@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.
- package/CHANGELOG.md +66 -0
- package/configure/CHANGELOG.md +66 -0
- package/configure/lib/DeleteWidget.js +31 -44
- package/configure/lib/DeleteWidget.js.map +1 -1
- package/configure/lib/__tests__/DeleteWidget.test.js +60 -0
- package/configure/lib/__tests__/hotspot-container.test.js +377 -0
- package/configure/lib/__tests__/hotspot-drawable.test.js +233 -0
- package/configure/lib/__tests__/index.test.js +211 -0
- package/configure/lib/__tests__/root.test.js +440 -0
- package/configure/lib/__tests__/utils.test.js +287 -0
- package/configure/lib/button.js +27 -46
- package/configure/lib/button.js.map +1 -1
- package/configure/lib/buttons/circle.js +21 -28
- package/configure/lib/buttons/circle.js.map +1 -1
- package/configure/lib/buttons/polygon.js +27 -34
- package/configure/lib/buttons/polygon.js.map +1 -1
- package/configure/lib/buttons/rectangle.js +27 -34
- package/configure/lib/buttons/rectangle.js.map +1 -1
- package/configure/lib/defaults.js +3 -4
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/hotspot-circle.js +133 -199
- package/configure/lib/hotspot-circle.js.map +1 -1
- package/configure/lib/hotspot-container.js +251 -356
- package/configure/lib/hotspot-container.js.map +1 -1
- package/configure/lib/hotspot-drawable.js +361 -473
- package/configure/lib/hotspot-drawable.js.map +1 -1
- package/configure/lib/hotspot-palette.js +93 -140
- package/configure/lib/hotspot-palette.js.map +1 -1
- package/configure/lib/hotspot-polygon.js +213 -318
- package/configure/lib/hotspot-polygon.js.map +1 -1
- package/configure/lib/hotspot-rectangle.js +129 -193
- package/configure/lib/hotspot-rectangle.js.map +1 -1
- package/configure/lib/icons.js +1 -1
- package/configure/lib/icons.js.map +1 -1
- package/configure/lib/image-konva.js +47 -87
- package/configure/lib/image-konva.js.map +1 -1
- package/configure/lib/index.js +163 -223
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/root.js +302 -394
- package/configure/lib/root.js.map +1 -1
- package/configure/lib/shapes/circle.js +70 -102
- package/configure/lib/shapes/circle.js.map +1 -1
- package/configure/lib/shapes/index.js +5 -13
- package/configure/lib/shapes/index.js.map +1 -1
- package/configure/lib/shapes/polygon.js +65 -97
- package/configure/lib/shapes/polygon.js.map +1 -1
- package/configure/lib/shapes/rectagle.js +70 -102
- package/configure/lib/shapes/rectagle.js.map +1 -1
- package/configure/lib/shapes/utils.js +3 -9
- package/configure/lib/shapes/utils.js.map +1 -1
- package/configure/lib/upload-control.js +26 -53
- package/configure/lib/upload-control.js.map +1 -1
- package/configure/lib/utils.js +85 -138
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +11 -10
- package/configure/src/__tests__/index.test.js +11 -5
- package/configure/src/button.jsx +12 -20
- package/configure/src/hotspot-circle.jsx +5 -18
- package/configure/src/hotspot-container.jsx +82 -98
- package/configure/src/hotspot-drawable.jsx +43 -45
- package/configure/src/hotspot-palette.jsx +45 -37
- package/configure/src/hotspot-polygon.jsx +4 -20
- package/configure/src/hotspot-rectangle.jsx +4 -17
- package/configure/src/index.js +12 -2
- package/configure/src/root.jsx +85 -79
- package/configure/src/upload-control.jsx +6 -16
- package/controller/CHANGELOG.md +52 -0
- package/controller/lib/__tests__/index.test.js +586 -0
- package/controller/lib/__tests__/utils.test.js +8 -0
- package/controller/lib/defaults.js +3 -4
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +152 -206
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js +15 -35
- package/controller/lib/utils.js.map +1 -1
- package/controller/package.json +2 -2
- package/docs/demo/pie.manifest.json +11 -0
- package/lib/__tests__/container.test.js +221 -0
- package/lib/__tests__/index.test.js +113 -0
- package/lib/__tests__/polygon.test.js +245 -0
- package/lib/__tests__/rectangle.test.js +236 -0
- package/lib/__tests__/session-updater.test.js +69 -0
- package/lib/hotspot/circle.js +111 -170
- package/lib/hotspot/circle.js.map +1 -1
- package/lib/hotspot/container.js +175 -261
- package/lib/hotspot/container.js.map +1 -1
- package/lib/hotspot/icons.js +1 -1
- package/lib/hotspot/icons.js.map +1 -1
- package/lib/hotspot/image-konva-tooltip.js +66 -113
- package/lib/hotspot/image-konva-tooltip.js.map +1 -1
- package/lib/hotspot/index.js +136 -199
- package/lib/hotspot/index.js.map +1 -1
- package/lib/hotspot/polygon.js +151 -215
- package/lib/hotspot/polygon.js.map +1 -1
- package/lib/hotspot/rectangle.js +130 -186
- package/lib/hotspot/rectangle.js.map +1 -1
- package/lib/index.js +188 -257
- package/lib/index.js.map +1 -1
- package/lib/session-updater.js +13 -19
- package/lib/session-updater.js.map +1 -1
- package/package.json +14 -11
- package/src/hotspot/circle.jsx +2 -13
- package/src/hotspot/container.jsx +35 -50
- package/src/hotspot/index.jsx +16 -28
- package/src/hotspot/polygon.jsx +4 -13
- package/src/hotspot/rectangle.jsx +4 -13
- package/src/index.js +21 -12
- package/LICENSE.md +0 -5
- package/configure/node_modules/debug/CHANGELOG.md +0 -395
- package/configure/node_modules/debug/LICENSE +0 -19
- package/configure/node_modules/debug/README.md +0 -437
- package/configure/node_modules/debug/node.js +0 -1
- package/configure/node_modules/debug/package.json +0 -51
- package/configure/node_modules/debug/src/browser.js +0 -180
- package/configure/node_modules/debug/src/common.js +0 -249
- package/configure/node_modules/debug/src/index.js +0 -12
- package/configure/node_modules/debug/src/node.js +0 -177
package/lib/session-updater.js
CHANGED
|
@@ -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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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(
|
|
20
|
-
return answer.id !== id;
|
|
21
|
-
});
|
|
18
|
+
session.answers = session.answers.filter(answer => answer.id !== id);
|
|
22
19
|
} else {
|
|
23
|
-
|
|
24
|
-
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
|
-
}
|
|
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=
|
|
42
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1cGRhdGVTZXNzaW9uVmFsdWUiLCJzZXNzaW9uIiwibW9kZWwiLCJkYXRhIiwiaWQiLCJzZWxlY3RlZCIsIm11bHRpcGxlQ29ycmVjdCIsImFuc3dlcnMiLCJmaWx0ZXIiLCJhbnN3ZXIiLCJpdGVtIiwicHVzaCIsInNlbGVjdG9yIiwidXBkYXRlU2Vzc2lvbk1ldGFkYXRhIiwibWV0YWRhdGEiLCJhdWRpb1N0YXJ0VGltZSIsImF1ZGlvRW5kVGltZSIsIndhaXRUaW1lIl0sInNvdXJjZXMiOlsiLi4vc3JjL3Nlc3Npb24tdXBkYXRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gdXBkYXRlU2Vzc2lvblZhbHVlKHNlc3Npb24sIG1vZGVsLCBkYXRhKSB7XG4gIGNvbnN0IHsgaWQsIHNlbGVjdGVkIH0gPSBkYXRhO1xuICBjb25zdCB7IG11bHRpcGxlQ29ycmVjdCB9ID0gbW9kZWwgfHwge307XG4gIHNlc3Npb24uYW5zd2VycyA9IHNlc3Npb24uYW5zd2VycyB8fCBbXTtcblxuICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgc2Vzc2lvbi5hbnN3ZXJzID0gc2Vzc2lvbi5hbnN3ZXJzLmZpbHRlcigoYW5zd2VyKSA9PiBhbnN3ZXIuaWQgIT09IGlkKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpdGVtID0geyBpZCB9O1xuICAgIGlmIChtdWx0aXBsZUNvcnJlY3QpIHtcbiAgICAgIHNlc3Npb24uYW5zd2Vycy5wdXNoKGl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXNzaW9uLmFuc3dlcnMgPSBbaXRlbV07XG4gICAgfVxuXG4gICAgLy91cGRhdGUgc2Vzc2lvbiBtZXRhZGF0YVxuICAgIHNlc3Npb24uc2VsZWN0b3IgPSBkYXRhLnNlbGVjdG9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTZXNzaW9uTWV0YWRhdGEoc2Vzc2lvbiwgbWV0YWRhdGEpIHtcbiAgc2Vzc2lvbi5hdWRpb1N0YXJ0VGltZSA9IHNlc3Npb24uYXVkaW9TdGFydFRpbWUgfHwgbWV0YWRhdGEuYXVkaW9TdGFydFRpbWU7IC8vdGltZXN0YW1wIHdoZW4gYXV0by1wbGF5ZWQgYXVkaW8gc3RhcnRlZCBwbGF5aW5nXG4gIHNlc3Npb24uYXVkaW9FbmRUaW1lID0gc2Vzc2lvbi5hdWRpb0VuZFRpbWUgfHwgbWV0YWRhdGEuYXVkaW9FbmRUaW1lOyAvL3RpbWVzdGFtcCB3aGVuIGF1dG8tcGxheWVkIGF1ZGlvIGNvbXBsZXRlZCBwbGF5aW5nXG5cbiAgaWYgKCFzZXNzaW9uLndhaXRUaW1lICYmIHNlc3Npb24uYXVkaW9TdGFydFRpbWUgJiYgc2Vzc2lvbi5hdWRpb0VuZFRpbWUpIHtcbiAgICAvLyB3YWl0VGltZSBpcyBlbGFwc2VkIHRpbWUgdGhlIHVzZXIgd2FpdGVkIGZvciBhdXRvLXBsYXllZCBhdWRpbyB0byBmaW5pc2hcbiAgICBzZXNzaW9uLndhaXRUaW1lID0gc2Vzc2lvbi5hdWRpb0VuZFRpbWUgLSBzZXNzaW9uLmF1ZGlvU3RhcnRUaW1lO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBTyxTQUFTQSxrQkFBa0JBLENBQUNDLE9BQU8sRUFBRUMsS0FBSyxFQUFFQyxJQUFJLEVBQUU7RUFDdkQsTUFBTTtJQUFFQyxFQUFFO0lBQUVDO0VBQVMsQ0FBQyxHQUFHRixJQUFJO0VBQzdCLE1BQU07SUFBRUc7RUFBZ0IsQ0FBQyxHQUFHSixLQUFLLElBQUksQ0FBQyxDQUFDO0VBQ3ZDRCxPQUFPLENBQUNNLE9BQU8sR0FBR04sT0FBTyxDQUFDTSxPQUFPLElBQUksRUFBRTtFQUV2QyxJQUFJLENBQUNGLFFBQVEsRUFBRTtJQUNiSixPQUFPLENBQUNNLE9BQU8sR0FBR04sT0FBTyxDQUFDTSxPQUFPLENBQUNDLE1BQU0sQ0FBRUMsTUFBTSxJQUFLQSxNQUFNLENBQUNMLEVBQUUsS0FBS0EsRUFBRSxDQUFDO0VBQ3hFLENBQUMsTUFBTTtJQUNMLE1BQU1NLElBQUksR0FBRztNQUFFTjtJQUFHLENBQUM7SUFDbkIsSUFBSUUsZUFBZSxFQUFFO01BQ25CTCxPQUFPLENBQUNNLE9BQU8sQ0FBQ0ksSUFBSSxDQUFDRCxJQUFJLENBQUM7SUFDNUIsQ0FBQyxNQUFNO01BQ0xULE9BQU8sQ0FBQ00sT0FBTyxHQUFHLENBQUNHLElBQUksQ0FBQztJQUMxQjs7SUFFQTtJQUNBVCxPQUFPLENBQUNXLFFBQVEsR0FBR1QsSUFBSSxDQUFDUyxRQUFRO0VBQ2xDO0FBQ0Y7QUFFTyxTQUFTQyxxQkFBcUJBLENBQUNaLE9BQU8sRUFBRWEsUUFBUSxFQUFFO0VBQ3ZEYixPQUFPLENBQUNjLGNBQWMsR0FBR2QsT0FBTyxDQUFDYyxjQUFjLElBQUlELFFBQVEsQ0FBQ0MsY0FBYyxDQUFDLENBQUM7RUFDNUVkLE9BQU8sQ0FBQ2UsWUFBWSxHQUFHZixPQUFPLENBQUNlLFlBQVksSUFBSUYsUUFBUSxDQUFDRSxZQUFZLENBQUMsQ0FBQzs7RUFFdEUsSUFBSSxDQUFDZixPQUFPLENBQUNnQixRQUFRLElBQUloQixPQUFPLENBQUNjLGNBQWMsSUFBSWQsT0FBTyxDQUFDZSxZQUFZLEVBQUU7SUFDdkU7SUFDQWYsT0FBTyxDQUFDZ0IsUUFBUSxHQUFHaEIsT0FBTyxDQUFDZSxZQUFZLEdBQUdmLE9BQU8sQ0FBQ2MsY0FBYztFQUNsRTtBQUNGIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
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.
|
|
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
|
-
"@
|
|
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": "
|
|
13
|
-
"@pie-lib/math-rendering": "
|
|
14
|
-
"@pie-lib/render-ui": "
|
|
15
|
-
"@pie-lib/test-utils": "
|
|
16
|
-
"konva": "
|
|
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": "
|
|
19
|
-
"react-dom": "
|
|
20
|
-
"react-konva": "
|
|
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": "
|
|
27
|
+
"gitHead": "0e14ff981bcdc8a89a0e58484026496701bfdbc3",
|
|
25
28
|
"scripts": {
|
|
26
29
|
"postpublish": "../../scripts/postpublish"
|
|
27
30
|
},
|
package/src/hotspot/circle.jsx
CHANGED
|
@@ -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
|
|
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 {
|
|
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
|
-
<
|
|
81
|
+
<BaseContainer style={{ padding: strokeWidth / 2 }}>
|
|
58
82
|
{imageUrl ? (
|
|
59
|
-
<
|
|
60
|
-
<
|
|
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
|
-
</
|
|
90
|
+
</ImageContainer>
|
|
68
91
|
) : null}
|
|
69
92
|
|
|
70
|
-
<
|
|
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
|
-
</
|
|
170
|
-
</
|
|
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
|
|
217
|
+
export default Container;
|
package/src/hotspot/index.jsx
CHANGED
|
@@ -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 {
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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
|
-
</
|
|
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
|
-
|
|
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;
|
package/src/hotspot/polygon.jsx
CHANGED
|
@@ -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
|
|
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
|
|
173
|
+
export default RectComponent;
|
package/src/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import
|
|
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
|
-
|
|
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.
|