@pie-element/drag-in-the-blank 3.12.1 → 3.12.6
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/CHANGELOG.md +16 -0
- package/configure/CHANGELOG.md +16 -0
- package/configure/lib/choices.js +27 -4
- package/configure/lib/choices.js.map +1 -1
- package/configure/package.json +4 -4
- package/controller/package.json +1 -1
- package/lib/main.js +11 -17
- package/lib/main.js.map +1 -1
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,22 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [3.12.5](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@3.12.4...@pie-element/drag-in-the-blank@3.12.5) (2021-12-13)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @pie-element/drag-in-the-blank
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## [3.12.2](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@3.12.1...@pie-element/drag-in-the-blank@3.12.2) (2021-11-29)
|
|
15
|
+
|
|
16
|
+
**Note:** Version bump only for package @pie-element/drag-in-the-blank
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
6
22
|
## [3.12.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@3.11.4...@pie-element/drag-in-the-blank@3.12.1) (2021-11-11)
|
|
7
23
|
|
|
8
24
|
**Note:** Version bump only for package @pie-element/drag-in-the-blank
|
package/configure/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,22 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [3.6.9](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@3.6.8...@pie-element/drag-in-the-blank-configure@3.6.9) (2021-12-13)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @pie-element/drag-in-the-blank-configure
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## [3.6.6](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@3.6.5...@pie-element/drag-in-the-blank-configure@3.6.6) (2021-11-29)
|
|
15
|
+
|
|
16
|
+
**Note:** Version bump only for package @pie-element/drag-in-the-blank-configure
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
6
22
|
## [3.6.5](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@3.6.4...@pie-element/drag-in-the-blank-configure@3.6.5) (2021-10-04)
|
|
7
23
|
|
|
8
24
|
**Note:** Version bump only for package @pie-element/drag-in-the-blank-configure
|
package/configure/lib/choices.js
CHANGED
|
@@ -61,10 +61,11 @@ window.renMath = _mathRendering.renderMath;
|
|
|
61
61
|
|
|
62
62
|
var InfoDialog = function InfoDialog(_ref) {
|
|
63
63
|
var open = _ref.open,
|
|
64
|
+
title = _ref.title,
|
|
64
65
|
onOk = _ref.onOk;
|
|
65
66
|
return /*#__PURE__*/_react["default"].createElement(_Dialog["default"], {
|
|
66
67
|
open: open
|
|
67
|
-
}, /*#__PURE__*/_react["default"].createElement(_DialogTitle["default"], null,
|
|
68
|
+
}, /*#__PURE__*/_react["default"].createElement(_DialogTitle["default"], null, title || ''), /*#__PURE__*/_react["default"].createElement(_DialogActions["default"], null, onOk && /*#__PURE__*/_react["default"].createElement(_Button["default"], {
|
|
68
69
|
onClick: onOk,
|
|
69
70
|
color: "primary"
|
|
70
71
|
}, "OK")));
|
|
@@ -72,7 +73,8 @@ var InfoDialog = function InfoDialog(_ref) {
|
|
|
72
73
|
|
|
73
74
|
InfoDialog.propTypes = {
|
|
74
75
|
open: _propTypes["default"].bool,
|
|
75
|
-
onOk: _propTypes["default"].func
|
|
76
|
+
onOk: _propTypes["default"].func,
|
|
77
|
+
title: _propTypes["default"].string
|
|
76
78
|
};
|
|
77
79
|
|
|
78
80
|
var styles = function styles(theme) {
|
|
@@ -122,9 +124,9 @@ var Choices = /*#__PURE__*/function (_React$Component) {
|
|
|
122
124
|
alternateResponses = model.alternateResponses;
|
|
123
125
|
var exists = (choices || []).filter(function (c) {
|
|
124
126
|
return c.value === val;
|
|
125
|
-
});
|
|
127
|
+
}); // discard the new added choice if it is a duplicate
|
|
126
128
|
|
|
127
|
-
if (exists.length) {
|
|
129
|
+
if (prevValue === '' && exists.length) {
|
|
128
130
|
var _newChoices = (choices || []).filter(function (c) {
|
|
129
131
|
return c.id !== key;
|
|
130
132
|
});
|
|
@@ -134,6 +136,26 @@ var Choices = /*#__PURE__*/function (_React$Component) {
|
|
|
134
136
|
_this.setState({
|
|
135
137
|
dialog: {
|
|
136
138
|
open: true,
|
|
139
|
+
message: 'Identical answer choices are not allowed and will be discarded',
|
|
140
|
+
onOk: function onOk() {
|
|
141
|
+
_this.setState({
|
|
142
|
+
dialog: {
|
|
143
|
+
open: false
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
return;
|
|
151
|
+
} // discard the change if the choice would be a duplicate to one that already exists
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
if (exists.length) {
|
|
155
|
+
_this.setState({
|
|
156
|
+
dialog: {
|
|
157
|
+
open: true,
|
|
158
|
+
message: 'Identical answer choices are not allowed and the changes will be discarded',
|
|
137
159
|
onOk: function onOk() {
|
|
138
160
|
_this.setState({
|
|
139
161
|
dialog: {
|
|
@@ -280,6 +302,7 @@ var Choices = /*#__PURE__*/function (_React$Component) {
|
|
|
280
302
|
className: classes.design
|
|
281
303
|
}, /*#__PURE__*/_react["default"].createElement(InfoDialog, {
|
|
282
304
|
open: dialog.open,
|
|
305
|
+
title: dialog.message,
|
|
283
306
|
onOk: dialog.onOk
|
|
284
307
|
}), /*#__PURE__*/_react["default"].createElement(_Button["default"], {
|
|
285
308
|
className: classes.addButton,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/choices.jsx"],"names":["window","renMath","renderMath","InfoDialog","open","onOk","propTypes","PropTypes","bool","func","styles","theme","design","marginTop","spacing","unit","altChoices","alignItems","display","flexWrap","justifyContent","padding","marginBottom","Choices","dialog","prevValue","val","key","props","onChange","model","choices","correctResponse","alternateResponses","exists","filter","c","value","length","newChoices","id","setState","map","usedForResponse","Object","keys","forEach","responseKey","values","alternate","indexOf","alert","newChoicesWithoutTheEmptyOne","choice","focusedEl","oldChoices","duplicates","v","domNode","ReactDOM","findDOMNode","focusedNodeRef","focus","state","classes","toolbarOpts","visibleChoices","getVisibleChoices","addButton","onAddChoice","index","minWidth","zIndex","ref","prompt","video","disabled","audio","onChoiceChanged","undefined","onChoiceFocus","handleChoiceRemove","React","Component","object","isRequired","Styled"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;AAEAA,MAAM,CAACC,OAAP,GAAiBC,yBAAjB;;AAEA,IAAMC,UAAU,GAAG,SAAbA,UAAa;AAAA,MAAGC,IAAH,QAAGA,IAAH;AAAA,MAASC,IAAT,QAASA,IAAT;AAAA,sBACjB,gCAAC,kBAAD;AAAQ,IAAA,IAAI,EAAED;AAAd,kBACE,gCAAC,uBAAD,yEADF,eAEE,gCAAC,yBAAD,QACGC,IAAI,iBACH,gCAAC,kBAAD;AAAQ,IAAA,OAAO,EAAEA,IAAjB;AAAuB,IAAA,KAAK,EAAC;AAA7B,UAFJ,CAFF,CADiB;AAAA,CAAnB;;AAaAF,UAAU,CAACG,SAAX,GAAuB;AACrBF,EAAAA,IAAI,EAAEG,sBAAUC,IADK;AAErBH,EAAAA,IAAI,EAAEE,sBAAUE;AAFK,CAAvB;;AAKA,IAAMC,MAAM,GAAG,SAATA,MAAS,CAAAC,KAAK;AAAA,SAAK;AACvBC,IAAAA,MAAM,EAAE;AACNC,MAAAA,SAAS,EAAEF,KAAK,CAACG,OAAN,CAAcC,IAAd,GAAqB;AAD1B,KADe;AAIvBC,IAAAA,UAAU,EAAE;AACVC,MAAAA,UAAU,EAAE,YADF;AAEVC,MAAAA,OAAO,EAAE,MAFC;AAGVC,MAAAA,QAAQ,EAAE,MAHA;AAIVC,MAAAA,cAAc,EAAE,cAJN;AAKVC,MAAAA,OAAO,EAAE,YALC;AAMV,eAAS;AACPC,QAAAA,YAAY,EAAE;AADP;AANC;AAJW,GAAL;AAAA,CAApB;;IAgBaC,O;;;;;;;;;;;;;;;8FASH;AACNC,MAAAA,MAAM,EAAE;AACNpB,QAAAA,IAAI,EAAE;AADA;AADF,K;wGAiBU,UAACqB,SAAD,EAAYC,GAAZ,EAAiBC,GAAjB,EAAyB;AACzC,wBAA4B,MAAKC,KAAjC;AAAA,UAAQC,QAAR,eAAQA,QAAR;AAAA,UAAkBC,KAAlB,eAAkBA,KAAlB;AACA,UAAQC,OAAR,GAAyDD,KAAzD,CAAQC,OAAR;AAAA,UAAiBC,eAAjB,GAAyDF,KAAzD,CAAiBE,eAAjB;AAAA,UAAkCC,kBAAlC,GAAyDH,KAAzD,CAAkCG,kBAAlC;AACA,UAAMC,MAAM,GAAG,CAACH,OAAO,IAAI,EAAZ,EAAgBI,MAAhB,CAAuB,UAAAC,CAAC;AAAA,eAAIA,CAAC,CAACC,KAAF,KAAYX,GAAhB;AAAA,OAAxB,CAAf;;AAEA,UAAGQ,MAAM,CAACI,MAAV,EAAkB;AAChB,YAAMC,WAAU,GAAG,CAACR,OAAO,IAAI,EAAZ,EAAgBI,MAAhB,CAAuB,UAAAC,CAAC;AAAA,iBAAIA,CAAC,CAACI,EAAF,KAASb,GAAb;AAAA,SAAxB,CAAnB;;AAEAE,QAAAA,QAAQ,CAACU,WAAD,CAAR;;AAEA,cAAKE,QAAL,CAAc;AACZjB,UAAAA,MAAM,EAAE;AACNpB,YAAAA,IAAI,EAAE,IADA;AAENC,YAAAA,IAAI,EAAE,gBAAM;AACV,oBAAKoC,QAAL,CACE;AACEjB,gBAAAA,MAAM,EAAE;AACNpB,kBAAAA,IAAI,EAAE;AADA;AADV,eADF;AAOD;AAVK;AADI,SAAd;;AAeA;AACD;;AAED,UAAMmC,UAAU,GAAGR,OAAO,GACtBA,OAAO,CAACW,GAAR,CAAY,UAAAN,CAAC,EAAI;AACjB,YAAIA,CAAC,CAACI,EAAF,KAASb,GAAb,EAAkB;AAChB,iDAAYS,CAAZ;AAAeC,YAAAA,KAAK,EAAEX;AAAtB;AACD;;AAED,eAAOU,CAAP;AACD,OANC,CADsB,GAQtB,EARJ;;AAUA,UAAI,gCAAc;AAAEC,QAAAA,KAAK,EAAEX;AAAT,OAAd,CAAJ,EAAmC;AACjC;AACA,YAAIiB,eAAe,GAAG,KAAtB;;AAEA,YAAIX,eAAJ,EAAqB;AACnBY,UAAAA,MAAM,CAACC,IAAP,CAAYb,eAAZ,EAA6Bc,OAA7B,CAAqC,UAAAC,WAAW,EAAI;AAClD,gBAAIf,eAAe,CAACe,WAAD,CAAf,KAAiCpB,GAArC,EAA0C;AACxCgB,cAAAA,eAAe,GAAG,IAAlB;AACD;AACF,WAJD;AAKD;;AAED,YAAIV,kBAAJ,EAAwB;AACtBW,UAAAA,MAAM,CAACI,MAAP,CAAcf,kBAAd,EAAkCa,OAAlC,CAA0C,UAAAG,SAAS,EAAI;AACrD,gBAAIA,SAAS,CAACC,OAAV,CAAkBvB,GAAlB,KAA0B,CAA9B,EAAiC;AAC/BgB,cAAAA,eAAe,GAAG,IAAlB;AACD;AACF,WAJD;AAKD;;AAED,YAAIA,eAAJ,EAAqB;AACnBQ,UAAAA,KAAK,CAAC,iCAAD,CAAL;AACD,SAFD,MAEO;AACL,cAAI,CAAC,gCAAc;AAAEd,YAAAA,KAAK,EAAEZ;AAAT,WAAd,CAAL,EAA0C;AACxC;AACA,gBAAM2B,4BAA4B,GAAGb,UAAU,CAACJ,MAAX,CAAkB,UAAAkB,MAAM;AAAA,qBAAIA,MAAM,CAACb,EAAP,KAAcb,GAAlB;AAAA,aAAxB,CAArC;AAEAE,YAAAA,QAAQ,CAACuB,4BAAD,CAAR;AACD,WALD,MAKO;AACLvB,YAAAA,QAAQ,CAACU,UAAD,CAAR;AACD;AACF;AACF,OAhCD,MAgCO;AACLV,QAAAA,QAAQ,CAACU,UAAD,CAAR;AACD;AACF,K;sGAEe,UAAAC,EAAE;AAAA,aAAI,MAAKC,QAAL,CAAc;AAClCa,QAAAA,SAAS,EAAEd;AADuB,OAAd,CAAJ;AAAA,K;oGAIJ,YAAM;AAClB,yBAAqD,MAAKZ,KAA1D;AAAA,UAA0B2B,UAA1B,gBAAQzB,KAAR,CAAiBC,OAAjB;AAAA,UAAwCF,QAAxC,gBAAwCA,QAAxC;;AAEA,YAAKY,QAAL,CAAc;AACZa,QAAAA,SAAS,YAAKC,UAAU,CAACjB,MAAhB;AADG,OAAd,EAEG,YAAM;AACPT,QAAAA,QAAQ,+CACD0B,UADC,IAEJ;AACEf,UAAAA,EAAE,YAAKe,UAAU,CAACjB,MAAhB,CADJ;AAEED,UAAAA,KAAK,EAAE;AAFT,SAFI,GAAR;AAQD,OAXD;AAYD,K;2GAEoB,UAAAG,EAAE,EAAI;AACzB,yBAAyC,MAAKZ,KAA9C;AAAA,UAAQC,QAAR,gBAAQA,QAAR;AAAA,UAA2BE,OAA3B,gBAAkBD,KAAlB,CAA2BC,OAA3B;AACA,UAAMQ,UAAU,GAAGR,OAAO,CAACI,MAAR,CAAe,UAAAC,CAAC;AAAA,eAAIA,CAAC,CAACI,EAAF,KAASA,EAAb;AAAA,OAAhB,CAAnB;AAEAX,MAAAA,QAAQ,CAACU,UAAD,CAAR;AACD,K;0GAEmB,YAAM;AACxB,yBAGI,MAAKX,KAHT;AAAA,UACE4B,UADF,gBACEA,UADF;AAAA,4CAEE1B,KAFF;AAAA,UAEWC,OAFX,sBAEWA,OAFX;AAAA,UAEoBC,eAFpB,sBAEoBA,eAFpB;;AAKA,UAAI,CAACD,OAAL,EAAc;AACZ,eAAO,EAAP;AACD;;AAED,UAAIyB,UAAJ,EAAgB;AACd,eAAOzB,OAAP;AACD,OAZuB,CAcxB;;;AACA,aAAOA,OAAO,CAACI,MAAR,CAAe,UAAAkB,MAAM;AAAA,eAAI,CAAC,sBAAKrB,eAAL,EAAsB,UAAAyB,CAAC;AAAA,iBAAIA,CAAC,KAAKJ,MAAM,CAACb,EAAjB;AAAA,SAAvB,CAAL;AAAA,OAArB,CAAP;AACD,K;;;;;;WAlID,8BAAqB;AACnB;AACA,UAAMkB,OAAO,GAAGC,qBAASC,WAAT,CAAqB,IAArB,CAAhB;;AAEA,qCAAWF,OAAX;;AAEA,UAAI,KAAKG,cAAT,EAAyB;AACvB,aAAKA,cAAL,CAAoBC,KAApB,CAA0B,KAA1B;AACD;AACF;;;WA2HD,kBAAS;AAAA;;AACP,wBAA8B,KAAKC,KAAnC;AAAA,UAAQT,SAAR,eAAQA,SAAR;AAAA,UAAmB9B,MAAnB,eAAmBA,MAAnB;AACA,yBAII,KAAKI,KAJT;AAAA,UACEoC,OADF,gBACEA,OADF;AAAA,UAEER,UAFF,gBAEEA,UAFF;AAAA,UAGES,WAHF,gBAGEA,WAHF;AAKA,UAAMC,cAAc,GAAG,KAAKC,iBAAL,MAA4B,EAAnD;AAEA,0BACE;AAAK,QAAA,SAAS,EAAEH,OAAO,CAACpD;AAAxB,sBACE,gCAAC,UAAD;AACE,QAAA,IAAI,EAAEY,MAAM,CAACpB,IADf;AAEE,QAAA,IAAI,EAAEoB,MAAM,CAACnB;AAFf,QADF,eAKE,gCAAC,kBAAD;AACE,QAAA,SAAS,EAAE2D,OAAO,CAACI,SADrB;AAEE,QAAA,OAAO,EAAC,WAFV;AAGE,QAAA,KAAK,EAAC,SAHR;AAIE,QAAA,OAAO,EAAE,KAAKC;AAJhB,sBALF,eAaE;AACE,QAAA,SAAS,EAAEL,OAAO,CAAChD;AADrB,SAIIkD,cAAc,CAACxB,GAAf,CAAmB,UAACN,CAAD,EAAIkC,KAAJ,EAAc;AAC/B,YAAIhB,SAAS,KAAKlB,CAAC,CAACI,EAApB,EAAwB;AACtB,8BACE;AACE,YAAA,GAAG,EAAE8B,KADP;AAEE,YAAA,KAAK,EAAE;AACLC,cAAAA,QAAQ,EAAE,MADL;AAELC,cAAAA,MAAM,EAAE;AAFH;AAFT,0BAOE,gCAAC,wBAAD;AACE,YAAA,GAAG,EAAE,aAAAC,KAAG;AAAA,qBAAK,MAAI,CAACZ,cAAL,GAAsBY,KAA3B;AAAA,aADV;AAEE,YAAA,SAAS,EAAET,OAAO,CAACU,MAFrB;AAGE,YAAA,MAAM,EAAEtC,CAAC,CAACC,KAHZ;AAIE,YAAA,WAAW,EAAE;AACXsC,cAAAA,KAAK,EAAE;AACLC,gBAAAA,QAAQ,EAAE;AADL,eADI;AAIXC,cAAAA,KAAK,EAAE;AACLD,gBAAAA,QAAQ,EAAE;AADL;AAJI,aAJf;AAYE,YAAA,QAAQ,EAAE,kBAAAlD,GAAG;AAAA,qBAAI,MAAI,CAACoD,eAAL,CAAqB1C,CAAC,CAACC,KAAvB,EAA8BX,GAA9B,EAAmCU,CAAC,CAACI,EAArC,CAAJ;AAAA,aAZf;AAaE,YAAA,MAAM,EAAE,kBAAM;AACZ,cAAA,MAAI,CAACC,QAAL,CAAc;AACZa,gBAAAA,SAAS,EAAEyB;AADC,eAAd;AAGD,aAjBH;AAkBE,YAAA,gBAAgB,MAlBlB;AAmBE,YAAA,WAAW,EAAEd;AAnBf,YAPF,CADF;AA+BD;;AAED,4BACE,gCAAC,kBAAD;AACE,UAAA,GAAG,EAAEK,KADP;AAEE,UAAA,UAAU,EAAEd,UAFd;AAGE,UAAA,QAAQ,EAAC,GAHX;AAIE,UAAA,MAAM,EAAEpB,CAJV;AAKE,UAAA,OAAO,EAAE;AAAA,mBAAM,MAAI,CAAC4C,aAAL,CAAmB5C,CAAC,CAACI,EAArB,CAAN;AAAA,WALX;AAME,UAAA,cAAc,EAAE;AAAA,mBAAM,MAAI,CAACyC,kBAAL,CAAwB7C,CAAC,CAACI,EAA1B,CAAN;AAAA;AANlB,UADF;AAUD,OA7CD,CAJJ,CAbF,CADF;AAoED;;;EAhO0B0C,kBAAMC,S;;;iCAAtB5D,O,eACQ;AACjBiC,EAAAA,UAAU,EAAEjD,sBAAUC,IADL;AAEjBsB,EAAAA,KAAK,EAAEvB,sBAAU6E,MAAV,CAAiBC,UAFP;AAGjBxD,EAAAA,QAAQ,EAAEtB,sBAAUE,IAAV,CAAe4E,UAHR;AAIjBrB,EAAAA,OAAO,EAAEzD,sBAAU6E,MAAV,CAAiBC,UAJT;AAKjBpB,EAAAA,WAAW,EAAE1D,sBAAU6E;AALN,C;AAkOrB,IAAME,MAAM,GAAG,wBAAW5E,MAAX,EAAmBa,OAAnB,CAAf;eAEe+D,M","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport EditableHtml from '@pie-lib/editable-html';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport find from 'lodash/find';\nimport Button from '@material-ui/core/Button';\nimport Choice from './choice';\nimport { choiceIsEmpty } from './markupUtils';\nimport { withStyles } from '@material-ui/core/styles';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogActions from '@material-ui/core/DialogActions';\n\nwindow.renMath = renderMath;\n\nconst InfoDialog = ({ open, onOk }) => (\n <Dialog open={open}>\n <DialogTitle>Identical answer choices are not allowed and will be discarded</DialogTitle>\n <DialogActions>\n {onOk && (\n <Button onClick={onOk} color=\"primary\">\n OK\n </Button>\n )}\n </DialogActions>\n </Dialog>\n);\n\nInfoDialog.propTypes = {\n open: PropTypes.bool,\n onOk: PropTypes.func,\n};\n\nconst styles = theme => ({\n design: {\n marginTop: theme.spacing.unit * 2\n },\n altChoices: {\n alignItems: 'flex-start',\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-evenly',\n padding: '20px 0 0 0',\n '& > *': {\n marginBottom: '20px'\n }\n }\n});\n\nexport class Choices extends React.Component {\n static propTypes = {\n duplicates: PropTypes.bool,\n model: PropTypes.object.isRequired,\n onChange: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired,\n toolbarOpts: PropTypes.object\n };\n\n state = {\n dialog: {\n open: false\n }\n };\n\n componentDidUpdate() {\n //eslint-disable-next-line\n const domNode = ReactDOM.findDOMNode(this);\n\n renderMath(domNode);\n\n if (this.focusedNodeRef) {\n this.focusedNodeRef.focus('end');\n }\n }\n\n onChoiceChanged = (prevValue, val, key) => {\n const { onChange, model } = this.props;\n const { choices, correctResponse, alternateResponses } = model;\n const exists = (choices || []).filter(c => c.value === val);\n\n if(exists.length) {\n const newChoices = (choices || []).filter(c => c.id !== key);\n\n onChange(newChoices);\n\n this.setState({\n dialog: {\n open: true,\n onOk: () => {\n this.setState(\n {\n dialog: {\n open: false\n }\n }\n );\n }\n }\n });\n\n return;\n }\n\n const newChoices = choices\n ? choices.map(c => {\n if (c.id === key) {\n return { ...c, value: val };\n }\n\n return c;\n })\n : [];\n\n if (choiceIsEmpty({ value: val })) {\n // if the edited content is empty, its usage has to be searched in the correct response definitions\n let usedForResponse = false;\n\n if (correctResponse) {\n Object.keys(correctResponse).forEach(responseKey => {\n if (correctResponse[responseKey] === key) {\n usedForResponse = true;\n }\n });\n }\n\n if (alternateResponses) {\n Object.values(alternateResponses).forEach(alternate => {\n if (alternate.indexOf(key) >= 0) {\n usedForResponse = true;\n }\n });\n }\n\n if (usedForResponse) {\n alert('Answer choices cannot be blank.');\n } else {\n if (!choiceIsEmpty({ value: prevValue })) {\n // if the previous value was not empty, it means that the choice can be deleted\n const newChoicesWithoutTheEmptyOne = newChoices.filter(choice => choice.id !== key);\n\n onChange(newChoicesWithoutTheEmptyOne);\n } else {\n onChange(newChoices);\n }\n }\n } else {\n onChange(newChoices);\n }\n };\n\n onChoiceFocus = id => this.setState({\n focusedEl: id\n });\n\n onAddChoice = () => {\n const { model: { choices: oldChoices }, onChange } = this.props;\n\n this.setState({\n focusedEl: `${oldChoices.length}`\n }, () => {\n onChange([\n ...oldChoices,\n {\n id: `${oldChoices.length}`,\n value: ''\n }\n ]\n );\n });\n };\n\n handleChoiceRemove = id => {\n const { onChange, model: { choices } } = this.props;\n const newChoices = choices.filter(c => c.id !== id);\n\n onChange(newChoices);\n };\n\n getVisibleChoices = () => {\n const {\n duplicates,\n model: { choices, correctResponse }\n } = this.props;\n\n if (!choices) {\n return [];\n }\n\n if (duplicates) {\n return choices;\n }\n\n // if duplicates not allowed, remove the choices that are used to define the correct response\n return choices.filter(choice => !find(correctResponse, v => v === choice.id));\n };\n\n render() {\n const { focusedEl, dialog } = this.state;\n const {\n classes,\n duplicates,\n toolbarOpts\n } = this.props;\n const visibleChoices = this.getVisibleChoices() || [];\n\n return (\n <div className={classes.design}>\n <InfoDialog\n open={dialog.open}\n onOk={dialog.onOk}\n />\n <Button\n className={classes.addButton}\n variant=\"contained\"\n color=\"primary\"\n onClick={this.onAddChoice}\n >\n Add Choice\n </Button>\n <div\n className={classes.altChoices}\n >\n {\n visibleChoices.map((c, index) => {\n if (focusedEl === c.id) {\n return (\n <div\n key={index}\n style={{\n minWidth: '100%',\n zIndex: '100'\n }}\n >\n <EditableHtml\n ref={ref => (this.focusedNodeRef = ref)}\n className={classes.prompt}\n markup={c.value}\n pluginProps={{\n video: {\n disabled: true\n },\n audio: {\n disabled: true\n }\n }}\n onChange={val => this.onChoiceChanged(c.value, val, c.id)}\n onDone={() => {\n this.setState({\n focusedEl: undefined\n });\n }}\n disableUnderline\n toolbarOpts={toolbarOpts}\n />\n </div>\n );\n }\n\n return (\n <Choice\n key={index}\n duplicates={duplicates}\n targetId=\"0\"\n choice={c}\n onClick={() => this.onChoiceFocus(c.id)}\n onRemoveChoice={() => this.handleChoiceRemove(c.id)}\n />\n );\n })\n }\n </div>\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(Choices);\n\nexport default Styled;\n"],"file":"choices.js"}
|
|
1
|
+
{"version":3,"sources":["../src/choices.jsx"],"names":["window","renMath","renderMath","InfoDialog","open","title","onOk","propTypes","PropTypes","bool","func","string","styles","theme","design","marginTop","spacing","unit","altChoices","alignItems","display","flexWrap","justifyContent","padding","marginBottom","Choices","dialog","prevValue","val","key","props","onChange","model","choices","correctResponse","alternateResponses","exists","filter","c","value","length","newChoices","id","setState","message","map","usedForResponse","Object","keys","forEach","responseKey","values","alternate","indexOf","alert","newChoicesWithoutTheEmptyOne","choice","focusedEl","oldChoices","duplicates","v","domNode","ReactDOM","findDOMNode","focusedNodeRef","focus","state","classes","toolbarOpts","visibleChoices","getVisibleChoices","addButton","onAddChoice","index","minWidth","zIndex","ref","prompt","video","disabled","audio","onChoiceChanged","undefined","onChoiceFocus","handleChoiceRemove","React","Component","object","isRequired","Styled"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport EditableHtml from '@pie-lib/editable-html';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport find from 'lodash/find';\nimport Button from '@material-ui/core/Button';\nimport Choice from './choice';\nimport { choiceIsEmpty } from './markupUtils';\nimport { withStyles } from '@material-ui/core/styles';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogActions from '@material-ui/core/DialogActions';\n\nwindow.renMath = renderMath;\n\nconst InfoDialog = ({ open, title, onOk }) => (\n <Dialog open={open}>\n <DialogTitle>{title || ''}</DialogTitle>\n <DialogActions>\n {onOk && (\n <Button onClick={onOk} color=\"primary\">\n OK\n </Button>\n )}\n </DialogActions>\n </Dialog>\n);\n\nInfoDialog.propTypes = {\n open: PropTypes.bool,\n onOk: PropTypes.func,\n title: PropTypes.string\n};\n\nconst styles = theme => ({\n design: {\n marginTop: theme.spacing.unit * 2\n },\n altChoices: {\n alignItems: 'flex-start',\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-evenly',\n padding: '20px 0 0 0',\n '& > *': {\n marginBottom: '20px'\n }\n }\n});\n\nexport class Choices extends React.Component {\n static propTypes = {\n duplicates: PropTypes.bool,\n model: PropTypes.object.isRequired,\n onChange: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired,\n toolbarOpts: PropTypes.object\n };\n\n state = {\n dialog: {\n open: false\n }\n };\n\n componentDidUpdate() {\n //eslint-disable-next-line\n const domNode = ReactDOM.findDOMNode(this);\n\n renderMath(domNode);\n\n if (this.focusedNodeRef) {\n this.focusedNodeRef.focus('end');\n }\n }\n\n onChoiceChanged = (prevValue, val, key) => {\n const { onChange, model } = this.props;\n const { choices, correctResponse, alternateResponses } = model;\n const exists = (choices || []).filter(c => c.value === val);\n\n // discard the new added choice if it is a duplicate\n if (prevValue === '' && exists.length) {\n const newChoices = (choices || []).filter(c => c.id !== key);\n\n onChange(newChoices);\n\n this.setState({\n dialog: {\n open: true,\n message:\n 'Identical answer choices are not allowed and will be discarded',\n onOk: () => {\n this.setState(\n {\n dialog: {\n open: false\n }\n }\n );\n }\n }\n });\n\n return;\n }\n\n // discard the change if the choice would be a duplicate to one that already exists\n if(exists.length) {\n this.setState({\n dialog: {\n open: true,\n message: 'Identical answer choices are not allowed and the changes will be discarded',\n onOk: () => {\n this.setState(\n {\n dialog: {\n open: false\n }\n }\n );\n }\n }\n });\n\n return;\n }\n\n const newChoices = choices\n ? choices.map(c => {\n if (c.id === key) {\n return { ...c, value: val };\n }\n\n return c;\n })\n : [];\n\n if (choiceIsEmpty({ value: val })) {\n // if the edited content is empty, its usage has to be searched in the correct response definitions\n let usedForResponse = false;\n\n if (correctResponse) {\n Object.keys(correctResponse).forEach(responseKey => {\n if (correctResponse[responseKey] === key) {\n usedForResponse = true;\n }\n });\n }\n\n if (alternateResponses) {\n Object.values(alternateResponses).forEach(alternate => {\n if (alternate.indexOf(key) >= 0) {\n usedForResponse = true;\n }\n });\n }\n\n if (usedForResponse) {\n alert('Answer choices cannot be blank.');\n } else {\n if (!choiceIsEmpty({ value: prevValue })) {\n // if the previous value was not empty, it means that the choice can be deleted\n const newChoicesWithoutTheEmptyOne = newChoices.filter(choice => choice.id !== key);\n\n onChange(newChoicesWithoutTheEmptyOne);\n } else {\n onChange(newChoices);\n }\n }\n } else {\n onChange(newChoices);\n }\n };\n\n onChoiceFocus = id => this.setState({\n focusedEl: id\n });\n\n onAddChoice = () => {\n const { model: { choices: oldChoices }, onChange } = this.props;\n\n this.setState({\n focusedEl: `${oldChoices.length}`\n }, () => {\n onChange([\n ...oldChoices,\n {\n id: `${oldChoices.length}`,\n value: ''\n }\n ]\n );\n });\n };\n\n handleChoiceRemove = id => {\n const { onChange, model: { choices } } = this.props;\n const newChoices = choices.filter(c => c.id !== id);\n\n onChange(newChoices);\n };\n\n getVisibleChoices = () => {\n const {\n duplicates,\n model: { choices, correctResponse }\n } = this.props;\n\n if (!choices) {\n return [];\n }\n\n if (duplicates) {\n return choices;\n }\n\n // if duplicates not allowed, remove the choices that are used to define the correct response\n return choices.filter(choice => !find(correctResponse, v => v === choice.id));\n };\n\n render() {\n const { focusedEl, dialog } = this.state;\n const {\n classes,\n duplicates,\n toolbarOpts\n } = this.props;\n const visibleChoices = this.getVisibleChoices() || [];\n\n return (\n <div className={classes.design}>\n <InfoDialog\n open={dialog.open}\n title={dialog.message}\n onOk={dialog.onOk}\n />\n <Button\n className={classes.addButton}\n variant=\"contained\"\n color=\"primary\"\n onClick={this.onAddChoice}\n >\n Add Choice\n </Button>\n <div\n className={classes.altChoices}\n >\n {\n visibleChoices.map((c, index) => {\n if (focusedEl === c.id) {\n return (\n <div\n key={index}\n style={{\n minWidth: '100%',\n zIndex: '100'\n }}\n >\n <EditableHtml\n ref={ref => (this.focusedNodeRef = ref)}\n className={classes.prompt}\n markup={c.value}\n pluginProps={{\n video: {\n disabled: true\n },\n audio: {\n disabled: true\n }\n }}\n onChange={val => this.onChoiceChanged(c.value, val, c.id)}\n onDone={() => {\n this.setState({\n focusedEl: undefined\n });\n }}\n disableUnderline\n toolbarOpts={toolbarOpts}\n />\n </div>\n );\n }\n\n return (\n <Choice\n key={index}\n duplicates={duplicates}\n targetId=\"0\"\n choice={c}\n onClick={() => this.onChoiceFocus(c.id)}\n onRemoveChoice={() => this.handleChoiceRemove(c.id)}\n />\n );\n })\n }\n </div>\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(Choices);\n\nexport default Styled;\n"],"file":"choices.js"}
|
package/configure/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/drag-in-the-blank-configure",
|
|
3
|
-
"version": "3.6.
|
|
3
|
+
"version": "3.6.10",
|
|
4
4
|
"private": true,
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "src/index.js",
|
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
"@material-ui/core": "^3.9.2",
|
|
9
9
|
"@material-ui/icons": "^3.0.1",
|
|
10
10
|
"@pie-framework/pie-configure-events": "^1.2.0",
|
|
11
|
-
"@pie-lib/config-ui": "^10.10.
|
|
11
|
+
"@pie-lib/config-ui": "^10.10.13",
|
|
12
12
|
"@pie-lib/drag": "^1.1.52",
|
|
13
|
-
"@pie-lib/editable-html": "^7.17.
|
|
14
|
-
"@pie-lib/math-rendering": "^2.3.
|
|
13
|
+
"@pie-lib/editable-html": "^7.17.13",
|
|
14
|
+
"@pie-lib/math-rendering": "^2.3.12",
|
|
15
15
|
"debug": "^3.1.0",
|
|
16
16
|
"lodash": "^4.17.15",
|
|
17
17
|
"prop-types": "^15.6.2",
|
package/controller/package.json
CHANGED
package/lib/main.js
CHANGED
|
@@ -109,31 +109,25 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
109
109
|
hidden: 'Show Teacher Instructions',
|
|
110
110
|
visible: 'Hide Teacher Instructions'
|
|
111
111
|
}
|
|
112
|
-
}, /*#__PURE__*/_react["default"].createElement(
|
|
113
|
-
|
|
114
|
-
__html: model.teacherInstructions
|
|
115
|
-
}
|
|
112
|
+
}, /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
|
|
113
|
+
prompt: model.teacherInstructions
|
|
116
114
|
})), /*#__PURE__*/_react["default"].createElement("br", null)), /*#__PURE__*/_react["default"].createElement(_correctAnswerToggle["default"], {
|
|
117
115
|
show: showCorrectAnswerToggle,
|
|
118
116
|
toggled: showCorrectAnswer,
|
|
119
117
|
onToggle: this.toggleShowCorrect
|
|
120
|
-
}), showCorrectAnswerToggle && /*#__PURE__*/_react["default"].createElement("br", null), prompt && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
118
|
+
}), showCorrectAnswerToggle && /*#__PURE__*/_react["default"].createElement("br", null), prompt && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
|
|
119
|
+
prompt: prompt
|
|
120
|
+
}), /*#__PURE__*/_react["default"].createElement("br", null)), /*#__PURE__*/_react["default"].createElement(DraggableDragInTheBlank, (0, _extends2["default"])({}, modelWithValue, {
|
|
121
|
+
onChange: onChange,
|
|
122
|
+
showCorrectAnswer: showCorrectAnswer
|
|
123
|
+
})), model.rationale && (0, _renderUi.hasText)(model.rationale) && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("br", null), /*#__PURE__*/_react["default"].createElement(_renderUi.Collapsible, {
|
|
125
124
|
labels: {
|
|
126
125
|
hidden: 'Show Rationale',
|
|
127
126
|
visible: 'Hide Rationale'
|
|
128
127
|
}
|
|
129
|
-
}, /*#__PURE__*/_react["default"].createElement(
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
})), /*#__PURE__*/_react["default"].createElement("br", null)), /*#__PURE__*/_react["default"].createElement(DraggableDragInTheBlank, (0, _extends2["default"])({}, modelWithValue, {
|
|
134
|
-
onChange: onChange,
|
|
135
|
-
showCorrectAnswer: showCorrectAnswer
|
|
136
|
-
})));
|
|
128
|
+
}, /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
|
|
129
|
+
prompt: model.rationale
|
|
130
|
+
})), /*#__PURE__*/_react["default"].createElement("br", null)));
|
|
137
131
|
}
|
|
138
132
|
}]);
|
|
139
133
|
return Main;
|
package/lib/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/main.js"],"names":["DraggableDragInTheBlank","DragInTheBlank","Main","showCorrectAnswer","setState","state","domNode","ReactDOM","findDOMNode","props","model","onChange","value","classes","prompt","mode","modelWithValue","showCorrectAnswerToggle","mainContainer","teacherInstructions","hidden","visible","
|
|
1
|
+
{"version":3,"sources":["../src/main.js"],"names":["DraggableDragInTheBlank","DragInTheBlank","Main","showCorrectAnswer","setState","state","domNode","ReactDOM","findDOMNode","props","model","onChange","value","classes","prompt","mode","modelWithValue","showCorrectAnswerToggle","mainContainer","teacherInstructions","hidden","visible","toggleShowCorrect","rationale","React","Component","PropTypes","object","feedback","func","styles","theme","padding","spacing","unit","color","text","backgroundColor","background"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport CorrectAnswerToggle from '@pie-lib/correct-answer-toggle';\nimport { DragInTheBlank } from '@pie-lib/mask-markup';\nimport { withDragContext } from '@pie-lib/drag';\nimport {color, Collapsible, hasText, PreviewPrompt} from '@pie-lib/render-ui';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport { withStyles } from '@material-ui/core/styles';\n\nconst DraggableDragInTheBlank = withDragContext(DragInTheBlank);\n\nexport class Main extends React.Component {\n static propTypes = {\n classes: PropTypes.object,\n model: PropTypes.object,\n value: PropTypes.object,\n feedback: PropTypes.object,\n onChange: PropTypes.func\n };\n\n static defaultProps = {\n value: {}\n };\n\n state = {\n showCorrectAnswer: false\n };\n\n componentDidUpdate() {\n // eslint-disable-next-line\n const domNode = ReactDOM.findDOMNode(this);\n\n renderMath(domNode);\n }\n\n toggleShowCorrect = () => {\n this.setState({ showCorrectAnswer: !this.state.showCorrectAnswer });\n };\n\n render() {\n const { showCorrectAnswer } = this.state;\n const { model, onChange, value, classes } = this.props;\n const { prompt, mode } = model;\n const modelWithValue = {\n ...model,\n value\n };\n const showCorrectAnswerToggle = mode === 'evaluate';\n\n return (\n <div className={classes.mainContainer}>\n {\n model.teacherInstructions && hasText(model.teacherInstructions) && (\n <React.Fragment>\n <Collapsible labels={{ hidden: 'Show Teacher Instructions', visible: 'Hide Teacher Instructions' }}>\n <PreviewPrompt prompt={model.teacherInstructions} />\n </Collapsible>\n <br />\n </React.Fragment>\n )\n }\n <CorrectAnswerToggle\n show={showCorrectAnswerToggle}\n toggled={showCorrectAnswer}\n onToggle={this.toggleShowCorrect}\n />\n {showCorrectAnswerToggle && <br />}\n {prompt && (\n <React.Fragment>\n <PreviewPrompt prompt={prompt} />\n <br />\n </React.Fragment>\n )}\n <DraggableDragInTheBlank\n {...modelWithValue}\n onChange={onChange}\n showCorrectAnswer={showCorrectAnswer}\n />\n {\n model.rationale && hasText(model.rationale) && (\n <React.Fragment>\n <br />\n <Collapsible labels={{ hidden: 'Show Rationale', visible: 'Hide Rationale' }}>\n <PreviewPrompt prompt={model.rationale} />\n </Collapsible>\n <br />\n </React.Fragment>\n )\n }\n </div>\n );\n }\n}\n\n\nconst styles = (theme) => ({\n mainContainer: {\n padding: theme.spacing.unit,\n color: color.text(),\n backgroundColor: color.background(),\n '& tr > td': {\n color: color.text()\n }\n },\n});\n\nexport default withStyles(styles)(Main);\n\n"],"file":"main.js"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"repository": "pie-framework/pie-elements",
|
|
7
|
-
"version": "3.12.
|
|
7
|
+
"version": "3.12.6",
|
|
8
8
|
"description": "",
|
|
9
9
|
"scripts": {
|
|
10
10
|
"test": "echo \"Error: no test specified\" && exit 1",
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@material-ui/core": "^3.9.2",
|
|
15
15
|
"@pie-framework/pie-player-events": "^0.1.0",
|
|
16
|
-
"@pie-lib/correct-answer-toggle": "^2.3.
|
|
17
|
-
"@pie-lib/mask-markup": "^1.11.
|
|
18
|
-
"@pie-lib/math-rendering": "^2.3.
|
|
19
|
-
"@pie-lib/render-ui": "^4.12.
|
|
16
|
+
"@pie-lib/correct-answer-toggle": "^2.3.33",
|
|
17
|
+
"@pie-lib/mask-markup": "^1.11.4",
|
|
18
|
+
"@pie-lib/math-rendering": "^2.3.12",
|
|
19
|
+
"@pie-lib/render-ui": "^4.12.4",
|
|
20
20
|
"classnames": "^2.2.5",
|
|
21
21
|
"lodash": "^4.17.10",
|
|
22
22
|
"prop-types": "^15.6.1",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
},
|
|
26
26
|
"author": "",
|
|
27
27
|
"license": "ISC",
|
|
28
|
-
"gitHead": "
|
|
28
|
+
"gitHead": "ff7c86a6e386b71b47fdd28890d5a977fff15e17",
|
|
29
29
|
"main": "lib/index.js",
|
|
30
30
|
"module": "src/index.js"
|
|
31
31
|
}
|