@pie-element/hotspot 9.1.0 → 9.2.0-mui-update.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.
Files changed (117) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/configure/CHANGELOG.md +66 -0
  3. package/configure/lib/DeleteWidget.js +31 -44
  4. package/configure/lib/DeleteWidget.js.map +1 -1
  5. package/configure/lib/__tests__/DeleteWidget.test.js +60 -0
  6. package/configure/lib/__tests__/hotspot-container.test.js +377 -0
  7. package/configure/lib/__tests__/hotspot-drawable.test.js +233 -0
  8. package/configure/lib/__tests__/index.test.js +211 -0
  9. package/configure/lib/__tests__/root.test.js +440 -0
  10. package/configure/lib/__tests__/utils.test.js +287 -0
  11. package/configure/lib/button.js +27 -46
  12. package/configure/lib/button.js.map +1 -1
  13. package/configure/lib/buttons/circle.js +21 -28
  14. package/configure/lib/buttons/circle.js.map +1 -1
  15. package/configure/lib/buttons/polygon.js +27 -34
  16. package/configure/lib/buttons/polygon.js.map +1 -1
  17. package/configure/lib/buttons/rectangle.js +27 -34
  18. package/configure/lib/buttons/rectangle.js.map +1 -1
  19. package/configure/lib/defaults.js +3 -4
  20. package/configure/lib/defaults.js.map +1 -1
  21. package/configure/lib/hotspot-circle.js +133 -199
  22. package/configure/lib/hotspot-circle.js.map +1 -1
  23. package/configure/lib/hotspot-container.js +251 -356
  24. package/configure/lib/hotspot-container.js.map +1 -1
  25. package/configure/lib/hotspot-drawable.js +361 -473
  26. package/configure/lib/hotspot-drawable.js.map +1 -1
  27. package/configure/lib/hotspot-palette.js +93 -140
  28. package/configure/lib/hotspot-palette.js.map +1 -1
  29. package/configure/lib/hotspot-polygon.js +213 -318
  30. package/configure/lib/hotspot-polygon.js.map +1 -1
  31. package/configure/lib/hotspot-rectangle.js +129 -193
  32. package/configure/lib/hotspot-rectangle.js.map +1 -1
  33. package/configure/lib/icons.js +1 -1
  34. package/configure/lib/icons.js.map +1 -1
  35. package/configure/lib/image-konva.js +47 -87
  36. package/configure/lib/image-konva.js.map +1 -1
  37. package/configure/lib/index.js +163 -223
  38. package/configure/lib/index.js.map +1 -1
  39. package/configure/lib/root.js +302 -394
  40. package/configure/lib/root.js.map +1 -1
  41. package/configure/lib/shapes/circle.js +70 -102
  42. package/configure/lib/shapes/circle.js.map +1 -1
  43. package/configure/lib/shapes/index.js +5 -13
  44. package/configure/lib/shapes/index.js.map +1 -1
  45. package/configure/lib/shapes/polygon.js +65 -97
  46. package/configure/lib/shapes/polygon.js.map +1 -1
  47. package/configure/lib/shapes/rectagle.js +70 -102
  48. package/configure/lib/shapes/rectagle.js.map +1 -1
  49. package/configure/lib/shapes/utils.js +3 -9
  50. package/configure/lib/shapes/utils.js.map +1 -1
  51. package/configure/lib/upload-control.js +26 -53
  52. package/configure/lib/upload-control.js.map +1 -1
  53. package/configure/lib/utils.js +85 -138
  54. package/configure/lib/utils.js.map +1 -1
  55. package/configure/package.json +11 -10
  56. package/configure/src/__tests__/index.test.js +11 -5
  57. package/configure/src/button.jsx +12 -20
  58. package/configure/src/hotspot-circle.jsx +5 -18
  59. package/configure/src/hotspot-container.jsx +82 -98
  60. package/configure/src/hotspot-drawable.jsx +43 -45
  61. package/configure/src/hotspot-palette.jsx +45 -37
  62. package/configure/src/hotspot-polygon.jsx +4 -20
  63. package/configure/src/hotspot-rectangle.jsx +4 -17
  64. package/configure/src/index.js +12 -2
  65. package/configure/src/root.jsx +85 -79
  66. package/configure/src/upload-control.jsx +6 -16
  67. package/controller/CHANGELOG.md +52 -0
  68. package/controller/lib/__tests__/index.test.js +586 -0
  69. package/controller/lib/__tests__/utils.test.js +8 -0
  70. package/controller/lib/defaults.js +3 -4
  71. package/controller/lib/defaults.js.map +1 -1
  72. package/controller/lib/index.js +152 -206
  73. package/controller/lib/index.js.map +1 -1
  74. package/controller/lib/utils.js +15 -35
  75. package/controller/lib/utils.js.map +1 -1
  76. package/controller/package.json +2 -2
  77. package/docs/demo/pie.manifest.json +11 -0
  78. package/lib/__tests__/container.test.js +221 -0
  79. package/lib/__tests__/index.test.js +113 -0
  80. package/lib/__tests__/polygon.test.js +245 -0
  81. package/lib/__tests__/rectangle.test.js +236 -0
  82. package/lib/__tests__/session-updater.test.js +69 -0
  83. package/lib/hotspot/circle.js +111 -170
  84. package/lib/hotspot/circle.js.map +1 -1
  85. package/lib/hotspot/container.js +175 -261
  86. package/lib/hotspot/container.js.map +1 -1
  87. package/lib/hotspot/icons.js +1 -1
  88. package/lib/hotspot/icons.js.map +1 -1
  89. package/lib/hotspot/image-konva-tooltip.js +66 -113
  90. package/lib/hotspot/image-konva-tooltip.js.map +1 -1
  91. package/lib/hotspot/index.js +136 -199
  92. package/lib/hotspot/index.js.map +1 -1
  93. package/lib/hotspot/polygon.js +151 -215
  94. package/lib/hotspot/polygon.js.map +1 -1
  95. package/lib/hotspot/rectangle.js +130 -186
  96. package/lib/hotspot/rectangle.js.map +1 -1
  97. package/lib/index.js +188 -257
  98. package/lib/index.js.map +1 -1
  99. package/lib/session-updater.js +13 -19
  100. package/lib/session-updater.js.map +1 -1
  101. package/package.json +14 -11
  102. package/src/hotspot/circle.jsx +2 -13
  103. package/src/hotspot/container.jsx +35 -50
  104. package/src/hotspot/index.jsx +16 -28
  105. package/src/hotspot/polygon.jsx +4 -13
  106. package/src/hotspot/rectangle.jsx +4 -13
  107. package/src/index.js +21 -12
  108. package/LICENSE.md +0 -5
  109. package/configure/node_modules/debug/CHANGELOG.md +0 -395
  110. package/configure/node_modules/debug/LICENSE +0 -19
  111. package/configure/node_modules/debug/README.md +0 -437
  112. package/configure/node_modules/debug/node.js +0 -1
  113. package/configure/node_modules/debug/package.json +0 -51
  114. package/configure/node_modules/debug/src/browser.js +0 -180
  115. package/configure/node_modules/debug/src/common.js +0 -249
  116. package/configure/node_modules/debug/src/index.js +0 -12
  117. package/configure/node_modules/debug/src/node.js +0 -177
@@ -5,39 +5,33 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.updateSessionMetadata = updateSessionMetadata;
7
7
  exports.updateSessionValue = updateSessionValue;
8
-
9
8
  function updateSessionValue(session, model, data) {
10
- var id = data.id,
11
- selected = data.selected;
12
-
13
- var _ref = model || {},
14
- multipleCorrect = _ref.multipleCorrect;
15
-
9
+ const {
10
+ id,
11
+ selected
12
+ } = data;
13
+ const {
14
+ multipleCorrect
15
+ } = model || {};
16
16
  session.answers = session.answers || [];
17
-
18
17
  if (!selected) {
19
- session.answers = session.answers.filter(function (answer) {
20
- return answer.id !== id;
21
- });
18
+ session.answers = session.answers.filter(answer => answer.id !== id);
22
19
  } else {
23
- var item = {
24
- id: id
20
+ const item = {
21
+ id
25
22
  };
26
-
27
23
  if (multipleCorrect) {
28
24
  session.answers.push(item);
29
25
  } else {
30
26
  session.answers = [item];
31
- } //update session metadata
32
-
27
+ }
33
28
 
29
+ //update session metadata
34
30
  session.selector = data.selector;
35
31
  }
36
32
  }
37
-
38
33
  function updateSessionMetadata(session, metadata) {
39
34
  session.audioStartTime = session.audioStartTime || metadata.audioStartTime; //timestamp when auto-played audio started playing
40
-
41
35
  session.audioEndTime = session.audioEndTime || metadata.audioEndTime; //timestamp when auto-played audio completed playing
42
36
 
43
37
  if (!session.waitTime && session.audioStartTime && session.audioEndTime) {
@@ -45,4 +39,4 @@ function updateSessionMetadata(session, metadata) {
45
39
  session.waitTime = session.audioEndTime - session.audioStartTime;
46
40
  }
47
41
  }
48
- //# sourceMappingURL=session-updater.js.map
42
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1cGRhdGVTZXNzaW9uVmFsdWUiLCJzZXNzaW9uIiwibW9kZWwiLCJkYXRhIiwiaWQiLCJzZWxlY3RlZCIsIm11bHRpcGxlQ29ycmVjdCIsImFuc3dlcnMiLCJmaWx0ZXIiLCJhbnN3ZXIiLCJpdGVtIiwicHVzaCIsInNlbGVjdG9yIiwidXBkYXRlU2Vzc2lvbk1ldGFkYXRhIiwibWV0YWRhdGEiLCJhdWRpb1N0YXJ0VGltZSIsImF1ZGlvRW5kVGltZSIsIndhaXRUaW1lIl0sInNvdXJjZXMiOlsiLi4vc3JjL3Nlc3Npb24tdXBkYXRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gdXBkYXRlU2Vzc2lvblZhbHVlKHNlc3Npb24sIG1vZGVsLCBkYXRhKSB7XG4gIGNvbnN0IHsgaWQsIHNlbGVjdGVkIH0gPSBkYXRhO1xuICBjb25zdCB7IG11bHRpcGxlQ29ycmVjdCB9ID0gbW9kZWwgfHwge307XG4gIHNlc3Npb24uYW5zd2VycyA9IHNlc3Npb24uYW5zd2VycyB8fCBbXTtcblxuICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgc2Vzc2lvbi5hbnN3ZXJzID0gc2Vzc2lvbi5hbnN3ZXJzLmZpbHRlcigoYW5zd2VyKSA9PiBhbnN3ZXIuaWQgIT09IGlkKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpdGVtID0geyBpZCB9O1xuICAgIGlmIChtdWx0aXBsZUNvcnJlY3QpIHtcbiAgICAgIHNlc3Npb24uYW5zd2Vycy5wdXNoKGl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXNzaW9uLmFuc3dlcnMgPSBbaXRlbV07XG4gICAgfVxuXG4gICAgLy91cGRhdGUgc2Vzc2lvbiBtZXRhZGF0YVxuICAgIHNlc3Npb24uc2VsZWN0b3IgPSBkYXRhLnNlbGVjdG9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTZXNzaW9uTWV0YWRhdGEoc2Vzc2lvbiwgbWV0YWRhdGEpIHtcbiAgc2Vzc2lvbi5hdWRpb1N0YXJ0VGltZSA9IHNlc3Npb24uYXVkaW9TdGFydFRpbWUgfHwgbWV0YWRhdGEuYXVkaW9TdGFydFRpbWU7IC8vdGltZXN0YW1wIHdoZW4gYXV0by1wbGF5ZWQgYXVkaW8gc3RhcnRlZCBwbGF5aW5nXG4gIHNlc3Npb24uYXVkaW9FbmRUaW1lID0gc2Vzc2lvbi5hdWRpb0VuZFRpbWUgfHwgbWV0YWRhdGEuYXVkaW9FbmRUaW1lOyAvL3RpbWVzdGFtcCB3aGVuIGF1dG8tcGxheWVkIGF1ZGlvIGNvbXBsZXRlZCBwbGF5aW5nXG5cbiAgaWYgKCFzZXNzaW9uLndhaXRUaW1lICYmIHNlc3Npb24uYXVkaW9TdGFydFRpbWUgJiYgc2Vzc2lvbi5hdWRpb0VuZFRpbWUpIHtcbiAgICAvLyB3YWl0VGltZSBpcyBlbGFwc2VkIHRpbWUgdGhlIHVzZXIgd2FpdGVkIGZvciBhdXRvLXBsYXllZCBhdWRpbyB0byBmaW5pc2hcbiAgICBzZXNzaW9uLndhaXRUaW1lID0gc2Vzc2lvbi5hdWRpb0VuZFRpbWUgLSBzZXNzaW9uLmF1ZGlvU3RhcnRUaW1lO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBTyxTQUFTQSxrQkFBa0JBLENBQUNDLE9BQU8sRUFBRUMsS0FBSyxFQUFFQyxJQUFJLEVBQUU7RUFDdkQsTUFBTTtJQUFFQyxFQUFFO0lBQUVDO0VBQVMsQ0FBQyxHQUFHRixJQUFJO0VBQzdCLE1BQU07SUFBRUc7RUFBZ0IsQ0FBQyxHQUFHSixLQUFLLElBQUksQ0FBQyxDQUFDO0VBQ3ZDRCxPQUFPLENBQUNNLE9BQU8sR0FBR04sT0FBTyxDQUFDTSxPQUFPLElBQUksRUFBRTtFQUV2QyxJQUFJLENBQUNGLFFBQVEsRUFBRTtJQUNiSixPQUFPLENBQUNNLE9BQU8sR0FBR04sT0FBTyxDQUFDTSxPQUFPLENBQUNDLE1BQU0sQ0FBRUMsTUFBTSxJQUFLQSxNQUFNLENBQUNMLEVBQUUsS0FBS0EsRUFBRSxDQUFDO0VBQ3hFLENBQUMsTUFBTTtJQUNMLE1BQU1NLElBQUksR0FBRztNQUFFTjtJQUFHLENBQUM7SUFDbkIsSUFBSUUsZUFBZSxFQUFFO01BQ25CTCxPQUFPLENBQUNNLE9BQU8sQ0FBQ0ksSUFBSSxDQUFDRCxJQUFJLENBQUM7SUFDNUIsQ0FBQyxNQUFNO01BQ0xULE9BQU8sQ0FBQ00sT0FBTyxHQUFHLENBQUNHLElBQUksQ0FBQztJQUMxQjs7SUFFQTtJQUNBVCxPQUFPLENBQUNXLFFBQVEsR0FBR1QsSUFBSSxDQUFDUyxRQUFRO0VBQ2xDO0FBQ0Y7QUFFTyxTQUFTQyxxQkFBcUJBLENBQUNaLE9BQU8sRUFBRWEsUUFBUSxFQUFFO0VBQ3ZEYixPQUFPLENBQUNjLGNBQWMsR0FBR2QsT0FBTyxDQUFDYyxjQUFjLElBQUlELFFBQVEsQ0FBQ0MsY0FBYyxDQUFDLENBQUM7RUFDNUVkLE9BQU8sQ0FBQ2UsWUFBWSxHQUFHZixPQUFPLENBQUNlLFlBQVksSUFBSUYsUUFBUSxDQUFDRSxZQUFZLENBQUMsQ0FBQzs7RUFFdEUsSUFBSSxDQUFDZixPQUFPLENBQUNnQixRQUFRLElBQUloQixPQUFPLENBQUNjLGNBQWMsSUFBSWQsT0FBTyxDQUFDZSxZQUFZLEVBQUU7SUFDdkU7SUFDQWYsT0FBTyxDQUFDZ0IsUUFBUSxHQUFHaEIsT0FBTyxDQUFDZSxZQUFZLEdBQUdmLE9BQU8sQ0FBQ2MsY0FBYztFQUNsRTtBQUNGIiwiaWdub3JlTGlzdCI6W119
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/session-updater.js"],"names":["updateSessionValue","session","model","data","id","selected","multipleCorrect","answers","filter","answer","item","push","selector","updateSessionMetadata","metadata","audioStartTime","audioEndTime","waitTime"],"mappings":";;;;;;;;AAAO,SAASA,kBAAT,CAA4BC,OAA5B,EAAqCC,KAArC,EAA4CC,IAA5C,EAAkD;AACvD,MAAQC,EAAR,GAAyBD,IAAzB,CAAQC,EAAR;AAAA,MAAYC,QAAZ,GAAyBF,IAAzB,CAAYE,QAAZ;;AACA,aAA4BH,KAAK,IAAI,EAArC;AAAA,MAAQI,eAAR,QAAQA,eAAR;;AACAL,EAAAA,OAAO,CAACM,OAAR,GAAkBN,OAAO,CAACM,OAAR,IAAmB,EAArC;;AAEA,MAAI,CAACF,QAAL,EAAe;AACbJ,IAAAA,OAAO,CAACM,OAAR,GAAkBN,OAAO,CAACM,OAAR,CAAgBC,MAAhB,CAAuB,UAACC,MAAD;AAAA,aAAYA,MAAM,CAACL,EAAP,KAAcA,EAA1B;AAAA,KAAvB,CAAlB;AACD,GAFD,MAEO;AACL,QAAMM,IAAI,GAAG;AAAEN,MAAAA,EAAE,EAAFA;AAAF,KAAb;;AACA,QAAIE,eAAJ,EAAqB;AACnBL,MAAAA,OAAO,CAACM,OAAR,CAAgBI,IAAhB,CAAqBD,IAArB;AACD,KAFD,MAEO;AACLT,MAAAA,OAAO,CAACM,OAAR,GAAkB,CAACG,IAAD,CAAlB;AACD,KANI,CAQL;;;AACAT,IAAAA,OAAO,CAACW,QAAR,GAAmBT,IAAI,CAACS,QAAxB;AACD;AACF;;AAEM,SAASC,qBAAT,CAA+BZ,OAA/B,EAAwCa,QAAxC,EAAkD;AACvDb,EAAAA,OAAO,CAACc,cAAR,GAAyBd,OAAO,CAACc,cAAR,IAA0BD,QAAQ,CAACC,cAA5D,CADuD,CACqB;;AAC5Ed,EAAAA,OAAO,CAACe,YAAR,GAAuBf,OAAO,CAACe,YAAR,IAAwBF,QAAQ,CAACE,YAAxD,CAFuD,CAEe;;AAEtE,MAAI,CAACf,OAAO,CAACgB,QAAT,IAAqBhB,OAAO,CAACc,cAA7B,IAA+Cd,OAAO,CAACe,YAA3D,EAAyE;AACvE;AACAf,IAAAA,OAAO,CAACgB,QAAR,GAAmBhB,OAAO,CAACe,YAAR,GAAuBf,OAAO,CAACc,cAAlD;AACD;AACF","sourcesContent":["export function updateSessionValue(session, model, data) {\n const { id, selected } = data;\n const { multipleCorrect } = model || {};\n session.answers = session.answers || [];\n\n if (!selected) {\n session.answers = session.answers.filter((answer) => answer.id !== id);\n } else {\n const item = { id };\n if (multipleCorrect) {\n session.answers.push(item);\n } else {\n session.answers = [item];\n }\n\n //update session metadata\n session.selector = data.selector;\n }\n}\n\nexport function updateSessionMetadata(session, metadata) {\n session.audioStartTime = session.audioStartTime || metadata.audioStartTime; //timestamp when auto-played audio started playing\n session.audioEndTime = session.audioEndTime || metadata.audioEndTime; //timestamp when auto-played audio completed playing\n\n if (!session.waitTime && session.audioStartTime && session.audioEndTime) {\n // waitTime is elapsed time the user waited for auto-played audio to finish\n session.waitTime = session.audioEndTime - session.audioStartTime;\n }\n}\n"],"file":"session-updater.js"}
1
+ {"version":3,"file":"session-updater.js","names":["updateSessionValue","session","model","data","id","selected","multipleCorrect","answers","filter","answer","item","push","selector","updateSessionMetadata","metadata","audioStartTime","audioEndTime","waitTime"],"sources":["../src/session-updater.js"],"sourcesContent":["export function updateSessionValue(session, model, data) {\n const { id, selected } = data;\n const { multipleCorrect } = model || {};\n session.answers = session.answers || [];\n\n if (!selected) {\n session.answers = session.answers.filter((answer) => answer.id !== id);\n } else {\n const item = { id };\n if (multipleCorrect) {\n session.answers.push(item);\n } else {\n session.answers = [item];\n }\n\n //update session metadata\n session.selector = data.selector;\n }\n}\n\nexport function updateSessionMetadata(session, metadata) {\n session.audioStartTime = session.audioStartTime || metadata.audioStartTime; //timestamp when auto-played audio started playing\n session.audioEndTime = session.audioEndTime || metadata.audioEndTime; //timestamp when auto-played audio completed playing\n\n if (!session.waitTime && session.audioStartTime && session.audioEndTime) {\n // waitTime is elapsed time the user waited for auto-played audio to finish\n session.waitTime = session.audioEndTime - session.audioStartTime;\n }\n}\n"],"mappings":";;;;;;;AAAO,SAASA,kBAAkBA,CAACC,OAAO,EAAEC,KAAK,EAAEC,IAAI,EAAE;EACvD,MAAM;IAAEC,EAAE;IAAEC;EAAS,CAAC,GAAGF,IAAI;EAC7B,MAAM;IAAEG;EAAgB,CAAC,GAAGJ,KAAK,IAAI,CAAC,CAAC;EACvCD,OAAO,CAACM,OAAO,GAAGN,OAAO,CAACM,OAAO,IAAI,EAAE;EAEvC,IAAI,CAACF,QAAQ,EAAE;IACbJ,OAAO,CAACM,OAAO,GAAGN,OAAO,CAACM,OAAO,CAACC,MAAM,CAAEC,MAAM,IAAKA,MAAM,CAACL,EAAE,KAAKA,EAAE,CAAC;EACxE,CAAC,MAAM;IACL,MAAMM,IAAI,GAAG;MAAEN;IAAG,CAAC;IACnB,IAAIE,eAAe,EAAE;MACnBL,OAAO,CAACM,OAAO,CAACI,IAAI,CAACD,IAAI,CAAC;IAC5B,CAAC,MAAM;MACLT,OAAO,CAACM,OAAO,GAAG,CAACG,IAAI,CAAC;IAC1B;;IAEA;IACAT,OAAO,CAACW,QAAQ,GAAGT,IAAI,CAACS,QAAQ;EAClC;AACF;AAEO,SAASC,qBAAqBA,CAACZ,OAAO,EAAEa,QAAQ,EAAE;EACvDb,OAAO,CAACc,cAAc,GAAGd,OAAO,CAACc,cAAc,IAAID,QAAQ,CAACC,cAAc,CAAC,CAAC;EAC5Ed,OAAO,CAACe,YAAY,GAAGf,OAAO,CAACe,YAAY,IAAIF,QAAQ,CAACE,YAAY,CAAC,CAAC;;EAEtE,IAAI,CAACf,OAAO,CAACgB,QAAQ,IAAIhB,OAAO,CAACc,cAAc,IAAId,OAAO,CAACe,YAAY,EAAE;IACvE;IACAf,OAAO,CAACgB,QAAQ,GAAGhB,OAAO,CAACe,YAAY,GAAGf,OAAO,CAACc,cAAc;EAClE;AACF","ignoreList":[]}
package/package.json CHANGED
@@ -1,27 +1,30 @@
1
1
  {
2
2
  "name": "@pie-element/hotspot",
3
- "version": "9.1.0",
3
+ "version": "9.2.0-mui-update.0",
4
4
  "description": "",
5
5
  "repository": "pie-framework/pie-elements",
6
6
  "publishConfig": {
7
7
  "access": "public"
8
8
  },
9
9
  "dependencies": {
10
- "@material-ui/core": "^3.9.3",
10
+ "@emotion/react": "^11.14.0",
11
+ "@emotion/style": "^0.8.0",
12
+ "@mui/icons-material": "^7.3.4",
13
+ "@mui/material": "^7.3.4",
11
14
  "@pie-framework/pie-player-events": "^0.1.0",
12
- "@pie-lib/correct-answer-toggle": "^2.21.0",
13
- "@pie-lib/math-rendering": "^3.18.0",
14
- "@pie-lib/render-ui": "^4.31.0",
15
- "@pie-lib/test-utils": "^0.18.0",
16
- "konva": "^3.2.5",
15
+ "@pie-lib/correct-answer-toggle": "2.37.0-mui-update.0",
16
+ "@pie-lib/math-rendering": "3.38.0-mui-update.0",
17
+ "@pie-lib/render-ui": "4.47.0-mui-update.0",
18
+ "@pie-lib/test-utils": "0.34.0-mui-update.0",
19
+ "konva": "8.3.0",
17
20
  "prop-types": "^15.6.1",
18
- "react": "^16.8.1",
19
- "react-dom": "^16.8.1",
20
- "react-konva": "^16.9.0-0"
21
+ "react": "18.2.0",
22
+ "react-dom": "18.2.0",
23
+ "react-konva": "18.1.0"
21
24
  },
22
25
  "author": "pie framework developers",
23
26
  "license": "ISC",
24
- "gitHead": "e6dde692b33cb1d42c6b2958fff7520dc40ca82c",
27
+ "gitHead": "0e14ff981bcdc8a89a0e58484026496701bfdbc3",
25
28
  "scripts": {
26
29
  "postpublish": "../../scripts/postpublish"
27
30
  },
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { Circle, Group, Rect } from 'react-konva';
4
- import { withStyles } from '@material-ui/core/styles';
5
4
  import ImageComponent from './image-konva-tooltip';
6
5
  import { faCorrect, faWrong } from './icons';
7
6
 
@@ -44,7 +43,6 @@ class CircleComponent extends React.Component {
44
43
 
45
44
  render() {
46
45
  const {
47
- classes,
48
46
  radius,
49
47
  hotspotColor,
50
48
  isCorrect,
@@ -105,7 +103,6 @@ class CircleComponent extends React.Component {
105
103
  />
106
104
  )}
107
105
  <Circle
108
- classes={classes.base}
109
106
  radius={radius}
110
107
  fill={selected && selectedHotspotColor ? selectedHotspotColor : hotspotColor}
111
108
  onClick={this.handleClick}
@@ -117,6 +114,7 @@ class CircleComponent extends React.Component {
117
114
  onMouseEnter={this.handleMouseEnter}
118
115
  x={x}
119
116
  y={y}
117
+ opacity={0.5}
120
118
  />
121
119
  {isEvaluateMode && iconSrc ? <ImageComponent src={iconSrc} x={iconX} y={iconY} tooltip={evaluateText} /> : null}
122
120
  </Group>
@@ -124,16 +122,7 @@ class CircleComponent extends React.Component {
124
122
  }
125
123
  }
126
124
 
127
- const styles = () => ({
128
- base: {
129
- cursor: 'pointer',
130
- opacity: 0.5,
131
- position: 'relative',
132
- },
133
- });
134
-
135
125
  CircleComponent.propTypes = {
136
- classes: PropTypes.object.isRequired,
137
126
  radius: PropTypes.number.isRequired,
138
127
  hotspotColor: PropTypes.string.isRequired,
139
128
  id: PropTypes.string.isRequired,
@@ -161,4 +150,4 @@ CircleComponent.defaultProps = {
161
150
  scale: 1,
162
151
  };
163
152
 
164
- export default withStyles(styles)(CircleComponent);
153
+ export default CircleComponent;
@@ -1,13 +1,38 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { Layer, Stage } from 'react-konva';
4
- import { withStyles } from '@material-ui/core/styles';
5
- import { color } from '@pie-lib/render-ui';
4
+ import { styled } from '@mui/material/styles';
6
5
 
7
6
  import Rectangle from './rectangle';
8
7
  import Polygon from './polygon';
9
8
  import Circle from './circle';
10
9
 
10
+ const BaseContainer = styled('div')(({ theme }) => ({
11
+ marginTop: theme.spacing(2),
12
+ marginBottom: theme.spacing(2),
13
+ position: 'relative',
14
+ background: theme.palette.common.white,
15
+ border: `${theme.spacing(1)} solid ${theme.palette.common.white}`,
16
+ width: 'fit-content',
17
+ }));
18
+
19
+ const ImageContainer = styled('div')({
20
+ position: 'relative',
21
+ width: 'fit-content',
22
+ });
23
+
24
+ const Image = styled('img')({
25
+ alignItems: 'center',
26
+ display: 'flex',
27
+ justifyContent: 'center',
28
+ });
29
+
30
+ const StyledStage = styled(Stage)({
31
+ left: 0,
32
+ top: 0,
33
+ position: 'absolute',
34
+ });
35
+
11
36
  export class Container extends React.Component {
12
37
  isSelected(shape) {
13
38
  const selectedShape = this.props.session.answers.filter((answer) => answer.id === shape.id)[0];
@@ -34,7 +59,6 @@ export class Container extends React.Component {
34
59
 
35
60
  render() {
36
61
  const {
37
- classes,
38
62
  dimensions: { width: withProp, height: heightProp },
39
63
  disabled,
40
64
  hotspotColor,
@@ -54,21 +78,19 @@ export class Container extends React.Component {
54
78
  const height = heightProp * SCALE;
55
79
 
56
80
  return (
57
- <div className={classes.base} style={{ padding: strokeWidth / 2 }}>
81
+ <BaseContainer style={{ padding: strokeWidth / 2 }}>
58
82
  {imageUrl ? (
59
- <div className={classes.imageContainer}>
60
- <img
83
+ <ImageContainer>
84
+ <Image
61
85
  alt="hotspot-image"
62
- className={classes.image}
63
86
  height="auto"
64
87
  src={imageUrl}
65
88
  style={{ width, height, maxWidth: width, maxHeight: height }}
66
89
  />
67
- </div>
90
+ </ImageContainer>
68
91
  ) : null}
69
92
 
70
- <Stage
71
- className={classes.stage}
93
+ <StyledStage
72
94
  height={height + strokeWidth}
73
95
  width={width + strokeWidth}
74
96
  x={strokeWidth / 2}
@@ -142,7 +164,6 @@ export class Container extends React.Component {
142
164
 
143
165
  return (
144
166
  <Circle
145
- classes={classes}
146
167
  scale={SCALE}
147
168
  isEvaluateMode={isEvaluateMode}
148
169
  isCorrect={isCorrect}
@@ -166,49 +187,13 @@ export class Container extends React.Component {
166
187
  );
167
188
  })}
168
189
  </Layer>
169
- </Stage>
170
- </div>
190
+ </StyledStage>
191
+ </BaseContainer>
171
192
  );
172
193
  }
173
194
  }
174
195
 
175
- const styles = (theme) => ({
176
- base: {
177
- marginTop: theme.spacing.unit * 2,
178
- marginBottom: theme.spacing.unit * 2,
179
- position: 'relative',
180
- background: theme.palette.common.white,
181
- border: `${theme.spacing.unit}px solid ${theme.palette.common.white}`,
182
- width: 'fit-content',
183
- },
184
- image: {
185
- alignItems: 'center',
186
- display: 'flex',
187
- justifyContent: 'center',
188
- },
189
- imageContainer: {
190
- position: 'relative',
191
- width: 'fit-content',
192
- },
193
- stage: {
194
- left: 0,
195
- top: 0,
196
- position: 'absolute',
197
- },
198
- resize: {
199
- borderBottom: `1px solid ${color.disabled()}`,
200
- borderRight: `1px solid ${color.disabled()}`,
201
- bottom: '-10px',
202
- cursor: 'se-resize',
203
- height: '10px',
204
- position: 'absolute',
205
- right: '-10px',
206
- width: '10px',
207
- },
208
- });
209
-
210
196
  Container.propTypes = {
211
- classes: PropTypes.object.isRequired,
212
197
  dimensions: PropTypes.object.isRequired,
213
198
  disabled: PropTypes.bool.isRequired,
214
199
  hotspotColor: PropTypes.string.isRequired,
@@ -229,4 +214,4 @@ Container.defaultProps = {
229
214
  scale: 1,
230
215
  };
231
216
 
232
- export default withStyles(styles)(Container);
217
+ export default Container;
@@ -2,10 +2,20 @@ import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import CorrectAnswerToggle from '@pie-lib/correct-answer-toggle';
4
4
  import { color, Collapsible, hasText, PreviewPrompt, UiLayout, hasMedia } from '@pie-lib/render-ui';
5
- import { withStyles } from '@material-ui/core/styles';
5
+ import { styled } from '@mui/material/styles';
6
6
 
7
7
  import Container from './container';
8
8
 
9
+ const StyledUiLayout = styled(UiLayout)({
10
+ color: color.text(),
11
+ backgroundColor: color.background(),
12
+ position: 'relative',
13
+ });
14
+
15
+ const StyledCollapsible = styled(Collapsible)(({ theme }) => ({
16
+ marginBottom: theme.spacing(2),
17
+ }));
18
+
9
19
  class HotspotComponent extends React.Component {
10
20
  constructor(props) {
11
21
  super(props);
@@ -81,7 +91,6 @@ class HotspotComponent extends React.Component {
81
91
  customAudioButton,
82
92
  },
83
93
  onSelectChoice,
84
- classes,
85
94
  } = this.props;
86
95
  const { showCorrect } = this.state;
87
96
  const isEvaluateMode = mode === 'evaluate';
@@ -91,19 +100,17 @@ class HotspotComponent extends React.Component {
91
100
  teacherInstructions && (hasText(teacherInstructions) || hasMedia(teacherInstructions));
92
101
 
93
102
  return (
94
- <UiLayout
103
+ <StyledUiLayout
95
104
  extraCSSRules={extraCSSRules}
96
105
  id={'main-container'}
97
- className={classes.main}
98
106
  fontSizeFactor={fontSizeFactor}
99
107
  >
100
108
  {showTeacherInstructions && (
101
- <Collapsible
109
+ <StyledCollapsible
102
110
  labels={{ hidden: 'Show Teacher Instructions', visible: 'Hide Teacher Instructions' }}
103
- className={classes.collapsible}
104
111
  >
105
112
  <PreviewPrompt className="prompt" prompt={teacherInstructions} />
106
- </Collapsible>
113
+ </StyledCollapsible>
107
114
  )}
108
115
 
109
116
  {prompt && (
@@ -149,34 +156,15 @@ class HotspotComponent extends React.Component {
149
156
  <PreviewPrompt className="prompt" prompt={rationale} />
150
157
  </Collapsible>
151
158
  )}
152
- </UiLayout>
159
+ </StyledUiLayout>
153
160
  );
154
161
  }
155
162
  }
156
163
 
157
164
  HotspotComponent.propTypes = {
158
- classes: PropTypes.object,
159
165
  model: PropTypes.object.isRequired,
160
166
  onSelectChoice: PropTypes.func.isRequired,
161
167
  session: PropTypes.object.isRequired,
162
168
  };
163
169
 
164
- HotspotComponent.defaultProps = {
165
- classes: {},
166
- };
167
-
168
- const styles = (theme) => ({
169
- main: {
170
- color: color.text(),
171
- backgroundColor: color.background(),
172
- position: 'relative',
173
- },
174
- collapsible: {
175
- marginBottom: theme.spacing.unit * 2,
176
- },
177
- prompt: {
178
- fontSize: 'inherit',
179
- },
180
- });
181
-
182
- export default withStyles(styles)(HotspotComponent);
170
+ export default HotspotComponent;
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { Line, Group, Rect } from 'react-konva';
4
- import { withStyles } from '@material-ui/core/styles';
5
4
  import ImageComponent from './image-konva-tooltip';
6
5
  import { faCorrect, faWrong } from './icons';
7
6
 
@@ -63,7 +62,6 @@ class PolygonComponent extends React.Component {
63
62
 
64
63
  render() {
65
64
  const {
66
- classes,
67
65
  hotspotColor,
68
66
  isCorrect,
69
67
  isEvaluateMode,
@@ -152,7 +150,6 @@ class PolygonComponent extends React.Component {
152
150
  <Line
153
151
  points={pointsParsed}
154
152
  closed={true}
155
- classes={classes.base}
156
153
  fill={selected && selectedHotspotColor? selectedHotspotColor : hotspotColor}
157
154
  onClick={this.handleClick}
158
155
  onTap={this.handleClick}
@@ -161,6 +158,9 @@ class PolygonComponent extends React.Component {
161
158
  strokeWidth={useHoveredStyle && !selected ? 0 : outlineWidth}
162
159
  onMouseLeave={this.handleMouseLeave}
163
160
  onMouseEnter={this.handleMouseEnter}
161
+ opacity={0.5}
162
+ cursor='pointer'
163
+ position='relative'
164
164
  />
165
165
  {isEvaluateMode && iconSrc ? <ImageComponent src={iconSrc} x={iconX} y={iconY} tooltip={evaluateText} /> : null}
166
166
  </Group>
@@ -168,16 +168,7 @@ class PolygonComponent extends React.Component {
168
168
  }
169
169
  }
170
170
 
171
- const styles = () => ({
172
- base: {
173
- cursor: 'pointer',
174
- opacity: 0.5,
175
- position: 'relative',
176
- },
177
- });
178
-
179
171
  PolygonComponent.propTypes = {
180
- classes: PropTypes.object.isRequired,
181
172
  hotspotColor: PropTypes.string.isRequired,
182
173
  id: PropTypes.string.isRequired,
183
174
  isCorrect: PropTypes.bool.isRequired,
@@ -202,4 +193,4 @@ PolygonComponent.defaultProps = {
202
193
  scale: 1,
203
194
  };
204
195
 
205
- export default withStyles(styles)(PolygonComponent);
196
+ export default PolygonComponent;
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { Rect, Group } from 'react-konva';
4
- import { withStyles } from '@material-ui/core/styles';
5
4
  import ImageComponent from './image-konva-tooltip';
6
5
  import { faCorrect, faWrong } from './icons';
7
6
 
@@ -44,7 +43,6 @@ class RectComponent extends React.Component {
44
43
 
45
44
  render() {
46
45
  const {
47
- classes,
48
46
  height,
49
47
  hotspotColor,
50
48
  hoverOutlineColor,
@@ -121,7 +119,6 @@ class RectComponent extends React.Component {
121
119
  />
122
120
  )}
123
121
  <Rect
124
- classes={classes.base}
125
122
  width={width}
126
123
  height={height}
127
124
  fill={selected && selectedHotspotColor ? selectedHotspotColor : hotspotColor}
@@ -134,6 +131,9 @@ class RectComponent extends React.Component {
134
131
  onMouseEnter={this.handleMouseEnter}
135
132
  x={x}
136
133
  y={y}
134
+ opacity={0.5}
135
+ cursor="pointer"
136
+ position="relative"
137
137
  />
138
138
  {isEvaluateMode && iconSrc ? <ImageComponent src={iconSrc} x={iconX} y={iconY} tooltip={evaluateText} /> : null}
139
139
  </Group>
@@ -141,16 +141,7 @@ class RectComponent extends React.Component {
141
141
  }
142
142
  }
143
143
 
144
- const styles = () => ({
145
- base: {
146
- cursor: 'pointer',
147
- opacity: 0.5,
148
- position: 'relative',
149
- },
150
- });
151
-
152
144
  RectComponent.propTypes = {
153
- classes: PropTypes.object.isRequired,
154
145
  height: PropTypes.number.isRequired,
155
146
  hotspotColor: PropTypes.string.isRequired,
156
147
  id: PropTypes.string.isRequired,
@@ -179,4 +170,4 @@ RectComponent.defaultProps = {
179
170
  scale: 1,
180
171
  };
181
172
 
182
- export default withStyles(styles)(RectComponent);
173
+ export default RectComponent;
package/src/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import ReactDOM from 'react-dom';
2
+ import { createRoot } from 'react-dom/client';
3
3
  import { renderMath } from '@pie-lib/math-rendering';
4
4
  import { EnableAudioAutoplayImage } from '@pie-lib/render-ui';
5
5
  import { SessionChangedEvent, ModelSetEvent } from '@pie-framework/pie-player-events';
@@ -14,6 +14,7 @@ export default class Hotspot extends HTMLElement {
14
14
  this._session = null;
15
15
  this._audioInitialized = false;
16
16
  this.audioComplete = false;
17
+ this._root = null;
17
18
  }
18
19
 
19
20
  set model(m) {
@@ -191,16 +192,6 @@ export default class Hotspot extends HTMLElement {
191
192
  observer.observe(this, { childList: true, subtree: true });
192
193
  }
193
194
 
194
- disconnectedCallback() {
195
- document.removeEventListener('click', this._enableAudio);
196
-
197
- if (this._audio) {
198
- this._audio.removeEventListener('playing', this._handlePlaying);
199
- this._audio.removeEventListener('ended', this._handleEnded);
200
- this._audio = null;
201
- }
202
- }
203
-
204
195
  _render() {
205
196
  if (this._model && this._session) {
206
197
  const el = React.createElement(HotspotComponent, {
@@ -209,9 +200,27 @@ export default class Hotspot extends HTMLElement {
209
200
  onSelectChoice: this.onSelectChoice.bind(this),
210
201
  });
211
202
 
212
- ReactDOM.render(el, this, () => {
203
+ if (!this._root) {
204
+ this._root = createRoot(this);
205
+ }
206
+ this._root.render(el);
207
+ queueMicrotask(() => {
213
208
  renderMath(this);
214
209
  });
215
210
  }
216
211
  }
212
+
213
+ disconnectedCallback() {
214
+ document.removeEventListener('click', this._enableAudio);
215
+
216
+ if (this._audio) {
217
+ this._audio.removeEventListener('playing', this._handlePlaying);
218
+ this._audio.removeEventListener('ended', this._handleEnded);
219
+ this._audio = null;
220
+ }
221
+
222
+ if (this._root) {
223
+ this._root.unmount();
224
+ }
225
+ }
217
226
  }
package/LICENSE.md DELETED
@@ -1,5 +0,0 @@
1
- Copyright 2019 CoreSpring Inc
2
-
3
- Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
4
-
5
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.