@pie-element/rubric 8.1.2-next.2 → 8.1.2

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 (93) hide show
  1. package/CHANGELOG.json +257 -0
  2. package/CHANGELOG.md +1725 -0
  3. package/LICENSE.md +5 -0
  4. package/README.md +3 -0
  5. package/configure/CHANGELOG.json +197 -0
  6. package/configure/CHANGELOG.md +1565 -0
  7. package/configure/lib/defaults.js +70 -0
  8. package/configure/lib/defaults.js.map +1 -0
  9. package/configure/lib/index.js +135 -0
  10. package/configure/lib/index.js.map +1 -0
  11. package/configure/lib/main.js +103 -0
  12. package/configure/lib/main.js.map +1 -0
  13. package/configure/package.json +23 -0
  14. package/configure/src/__tests__/index.test.jsx +192 -0
  15. package/configure/src/defaults.js +43 -0
  16. package/configure/src/index.js +139 -0
  17. package/configure/src/main.jsx +87 -0
  18. package/controller/CHANGELOG.json +17 -0
  19. package/controller/CHANGELOG.md +901 -0
  20. package/controller/lib/defaults.js +15 -0
  21. package/controller/lib/defaults.js.map +1 -0
  22. package/controller/lib/index.js +46 -0
  23. package/controller/lib/index.js.map +1 -0
  24. package/controller/package.json +12 -0
  25. package/controller/src/__tests__/index.test.js +33 -0
  26. package/controller/src/defaults.js +8 -0
  27. package/controller/src/index.js +41 -0
  28. package/docs/config-schema.json +712 -0
  29. package/docs/config-schema.json.md +532 -0
  30. package/docs/demo/config.js +8 -0
  31. package/docs/demo/generate.js +8 -0
  32. package/docs/demo/index.html +2 -0
  33. package/docs/pie-schema.json +391 -0
  34. package/docs/pie-schema.json.md +281 -0
  35. package/lib/index.js +52 -0
  36. package/lib/index.js.map +1 -0
  37. package/lib/main.js +208 -0
  38. package/lib/main.js.map +1 -0
  39. package/lib/print.js +71 -0
  40. package/lib/print.js.map +1 -0
  41. package/module/configure.js +1 -0
  42. package/module/controller.js +73 -0
  43. package/module/demo.js +33 -0
  44. package/module/element.js +1 -0
  45. package/module/index.html +21 -0
  46. package/module/manifest.json +14 -0
  47. package/module/print-demo.js +71 -0
  48. package/module/print.html +18 -0
  49. package/module/print.js +1 -0
  50. package/package.json +25 -87
  51. package/src/__tests__/rubric-view.test.jsx +37 -0
  52. package/src/index.js +48 -0
  53. package/src/main.jsx +226 -0
  54. package/src/print.js +74 -0
  55. package/configure.js +0 -2
  56. package/controller.js +0 -1
  57. package/dist/author/defaults.d.ts +0 -71
  58. package/dist/author/defaults.js +0 -53
  59. package/dist/author/index.d.ts +0 -21
  60. package/dist/author/index.js +0 -72
  61. package/dist/author/main.d.ts +0 -14
  62. package/dist/author/main.js +0 -51
  63. package/dist/browser/author/index.js +0 -44381
  64. package/dist/browser/author/index.js.map +0 -1
  65. package/dist/browser/controller/index.js +0 -41
  66. package/dist/browser/controller/index.js.map +0 -1
  67. package/dist/browser/delivery/index.js +0 -34
  68. package/dist/browser/delivery/index.js.map +0 -1
  69. package/dist/browser/dist-D-HDsar4.js +0 -9091
  70. package/dist/browser/dist-D-HDsar4.js.map +0 -1
  71. package/dist/browser/dist-DnnL1HSL.js +0 -98
  72. package/dist/browser/dist-DnnL1HSL.js.map +0 -1
  73. package/dist/browser/main-Fk9pdppe.js +0 -153
  74. package/dist/browser/main-Fk9pdppe.js.map +0 -1
  75. package/dist/browser/print/index.js +0 -34
  76. package/dist/browser/print/index.js.map +0 -1
  77. package/dist/browser/rubric.css +0 -2
  78. package/dist/controller/defaults.d.ts +0 -17
  79. package/dist/controller/defaults.js +0 -21
  80. package/dist/controller/index.d.ts +0 -10
  81. package/dist/controller/index.js +0 -23
  82. package/dist/delivery/index.d.ts +0 -16
  83. package/dist/delivery/index.js +0 -33
  84. package/dist/delivery/main.d.ts +0 -34
  85. package/dist/delivery/main.js +0 -156
  86. package/dist/index.d.ts +0 -1
  87. package/dist/index.iife.d.ts +0 -8
  88. package/dist/index.iife.js +0 -145
  89. package/dist/index.js +0 -2
  90. package/dist/print/index.d.ts +0 -15
  91. package/dist/print/index.js +0 -34
  92. package/dist/runtime-support.d.ts +0 -12
  93. package/dist/runtime-support.js +0 -12
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _default = exports.default = {
8
+ model: {
9
+ points: ['', '', '', ''],
10
+ sampleAnswers: [null, null, null, null],
11
+ maxPoints: 3,
12
+ excludeZero: false,
13
+ excludeZeroEnabled: true,
14
+ maxPointsEnabled: true
15
+ },
16
+ configuration: {
17
+ baseInputConfiguration: {
18
+ h3: {
19
+ disabled: true
20
+ },
21
+ audio: {
22
+ disabled: false
23
+ },
24
+ video: {
25
+ disabled: false
26
+ },
27
+ image: {
28
+ disabled: false
29
+ },
30
+ textAlign: {
31
+ disabled: true
32
+ },
33
+ showParagraphs: {
34
+ disabled: false
35
+ },
36
+ separateParagraphs: {
37
+ disabled: true
38
+ }
39
+ },
40
+ rubriclessInstruction: {
41
+ inputConfiguration: {
42
+ audio: {
43
+ disabled: false
44
+ },
45
+ video: {
46
+ disabled: false
47
+ },
48
+ image: {
49
+ disabled: false
50
+ }
51
+ }
52
+ },
53
+ showExcludeZero: {
54
+ settings: true,
55
+ label: 'Ability to exclude zero'
56
+ },
57
+ showMaxPoint: {
58
+ settings: true,
59
+ label: 'Show max points dropdown'
60
+ },
61
+ settingsPanelDisabled: false,
62
+ // width: '500px'
63
+ mathMlOptions: {
64
+ mmlOutput: false,
65
+ mmlEditing: false
66
+ },
67
+ maxMaxPoints: 9
68
+ }
69
+ };
70
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","names":["model","points","sampleAnswers","maxPoints","excludeZero","excludeZeroEnabled","maxPointsEnabled","configuration","baseInputConfiguration","h3","disabled","audio","video","image","textAlign","showParagraphs","separateParagraphs","rubriclessInstruction","inputConfiguration","showExcludeZero","settings","label","showMaxPoint","settingsPanelDisabled","mathMlOptions","mmlOutput","mmlEditing","maxMaxPoints"],"sources":["../src/defaults.js"],"sourcesContent":["export default {\n model: {\n points: ['', '', '', ''],\n sampleAnswers: [null, null, null, null],\n maxPoints: 3,\n excludeZero: false,\n excludeZeroEnabled: true,\n maxPointsEnabled: true,\n },\n configuration: {\n baseInputConfiguration: {\n h3: { disabled: true },\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n textAlign: { disabled: true },\n showParagraphs: { disabled: false },\n separateParagraphs: { disabled: true },\n },\n rubriclessInstruction: {\n inputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n },\n },\n showExcludeZero: {\n settings: true,\n label: 'Ability to exclude zero',\n },\n showMaxPoint: {\n settings: true,\n label: 'Show max points dropdown',\n },\n settingsPanelDisabled: false,\n // width: '500px'\n mathMlOptions: {\n mmlOutput: false,\n mmlEditing: false,\n },\n maxMaxPoints: 9,\n },\n};\n"],"mappings":";;;;;;iCAAe;EACbA,KAAK,EAAE;IACLC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IACxBC,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IACvCC,SAAS,EAAE,CAAC;IACZC,WAAW,EAAE,KAAK;IAClBC,kBAAkB,EAAE,IAAI;IACxBC,gBAAgB,EAAE;EACpB,CAAC;EACDC,aAAa,EAAE;IACbC,sBAAsB,EAAE;MACtBC,EAAE,EAAE;QAAEC,QAAQ,EAAE;MAAK,CAAC;MACtBC,KAAK,EAAE;QAAED,QAAQ,EAAE;MAAM,CAAC;MAC1BE,KAAK,EAAE;QAAEF,QAAQ,EAAE;MAAM,CAAC;MAC1BG,KAAK,EAAE;QAAEH,QAAQ,EAAE;MAAM,CAAC;MAC1BI,SAAS,EAAE;QAAEJ,QAAQ,EAAE;MAAK,CAAC;MAC7BK,cAAc,EAAE;QAAEL,QAAQ,EAAE;MAAM,CAAC;MACnCM,kBAAkB,EAAE;QAAEN,QAAQ,EAAE;MAAK;IACvC,CAAC;IACDO,qBAAqB,EAAE;MACrBC,kBAAkB,EAAE;QAClBP,KAAK,EAAE;UAAED,QAAQ,EAAE;QAAM,CAAC;QAC1BE,KAAK,EAAE;UAAEF,QAAQ,EAAE;QAAM,CAAC;QAC1BG,KAAK,EAAE;UAAEH,QAAQ,EAAE;QAAM;MAC3B;IACF,CAAC;IACDS,eAAe,EAAE;MACfC,QAAQ,EAAE,IAAI;MACdC,KAAK,EAAE;IACT,CAAC;IACDC,YAAY,EAAE;MACZF,QAAQ,EAAE,IAAI;MACdC,KAAK,EAAE;IACT,CAAC;IACDE,qBAAqB,EAAE,KAAK;IAC5B;IACAC,aAAa,EAAE;MACbC,SAAS,EAAE,KAAK;MAChBC,UAAU,EAAE;IACd,CAAC;IACDC,YAAY,EAAE;EAChB;AACF,CAAC","ignoreList":[]}
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _pieConfigureEvents = require("@pie-framework/pie-configure-events");
10
+ var _react = _interopRequireDefault(require("react"));
11
+ var _client = require("react-dom/client");
12
+ var _debug = _interopRequireDefault(require("debug"));
13
+ var _main = _interopRequireDefault(require("./main"));
14
+ var _defaults = _interopRequireDefault(require("./defaults"));
15
+ const modelWithDefaults = m => ({
16
+ ..._defaults.default.model,
17
+ ...m
18
+ });
19
+ const configurationWithDefaults = c => ({
20
+ ..._defaults.default.configuration,
21
+ ...c
22
+ });
23
+ class RubricElement extends HTMLElement {
24
+ constructor() {
25
+ super();
26
+ (0, _defineProperty2.default)(this, "updateModelAccordingToReceivedProps", nextModel => {
27
+ const currentModel = {
28
+ ...this._model
29
+ };
30
+ if (!nextModel) {
31
+ return currentModel;
32
+ }
33
+ const validatedModel = {
34
+ ...nextModel
35
+ };
36
+
37
+ // excludeZero should be false and disabled when maxPoints is 1
38
+ if (validatedModel.maxPoints === 1) {
39
+ validatedModel.excludeZero = false;
40
+ }
41
+ const {
42
+ maxPoints,
43
+ excludeZero
44
+ } = validatedModel || {};
45
+ validatedModel.points = validatedModel.points ? [...validatedModel.points] : [];
46
+ validatedModel.sampleAnswers = validatedModel.sampleAnswers ? [...validatedModel.sampleAnswers] : [];
47
+ const howManyPointsShouldHave = excludeZero ? maxPoints : maxPoints + 1;
48
+ const howManyPointsDoesItHave = validatedModel.points.length;
49
+ const excludeZeroChanged = currentModel?.excludeZero !== nextModel?.excludeZero;
50
+ const maxPointsChanged = currentModel?.maxPoints !== nextModel?.maxPoints;
51
+ if (howManyPointsDoesItHave < howManyPointsShouldHave) {
52
+ if (excludeZeroChanged && !excludeZero) {
53
+ validatedModel.points = ['', ...validatedModel.points];
54
+ validatedModel.sampleAnswers = [null, ...validatedModel.sampleAnswers];
55
+ }
56
+ if (maxPointsChanged) {
57
+ for (let i = 0; i < howManyPointsShouldHave - howManyPointsDoesItHave; i++) {
58
+ validatedModel.points.push('');
59
+ validatedModel.sampleAnswers.push(null);
60
+ }
61
+ }
62
+ } else if (howManyPointsDoesItHave > howManyPointsShouldHave) {
63
+ if (excludeZeroChanged && excludeZero) {
64
+ validatedModel.points = validatedModel.points.slice(1);
65
+ validatedModel.sampleAnswers = validatedModel.sampleAnswers.slice(1);
66
+ }
67
+ if (maxPointsChanged) {
68
+ validatedModel.points = validatedModel.points.slice(0, howManyPointsShouldHave);
69
+ validatedModel.sampleAnswers = validatedModel.sampleAnswers.slice(0, howManyPointsShouldHave);
70
+ }
71
+ }
72
+ return validatedModel;
73
+ });
74
+ (0, _defineProperty2.default)(this, "onConfigurationChanged", c => {
75
+ this._configuration = configurationWithDefaults(c);
76
+ if (this._model) {
77
+ this.onModelChanged(this._model);
78
+ }
79
+ this._render();
80
+ });
81
+ this._root = null;
82
+ _debug.default.log('constructor called');
83
+ this._model = modelWithDefaults();
84
+ this._configuration = configurationWithDefaults();
85
+ this.onModelChanged = this.onModelChanged.bind(this);
86
+ this.onConfigurationChanged = this.onConfigurationChanged.bind(this);
87
+ }
88
+ set model(m) {
89
+ this._model = this.updateModelAccordingToReceivedProps(modelWithDefaults(m));
90
+ this._render();
91
+ }
92
+ set configuration(c) {
93
+ this._configuration = configurationWithDefaults(c);
94
+ this._render();
95
+ }
96
+ onModelChanged(m) {
97
+ this._model = this.updateModelAccordingToReceivedProps(m);
98
+ this._render();
99
+ this.dispatchEvent(new _pieConfigureEvents.ModelUpdatedEvent(this._model, false));
100
+ }
101
+ insertImage(handler) {
102
+ this.dispatchEvent(new _pieConfigureEvents.InsertImageEvent(handler));
103
+ }
104
+ onDeleteImage(src, done) {
105
+ this.dispatchEvent(new _pieConfigureEvents.DeleteImageEvent(src, done));
106
+ }
107
+ connectedCallback() {
108
+ this._render();
109
+ }
110
+ _render() {
111
+ if (this._model) {
112
+ let element = /*#__PURE__*/_react.default.createElement(_main.default, {
113
+ model: this._model,
114
+ configuration: this._configuration,
115
+ onModelChanged: this.onModelChanged,
116
+ onConfigurationChanged: this.onConfigurationChanged,
117
+ imageSupport: {
118
+ add: this.insertImage.bind(this),
119
+ delete: this.onDeleteImage.bind(this)
120
+ }
121
+ });
122
+ if (!this._root) {
123
+ this._root = (0, _client.createRoot)(this);
124
+ }
125
+ this._root.render(element);
126
+ }
127
+ }
128
+ disconnectedCallback() {
129
+ if (this._root) {
130
+ this._root.unmount();
131
+ }
132
+ }
133
+ }
134
+ exports.default = RubricElement;
135
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["_pieConfigureEvents","require","_react","_interopRequireDefault","_client","_debug","_main","_defaults","modelWithDefaults","m","defaults","model","configurationWithDefaults","c","configuration","RubricElement","HTMLElement","constructor","_defineProperty2","default","nextModel","currentModel","_model","validatedModel","maxPoints","excludeZero","points","sampleAnswers","howManyPointsShouldHave","howManyPointsDoesItHave","length","excludeZeroChanged","maxPointsChanged","i","push","slice","_configuration","onModelChanged","_render","_root","debug","log","bind","onConfigurationChanged","updateModelAccordingToReceivedProps","dispatchEvent","ModelUpdatedEvent","insertImage","handler","InsertImageEvent","onDeleteImage","src","done","DeleteImageEvent","connectedCallback","element","React","createElement","Main","imageSupport","add","delete","createRoot","render","disconnectedCallback","unmount","exports"],"sources":["../src/index.js"],"sourcesContent":["import { ModelUpdatedEvent, InsertImageEvent, DeleteImageEvent } from '@pie-framework/pie-configure-events';\nimport React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport debug from 'debug';\n\nimport Main from './main';\nimport defaults from './defaults';\n\nconst modelWithDefaults = (m) => ({ ...defaults.model, ...m });\n\nconst configurationWithDefaults = (c) => ({ ...defaults.configuration, ...c });\n\nexport default class RubricElement extends HTMLElement {\n constructor() {\n super();\n this._root = null;\n debug.log('constructor called');\n this._model = modelWithDefaults();\n this._configuration = configurationWithDefaults();\n this.onModelChanged = this.onModelChanged.bind(this);\n this.onConfigurationChanged = this.onConfigurationChanged.bind(this);\n }\n\n updateModelAccordingToReceivedProps = (nextModel) => {\n const currentModel = { ...this._model };\n\n if (!nextModel) {\n return currentModel;\n }\n\n const validatedModel = { ...nextModel };\n\n // excludeZero should be false and disabled when maxPoints is 1\n if (validatedModel.maxPoints === 1) {\n validatedModel.excludeZero = false;\n }\n\n const { maxPoints, excludeZero } = validatedModel || {};\n\n validatedModel.points = validatedModel.points ? [...validatedModel.points] : [];\n validatedModel.sampleAnswers = validatedModel.sampleAnswers ? [...validatedModel.sampleAnswers] : [];\n\n const howManyPointsShouldHave = excludeZero ? maxPoints : maxPoints + 1;\n const howManyPointsDoesItHave = validatedModel.points.length;\n\n const excludeZeroChanged = currentModel?.excludeZero !== nextModel?.excludeZero;\n const maxPointsChanged = currentModel?.maxPoints !== nextModel?.maxPoints;\n\n if (howManyPointsDoesItHave < howManyPointsShouldHave) {\n if (excludeZeroChanged && !excludeZero) {\n validatedModel.points = ['', ...validatedModel.points];\n validatedModel.sampleAnswers = [null, ...validatedModel.sampleAnswers];\n }\n\n if (maxPointsChanged) {\n for (let i = 0; i < howManyPointsShouldHave - howManyPointsDoesItHave; i++) {\n validatedModel.points.push('');\n validatedModel.sampleAnswers.push(null);\n }\n }\n } else if (howManyPointsDoesItHave > howManyPointsShouldHave) {\n if (excludeZeroChanged && excludeZero) {\n validatedModel.points = validatedModel.points.slice(1);\n validatedModel.sampleAnswers = validatedModel.sampleAnswers.slice(1);\n }\n\n if (maxPointsChanged) {\n validatedModel.points = validatedModel.points.slice(0, howManyPointsShouldHave);\n validatedModel.sampleAnswers = validatedModel.sampleAnswers.slice(0, howManyPointsShouldHave);\n }\n }\n\n return validatedModel;\n };\n\n set model(m) {\n this._model = this.updateModelAccordingToReceivedProps(modelWithDefaults(m));\n this._render();\n }\n\n set configuration(c) {\n this._configuration = configurationWithDefaults(c);\n this._render();\n }\n\n onModelChanged(m) {\n this._model = this.updateModelAccordingToReceivedProps(m);\n this._render();\n this.dispatchEvent(new ModelUpdatedEvent(this._model, false));\n }\n\n onConfigurationChanged = (c) => {\n this._configuration = configurationWithDefaults(c);\n\n if (this._model) {\n this.onModelChanged(this._model);\n }\n\n this._render();\n };\n\n insertImage(handler) {\n this.dispatchEvent(new InsertImageEvent(handler));\n }\n\n onDeleteImage(src, done) {\n this.dispatchEvent(new DeleteImageEvent(src, done));\n }\n\n connectedCallback() {\n this._render();\n }\n\n _render() {\n if (this._model) {\n let element = React.createElement(Main, {\n model: this._model,\n configuration: this._configuration,\n onModelChanged: this.onModelChanged,\n onConfigurationChanged: this.onConfigurationChanged,\n imageSupport: {\n add: this.insertImage.bind(this),\n delete: this.onDeleteImage.bind(this),\n },\n });\n\n if (!this._root) {\n this._root = createRoot(this);\n }\n this._root.render(element);\n }\n }\n\n disconnectedCallback() {\n if (this._root) {\n this._root.unmount();\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _react = _interopRequireDefault(require("react"));
10
+ var _rubric = require("@pie-lib/rubric");
11
+ var _styles = require("@mui/material/styles");
12
+ var _configUi = require("@pie-lib/config-ui");
13
+ const {
14
+ Panel,
15
+ toggle
16
+ } = _configUi.settings;
17
+ const StyledDiv = (0, _styles.styled)('div')(({
18
+ theme,
19
+ width
20
+ }) => ({
21
+ maxWidth: width,
22
+ fontFamily: 'Cerebri Sans',
23
+ fontSize: theme.typography.fontSize
24
+ }));
25
+ class Main extends _react.default.Component {
26
+ constructor(...args) {
27
+ super(...args);
28
+ (0, _defineProperty2.default)(this, "verifyRubriclessModel", (m, config) => {
29
+ const {
30
+ rubricless = false
31
+ } = config || {};
32
+ return rubricless ? (({
33
+ points,
34
+ sampleAnswers,
35
+ ...rest
36
+ }) => rest)(m) : m;
37
+ });
38
+ }
39
+ render() {
40
+ const {
41
+ model,
42
+ configuration,
43
+ onConfigurationChanged,
44
+ onModelChanged,
45
+ imageSupport
46
+ } = this.props || {};
47
+ const {
48
+ baseInputConfiguration = {},
49
+ contentDimensions = {},
50
+ settingsPanelDisabled,
51
+ showExcludeZero = {},
52
+ showMaxPoint = {},
53
+ mathMlOptions = {},
54
+ rubricless = false,
55
+ rubriclessInstruction,
56
+ width
57
+ } = configuration || {};
58
+
59
+ // ensure to eliminate points and sampleAnswers in case of rubricless
60
+ const value = this.verifyRubriclessModel(model, configuration);
61
+ const {
62
+ extraCSSRules
63
+ } = model;
64
+ const panelProperties = {
65
+ excludeZeroEnabled: showExcludeZero.settings && toggle(showExcludeZero.label),
66
+ maxPointsEnabled: showMaxPoint.settings && toggle(showMaxPoint.label),
67
+ rubriclessInstructionEnabled: rubricless && rubriclessInstruction.settings && toggle(rubriclessInstruction.label)
68
+ };
69
+ const getPluginProps = props => {
70
+ return Object.assign({
71
+ ...baseInputConfiguration
72
+ }, props || {});
73
+ };
74
+ return /*#__PURE__*/_react.default.createElement(_configUi.layout.ConfigLayout, {
75
+ extraCSSRules: extraCSSRules,
76
+ dimensions: contentDimensions,
77
+ hideSettings: settingsPanelDisabled,
78
+ settings: /*#__PURE__*/_react.default.createElement(Panel, {
79
+ model: model,
80
+ onChangeModel: onModelChanged,
81
+ configuration: configuration,
82
+ onChangeConfiguration: onConfigurationChanged,
83
+ pluginOpts: getPluginProps(rubriclessInstruction?.inputConfiguration),
84
+ groups: {
85
+ Properties: panelProperties
86
+ },
87
+ imageSupport: imageSupport
88
+ })
89
+ }, /*#__PURE__*/_react.default.createElement(StyledDiv, {
90
+ width: width
91
+ }, /*#__PURE__*/_react.default.createElement(_rubric.Authoring, {
92
+ value: value,
93
+ config: configuration,
94
+ onChange: onModelChanged,
95
+ mathMlOptions: mathMlOptions,
96
+ rubricless: rubricless,
97
+ pluginOpts: baseInputConfiguration,
98
+ imageSupport: imageSupport
99
+ })));
100
+ }
101
+ }
102
+ var _default = exports.default = Main;
103
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","names":["_react","_interopRequireDefault","require","_rubric","_styles","_configUi","Panel","toggle","settings","StyledDiv","styled","theme","width","maxWidth","fontFamily","fontSize","typography","Main","React","Component","constructor","args","_defineProperty2","default","m","config","rubricless","points","sampleAnswers","rest","render","model","configuration","onConfigurationChanged","onModelChanged","imageSupport","props","baseInputConfiguration","contentDimensions","settingsPanelDisabled","showExcludeZero","showMaxPoint","mathMlOptions","rubriclessInstruction","value","verifyRubriclessModel","extraCSSRules","panelProperties","excludeZeroEnabled","label","maxPointsEnabled","rubriclessInstructionEnabled","getPluginProps","Object","assign","createElement","layout","ConfigLayout","dimensions","hideSettings","onChangeModel","onChangeConfiguration","pluginOpts","inputConfiguration","groups","Properties","Authoring","onChange","_default","exports"],"sources":["../src/main.jsx"],"sourcesContent":["import React from 'react';\nimport { Authoring } from '@pie-lib/rubric';\nimport { styled } from '@mui/material/styles';\nimport { layout, settings } from '@pie-lib/config-ui';\n\nconst { Panel, toggle } = settings;\n\nconst StyledDiv = styled('div')(({ theme, width }) => ({\n maxWidth: width,\n fontFamily: 'Cerebri Sans',\n fontSize: theme.typography.fontSize,\n}));\n\nclass Main extends React.Component {\n verifyRubriclessModel = (m, config) => {\n const { rubricless = false } = config || {};\n return rubricless ? (({ points, sampleAnswers, ...rest }) => rest)(m) : m;\n };\n\n render() {\n const { model, configuration, onConfigurationChanged, onModelChanged, imageSupport } = this.props || {};\n const {\n baseInputConfiguration = {},\n contentDimensions = {},\n settingsPanelDisabled,\n showExcludeZero = {},\n showMaxPoint = {},\n mathMlOptions = {},\n rubricless = false,\n rubriclessInstruction,\n width,\n } = configuration || {};\n\n // ensure to eliminate points and sampleAnswers in case of rubricless\n const value = this.verifyRubriclessModel(model, configuration);\n const { extraCSSRules } = model;\n\n const panelProperties = {\n excludeZeroEnabled: showExcludeZero.settings && toggle(showExcludeZero.label),\n maxPointsEnabled: showMaxPoint.settings && toggle(showMaxPoint.label),\n rubriclessInstructionEnabled: rubricless && rubriclessInstruction.settings && toggle(rubriclessInstruction.label),\n };\n\n const getPluginProps = (props) => {\n return Object.assign(\n {\n ...baseInputConfiguration,\n },\n props || {},\n );\n };\n\n return (\n <layout.ConfigLayout\n extraCSSRules={extraCSSRules}\n dimensions={contentDimensions}\n hideSettings={settingsPanelDisabled}\n settings={\n <Panel\n model={model}\n onChangeModel={onModelChanged}\n configuration={configuration}\n onChangeConfiguration={onConfigurationChanged}\n pluginOpts={getPluginProps(rubriclessInstruction?.inputConfiguration)}\n groups={{\n Properties: panelProperties,\n }}\n imageSupport={imageSupport}\n />\n } >\n <StyledDiv width={width}>\n <Authoring\n value={value}\n config={configuration}\n onChange={onModelChanged}\n mathMlOptions={mathMlOptions}\n rubricless={rubricless}\n pluginOpts={baseInputConfiguration}\n imageSupport={imageSupport}\n />\n </StyledDiv>\n </layout.ConfigLayout>\n );\n }\n}\n\nexport default Main;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@pie-element/rubric-configure",
3
+ "private": true,
4
+ "version": "7.1.2",
5
+ "description": "Rubric authoring view",
6
+ "main": "lib/index.js",
7
+ "author": "Pie Framework Authors",
8
+ "dependencies": {
9
+ "@emotion/react": "^11.14.0",
10
+ "@emotion/style": "^0.8.0",
11
+ "@mui/icons-material": "^7.3.4",
12
+ "@mui/material": "^7.3.4",
13
+ "@pie-framework/pie-configure-events": "^1.3.0",
14
+ "@pie-lib/config-ui": "13.0.6",
15
+ "@pie-lib/editable-html-tip-tap": "2.1.4",
16
+ "@pie-lib/render-ui": "6.1.1",
17
+ "@pie-lib/rubric": "2.0.6",
18
+ "debug": "^4.1.1",
19
+ "react": "18.3.1",
20
+ "react-dom": "18.3.1"
21
+ },
22
+ "license": "ISC"
23
+ }
@@ -0,0 +1,192 @@
1
+ import RubricElement from '../index';
2
+ import defaults from '../defaults';
3
+ import { ModelUpdatedEvent, InsertSoundEvent, DeleteSoundEvent } from '@pie-framework/pie-configure-events';
4
+ import React from 'react';
5
+
6
+ jest.mock('@pie-lib/rubric', () => ({
7
+ Authoring: (props) => <div data-testid="authoring" {...props} />,
8
+ }));
9
+
10
+ jest.mock('react-dom/client', () => ({
11
+ createRoot: jest.fn(() => ({
12
+ render: jest.fn(),
13
+ unmount: jest.fn(),
14
+ })),
15
+ }));
16
+
17
+ jest.mock('@pie-lib/config-ui', () => ({
18
+ layout: {
19
+ ConfigLayout: (props) => <div {...props} />,
20
+ },
21
+ settings: {
22
+ Panel: (props) => <div {...props} />,
23
+ toggle: jest.fn(),
24
+ radio: jest.fn(),
25
+ },
26
+ }));
27
+
28
+ const model = (extras) => ({
29
+ id: '1',
30
+ element: 'pie-rubric',
31
+ points: ['A', 'B', 'C', 'D'],
32
+ sampleAnswers: [true, true, false, false],
33
+ maxPoints: 3,
34
+ excludeZero: false,
35
+ excludeZeroEnabled: true,
36
+ maxPointsEnabled: true,
37
+ ...extras,
38
+ });
39
+
40
+ const invalidModel = (extras) => ({
41
+ id: '2',
42
+ element: 'pie-rubric',
43
+ points: ['A', 'B', 'C', 'D'],
44
+ sampleAnswers: [true, true, false, false],
45
+ maxPoints: 5,
46
+ excludeZero: false,
47
+ excludeZeroEnabled: true,
48
+ maxPointsEnabled: true,
49
+ ...extras,
50
+ });
51
+ const configuration = (c) => ({ ...defaults.configuration, ...c });
52
+
53
+ describe('RubricElement', () => {
54
+ let element;
55
+
56
+ beforeAll(() => {
57
+ // Register the custom element if not already registered
58
+ if (!customElements.get('pie-rubric-configure')) {
59
+ customElements.define('pie-rubric-configure', RubricElement);
60
+ }
61
+ });
62
+
63
+ beforeEach(() => {
64
+ element = new RubricElement();
65
+ });
66
+
67
+ afterEach(() => {
68
+ jest.clearAllMocks();
69
+ });
70
+
71
+ describe('set model', () => {
72
+ it('should set the model correctly', () => {
73
+ const newModel = model();
74
+ element.model = newModel;
75
+ expect(element._model).toEqual(newModel);
76
+ });
77
+ });
78
+
79
+ describe('onModelChanged', () => {
80
+ it('should dispatch ModelUpdatedEvent on model change', () => {
81
+ const newModel = model();
82
+ const dispatchEventSpy = jest.spyOn(element, 'dispatchEvent');
83
+ element.onModelChanged(newModel);
84
+ expect(element._model).toEqual(newModel);
85
+ expect(dispatchEventSpy).toHaveBeenCalledWith(new ModelUpdatedEvent(newModel, false));
86
+ });
87
+ });
88
+
89
+ describe('set configuration', () => {
90
+ it('should set the configuration correctly', () => {
91
+ const newConfiguration = configuration();
92
+ element.configuration = newConfiguration;
93
+ expect(element._configuration).toEqual(newConfiguration);
94
+ });
95
+ });
96
+
97
+ describe('onConfigurationChanged', () => {
98
+ it('should call _render method on configuration change and overwrite the defaults with the new values', () => {
99
+ const newConfiguration = configuration({ maxMaxPoints: 10 });
100
+ const renderSpy = jest.spyOn(element, '_render');
101
+ element.onConfigurationChanged(newConfiguration);
102
+ expect(element._configuration.maxMaxPoints).toEqual(10);
103
+ expect(renderSpy).toHaveBeenCalled();
104
+ });
105
+ });
106
+
107
+ describe('updateModelAccordingToReceivedProps', () => {
108
+ it('should return the same model if it is already valid', () => {
109
+ const validModel = model();
110
+ const validatedModel = element.updateModelAccordingToReceivedProps(validModel);
111
+ expect(validatedModel).toEqual(validModel);
112
+ });
113
+
114
+ it('should return an empty model if the input model is undefined', () => {
115
+ const validatedModel = element.updateModelAccordingToReceivedProps(undefined);
116
+ expect(validatedModel).toEqual(defaults.model);
117
+ });
118
+
119
+ it('should return an empty model if the input model is null', () => {
120
+ const validatedModel = element.updateModelAccordingToReceivedProps(null);
121
+ expect(validatedModel).toEqual(defaults.model);
122
+ });
123
+
124
+ it('should handle undefined properties in the input model', () => {
125
+ const validatedModel = element.updateModelAccordingToReceivedProps({});
126
+ expect(validatedModel).toEqual({ points: [], sampleAnswers: [] });
127
+ });
128
+
129
+ it('should handle null properties in the input model', () => {
130
+ const validatedModel = element.updateModelAccordingToReceivedProps({ maxPoints: null, excludeZero: null });
131
+ expect(validatedModel).toEqual({
132
+ excludeZero: null,
133
+ maxPoints: null,
134
+ points: ['', ''],
135
+ sampleAnswers: [null, null],
136
+ });
137
+ });
138
+
139
+ it('should handle undefined points and sampleAnswers arrays', () => {
140
+ const validatedModel = element.updateModelAccordingToReceivedProps({ maxPoints: 5, excludeZero: false });
141
+ expect(validatedModel.points).toEqual(['', '', '', '', '', '']);
142
+ expect(validatedModel.sampleAnswers).toEqual([null, null, null, null, null, null]);
143
+ });
144
+
145
+ it('should handle case when howManyPointsDoesItHave is less than howManyPointsShouldHave with maxPoints & excludeZero changed', () => {
146
+ const nextModel = model({
147
+ maxPoints: 7,
148
+ excludeZero: true,
149
+ });
150
+ const result = element.updateModelAccordingToReceivedProps(nextModel);
151
+ expect(result.points).toEqual(['A', 'B', 'C', 'D', '', '', '']);
152
+ expect(result.sampleAnswers).toEqual([true, true, false, false, null, null, null]);
153
+ });
154
+
155
+ it('should handle case when howManyPointsDoesItHave is less than howManyPointsShouldHave and maxPointsChanged', () => {
156
+ const nextModel = model({
157
+ maxPoints: 4,
158
+ excludeZero: false,
159
+ });
160
+ const result = element.updateModelAccordingToReceivedProps(nextModel);
161
+ expect(result.points).toEqual(['A', 'B', 'C', 'D', '']);
162
+ expect(result.sampleAnswers).toEqual([true, true, false, false, null]);
163
+ });
164
+
165
+ it('should handle case when howManyPointsDoesItHave is greater than howManyPointsShouldHave and excludeZeroChanged', () => {
166
+ const nextModel = model({
167
+ maxPoints: 3,
168
+ excludeZero: true,
169
+ });
170
+ const result = element.updateModelAccordingToReceivedProps(nextModel);
171
+ expect(result.points).toEqual(['B', 'C', 'D']);
172
+ expect(result.sampleAnswers).toEqual([true, false, false]);
173
+ });
174
+
175
+ it('should handle case when howManyPointsDoesItHave is greater than howManyPointsShouldHave and maxPointsChanged', () => {
176
+ const nextModel = model({
177
+ maxPoints: 1,
178
+ excludeZero: false,
179
+ });
180
+ const result = element.updateModelAccordingToReceivedProps(nextModel);
181
+ expect(result.points).toEqual(['A', 'B']);
182
+ expect(result.sampleAnswers).toEqual([true, true]);
183
+ });
184
+
185
+ it('should handle case if invalid model is set, after updateModelAccordingToReceivedProps the returned model is valid', () => {
186
+ const newModel = invalidModel();
187
+ element.onModelChanged(newModel);
188
+ expect(element._model.points).toEqual(['A', 'B', 'C', 'D', '', '']);
189
+ expect(element._model.sampleAnswers).toEqual([true, true, false, false, null, null]);
190
+ });
191
+ });
192
+ });
@@ -0,0 +1,43 @@
1
+ export default {
2
+ model: {
3
+ points: ['', '', '', ''],
4
+ sampleAnswers: [null, null, null, null],
5
+ maxPoints: 3,
6
+ excludeZero: false,
7
+ excludeZeroEnabled: true,
8
+ maxPointsEnabled: true,
9
+ },
10
+ configuration: {
11
+ baseInputConfiguration: {
12
+ h3: { disabled: true },
13
+ audio: { disabled: false },
14
+ video: { disabled: false },
15
+ image: { disabled: false },
16
+ textAlign: { disabled: true },
17
+ showParagraphs: { disabled: false },
18
+ separateParagraphs: { disabled: true },
19
+ },
20
+ rubriclessInstruction: {
21
+ inputConfiguration: {
22
+ audio: { disabled: false },
23
+ video: { disabled: false },
24
+ image: { disabled: false },
25
+ },
26
+ },
27
+ showExcludeZero: {
28
+ settings: true,
29
+ label: 'Ability to exclude zero',
30
+ },
31
+ showMaxPoint: {
32
+ settings: true,
33
+ label: 'Show max points dropdown',
34
+ },
35
+ settingsPanelDisabled: false,
36
+ // width: '500px'
37
+ mathMlOptions: {
38
+ mmlOutput: false,
39
+ mmlEditing: false,
40
+ },
41
+ maxMaxPoints: 9,
42
+ },
43
+ };