@pie-element/number-line 11.3.4-next.0 → 12.0.0-beta.0
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/configure/lib/arrows.js +68 -103
- package/configure/lib/arrows.js.map +1 -1
- package/configure/lib/card-bar.js +41 -62
- package/configure/lib/card-bar.js.map +1 -1
- package/configure/lib/defaults.js +5 -7
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/domain.js +60 -116
- package/configure/lib/domain.js.map +1 -1
- package/configure/lib/index.js +124 -194
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/main.js +585 -721
- package/configure/lib/main.js.map +1 -1
- package/configure/lib/number-text-field.js +15 -86
- package/configure/lib/number-text-field.js.map +1 -1
- package/configure/lib/point-config.js +69 -129
- package/configure/lib/point-config.js.map +1 -1
- package/configure/lib/size.js +43 -77
- package/configure/lib/size.js.map +1 -1
- package/configure/lib/ticks.js +89 -151
- package/configure/lib/ticks.js.map +1 -1
- package/configure/lib/utils.js +2 -4
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +10 -7
- package/controller/lib/defaults.js +5 -6
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +171 -286
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/tickUtils.js +96 -169
- package/controller/lib/tickUtils.js.map +1 -1
- package/controller/lib/utils.js +55 -88
- package/controller/lib/utils.js.map +1 -1
- package/controller/package.json +3 -3
- package/lib/data-converter.js +19 -23
- package/lib/data-converter.js.map +1 -1
- package/lib/draggable/index.js +104 -43
- package/lib/draggable/index.js.map +1 -1
- package/lib/index.js +118 -205
- package/lib/index.js.map +1 -1
- package/lib/number-line/colors.js +3 -13
- package/lib/number-line/colors.js.map +1 -1
- package/lib/number-line/feedback.js +53 -69
- package/lib/number-line/feedback.js.map +1 -1
- package/lib/number-line/graph/arrow.js +19 -38
- package/lib/number-line/graph/arrow.js.map +1 -1
- package/lib/number-line/graph/elements/base.js +7 -13
- package/lib/number-line/graph/elements/base.js.map +1 -1
- package/lib/number-line/graph/elements/builder.js +6 -7
- package/lib/number-line/graph/elements/builder.js.map +1 -1
- package/lib/number-line/graph/elements/line.js +209 -265
- package/lib/number-line/graph/elements/line.js.map +1 -1
- package/lib/number-line/graph/elements/point.js +170 -201
- package/lib/number-line/graph/elements/point.js.map +1 -1
- package/lib/number-line/graph/elements/ray.js +147 -185
- package/lib/number-line/graph/elements/ray.js.map +1 -1
- package/lib/number-line/graph/index.js +217 -283
- package/lib/number-line/graph/index.js.map +1 -1
- package/lib/number-line/graph/line.js +12 -22
- package/lib/number-line/graph/line.js.map +1 -1
- package/lib/number-line/graph/stacks.js +31 -54
- package/lib/number-line/graph/stacks.js.map +1 -1
- package/lib/number-line/graph/tick-utils.js +120 -209
- package/lib/number-line/graph/tick-utils.js.map +1 -1
- package/lib/number-line/graph/ticks.js +144 -225
- package/lib/number-line/graph/ticks.js.map +1 -1
- package/lib/number-line/index.js +331 -395
- package/lib/number-line/index.js.map +1 -1
- package/lib/number-line/point-chooser/button.js +33 -58
- package/lib/number-line/point-chooser/button.js.map +1 -1
- package/lib/number-line/point-chooser/img.js +2 -3
- package/lib/number-line/point-chooser/img.js.map +1 -1
- package/lib/number-line/point-chooser/index.js +152 -148
- package/lib/number-line/point-chooser/index.js.map +1 -1
- package/lib/number-line/point-chooser/styles.js +29 -52
- package/lib/number-line/point-chooser/styles.js.map +1 -1
- package/lib/number-line/transitions/fade.js +69 -48
- package/lib/number-line/transitions/fade.js.map +1 -1
- package/lib/number-line/transitions/index.js +2 -4
- package/lib/number-line/transitions/index.js.map +1 -1
- package/package.json +14 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["score","number","scaled","getPartialScore","corrected","ps","correct","rule","find","r","numberOfCorrect","length","scorePercentage","accumulateAnswer","correctResponse","total","answer","isCorrectResponse","some","cr","matches","outcome","model","session","env","Promise","resolve","empty","partialScoringEnabled","partialScoring","enabled","numCorrect","reduce","numIncorrect","getScore","question","getCorrected","correctness","getCorrectness","allowPartialScoring","filter","o","canDoPartialScoring","CLOSE_TO_PRECISION","closeTo","a","b","precision","expectedDiff","Math","pow","receivedDiff","abs","close","v","ov","incorrect","notInAnswer","noCorrectResponse","acc","index","match","push","splice","indexOf","normalize","feedback","defaults","createDefaultModel","out","graph","colorContrast","updateTicks","domain","labelStep","ticks","minor","major","min","Number","toFixed","max","fraction","tickIntervalType","step","math","evaluate","reject","Error","normalizedQuestion","normalizedModel","evaluateMode","mode","exhibitOnly","disabled","teacherInstructions","role","fb","undefined","then","feedbackMessage","prompt","type","message","accessibility","language","extraCSSRules","createCorrectResponseSession","id","getInnerText","html","replaceAll","getContent","replace","validate","config","maxMaxElements","numberLineDimensions","minWidth","maxWidth","width","maxNumberOfPoints","errors","forEach","field","required","widthError","MIN_DOMAIN","MAX_DOMAIN","domainError","maxError","pointsError","correctResponseError"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;;;;;AAEA,IAAMA,KAAK,GAAG,SAARA,KAAQ,CAACC,MAAD,EAAY;AACxB,SAAO;AACLD,IAAAA,KAAK,EAAE;AACLE,MAAAA,MAAM,EAAED;AADH;AADF,GAAP;AAKD,CAND;;AAQA,IAAME,eAAe,GAAG,SAAlBA,eAAkB,CAACC,SAAD,EAAYC,EAAZ,EAAmB;AACzC,MAAQC,OAAR,GAAoBF,SAApB,CAAQE,OAAR;AACA,MAAMC,IAAI,GAAGF,EAAE,CAACG,IAAH,CAAQ,UAACC,CAAD;AAAA,WAAOA,CAAC,CAACC,eAAF,KAAsBJ,OAAO,CAACK,MAArC;AAAA,GAAR,CAAb;;AAEA,MAAIJ,IAAJ,EAAU;AACR,WAAO,OAAOA,IAAI,CAACK,eAAL,GAAuB,GAA9B,CAAP;AACD,GAFD,MAEO;AACL,WAAO,CAAP;AACD;AACF,CATD;;AAWA,IAAMC,gBAAgB,GAAG,SAAnBA,gBAAmB,CAACC,eAAD;AAAA,SAAqB,UAACC,KAAD,EAAQC,MAAR,EAAmB;AAC/D,QAAMC,iBAAiB,GAAGH,eAAe,CAACI,IAAhB,CAAqB,UAACC,EAAD;AAAA,aAAQC,OAAO,CAACD,EAAD,CAAP,CAAYH,MAAZ,CAAR;AAAA,KAArB,CAA1B;AACA,WAAOD,KAAK,IAAIE,iBAAiB,GAAG,CAAH,GAAO,CAA5B,CAAZ;AACD,GAHwB;AAAA,CAAzB;AAKA;AACA;;;AACO,SAASI,OAAT,CAAiBC,KAAjB,EAAwBC,OAAxB,EAAiCC,GAAjC,EAAsC;AAC3C,SAAO,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAI,CAACH,OAAD,IAAY,yBAAQA,OAAR,CAAhB,EAAkC;AAChCG,MAAAA,OAAO,CAAC;AAAE1B,QAAAA,KAAK,EAAE,CAAT;AAAY2B,QAAAA,KAAK,EAAE;AAAnB,OAAD,CAAP;AACD,KAFD,MAEO;AACL,UAAMC,qBAAqB,GAAGC,gCAAeC,OAAf,CAAuBR,KAAvB,EAA8BE,GAA9B,CAA9B;;AACA,UAAMO,UAAU,GAAG,CAACR,OAAO,CAACP,MAAR,IAAkB,EAAnB,EAAuBgB,MAAvB,CAA8BnB,gBAAgB,CAACS,KAAK,CAACR,eAAP,CAA9C,EAAuE,CAAvE,CAAnB;AAEA,UAAIC,KAAK,GAAGO,KAAK,CAACR,eAAN,CAAsBH,MAAlC;AACA,UAAIsB,YAAY,GAAG,CAAnB;;AAEA,UAAI,CAACV,OAAO,CAACP,MAAR,IAAkB,EAAnB,EAAuBL,MAAvB,GAAgCI,KAApC,EAA2C;AACzCkB,QAAAA,YAAY,GAAG,CAACV,OAAO,CAACP,MAAR,IAAkB,EAAnB,EAAuBL,MAAvB,GAAgCI,KAA/C;AACD;;AAED,UAAIA,KAAK,KAAK,CAAd,EAAiB;AACfA,QAAAA,KAAK,GAAG,CAAR;AACD;;AAED,UAAIf,MAAK,GAAG+B,UAAU,GAAG,CAAb,GAAiB,CAAjB,GAAqB,CAACA,UAAU,GAAGE,YAAd,IAA8BlB,KAA/D;;AAEA,UAAIf,MAAK,GAAG,CAAZ,EAAe;AACbA,QAAAA,MAAK,GAAG,CAAR;AACD;;AAED0B,MAAAA,OAAO,CAAC;AAAE1B,QAAAA,KAAK,EAAE4B,qBAAqB,GAAG5B,MAAH,GAAWA,MAAK,KAAK,CAAV,GAAc,CAAd,GAAkB;AAA3D,OAAD,CAAP;AACD;AACF,GA1BM,CAAP;AA2BD;;AAEM,SAASkC,QAAT,CAAkBC,QAAlB,EAA4BZ,OAA5B,EAAqC;AAC1C,SAAO,IAAIE,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAI,CAACH,OAAD,IAAY,yBAAQA,OAAR,CAAhB,EAAkC;AAChCG,MAAAA,OAAO,CAAC;AAAE1B,QAAAA,KAAK,EAAE;AAAEE,UAAAA,MAAM,EAAE;AAAV;AAAT,OAAD,CAAP;AACD,KAFD,MAEO;AACLqB,MAAAA,OAAO,CAACP,MAAR,GAAiBO,OAAO,CAACP,MAAR,IAAkB,EAAnC;AAEA,UAAMZ,SAAS,GAAGgC,YAAY,CAACb,OAAO,CAACP,MAAT,EAAiB,2BAAUmB,QAAQ,CAACrB,eAAnB,CAAjB,CAA9B;AAEA,UAAMuB,WAAW,GAAGC,cAAc,CAAClC,SAAD,CAAlC;;AAEA,UAAIiC,WAAW,KAAK,SAApB,EAA+B;AAC7BX,QAAAA,OAAO,CAAC1B,KAAK,CAAC,GAAD,CAAN,CAAP;AACD,OAFD,MAEO,IAAIqC,WAAW,KAAK,WAApB,EAAiC;AACtCX,QAAAA,OAAO,CAAC1B,KAAK,CAAC,GAAD,CAAN,CAAP;AACD,OAFM,MAEA,IAAIqC,WAAW,KAAK,SAApB,EAA+B;AACpC,YAAQE,mBAAR,GAAgDJ,QAAhD,CAAQI,mBAAR;AAAA,YAA6BV,eAA7B,GAAgDM,QAAhD,CAA6BN,cAA7B;;AACA,YAAMxB,EAAE,GAAG,CAACwB,eAAc,IAAI,EAAnB,EAAuBW,MAAvB,CAA8B,UAACC,CAAD;AAAA,iBAAO,CAAC,yBAAQA,CAAR,CAAR;AAAA,SAA9B,CAAX;;AACA,YAAMC,mBAAmB,GAAGH,mBAAmB,IAAIlC,EAAE,CAACM,MAAH,GAAY,CAA/D;;AACA,YAAI+B,mBAAJ,EAAyB;AACvBhB,UAAAA,OAAO,CAAC1B,KAAK,CAACG,eAAe,CAACC,SAAD,EAAYC,EAAZ,CAAhB,CAAN,CAAP;AACD,SAFD,MAEO;AACLqB,UAAAA,OAAO,CAAC1B,KAAK,CAAC,GAAD,CAAN,CAAP;AACD;AACF,OATM,MASA;AACL0B,QAAAA,OAAO,CAAC;AAAE1B,UAAAA,KAAK,EAAE;AAAEE,YAAAA,MAAM,EAAE,CAAC;AAAX;AAAT,SAAD,CAAP;AACD;AACF;AACF,GA3BM,CAAP;AA4BD;;AAEM,IAAMyC,kBAAkB,GAAG,CAA3B;;;AAEA,IAAMC,OAAO,GAAG,SAAVA,OAAU,CAACC,CAAD,EAAIC,CAAJ,EAAOC,SAAP,EAAqB;AAC1CA,EAAAA,SAAS,GAAGA,SAAS,IAAI,CAAzB;AACA,MAAMC,YAAY,GAAGC,IAAI,CAACC,GAAL,CAAS,EAAT,EAAa,CAACH,SAAd,IAA2B,CAAhD;AACA,MAAMI,YAAY,GAAGF,IAAI,CAACG,GAAL,CAASP,CAAC,GAAGC,CAAb,CAArB;AACA,MAAMO,KAAK,GAAGF,YAAY,IAAIH,YAA9B;AACA,SAAOK,KAAP;AACD,CANM;;;;AAQP,IAAMjC,OAAO,GAAG,SAAVA,OAAU,CAACyB,CAAD;AAAA,SAAO,UAACS,CAAD,EAAO;AAC5B,WAAO,6BAAYT,CAAZ,EAAeS,CAAf,EAAkB,UAACA,CAAD,EAAIC,EAAJ,EAAW;AAClC,UAAI,OAAOD,CAAP,KAAa,QAAb,IAAyB,OAAOC,EAAP,KAAc,QAA3C,EAAqD;AACnD,eAAOX,OAAO,CAACU,CAAD,EAAIC,EAAJ,EAAQZ,kBAAR,CAAd;AACD;AACF,KAJM,CAAP;AAKD,GANe;AAAA,CAAhB;;AAQO,IAAMP,YAAY,GAAG,SAAfA,YAAe,CAACpB,MAAD,EAASF,eAAT,EAA6B;AACvD,MAAI,yBAAQA,eAAR,KAA4BE,MAAM,CAACL,MAAP,GAAgB,CAAhD,EAAmD;AACjD,WAAO;AACLL,MAAAA,OAAO,EAAE,EADJ;AAELkD,MAAAA,SAAS,EAAE,EAFN;AAGLC,MAAAA,WAAW,EAAE,EAHR;AAILC,MAAAA,iBAAiB,EAAE;AAJd,KAAP;AAMD;;AAED,SAAO1C,MAAM,CAACgB,MAAP,CACL,UAAC2B,GAAD,EAAMd,CAAN,EAASe,KAAT,EAAmB;AACjB,QAAQtD,OAAR,GAA4CqD,GAA5C,CAAQrD,OAAR;AAAA,QAAiBkD,SAAjB,GAA4CG,GAA5C,CAAiBH,SAAjB;AAAA,QAA4BC,WAA5B,GAA4CE,GAA5C,CAA4BF,WAA5B;AAEA,QAAMI,KAAK,GAAG,sBAAKJ,WAAL,EAAkBrC,OAAO,CAACyB,CAAD,CAAzB,CAAd;;AACA,QAAIgB,KAAJ,EAAW;AACTvD,MAAAA,OAAO,CAACwD,IAAR,CAAaF,KAAb;AACAH,MAAAA,WAAW,CAACM,MAAZ,CAAmBN,WAAW,CAACO,OAAZ,CAAoBH,KAApB,CAAnB,EAA+C,CAA/C;AACD,KAHD,MAGO;AACLL,MAAAA,SAAS,CAACM,IAAV,CAAeF,KAAf;AACD;;AAED,WAAO;AACLtD,MAAAA,OAAO,EAAEA,OADJ;AAELkD,MAAAA,SAAS,EAAEA,SAFN;AAGLC,MAAAA,WAAW,EAAEA;AAHR,KAAP;AAKD,GAjBI,EAkBL;AACEnD,IAAAA,OAAO,EAAE,EADX;AAEEkD,IAAAA,SAAS,EAAE,EAFb;AAGEC,IAAAA,WAAW,EAAE3C;AAHf,GAlBK,CAAP;AAwBD,CAlCM;;;;AAoCA,IAAMwB,cAAc,GAAG,SAAjBA,cAAiB,CAAClC,SAAD,EAAe;AAC3C,MAAQoD,SAAR,GAA+DpD,SAA/D,CAAQoD,SAAR;AAAA,MAAmBlD,OAAnB,GAA+DF,SAA/D,CAAmBE,OAAnB;AAAA,MAA4BmD,WAA5B,GAA+DrD,SAA/D,CAA4BqD,WAA5B;AAAA,MAAyCC,iBAAzC,GAA+DtD,SAA/D,CAAyCsD,iBAAzC;;AAEA,MAAIA,iBAAJ,EAAuB;AACrB,WAAO,SAAP;AACD;;AAED,MAAIF,SAAS,CAAC7C,MAAV,KAAqB,CAArB,IAA0BL,OAAO,CAACK,MAAR,KAAmB,CAAjD,EAAoD;AAClD,WAAO,YAAP;AACD;;AAED,MAAI6C,SAAS,CAAC7C,MAAV,KAAqB,CAArB,IAA0B8C,WAAW,CAAC9C,MAAZ,KAAuB,CAArD,EAAwD;AACtD,WAAO,SAAP;AACD;;AAED,MAAI6C,SAAS,CAAC7C,MAAV,GAAmB,CAAnB,IAAwB8C,WAAW,CAAC9C,MAAZ,GAAqB,CAAjD,EAAoD;AAClD,QAAIL,OAAO,CAACK,MAAR,GAAiB,CAArB,EAAwB;AACtB,aAAO,SAAP;AACD,KAFD,MAEO;AACL,aAAO,WAAP;AACD;AACF;;AAED,SAAO,SAAP;AACD,CAxBM;AA0BP;AACA;AACA;AACA;;;;;AACO,SAASsD,SAAT,CAAmB9B,QAAnB,EAA6B;AAClC,MAAM+B,QAAQ,GAAG,uBAAMC,qBAASD,QAAf,EAAyB/B,QAAQ,CAAC+B,QAAlC,CAAjB;AAEA,uDAAYC,oBAAZ,GAAyBhC,QAAzB;AAAmC+B,IAAAA,QAAQ,EAARA;AAAnC;AACD;;AAEM,SAASE,kBAAT,GAAwC;AAAA,MAAZ9C,KAAY,uEAAJ,EAAI;AAC7C,SAAO,IAAIG,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAM2C,GAAG,mCACJ/C,KADI;AAEPgD,MAAAA,KAAK,kCACAH,qBAASG,KADT,GAEAhD,KAAK,CAACgD,KAFN,CAFE;AAMPC,MAAAA,aAAa,EAAE;AANR,MAAT;;AASA7C,IAAAA,OAAO,CAAC,wBAAO2C,GAAP,EAAY,UAACf,CAAD;AAAA,aAAO,CAACA,CAAR;AAAA,KAAZ,CAAD,CAAP;AACD,GAXM,CAAP;AAYD,C,CAED;;;AACA,IAAMkB,WAAW,GAAG,SAAdA,WAAc,CAAClD,KAAD,EAAW;AAC7B,qBAA0DA,KAA1D,CAAQgD,KAAR;AAAA,2CAAmD,EAAnD;AAAA,MAAiBG,MAAjB,gBAAiBA,MAAjB;AAAA,MAAyBC,SAAzB,gBAAyBA,SAAzB;AAAA,wCAAoCC,KAApC;AAAA,MAAoCA,KAApC,mCAA4C,EAA5C;AACA,MAAQC,KAAR,GAAyBD,KAAzB,CAAQC,KAAR;AAAA,MAAeC,KAAf,GAAyBF,KAAzB,CAAeE,KAAf;;AAEA,MAAIJ,MAAJ,EAAY;AACVA,IAAAA,MAAM,CAACK,GAAP,GAAaC,MAAM,CAAC,CAACN,MAAM,CAACK,GAAP,IAAc,CAAf,EAAkBE,OAAlB,CAA0B,CAA1B,CAAD,CAAnB;AACAP,IAAAA,MAAM,CAACQ,GAAP,GAAaF,MAAM,CAAC,CAACN,MAAM,CAACQ,GAAP,IAAc,CAAf,EAAkBD,OAAlB,CAA0B,CAA1B,CAAD,CAAnB;AACD;;AAED,MAAIN,SAAS,IAAI,OAAOA,SAAP,KAAqB,QAAlC,IAA8CA,SAAS,CAACb,KAAV,CAAgB,6BAAhB,CAAlD,EAAkG;AAChGvC,IAAAA,KAAK,CAACgD,KAAN,CAAYY,QAAZ,GAAuB,IAAvB;AACAP,IAAAA,KAAK,CAACQ,gBAAN,GAAyB,UAAzB,CAFgG,CAIhG;;AACA,QAAMC,IAAI,GAAGC,IAAI,CAACC,QAAL,CAAcZ,SAAd,CAAb;;AAEA,QAAIU,IAAI,KAAKP,KAAb,EAAoB;AAClBF,MAAAA,KAAK,CAACE,KAAN,GAAcO,IAAd;AACAT,MAAAA,KAAK,CAACC,KAAN,GAAcQ,IAAI,IAAIP,KAAK,GAAGD,KAAZ,CAAlB;AACD;AACF;;AAED,SAAOtD,KAAP;AACD,CAvBD;;AAyBO,SAASA,KAAT,CAAea,QAAf,EAAyBZ,OAAzB,EAAkCC,GAAlC,EAAuC;AAC5C,MAAI,CAACW,QAAL,EAAe;AACb,WAAOV,OAAO,CAAC8D,MAAR,CAAe,IAAIC,KAAJ,CAAU,kBAAV,CAAf,CAAP;AACD;;AAED,SAAO,IAAI/D,OAAJ;AAAA,6FAAY,iBAAOC,OAAP,EAAgB6D,MAAhB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBACgBtB,SAAS,CAAC9B,QAAD,CADzB;;AAAA;AACXsD,cAAAA,kBADW;AAEXC,cAAAA,eAFW,GAEOlB,WAAW,CAACiB,kBAAD,CAFlB,EAGjB;;AACMnB,cAAAA,KAJW,GAIH,4BAAgBoB,eAAe,CAACpB,KAAhC,CAJG;;AAMjB,kBAAIA,KAAJ,EAAW;AACHqB,gBAAAA,YADG,GACYnE,GAAG,CAACoE,IAAJ,KAAa,UADzB;AAGH9E,gBAAAA,eAHG,GAGe,2BAAU2E,kBAAkB,CAAC3E,eAA7B,CAHf;AAIHV,gBAAAA,SAJG,GAISuF,YAAY,IAAIvD,YAAY,CAACb,OAAO,GAAGA,OAAO,CAACP,MAAR,IAAkB,EAArB,GAA0B,EAAlC,EAAsCF,eAAtC,CAJrC;AAKHuB,gBAAAA,WALG,GAKWsD,YAAY,IAAIrD,cAAc,CAAClC,SAAD,CALzC;AAODyF,gBAAAA,WAPC,GAOevB,KAPf,CAODuB,WAPC;AAQHC,gBAAAA,QARG,GAQQtE,GAAG,CAACoE,IAAJ,KAAa,QAAb,IAAyBC,WAAW,KAAK,IARjD;AASLE,gBAAAA,mBATK,GASiB,IATjB;;AAWT,oBAAIvE,GAAG,CAACwE,IAAJ,KAAa,YAAb,KAA8BxE,GAAG,CAACoE,IAAJ,KAAa,MAAb,IAAuBD,YAArD,CAAJ,EAAwE;AACtEI,kBAAAA,mBAAmB,GAAGN,kBAAkB,CAACM,mBAAzC;AACD;;AAEKE,gBAAAA,EAfG,GAeEN,YAAY,GACnB,yCAA0BtD,WAA1B,EAAuCoD,kBAAkB,CAACvB,QAA1D,CADmB,GAEnBzC,OAAO,CAACC,OAAR,CAAgBwE,SAAhB,CAjBK;AAmBTD,gBAAAA,EAAE,CAACE,IAAH,CAAQ,UAACC,eAAD,EAAqB;AAC3B,sBAAM/B,GAAG,GAAG;AACVgC,oBAAAA,MAAM,EAAEZ,kBAAkB,CAACY,MADjB;AAEVN,oBAAAA,mBAAmB,EAAnBA,mBAFU;AAGVzB,oBAAAA,KAAK,EAALA,KAHU;AAIVwB,oBAAAA,QAAQ,EAARA,QAJU;AAKV1F,oBAAAA,SAAS,EAATA,SALU;AAMVU,oBAAAA,eAAe,EACb6E,YAAY,IAAI,CAAC,YAAD,EAAe,SAAf,EAA0B3B,OAA1B,CAAkC3B,WAAlC,MAAmD,CAAC,CAApE,IAAyEoD,kBAAkB,CAAC3E,eAPpF;AAQVoD,oBAAAA,QAAQ,EAAEkC,eAAe,IAAI;AAC3BE,sBAAAA,IAAI,EAAEjE,WADqB;AAE3BkE,sBAAAA,OAAO,EAAEH;AAFkB,qBARnB;AAYV7B,oBAAAA,aAAa,EAAG/C,GAAG,CAACgF,aAAJ,IAAqBhF,GAAG,CAACgF,aAAJ,CAAkBjC,aAAxC,IAA0D,gBAZ/D;AAaVkC,oBAAAA,QAAQ,EAAEhB,kBAAkB,CAACgB,QAbnB;AAcVC,oBAAAA,aAAa,EAAEjB,kBAAkB,CAACiB;AAdxB,mBAAZ;AAgBAhF,kBAAAA,OAAO,CAAC,wBAAO2C,GAAP,EAAY,UAACf,CAAD;AAAA,2BAAO,CAACA,CAAR;AAAA,mBAAZ,CAAD,CAAP;AACD,iBAlBD;AAmBD,eAtCD,MAsCO;AACLiC,gBAAAA,MAAM,CAAC,IAAIC,KAAJ,CAAU,oBAAV,CAAD,CAAN;AACD;;AA9CgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAZ;;AAAA;AAAA;AAAA;AAAA,MAAP;AAgDD;;AAEM,IAAMmB,4BAA4B,GAAG,SAA/BA,4BAA+B,CAACxE,QAAD,EAAWX,GAAX,EAAmB;AAC7D,SAAO,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAIF,GAAG,CAACoE,IAAJ,KAAa,UAAb,IAA2BpE,GAAG,CAACwE,IAAJ,KAAa,YAA5C,EAA0D;AACxD,UAAyBhF,MAAzB,GAAoCmB,QAApC,CAAQrB,eAAR;AAEAY,MAAAA,OAAO,CAAC;AACNV,QAAAA,MAAM,EAANA,MADM;AAEN4F,QAAAA,EAAE,EAAE;AAFE,OAAD,CAAP;AAID,KAPD,MAOO;AACLlF,MAAAA,OAAO,CAAC,IAAD,CAAP;AACD;AACF,GAXM,CAAP;AAYD,CAbM,C,CAeP;;;;;AACA,IAAMmF,YAAY,GAAG,SAAfA,YAAe,CAACC,IAAD;AAAA,SAAU,CAACA,IAAI,IAAI,EAAT,EAAaC,UAAb,CAAwB,UAAxB,EAAoC,EAApC,CAAV;AAAA,CAArB,C,CAEA;;;AACA,IAAMC,UAAU,GAAG,SAAbA,UAAa,CAACF,IAAD;AAAA,SAAU,CAACA,IAAI,IAAI,EAAT,EAAaG,OAAb,CAAqB,oCAArB,EAA2D,EAA3D,CAAV;AAAA,CAAnB;;AAEO,IAAMC,QAAQ,GAAG,SAAXA,QAAW,GAA6B;AAAA,MAA5B5F,KAA4B,uEAApB,EAAoB;AAAA,MAAhB6F,MAAgB,uEAAP,EAAO;;AACnD,cAAmC7F,KAAK,IAAI,EAA5C;AAAA,MAAQgD,KAAR,SAAQA,KAAR;AAAA,MAAexD,eAAf,SAAeA,eAAf;;AACA,cAAyGqG,MAAM,IAAI,EAAnH;AAAA,mCAAQC,cAAR;AAAA,MAAQA,cAAR,qCAAyB,EAAzB;AAAA,oCAA6BC,oBAA7B;;AAAA,6DAAkG,EAAlG;AAAA,qDAAqDvC,GAArD;AAAA,MAA0DwC,QAA1D,uCAAqE,GAArE;AAAA,qDAA0ErC,GAA1E;AAAA,MAA+EsC,QAA/E,uCAA0F,GAA1F;;AACA,cAA6CjD,KAAK,IAAI,EAAtD;AAAA,MAAQkD,KAAR,SAAQA,KAAR;AAAA,MAAe/C,MAAf,SAAeA,MAAf;AAAA,MAAuBgD,iBAAvB,SAAuBA,iBAAvB;;AACA,cAAqBhD,MAAM,IAAI,EAA/B;AAAA,MAAQK,GAAR,SAAQA,GAAR;AAAA,MAAaG,GAAb,SAAaA,GAAb;;AACA,MAAMyC,MAAM,GAAG,EAAf;AAEA,GAAC,qBAAD,EAAwB,QAAxB,EAAkCC,OAAlC,CAA0C,UAACC,KAAD,EAAW;AAAA;;AACnD,QAAI,iBAAAT,MAAM,CAACS,KAAD,CAAN,wDAAeC,QAAf,IAA2B,CAACb,UAAU,CAAC1F,KAAK,CAACsG,KAAD,CAAN,CAA1C,EAA0D;AACxDF,MAAAA,MAAM,CAACE,KAAD,CAAN,GAAgB,yBAAhB;AACD;AACF,GAJD;;AAMA,MAAIJ,KAAK,GAAGF,QAAR,IAAoBE,KAAK,GAAGD,QAAhC,EAA0C;AACxCG,IAAAA,MAAM,CAACI,UAAP,6CAAuDR,QAAvD,kBAAuEC,QAAvE;AACD;;AAED,MAAMQ,UAAU,GAAG,CAAC,MAApB;AACA,MAAMC,UAAU,GAAG,MAAnB;;AAEA,MAAIlD,GAAG,GAAGiD,UAAN,IAAoBjD,GAAG,GAAGkD,UAA1B,IAAwC/C,GAAG,GAAG8C,UAA9C,IAA4D9C,GAAG,GAAG+C,UAAtE,EAAkF;AAChFN,IAAAA,MAAM,CAACO,WAAP,2DAAsEF,UAAtE,eAAqFC,UAArF;AACD;;AAED,MAAIlD,GAAG,IAAIG,GAAX,EAAgB;AACdyC,IAAAA,MAAM,CAACQ,QAAP,GAAkB,2CAAlB;AACD;;AAED,MAAIT,iBAAiB,GAAG,CAApB,IAAyBA,iBAAiB,GAAGL,cAAjD,EAAiE;AAC/DM,IAAAA,MAAM,CAACS,WAAP,4DAAuEf,cAAvE;AACD;;AAED,MAAItG,eAAe,IAAIA,eAAe,CAACH,MAAhB,KAA2B,CAAlD,EAAqD;AACnD+G,IAAAA,MAAM,CAACU,oBAAP,GAA8B,oEAA9B;AACD;;AAED,SAAOV,MAAP;AACD,CArCM","sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport isEqualWith from 'lodash/isEqualWith';\nimport merge from 'lodash/merge';\nimport omitBy from 'lodash/omitBy';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { partialScoring } from '@pie-lib/controller-utils';\nimport * as math from 'mathjs';\n\nimport defaults from './defaults';\nimport { reloadTicksData } from './utils';\n\nconst score = (number) => {\n return {\n score: {\n scaled: number,\n },\n };\n};\n\nconst getPartialScore = (corrected, ps) => {\n const { correct } = corrected;\n const rule = ps.find((r) => r.numberOfCorrect === correct.length);\n\n if (rule) {\n return 1.0 * (rule.scorePercentage / 100);\n } else {\n return 0;\n }\n};\n\nconst accumulateAnswer = (correctResponse) => (total, answer) => {\n const isCorrectResponse = correctResponse.some((cr) => matches(cr)(answer));\n return total + (isCorrectResponse ? 1 : 0);\n};\n\n/**\n */\nexport function outcome(model, session, env) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n } else {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const numCorrect = (session.answer || []).reduce(accumulateAnswer(model.correctResponse), 0);\n\n let total = model.correctResponse.length;\n let numIncorrect = 0;\n\n if ((session.answer || []).length > total) {\n numIncorrect = (session.answer || []).length - total;\n }\n\n if (total === 0) {\n total = 1;\n }\n\n let score = numCorrect < 0 ? 0 : (numCorrect - numIncorrect) / total;\n\n if (score < 0) {\n score = 0;\n }\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0 });\n }\n });\n}\n\nexport function getScore(question, session) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: { scaled: 0 } });\n } else {\n session.answer = session.answer || [];\n\n const corrected = getCorrected(session.answer, cloneDeep(question.correctResponse));\n\n const correctness = getCorrectness(corrected);\n\n if (correctness === 'correct') {\n resolve(score(1.0));\n } else if (correctness === 'incorrect') {\n resolve(score(0.0));\n } else if (correctness === 'partial') {\n const { allowPartialScoring, partialScoring } = question;\n const ps = (partialScoring || []).filter((o) => !isEmpty(o));\n const canDoPartialScoring = allowPartialScoring && ps.length > 0;\n if (canDoPartialScoring) {\n resolve(score(getPartialScore(corrected, ps)));\n } else {\n resolve(score(0.0));\n }\n } else {\n resolve({ score: { scaled: -1 } });\n }\n }\n });\n}\n\nexport const CLOSE_TO_PRECISION = 3;\n\nexport const closeTo = (a, b, precision) => {\n precision = precision || 5;\n const expectedDiff = Math.pow(10, -precision) / 2;\n const receivedDiff = Math.abs(a - b);\n const close = receivedDiff <= expectedDiff;\n return close;\n};\n\nconst matches = (a) => (v) => {\n return isEqualWith(a, v, (v, ov) => {\n if (typeof v === 'number' && typeof ov === 'number') {\n return closeTo(v, ov, CLOSE_TO_PRECISION);\n }\n });\n};\n\nexport const getCorrected = (answer, correctResponse) => {\n if (isEmpty(correctResponse) && answer.length > 0) {\n return {\n correct: [],\n incorrect: [],\n notInAnswer: [],\n noCorrectResponse: true,\n };\n }\n\n return answer.reduce(\n (acc, a, index) => {\n const { correct, incorrect, notInAnswer } = acc;\n\n const match = find(notInAnswer, matches(a));\n if (match) {\n correct.push(index);\n notInAnswer.splice(notInAnswer.indexOf(match), 1);\n } else {\n incorrect.push(index);\n }\n\n return {\n correct: correct,\n incorrect: incorrect,\n notInAnswer: notInAnswer,\n };\n },\n {\n correct: [],\n incorrect: [],\n notInAnswer: correctResponse,\n },\n );\n};\n\nexport const getCorrectness = (corrected) => {\n const { incorrect, correct, notInAnswer, noCorrectResponse } = corrected;\n\n if (noCorrectResponse) {\n return 'unknown';\n }\n\n if (incorrect.length === 0 && correct.length === 0) {\n return 'unanswered';\n }\n\n if (incorrect.length === 0 && notInAnswer.length === 0) {\n return 'correct';\n }\n\n if (incorrect.length > 0 || notInAnswer.length > 0) {\n if (correct.length > 0) {\n return 'partial';\n } else {\n return 'incorrect';\n }\n }\n\n return 'unknown';\n};\n\n/**\n * A sample of a normalize function see:\n * https://github.com/pie-framework/pie-elements/issues/21\n */\nexport function normalize(question) {\n const feedback = merge(defaults.feedback, question.feedback);\n\n return { ...defaults, ...question, feedback };\n}\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n const out = {\n ...model,\n graph: {\n ...defaults.graph,\n ...model.graph,\n },\n colorContrast: 'black_on_white',\n };\n\n resolve(omitBy(out, (v) => !v));\n });\n}\n\n// this function is duplicated in configure; at some point, use the same shared function\nconst updateTicks = (model) => {\n const { graph: { domain, labelStep, ticks = {} } = {} } = model;\n const { minor, major } = ticks;\n\n if (domain) {\n domain.min = Number((domain.min || 0).toFixed(2));\n domain.max = Number((domain.max || 0).toFixed(2));\n }\n\n if (labelStep && typeof labelStep === 'string' && labelStep.match(/^[1-9][0-9]*\\/[1-9][0-9]*$/g)) {\n model.graph.fraction = true;\n ticks.tickIntervalType = 'Fraction';\n\n // update the ticks frequency and label value to match the label step if needed\n const step = math.evaluate(labelStep);\n\n if (step !== major) {\n ticks.major = step;\n ticks.minor = step / (major / minor);\n }\n }\n\n return model;\n};\n\nexport function model(question, session, env) {\n if (!question) {\n return Promise.reject(new Error('question is null'));\n }\n\n return new Promise(async (resolve, reject) => {\n const normalizedQuestion = await normalize(question);\n const normalizedModel = updateTicks(normalizedQuestion);\n // this function is also called in configure, it is a duplicate to maintain consistency and correctness\n const graph = reloadTicksData(normalizedModel.graph);\n\n if (graph) {\n const evaluateMode = env.mode === 'evaluate';\n\n const correctResponse = cloneDeep(normalizedQuestion.correctResponse);\n const corrected = evaluateMode && getCorrected(session ? session.answer || [] : [], correctResponse);\n const correctness = evaluateMode && getCorrectness(corrected);\n\n const { exhibitOnly } = graph;\n const disabled = env.mode !== 'gather' || exhibitOnly === true;\n let teacherInstructions = null;\n\n if (env.role === 'instructor' && (env.mode === 'view' || evaluateMode)) {\n teacherInstructions = normalizedQuestion.teacherInstructions;\n }\n\n const fb = evaluateMode\n ? getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : Promise.resolve(undefined);\n\n fb.then((feedbackMessage) => {\n const out = {\n prompt: normalizedQuestion.prompt,\n teacherInstructions,\n graph,\n disabled,\n corrected,\n correctResponse:\n evaluateMode && ['unanswered', 'correct'].indexOf(correctness) === -1 && normalizedQuestion.correctResponse,\n feedback: feedbackMessage && {\n type: correctness,\n message: feedbackMessage,\n },\n colorContrast: (env.accessibility && env.accessibility.colorContrast) || 'black_on_white',\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n resolve(omitBy(out, (v) => !v));\n });\n } else {\n reject(new Error('graph is undefined'));\n }\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { correctResponse: answer } = question;\n\n resolve({\n answer,\n id: '1',\n });\n } else {\n 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 { graph, correctResponse } = model || {};\n const { maxMaxElements = 20, numberLineDimensions: { min: minWidth = 200, max: maxWidth = 800 } = {} } = config || {};\n const { width, domain, maxNumberOfPoints } = graph || {};\n const { min, max } = domain || {};\n const errors = {};\n\n ['teacherInstructions', 'prompt'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n if (width < minWidth || width > maxWidth) {\n errors.widthError = `Width should be a value between ${minWidth} and ${maxWidth}.`;\n }\n\n const MIN_DOMAIN = -100000;\n const MAX_DOMAIN = 100000;\n\n if (min < MIN_DOMAIN || min > MAX_DOMAIN || max < MIN_DOMAIN || max > MAX_DOMAIN) {\n errors.domainError = `Min and max values must both be in the range [${MIN_DOMAIN}, ${MAX_DOMAIN}].`;\n }\n\n if (min >= max) {\n errors.maxError = 'Max value must be greater than min value.';\n }\n\n if (maxNumberOfPoints < 1 || maxNumberOfPoints > maxMaxElements) {\n errors.pointsError = `Max number of elements should be between 1 and ${maxMaxElements}.`;\n }\n\n if (correctResponse && correctResponse.length === 0) {\n errors.correctResponseError = 'The correct answer should include at least one number line object.';\n }\n\n return errors;\n};\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_cloneDeep","_interopRequireDefault","require","_find","_isEmpty","_isEqualWith","_merge","_omitBy","_feedback","_controllerUtils","math","_interopRequireWildcard","_defaults","_utils","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","score","number","scaled","getPartialScore","corrected","ps","correct","rule","find","numberOfCorrect","length","scorePercentage","accumulateAnswer","correctResponse","total","answer","isCorrectResponse","some","cr","matches","outcome","model","session","env","Promise","resolve","isEmpty","empty","partialScoringEnabled","partialScoring","enabled","numCorrect","reduce","numIncorrect","getScore","question","getCorrected","cloneDeep","correctness","getCorrectness","allowPartialScoring","filter","canDoPartialScoring","CLOSE_TO_PRECISION","exports","closeTo","a","b","precision","expectedDiff","Math","pow","receivedDiff","abs","close","v","isEqualWith","ov","incorrect","notInAnswer","noCorrectResponse","acc","index","match","push","splice","indexOf","normalize","feedback","merge","defaults","createDefaultModel","out","graph","colorContrast","omitBy","updateTicks","domain","labelStep","ticks","minor","major","min","Number","toFixed","max","fraction","tickIntervalType","step","evaluate","Error","normalizedQuestion","normalizedModel","reloadTicksData","evaluateMode","mode","exhibitOnly","disabled","teacherInstructions","role","feedbackMessage","getFeedbackForCorrectness","undefined","prompt","type","message","accessibility","language","extraCSSRules","createCorrectResponseSession","id","getInnerText","html","replaceAll","getContent","replace","validate","config","maxMaxElements","numberLineDimensions","minWidth","maxWidth","width","maxNumberOfPoints","errors","forEach","field","required","widthError","MIN_DOMAIN","MAX_DOMAIN","domainError","maxError","pointsError","correctResponseError"],"sources":["../src/index.js"],"sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport isEqualWith from 'lodash/isEqualWith';\nimport merge from 'lodash/merge';\nimport omitBy from 'lodash/omitBy';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { partialScoring } from '@pie-lib/controller-utils';\nimport * as math from 'mathjs';\n\nimport defaults from './defaults';\nimport { reloadTicksData } from './utils';\n\nconst score = (number) => {\n return {\n score: {\n scaled: number,\n },\n };\n};\n\nconst getPartialScore = (corrected, ps) => {\n const { correct } = corrected;\n const rule = ps.find((r) => r.numberOfCorrect === correct.length);\n\n if (rule) {\n return 1.0 * (rule.scorePercentage / 100);\n } else {\n return 0;\n }\n};\n\nconst accumulateAnswer = (correctResponse) => (total, answer) => {\n const isCorrectResponse = correctResponse.some((cr) => matches(cr)(answer));\n return total + (isCorrectResponse ? 1 : 0);\n};\n\n/**\n */\nexport function outcome(model, session, env) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n } else {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const numCorrect = (session.answer || []).reduce(accumulateAnswer(model.correctResponse), 0);\n\n let total = model.correctResponse.length;\n let numIncorrect = 0;\n\n if ((session.answer || []).length > total) {\n numIncorrect = (session.answer || []).length - total;\n }\n\n if (total === 0) {\n total = 1;\n }\n\n let score = numCorrect < 0 ? 0 : (numCorrect - numIncorrect) / total;\n\n if (score < 0) {\n score = 0;\n }\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0 });\n }\n });\n}\n\nexport function getScore(question, session) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: { scaled: 0 } });\n } else {\n session.answer = session.answer || [];\n\n const corrected = getCorrected(session.answer, cloneDeep(question.correctResponse));\n\n const correctness = getCorrectness(corrected);\n\n if (correctness === 'correct') {\n resolve(score(1.0));\n } else if (correctness === 'incorrect') {\n resolve(score(0.0));\n } else if (correctness === 'partial') {\n const { allowPartialScoring, partialScoring } = question;\n const ps = (partialScoring || []).filter((o) => !isEmpty(o));\n const canDoPartialScoring = allowPartialScoring && ps.length > 0;\n if (canDoPartialScoring) {\n resolve(score(getPartialScore(corrected, ps)));\n } else {\n resolve(score(0.0));\n }\n } else {\n resolve({ score: { scaled: -1 } });\n }\n }\n });\n}\n\nexport const CLOSE_TO_PRECISION = 3;\n\nexport const closeTo = (a, b, precision) => {\n precision = precision || 5;\n const expectedDiff = Math.pow(10, -precision) / 2;\n const receivedDiff = Math.abs(a - b);\n const close = receivedDiff <= expectedDiff;\n return close;\n};\n\nconst matches = (a) => (v) => {\n return isEqualWith(a, v, (v, ov) => {\n if (typeof v === 'number' && typeof ov === 'number') {\n return closeTo(v, ov, CLOSE_TO_PRECISION);\n }\n });\n};\n\nexport const getCorrected = (answer, correctResponse) => {\n if (isEmpty(correctResponse) && answer.length > 0) {\n return {\n correct: [],\n incorrect: [],\n notInAnswer: [],\n noCorrectResponse: true,\n };\n }\n\n return answer.reduce(\n (acc, a, index) => {\n const { correct, incorrect, notInAnswer } = acc;\n\n const match = find(notInAnswer, matches(a));\n if (match) {\n correct.push(index);\n notInAnswer.splice(notInAnswer.indexOf(match), 1);\n } else {\n incorrect.push(index);\n }\n\n return {\n correct: correct,\n incorrect: incorrect,\n notInAnswer: notInAnswer,\n };\n },\n {\n correct: [],\n incorrect: [],\n notInAnswer: correctResponse,\n },\n );\n};\n\nexport const getCorrectness = (corrected) => {\n const { incorrect, correct, notInAnswer, noCorrectResponse } = corrected;\n\n if (noCorrectResponse) {\n return 'unknown';\n }\n\n if (incorrect.length === 0 && correct.length === 0) {\n return 'unanswered';\n }\n\n if (incorrect.length === 0 && notInAnswer.length === 0) {\n return 'correct';\n }\n\n if (incorrect.length > 0 || notInAnswer.length > 0) {\n if (correct.length > 0) {\n return 'partial';\n } else {\n return 'incorrect';\n }\n }\n\n return 'unknown';\n};\n\n/**\n * A sample of a normalize function see:\n * https://github.com/pie-framework/pie-elements/issues/21\n */\nexport function normalize(question) {\n const feedback = merge(defaults.feedback, question.feedback);\n\n return { ...defaults, ...question, feedback };\n}\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n const out = {\n ...model,\n graph: {\n ...defaults.graph,\n ...model.graph,\n },\n colorContrast: 'black_on_white',\n };\n\n resolve(omitBy(out, (v) => !v));\n });\n}\n\n// this function is duplicated in configure; at some point, use the same shared function\nconst updateTicks = (model) => {\n const { graph: { domain, labelStep, ticks = {} } = {} } = model;\n const { minor, major } = ticks;\n\n if (domain) {\n domain.min = Number((domain.min || 0).toFixed(2));\n domain.max = Number((domain.max || 0).toFixed(2));\n }\n\n if (labelStep && typeof labelStep === 'string' && labelStep.match(/^[1-9][0-9]*\\/[1-9][0-9]*$/g)) {\n model.graph.fraction = true;\n ticks.tickIntervalType = 'Fraction';\n\n // update the ticks frequency and label value to match the label step if needed\n const step = math.evaluate(labelStep);\n\n if (step !== major) {\n ticks.major = step;\n ticks.minor = step / (major / minor);\n }\n }\n\n return model;\n};\n\nexport async function model(question, session, env) {\n if (!question) {\n throw new Error('question is null');\n }\n\n const normalizedQuestion = await normalize(question);\n const normalizedModel = updateTicks(normalizedQuestion);\n // this function is also called in configure, it is a duplicate to maintain consistency and correctness\n const graph = reloadTicksData(normalizedModel.graph);\n\n if (graph) {\n const evaluateMode = env.mode === 'evaluate';\n\n const correctResponse = cloneDeep(normalizedQuestion.correctResponse);\n const corrected = evaluateMode && getCorrected(session ? session.answer || [] : [], correctResponse);\n const correctness = evaluateMode && getCorrectness(corrected);\n\n const { exhibitOnly } = graph;\n const disabled = env.mode !== 'gather' || exhibitOnly === true;\n let teacherInstructions = null;\n\n if (env.role === 'instructor' && (env.mode === 'view' || evaluateMode)) {\n teacherInstructions = normalizedQuestion.teacherInstructions;\n }\n\n const feedbackMessage = evaluateMode\n ? await getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : undefined;\n\n const out = {\n prompt: normalizedQuestion.prompt,\n teacherInstructions,\n graph,\n disabled,\n corrected,\n correctResponse:\n evaluateMode && ['unanswered', 'correct'].indexOf(correctness) === -1 && normalizedQuestion.correctResponse,\n feedback: feedbackMessage && {\n type: correctness,\n message: feedbackMessage,\n },\n colorContrast: (env.accessibility && env.accessibility.colorContrast) || 'black_on_white',\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n return omitBy(out, (v) => !v);\n } else {\n throw new Error('graph is undefined');\n }\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { correctResponse: answer } = question;\n\n resolve({\n answer,\n id: '1',\n });\n } else {\n 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 { graph, correctResponse } = model || {};\n const { maxMaxElements = 20, numberLineDimensions: { min: minWidth = 200, max: maxWidth = 800 } = {} } = config || {};\n const { width, domain, maxNumberOfPoints } = graph || {};\n const { min, max } = domain || {};\n const errors = {};\n\n ['teacherInstructions', 'prompt'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n if (width < minWidth || width > maxWidth) {\n errors.widthError = `Width should be a value between ${minWidth} and ${maxWidth}.`;\n }\n\n const MIN_DOMAIN = -100000;\n const MAX_DOMAIN = 100000;\n\n if (min < MIN_DOMAIN || min > MAX_DOMAIN || max < MIN_DOMAIN || max > MAX_DOMAIN) {\n errors.domainError = `Min and max values must both be in the range [${MIN_DOMAIN}, ${MAX_DOMAIN}].`;\n }\n\n if (min >= max) {\n errors.maxError = 'Max value must be greater than min value.';\n }\n\n if (maxNumberOfPoints < 1 || maxNumberOfPoints > maxMaxElements) {\n errors.pointsError = `Max number of elements should be between 1 and ${maxMaxElements}.`;\n }\n\n if (correctResponse && correctResponse.length === 0) {\n errors.correctResponseError = 'The correct answer should include at least one number line object.';\n }\n\n return errors;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,43 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
-
|
|
7
4
|
Object.defineProperty(exports, "__esModule", {
|
|
8
5
|
value: true
|
|
9
6
|
});
|
|
10
7
|
exports.getMinorLimits = exports.generateMinorValues = exports.generateMajorValuesForMinor = void 0;
|
|
11
|
-
|
|
12
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
13
|
-
|
|
14
8
|
var math = _interopRequireWildcard(require("mathjs"));
|
|
15
|
-
|
|
16
9
|
var _uniqWith = _interopRequireDefault(require("lodash/uniqWith"));
|
|
17
|
-
|
|
18
10
|
var _isObject = _interopRequireDefault(require("lodash/isObject"));
|
|
19
|
-
|
|
20
11
|
var _isNumber = _interopRequireDefault(require("lodash/isNumber"));
|
|
21
|
-
|
|
22
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
23
|
-
|
|
24
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
25
|
-
|
|
26
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
27
|
-
|
|
28
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
29
|
-
|
|
12
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
30
13
|
// All these functions are duplicated in src/number-line/graph/tick-utils
|
|
31
14
|
|
|
32
15
|
/*This will store the possible decimal tick values*/
|
|
33
|
-
|
|
16
|
+
const decimalTickValues = [0.001, 0.01, 0.02, 0.04, 0.05, 0.1, 0.125, 0.2, 0.25, 0.5];
|
|
17
|
+
|
|
34
18
|
/*This will store the possible fraction tick values*/
|
|
19
|
+
const fractionTickValues = ['1/1000', '1/100', '1/64', '1/50', '1/32', '1/25', '1/20', '1/16', '1/15', '1/12', '1/10', '1/9', '1/8', '1/7', '1/6', '1/5', '1/4', '1/3', '1/2'];
|
|
35
20
|
|
|
36
|
-
var fractionTickValues = ['1/1000', '1/100', '1/64', '1/50', '1/32', '1/25', '1/20', '1/16', '1/15', '1/12', '1/10', '1/9', '1/8', '1/7', '1/6', '1/5', '1/4', '1/3', '1/2'];
|
|
37
21
|
/*This const will store possible multiplier for label interval that needs to be multiplied
|
|
38
22
|
with tick interval with denominator represented with object key.*/
|
|
39
|
-
|
|
40
|
-
var labelMultiplier = {
|
|
23
|
+
const labelMultiplier = {
|
|
41
24
|
1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
|
|
42
25
|
2: [1, 2, 4, 6, 8, 10],
|
|
43
26
|
3: [1, 3, 6, 9],
|
|
@@ -59,82 +42,61 @@ var labelMultiplier = {
|
|
|
59
42
|
100: [1, 2, 4, 5, 10],
|
|
60
43
|
1000: [1, 2, 4, 5, 8, 10]
|
|
61
44
|
};
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
var m = math.mod(math.abs(start), math.abs(interval));
|
|
65
|
-
|
|
45
|
+
const fractionRange = (start, end, interval) => {
|
|
46
|
+
const m = math.mod(math.abs(start), math.abs(interval));
|
|
66
47
|
if (!math.equal(m, 0)) {
|
|
67
48
|
throw new Error('start point must be divisible by interval');
|
|
68
49
|
}
|
|
69
|
-
|
|
70
50
|
if (math.equal(start, end)) {
|
|
71
51
|
return [];
|
|
72
52
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
var direction = math.larger(interval, 0) ? 'positive' : 'negative';
|
|
76
|
-
|
|
53
|
+
const e = math.subtract(end, math.mod(end, math.abs(interval)));
|
|
54
|
+
const direction = math.larger(interval, 0) ? 'positive' : 'negative';
|
|
77
55
|
if (direction === 'negative' && math.largerEq(end, start)) {
|
|
78
56
|
throw new Error('start must be > than end when doing a negative decrement');
|
|
79
57
|
}
|
|
80
|
-
|
|
81
58
|
if (direction === 'positive' && math.smallerEq(end, start)) {
|
|
82
59
|
throw new Error('start must be < end when doing increments');
|
|
83
60
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
var next = start;
|
|
88
|
-
|
|
61
|
+
const compareFn = direction === 'positive' ? math.smallerEq : math.equal(e, end) ? math.largerEq : math.larger;
|
|
62
|
+
const out = [];
|
|
63
|
+
let next = start;
|
|
89
64
|
while (compareFn(next, e)) {
|
|
90
65
|
out.push(next);
|
|
91
66
|
next = math.add(next, interval);
|
|
92
67
|
}
|
|
93
|
-
|
|
94
68
|
return out;
|
|
95
69
|
};
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return "Can only do a positive or negative range, but got: start: ".concat(start, " and end:").concat(end);
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
var zeroBasedRange = function zeroBasedRange(start, end, interval) {
|
|
70
|
+
const zbrErrorMessage = (start, end) => `Can only do a positive or negative range, but got: start: ${start} and end:${end}`;
|
|
71
|
+
const zeroBasedRange = (start, end, interval) => {
|
|
102
72
|
start = math.fraction(start);
|
|
103
73
|
end = math.fraction(end);
|
|
104
74
|
interval = math.fraction(interval);
|
|
105
|
-
|
|
106
|
-
|
|
75
|
+
const length = math.abs(math.subtract(end, start));
|
|
107
76
|
if (math.larger(length, math.abs(end))) {
|
|
108
77
|
throw new Error(zbrErrorMessage(start, end));
|
|
109
78
|
}
|
|
110
|
-
|
|
111
|
-
var a = {
|
|
79
|
+
const a = {
|
|
112
80
|
start: math.abs(start),
|
|
113
81
|
end: math.abs(end),
|
|
114
82
|
interval: math.abs(interval),
|
|
115
83
|
multiplier: math.smaller(interval, 0) ? -1 : 1
|
|
116
84
|
};
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
return math.multiply(v, -1);
|
|
122
|
-
}) : r;
|
|
123
|
-
|
|
85
|
+
const m = math.mod(a.start, a.interval);
|
|
86
|
+
const s = math.larger(m, 0) ? math.add(math.subtract(a.start, m), a.interval) : a.start;
|
|
87
|
+
const r = fractionRange(s, a.end, a.interval);
|
|
88
|
+
const out = a.multiplier === -1 ? r.map(v => math.multiply(v, -1)) : r;
|
|
124
89
|
if (math.smaller(interval, 0)) {
|
|
125
90
|
out.reverse();
|
|
126
91
|
}
|
|
127
|
-
|
|
128
92
|
return out;
|
|
129
93
|
};
|
|
130
|
-
|
|
131
|
-
var fmin = function fmin(a, b) {
|
|
94
|
+
const fmin = (a, b) => {
|
|
132
95
|
a = math.fraction(a);
|
|
133
96
|
b = math.fraction(b);
|
|
134
97
|
return math.smaller(a, b) ? a : b;
|
|
135
98
|
};
|
|
136
|
-
|
|
137
|
-
var fmax = function fmax(a, b) {
|
|
99
|
+
const fmax = (a, b) => {
|
|
138
100
|
a = math.fraction(a);
|
|
139
101
|
b = math.fraction(b);
|
|
140
102
|
return math.larger(a, b) ? a : b;
|
|
@@ -144,148 +106,130 @@ var fmax = function fmax(a, b) {
|
|
|
144
106
|
* such that it was hard to round the numbers.
|
|
145
107
|
* This is a more simplistic version but makes rounding work.
|
|
146
108
|
*/
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
var simpleRange = function simpleRange(start, end, interval) {
|
|
109
|
+
const simpleRange = (start, end, interval) => {
|
|
150
110
|
start = math.fraction(start);
|
|
151
111
|
end = math.fraction(end);
|
|
152
112
|
interval = math.fraction(interval);
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
113
|
+
const positiveRange = math.larger(end, 0) ? zeroBasedRange(fmax(0, start), end, interval) : [];
|
|
114
|
+
const negativeRange = math.smaller(start, 0) ? zeroBasedRange(fmin(0, end), start, math.multiply(interval, -1)) : [];
|
|
115
|
+
let together = negativeRange.concat(positiveRange);
|
|
116
|
+
const out = (0, _uniqWith.default)(together, math.equal);
|
|
157
117
|
return out;
|
|
158
118
|
};
|
|
159
|
-
|
|
160
|
-
var closeTo = function closeTo(a, b, precision) {
|
|
119
|
+
const closeTo = (a, b, precision) => {
|
|
161
120
|
precision = precision || 2;
|
|
162
|
-
|
|
163
|
-
|
|
121
|
+
const expectedDiff = Math.pow(10, -precision) / 2;
|
|
122
|
+
const receivedDiff = Math.abs(a - b);
|
|
164
123
|
return receivedDiff < expectedDiff;
|
|
165
124
|
};
|
|
166
|
-
|
|
167
|
-
var limit = function limit(v, min, max) {
|
|
125
|
+
const limit = (v, min, max) => {
|
|
168
126
|
if (math.smaller(fraction(v), fraction(min))) {
|
|
169
127
|
return min;
|
|
170
128
|
}
|
|
171
|
-
|
|
172
129
|
if (math.larger(fraction(v), fraction(max))) {
|
|
173
130
|
return max;
|
|
174
131
|
}
|
|
175
|
-
|
|
176
132
|
return v;
|
|
177
133
|
};
|
|
134
|
+
|
|
178
135
|
/*
|
|
179
136
|
* Function to get tick interval limits based on min, max and width entered by the user.
|
|
180
137
|
* @param domain object containing max and min value.
|
|
181
138
|
* @param width number represents width of number line.
|
|
182
139
|
* */
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
var min = math.number(math.multiply(10, math.divide(math.fraction(end), width)));
|
|
188
|
-
var max = math.number(math.multiply(20, min));
|
|
140
|
+
const getMinorLimits = (domain, width) => {
|
|
141
|
+
const end = domain.max - domain.min;
|
|
142
|
+
const min = math.number(math.multiply(10, math.divide(math.fraction(end), width)));
|
|
143
|
+
const max = math.number(math.multiply(20, min));
|
|
189
144
|
return {
|
|
190
145
|
min: min,
|
|
191
146
|
max: max
|
|
192
147
|
};
|
|
193
148
|
};
|
|
194
|
-
|
|
195
149
|
exports.getMinorLimits = getMinorLimits;
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
var mod = math.mod(multiple, src);
|
|
150
|
+
const isMultiple = (multiple, src) => {
|
|
151
|
+
const mod = math.mod(multiple, src);
|
|
199
152
|
return math.equal(mod, 0);
|
|
200
153
|
};
|
|
154
|
+
|
|
201
155
|
/**
|
|
202
156
|
* Accepts a fraction object {n,d,s} or number.
|
|
203
157
|
* @param {*} v
|
|
204
158
|
* @return mathjs.fraction
|
|
205
159
|
*/
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
var fraction = function fraction(v) {
|
|
209
|
-
if ((0, _isObject["default"])(v)) {
|
|
160
|
+
const fraction = v => {
|
|
161
|
+
if ((0, _isObject.default)(v)) {
|
|
210
162
|
return math.fraction(v.n * v.s, v.d);
|
|
211
|
-
} else if ((0, _isNumber
|
|
163
|
+
} else if ((0, _isNumber.default)(v)) {
|
|
212
164
|
return math.fraction(v);
|
|
213
165
|
}
|
|
214
166
|
};
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
var isMajorMultiple = isMultiple(major, minor);
|
|
222
|
-
|
|
167
|
+
const normalizeTicks = (domain, width, ticks, opts) => {
|
|
168
|
+
const useLimit = opts ? opts.limit !== false : true;
|
|
169
|
+
const minorLimits = getMinorLimits(domain, width);
|
|
170
|
+
const minor = useLimit ? limit(fraction(ticks.minor), minorLimits.min, minorLimits.max) : fraction(ticks.minor);
|
|
171
|
+
const major = useLimit ? limit(fraction(ticks.major), minor, math.multiply(minor, 20)) : fraction(ticks.major);
|
|
172
|
+
const isMajorMultiple = isMultiple(major, minor);
|
|
223
173
|
if (!isMajorMultiple) {
|
|
224
|
-
|
|
225
|
-
|
|
174
|
+
const multiplier = math.divide(major, minor);
|
|
175
|
+
const multiplyBy = multiplier <= 2 ? 2 : Math.round(multiplier);
|
|
226
176
|
|
|
177
|
+
// major must be a multiple of minor
|
|
227
178
|
return {
|
|
228
|
-
minor
|
|
179
|
+
minor,
|
|
229
180
|
major: math.multiply(minor, multiplyBy)
|
|
230
181
|
};
|
|
231
182
|
}
|
|
232
|
-
|
|
233
183
|
return {
|
|
234
|
-
major
|
|
235
|
-
minor
|
|
184
|
+
major,
|
|
185
|
+
minor
|
|
236
186
|
};
|
|
237
187
|
};
|
|
188
|
+
|
|
238
189
|
/**
|
|
239
190
|
* Build ticks as an array of mathjs Fractions
|
|
240
191
|
*/
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
var buildTickDataAsFractions = function buildTickDataAsFractions(domain, width, ticks, opts) {
|
|
192
|
+
const buildTickDataAsFractions = (domain, width, ticks, opts) => {
|
|
244
193
|
ticks = normalizeTicks(domain, width, ticks, opts);
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
var type = 'minor';
|
|
250
|
-
var modulo = math.mod(x, ticks.major);
|
|
251
|
-
|
|
194
|
+
const rng = simpleRange(domain.min, domain.max, ticks.minor);
|
|
195
|
+
const o = rng.filter(x => math.smallerEq(x, math.fraction(domain.max))).map(x => {
|
|
196
|
+
let type = 'minor';
|
|
197
|
+
const modulo = math.mod(x, ticks.major);
|
|
252
198
|
if (closeTo(math.number(modulo), 0)) {
|
|
253
199
|
type = 'major';
|
|
254
200
|
}
|
|
255
|
-
|
|
256
201
|
return {
|
|
257
|
-
x
|
|
258
|
-
type
|
|
202
|
+
x,
|
|
203
|
+
type
|
|
259
204
|
};
|
|
260
205
|
});
|
|
261
206
|
return o;
|
|
262
207
|
};
|
|
208
|
+
|
|
263
209
|
/*
|
|
264
210
|
* This function will generate tick interval values based on min and max limits of ticks.
|
|
265
211
|
* @param minorLimits object containing min and max values
|
|
266
212
|
* @return out object containing three arrays 1. fraction values, 2. decimal values,
|
|
267
213
|
* */
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
var generateMinorValues = function generateMinorValues(minorLimits) {
|
|
271
|
-
var out = {
|
|
214
|
+
const generateMinorValues = minorLimits => {
|
|
215
|
+
let out = {
|
|
272
216
|
fraction: [],
|
|
273
217
|
decimal: []
|
|
274
218
|
};
|
|
275
|
-
decimalTickValues.forEach(
|
|
219
|
+
decimalTickValues.forEach(value => {
|
|
276
220
|
if (value >= minorLimits.min && value <= minorLimits.max) {
|
|
277
221
|
out.decimal.push(value);
|
|
278
222
|
}
|
|
279
223
|
});
|
|
280
|
-
fractionTickValues.forEach(
|
|
281
|
-
|
|
282
|
-
|
|
224
|
+
fractionTickValues.forEach(value => {
|
|
225
|
+
let decimalValue = math.number(math.fraction(value));
|
|
283
226
|
if (decimalValue >= minorLimits.min && decimalValue <= minorLimits.max) {
|
|
284
227
|
out.fraction.push(value);
|
|
285
228
|
}
|
|
286
229
|
});
|
|
287
230
|
return out;
|
|
288
231
|
};
|
|
232
|
+
|
|
289
233
|
/*
|
|
290
234
|
* This function will generate label interval values for provided tick interval value.
|
|
291
235
|
* @param minor number representing tick interval value.
|
|
@@ -293,77 +237,60 @@ var generateMinorValues = function generateMinorValues(minorLimits) {
|
|
|
293
237
|
* @param width number representing width of number line.
|
|
294
238
|
* @return out object containing three arrays 1. fraction values, 2. decimal values,
|
|
295
239
|
* */
|
|
296
|
-
|
|
297
|
-
|
|
298
240
|
exports.generateMinorValues = generateMinorValues;
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
var out = {
|
|
241
|
+
const generateMajorValuesForMinor = (minor, domain, width) => {
|
|
242
|
+
let out = {
|
|
302
243
|
decimal: [],
|
|
303
244
|
fraction: []
|
|
304
245
|
};
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
246
|
+
let fraction = math.fraction(math.number(math.number(minor)));
|
|
247
|
+
let n = fraction.n;
|
|
248
|
+
let d = fraction.d;
|
|
309
249
|
if (n >= 1 && d === 1) {
|
|
310
|
-
for (
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
250
|
+
for (let i = 1; i <= 10; i++) {
|
|
251
|
+
let num = math.number(math.multiply(n, i));
|
|
252
|
+
//Here we check if this major value can plot at least 2 points on number line.
|
|
253
|
+
let ticksData = {
|
|
314
254
|
minor: minor,
|
|
315
255
|
major: num
|
|
316
256
|
};
|
|
317
|
-
|
|
257
|
+
let output = buildTickData(domain, width, ticksData, {
|
|
318
258
|
fraction: undefined
|
|
319
259
|
});
|
|
320
|
-
|
|
321
|
-
if (output.filter(function (x) {
|
|
322
|
-
return x.type === 'major';
|
|
323
|
-
}).length > 1) {
|
|
260
|
+
if (output.filter(x => x.type === 'major').length > 1) {
|
|
324
261
|
out.fraction.push(num.toString());
|
|
325
262
|
out.decimal.push(num);
|
|
326
263
|
}
|
|
327
264
|
}
|
|
328
265
|
} else {
|
|
329
|
-
for (
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
var _ticksData = {
|
|
266
|
+
for (const multiplierKey in labelMultiplier[d]) {
|
|
267
|
+
let num = math.multiply(math.fraction(n, d), labelMultiplier[d][multiplierKey]);
|
|
268
|
+
//Here we check if this major value can plot at least 2 points on number line.
|
|
269
|
+
let ticksData = {
|
|
334
270
|
minor: minor,
|
|
335
|
-
major: math.number(
|
|
271
|
+
major: math.number(num)
|
|
336
272
|
};
|
|
337
|
-
|
|
338
|
-
var _output = buildTickData(domain, width, _ticksData, {
|
|
273
|
+
let output = buildTickData(domain, width, ticksData, {
|
|
339
274
|
fraction: undefined
|
|
340
275
|
});
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
}).length > 1) {
|
|
345
|
-
if (_num.d !== 1) {
|
|
346
|
-
out.fraction.push(_num.n + '/' + _num.d);
|
|
276
|
+
if (output.filter(x => x.type === 'major').length > 1) {
|
|
277
|
+
if (num.d !== 1) {
|
|
278
|
+
out.fraction.push(num.n + '/' + num.d);
|
|
347
279
|
} else {
|
|
348
|
-
out.fraction.push(
|
|
280
|
+
out.fraction.push(num.n.toString());
|
|
349
281
|
}
|
|
350
|
-
|
|
351
|
-
out.decimal.push(math.number(_num));
|
|
282
|
+
out.decimal.push(math.number(num));
|
|
352
283
|
}
|
|
353
284
|
}
|
|
354
285
|
}
|
|
355
|
-
|
|
356
286
|
return out;
|
|
357
287
|
};
|
|
358
|
-
|
|
359
288
|
exports.generateMajorValuesForMinor = generateMajorValuesForMinor;
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
x: math.number(o.x) || 0
|
|
366
|
-
});
|
|
289
|
+
const buildTickData = (domain, width, ticks, opts) => {
|
|
290
|
+
const result = buildTickDataAsFractions(domain, width, ticks, opts);
|
|
291
|
+
const out = result.map(o => opts.fraction ? o : {
|
|
292
|
+
...o,
|
|
293
|
+
x: math.number(o.x) || 0
|
|
367
294
|
});
|
|
368
295
|
return out;
|
|
369
296
|
};
|