@pie-element/explicit-constructed-response 11.2.2-beta.6 → 11.2.2-beta.8

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.
@@ -0,0 +1,184 @@
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
+ choices: {},
10
+ displayType: 'block',
11
+ markup: '',
12
+ maxLengthPerChoiceEnabled: true,
13
+ playerSpellCheckEnabled: true,
14
+ prompt: '',
15
+ promptEnabled: true,
16
+ rationale: '',
17
+ rationaleEnabled: true,
18
+ spellCheckEnabled: true,
19
+ studentInstructionsEnabled: true,
20
+ teacherInstructions: '',
21
+ teacherInstructionsEnabled: true,
22
+ toolbarEditorPosition: 'bottom',
23
+ responseAreaInputConfiguration: {}
24
+ },
25
+ configuration: {
26
+ baseInputConfiguration: {
27
+ h3: {
28
+ disabled: true
29
+ },
30
+ html: {
31
+ disabled: true
32
+ },
33
+ audio: {
34
+ disabled: false
35
+ },
36
+ video: {
37
+ disabled: false
38
+ },
39
+ image: {
40
+ disabled: false
41
+ },
42
+ textAlign: {
43
+ disabled: true
44
+ },
45
+ showParagraphs: {
46
+ disabled: false
47
+ },
48
+ separateParagraphs: {
49
+ disabled: true
50
+ }
51
+ },
52
+ prompt: {
53
+ settings: true,
54
+ label: 'Prompt',
55
+ inputConfiguration: {
56
+ audio: {
57
+ disabled: false
58
+ },
59
+ video: {
60
+ disabled: false
61
+ },
62
+ image: {
63
+ disabled: false
64
+ }
65
+ },
66
+ required: false
67
+ },
68
+ partialScoring: {
69
+ settings: false,
70
+ label: 'Allow Partial Scoring'
71
+ },
72
+ rationale: {
73
+ settings: true,
74
+ label: 'Rationale',
75
+ inputConfiguration: {
76
+ audio: {
77
+ disabled: false
78
+ },
79
+ video: {
80
+ disabled: false
81
+ },
82
+ image: {
83
+ disabled: false
84
+ }
85
+ },
86
+ required: false
87
+ },
88
+ settingsPanelDisabled: false,
89
+ spellCheck: {
90
+ label: 'Spellcheck',
91
+ settings: false,
92
+ enabled: true
93
+ },
94
+ editSource: {
95
+ label: 'Edit Source',
96
+ settings: false,
97
+ enabled: false
98
+ },
99
+ playerSpellCheck: {
100
+ label: 'Student Spellcheck',
101
+ settings: true,
102
+ enabled: true
103
+ },
104
+ teacherInstructions: {
105
+ settings: true,
106
+ label: 'Teacher Instructions',
107
+ inputConfiguration: {
108
+ audio: {
109
+ disabled: false
110
+ },
111
+ video: {
112
+ disabled: false
113
+ },
114
+ image: {
115
+ disabled: false
116
+ }
117
+ },
118
+ required: false
119
+ },
120
+ template: {
121
+ inputConfiguration: {
122
+ audio: {
123
+ disabled: false
124
+ },
125
+ video: {
126
+ disabled: false
127
+ },
128
+ image: {
129
+ disabled: false
130
+ },
131
+ h3: {
132
+ disabled: true
133
+ },
134
+ blockquote: {
135
+ disabled: true
136
+ }
137
+ }
138
+ },
139
+ maxLengthPerChoice: {
140
+ settings: true,
141
+ label: 'Maximum Length Per Choice'
142
+ },
143
+ maxResponseAreas: 10,
144
+ maxImageWidth: {
145
+ teacherInstructions: 300,
146
+ prompt: 300,
147
+ rationale: 300
148
+ },
149
+ maxImageHeight: {
150
+ teacherInstructions: 300,
151
+ prompt: 300,
152
+ rationale: 300
153
+ },
154
+ withRubric: {
155
+ settings: false,
156
+ label: 'Add Rubric'
157
+ },
158
+ mathMlOptions: {
159
+ mmlOutput: false,
160
+ mmlEditing: false
161
+ },
162
+ language: {
163
+ settings: false,
164
+ label: 'Specify Language',
165
+ enabled: false
166
+ },
167
+ languageChoices: {
168
+ label: 'Language Choices',
169
+ options: []
170
+ },
171
+ responseAreaInputConfiguration: {
172
+ inputConfiguration: {
173
+ characters: {
174
+ disabled: true
175
+ }
176
+ }
177
+ },
178
+ spanishButton: {
179
+ settings: true,
180
+ label: 'Disable Spanish Characters'
181
+ }
182
+ }
183
+ };
184
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","names":["model","choices","displayType","markup","maxLengthPerChoiceEnabled","playerSpellCheckEnabled","prompt","promptEnabled","rationale","rationaleEnabled","spellCheckEnabled","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition","responseAreaInputConfiguration","configuration","baseInputConfiguration","h3","disabled","html","audio","video","image","textAlign","showParagraphs","separateParagraphs","settings","label","inputConfiguration","required","partialScoring","settingsPanelDisabled","spellCheck","enabled","editSource","playerSpellCheck","template","blockquote","maxLengthPerChoice","maxResponseAreas","maxImageWidth","maxImageHeight","withRubric","mathMlOptions","mmlOutput","mmlEditing","language","languageChoices","options","characters","spanishButton"],"sources":["../src/defaults.js"],"sourcesContent":["export default {\n model: {\n choices: {},\n displayType: 'block',\n markup: '',\n maxLengthPerChoiceEnabled: true,\n playerSpellCheckEnabled: true,\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n spellCheckEnabled: true,\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n responseAreaInputConfiguration: {},\n },\n configuration: {\n baseInputConfiguration: {\n h3: { disabled: true },\n html: { 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 prompt: {\n settings: true,\n label: 'Prompt',\n inputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n },\n required: false,\n },\n partialScoring: {\n settings: false,\n label: 'Allow Partial Scoring',\n },\n rationale: {\n settings: true,\n label: 'Rationale',\n inputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n },\n required: false,\n },\n settingsPanelDisabled: false,\n spellCheck: {\n label: 'Spellcheck',\n settings: false,\n enabled: true,\n },\n editSource: {\n label: 'Edit Source',\n settings: false,\n enabled: false,\n },\n playerSpellCheck: {\n label: 'Student Spellcheck',\n settings: true,\n enabled: true,\n },\n teacherInstructions: {\n settings: true,\n label: 'Teacher Instructions',\n inputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n },\n required: false,\n },\n template: {\n inputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n h3: { disabled: true },\n blockquote: { disabled: true },\n },\n },\n maxLengthPerChoice: {\n settings: true,\n label: 'Maximum Length Per Choice',\n },\n maxResponseAreas: 10,\n maxImageWidth: {\n teacherInstructions: 300,\n prompt: 300,\n rationale: 300,\n },\n maxImageHeight: {\n teacherInstructions: 300,\n prompt: 300,\n rationale: 300,\n },\n withRubric: {\n settings: false,\n label: 'Add Rubric',\n },\n mathMlOptions: {\n mmlOutput: false,\n mmlEditing: false,\n },\n language: {\n settings: false,\n label: 'Specify Language',\n enabled: false,\n },\n languageChoices: {\n label: 'Language Choices',\n options: [],\n },\n responseAreaInputConfiguration: {\n inputConfiguration: {\n characters: {\n disabled: true\n },\n },\n },\n spanishButton: {\n settings: true,\n label: 'Disable Spanish Characters',\n },\n },\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = exports.ECRToolbar = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _react = _interopRequireDefault(require("react"));
11
+ var _propTypes = _interopRequireDefault(require("prop-types"));
12
+ var _styles = require("@mui/material/styles");
13
+ var _editableHtmlTipTap = _interopRequireDefault(require("@pie-lib/editable-html-tip-tap"));
14
+ var _markupUtils = require("./markupUtils");
15
+ const findSlateNode = key => {
16
+ return window.document.querySelector('[data-key="' + key + '"]');
17
+ };
18
+ const StyledEditableHtml = (0, _styles.styled)(_editableHtmlTipTap.default)(({
19
+ theme
20
+ }) => ({
21
+ backgroundColor: theme.palette.common.white,
22
+ outline: 'none',
23
+ lineHeight: '15px'
24
+ }));
25
+ class ECRToolbar extends _react.default.Component {
26
+ constructor(...args) {
27
+ super(...args);
28
+ (0, _defineProperty2.default)(this, "state", {
29
+ markup: '',
30
+ toolbarStyle: {}
31
+ });
32
+ (0, _defineProperty2.default)(this, "onDone", markup => {
33
+ const {
34
+ editor,
35
+ node,
36
+ onToolbarDone,
37
+ onChangeResponse,
38
+ pos
39
+ } = this.props;
40
+ const sanitizedMarkup = (0, _markupUtils.stripHtmlTags)(markup);
41
+ this.setState({
42
+ markup: sanitizedMarkup
43
+ });
44
+ const {
45
+ tr
46
+ } = editor.state;
47
+
48
+ // Type check before calling setNodeMarkup: if the node at the current position is a text node,
49
+ // missing, or not an inline atom, bail out to avoid errors after a delete.
50
+ const nodeAtPos = tr.doc.nodeAt(pos);
51
+ if (!nodeAtPos || nodeAtPos.isText || !nodeAtPos.isAtom || !nodeAtPos.isInline) {
52
+ return false;
53
+ }
54
+
55
+ // Merge old and new attributes
56
+ tr.setNodeMarkup(pos, undefined, {
57
+ ...node.attrs,
58
+ value: sanitizedMarkup
59
+ });
60
+ editor.view.dispatch(tr);
61
+ onToolbarDone(true);
62
+ onChangeResponse(sanitizedMarkup);
63
+ });
64
+ (0, _defineProperty2.default)(this, "onRespAreaChange", respAreaMarkup => {
65
+ this.setState({
66
+ respAreaMarkup
67
+ });
68
+ });
69
+ (0, _defineProperty2.default)(this, "onKeyDown", event => {
70
+ if (event.key === 'Enter') {
71
+ return true;
72
+ }
73
+ return false;
74
+ });
75
+ (0, _defineProperty2.default)(this, "onBlur", () => {
76
+ if (this.clickedInside) {
77
+ this.clickedInside = false;
78
+ }
79
+ });
80
+ }
81
+ componentDidMount() {
82
+ const {
83
+ correctChoice,
84
+ node,
85
+ editor
86
+ } = this.props;
87
+ const choice = correctChoice || {};
88
+ const domNode = editor.view.nodeDOM(editor.state.selection.from);
89
+ if (domNode?.nodeType === 1) {
90
+ //eslint-disable-next-line
91
+ const domNodeRect = domNode.getBoundingClientRect();
92
+ const editor = domNode.closest('.tiptap');
93
+ const editorRect = editor.getBoundingClientRect();
94
+ const top = domNodeRect.top - editorRect.top;
95
+ const left = domNodeRect.left - editorRect.left;
96
+ this.setState({
97
+ markup: choice.label,
98
+ toolbarStyle: {
99
+ position: 'absolute',
100
+ // top: `${top + domNodeRect.height + 17}px`,
101
+ top: 0,
102
+ // left: `${left + 20}px`,
103
+ left: 0,
104
+ width: `${domNodeRect.width - 4}px`
105
+ }
106
+ });
107
+ }
108
+ }
109
+ render() {
110
+ const {
111
+ maxLengthPerChoiceEnabled,
112
+ pluginProps,
113
+ spellCheck
114
+ } = this.props;
115
+ const {
116
+ markup,
117
+ toolbarStyle
118
+ } = this.state;
119
+ const inputProps = maxLengthPerChoiceEnabled ? {} : {
120
+ maxLength: 25
121
+ };
122
+ return /*#__PURE__*/_react.default.createElement("div", {
123
+ style: toolbarStyle
124
+ }, /*#__PURE__*/_react.default.createElement(StyledEditableHtml, (0, _extends2.default)({
125
+ autoFocus: true,
126
+ disableUnderline: true,
127
+ onChange: respAreaMarkup => {
128
+ if (this.preventDone) {
129
+ return;
130
+ }
131
+ this.onRespAreaChange(respAreaMarkup);
132
+ },
133
+ onDone: val => {
134
+ if (this.preventDone) {
135
+ return;
136
+ }
137
+ this.onDone(val);
138
+ },
139
+ onBlur: e => {
140
+ this.preventDone = e.relatedTarget && e.relatedTarget.closest('.insert-character-dialog');
141
+ this.onBlur(e);
142
+ },
143
+ onKeyDown: this.onKeyDown,
144
+ markup: markup || '',
145
+ activePlugins: ['languageCharacters'],
146
+ pluginProps: pluginProps,
147
+ languageCharactersProps: [{
148
+ language: 'spanish'
149
+ }],
150
+ minHeight: '15px',
151
+ maxHeight: '15px',
152
+ spellCheck: spellCheck,
153
+ autoWidthToolbar: true,
154
+ toolbarOpts: {
155
+ minWidth: 'auto',
156
+ isHidden: !!pluginProps?.characters?.disabled
157
+ }
158
+ }, inputProps)));
159
+ }
160
+ }
161
+ exports.ECRToolbar = ECRToolbar;
162
+ (0, _defineProperty2.default)(ECRToolbar, "propTypes", {
163
+ correctChoice: _propTypes.default.object,
164
+ node: _propTypes.default.object,
165
+ pos: _propTypes.default.number,
166
+ onDone: _propTypes.default.func,
167
+ onChangeResponse: _propTypes.default.func.isRequired,
168
+ onToolbarDone: _propTypes.default.func.isRequired,
169
+ value: _propTypes.default.shape({
170
+ change: _propTypes.default.func.isRequired,
171
+ document: _propTypes.default.shape({
172
+ getNextText: _propTypes.default.func.isRequired
173
+ })
174
+ }),
175
+ editor: _propTypes.default.object,
176
+ maxLengthPerChoiceEnabled: _propTypes.default.bool,
177
+ pluginProps: _propTypes.default.object,
178
+ spellCheck: _propTypes.default.bool
179
+ });
180
+ var _default = exports.default = ECRToolbar;
181
+ //# sourceMappingURL=ecr-toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecr-toolbar.js","names":["_react","_interopRequireDefault","require","_propTypes","_styles","_editableHtmlTipTap","_markupUtils","findSlateNode","key","window","document","querySelector","StyledEditableHtml","styled","EditableHtml","theme","backgroundColor","palette","common","white","outline","lineHeight","ECRToolbar","React","Component","constructor","args","_defineProperty2","default","markup","toolbarStyle","editor","node","onToolbarDone","onChangeResponse","pos","props","sanitizedMarkup","stripHtmlTags","setState","tr","state","nodeAtPos","doc","nodeAt","isText","isAtom","isInline","setNodeMarkup","undefined","attrs","value","view","dispatch","respAreaMarkup","event","clickedInside","componentDidMount","correctChoice","choice","domNode","nodeDOM","selection","from","nodeType","domNodeRect","getBoundingClientRect","closest","editorRect","top","left","label","position","width","render","maxLengthPerChoiceEnabled","pluginProps","spellCheck","inputProps","maxLength","createElement","style","_extends2","autoFocus","disableUnderline","onChange","preventDone","onRespAreaChange","onDone","val","onBlur","e","relatedTarget","onKeyDown","activePlugins","languageCharactersProps","language","minHeight","maxHeight","autoWidthToolbar","toolbarOpts","minWidth","isHidden","characters","disabled","exports","PropTypes","object","number","func","isRequired","shape","change","getNextText","bool","_default"],"sources":["../src/ecr-toolbar.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { styled } from '@mui/material/styles';\nimport EditableHtml from '@pie-lib/editable-html-tip-tap';\nimport { stripHtmlTags } from './markupUtils';\n\nconst findSlateNode = (key) => {\n return window.document.querySelector('[data-key=\"' + key + '\"]');\n};\n\nconst StyledEditableHtml = styled(EditableHtml)(({ theme }) => ({\n backgroundColor: theme.palette.common.white,\n outline: 'none',\n lineHeight: '15px',\n}));\n\nexport class ECRToolbar extends React.Component {\n static propTypes = {\n correctChoice: PropTypes.object,\n node: PropTypes.object,\n pos: PropTypes.number,\n onDone: PropTypes.func,\n onChangeResponse: PropTypes.func.isRequired,\n onToolbarDone: PropTypes.func.isRequired,\n value: PropTypes.shape({\n change: PropTypes.func.isRequired,\n document: PropTypes.shape({\n getNextText: PropTypes.func.isRequired,\n }),\n }),\n editor: PropTypes.object,\n maxLengthPerChoiceEnabled: PropTypes.bool,\n pluginProps: PropTypes.object,\n spellCheck: PropTypes.bool,\n };\n\n state = {\n markup: '',\n toolbarStyle: {},\n };\n\n componentDidMount() {\n const { correctChoice, node, editor } = this.props;\n const choice = correctChoice || {};\n\n const domNode = editor.view.nodeDOM(editor.state.selection.from);\n\n if (domNode?.nodeType === 1) {\n //eslint-disable-next-line\n const domNodeRect = domNode.getBoundingClientRect();\n const editor = domNode.closest('.tiptap');\n const editorRect = editor.getBoundingClientRect();\n const top = domNodeRect.top - editorRect.top;\n const left = domNodeRect.left - editorRect.left;\n\n this.setState({\n markup: choice.label,\n toolbarStyle: {\n position: 'absolute',\n // top: `${top + domNodeRect.height + 17}px`,\n top: 0,\n // left: `${left + 20}px`,\n left: 0,\n width: `${domNodeRect.width - 4}px`,\n },\n });\n }\n }\n\n onDone = (markup) => {\n const { editor, node, onToolbarDone, onChangeResponse, pos } = this.props;\n const sanitizedMarkup = stripHtmlTags(markup);\n this.setState({ markup: sanitizedMarkup });\n\n const { tr } = editor.state;\n\n // Type check before calling setNodeMarkup: if the node at the current position is a text node,\n // missing, or not an inline atom, bail out to avoid errors after a delete.\n const nodeAtPos = tr.doc.nodeAt(pos);\n if (!nodeAtPos || nodeAtPos.isText || !nodeAtPos.isAtom || !nodeAtPos.isInline) {\n return false;\n }\n\n // Merge old and new attributes\n tr.setNodeMarkup(pos, undefined, { ...node.attrs, value: sanitizedMarkup });\n editor.view.dispatch(tr);\n\n onToolbarDone(true);\n onChangeResponse(sanitizedMarkup);\n };\n\n onRespAreaChange = (respAreaMarkup) => {\n this.setState({ respAreaMarkup });\n };\n\n onKeyDown = (event) => {\n if (event.key === 'Enter') {\n return true;\n }\n\n return false;\n };\n\n onBlur = () => {\n if (this.clickedInside) {\n this.clickedInside = false;\n }\n };\n\n render() {\n const { maxLengthPerChoiceEnabled, pluginProps, spellCheck } = this.props;\n const { markup, toolbarStyle } = this.state;\n const inputProps = maxLengthPerChoiceEnabled ? {} : { maxLength: 25 };\n\n return (\n <div style={toolbarStyle}>\n <StyledEditableHtml\n autoFocus={true}\n disableUnderline\n onChange={(respAreaMarkup) => {\n if (this.preventDone) {\n return;\n }\n this.onRespAreaChange(respAreaMarkup);\n }}\n onDone={(val) => {\n if (this.preventDone) {\n return;\n }\n this.onDone(val);\n }}\n onBlur={(e) => {\n this.preventDone = e.relatedTarget && e.relatedTarget.closest('.insert-character-dialog');\n this.onBlur(e);\n }}\n onKeyDown={this.onKeyDown}\n markup={markup || ''}\n activePlugins={['languageCharacters']}\n pluginProps={pluginProps}\n languageCharactersProps={[{ language: 'spanish' }]}\n minHeight={'15px'}\n maxHeight={'15px'}\n spellCheck={spellCheck}\n autoWidthToolbar\n toolbarOpts={{\n minWidth: 'auto',\n isHidden: !!pluginProps?.characters?.disabled,\n }}\n {...inputProps}\n />\n </div>\n );\n }\n}\n\nexport default ECRToolbar;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,165 @@
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 _client = require("react-dom/client");
11
+ var _debug = _interopRequireDefault(require("debug"));
12
+ var _lodashEs = require("lodash-es");
13
+ var _pieConfigureEvents = require("@pie-framework/pie-configure-events");
14
+ var _main = _interopRequireDefault(require("./main"));
15
+ var _defaults = _interopRequireDefault(require("./defaults"));
16
+ var _markupUtils = require("./markupUtils");
17
+ const log = (0, _debug.default)('explicit-constructed-response:configure');
18
+ class ExplicitConstructedResponse extends HTMLElement {
19
+ constructor() {
20
+ super();
21
+ (0, _defineProperty2.default)(this, "onModelChanged", (m, reset) => {
22
+ this._model = ExplicitConstructedResponse.prepareModel({
23
+ ...this._model,
24
+ ...m
25
+ });
26
+ this._render();
27
+ this.dispatchModelUpdated(reset);
28
+ });
29
+ (0, _defineProperty2.default)(this, "onConfigurationChanged", c => {
30
+ this._configuration = c;
31
+ const newInputConfig = this._configuration?.responseAreaInputConfiguration?.inputConfiguration;
32
+ this._model = {
33
+ ...this._model,
34
+ responseAreaInputConfiguration: newInputConfig
35
+ };
36
+ this.onModelChanged(this._model);
37
+ });
38
+ this._root = null;
39
+ this._model = ExplicitConstructedResponse.prepareModel();
40
+ this._configuration = _defaults.default.configuration;
41
+ }
42
+ set model(s) {
43
+ this._model = ExplicitConstructedResponse.prepareModel(s);
44
+ if (this._model.responseAreaInputConfiguration) {
45
+ this._model.responseAreaInputConfiguration = this._configuration.responseAreaInputConfiguration?.inputConfiguration;
46
+ }
47
+ this._render();
48
+ }
49
+ set configuration(c) {
50
+ this._configuration = (0, _lodashEs.defaults)(c, _defaults.default.configuration);
51
+
52
+ // if language:enabled is true, then the corresponding default item model should include a language value;
53
+ // if it is false, then the language field should be omitted from the item model.
54
+ // if a default item model includes a language value (e.g., en_US) and the corresponding authoring view settings have language:settings = true,
55
+ // then (a) language:enabled should also be true, and (b) that default language value should be represented in languageChoices[] (as a key).
56
+ if (c.language?.enabled) {
57
+ if (c.languageChoices?.options?.length) {
58
+ this._model.language = c.languageChoices.options[0].value;
59
+ }
60
+ } else if (c.language.settings && this._model.language) {
61
+ this._configuration.language.enabled = true;
62
+ if (!this._configuration.languageChoices.options || !this._configuration.languageChoices.options.length) {
63
+ this._configuration.languageChoices.options = [];
64
+ }
65
+
66
+ // check if the language is already included in the languageChoices.options array
67
+ // and if not, then add it.
68
+ if (!this._configuration.languageChoices.options.find(option => option.value === this._model.language)) {
69
+ this._configuration.languageChoices.options.push({
70
+ value: this._model.language,
71
+ label: this._model.language
72
+ });
73
+ }
74
+ } else {
75
+ delete this._model.language;
76
+ }
77
+ this._render();
78
+ }
79
+ set disableSidePanel(s) {
80
+ this._disableSidePanel = s;
81
+ this._render();
82
+ }
83
+ dispatchModelUpdated(reset) {
84
+ const resetValue = !!reset;
85
+ this.dispatchEvent(new _pieConfigureEvents.ModelUpdatedEvent(this._model, resetValue));
86
+ }
87
+ /** @param {done, progress, file} handler */
88
+ insertImage(handler) {
89
+ this.dispatchEvent(new _pieConfigureEvents.InsertImageEvent(handler));
90
+ }
91
+ onDeleteImage(src, done) {
92
+ this.dispatchEvent(new _pieConfigureEvents.DeleteImageEvent(src, done));
93
+ }
94
+ insertSound(handler) {
95
+ this.dispatchEvent(new _pieConfigureEvents.InsertSoundEvent(handler));
96
+ }
97
+ onDeleteSound(src, done) {
98
+ this.dispatchEvent(new _pieConfigureEvents.DeleteSoundEvent(src, done));
99
+ }
100
+ _render() {
101
+ log('_render');
102
+ let element = /*#__PURE__*/_react.default.createElement(_main.default, {
103
+ model: this._model,
104
+ configuration: this._configuration,
105
+ onModelChanged: this.onModelChanged,
106
+ onConfigurationChanged: this.onConfigurationChanged,
107
+ disableSidePanel: this._disableSidePanel,
108
+ imageSupport: {
109
+ add: this.insertImage.bind(this),
110
+ delete: this.onDeleteImage.bind(this)
111
+ },
112
+ uploadSoundSupport: {
113
+ add: this.insertSound.bind(this),
114
+ delete: this.onDeleteSound.bind(this)
115
+ }
116
+ });
117
+ if (!this._root) {
118
+ this._root = (0, _client.createRoot)(this);
119
+ }
120
+ this._root.render(element);
121
+ }
122
+ connectedCallback() {
123
+ this._render();
124
+ }
125
+ disconnectedCallback() {
126
+ if (this._root) {
127
+ this._root.unmount();
128
+ this._root = null;
129
+ }
130
+ }
131
+ }
132
+ exports.default = ExplicitConstructedResponse;
133
+ (0, _defineProperty2.default)(ExplicitConstructedResponse, "prepareModel", (model = {}) => {
134
+ const joinedObj = {
135
+ ..._defaults.default.model,
136
+ ...model
137
+ };
138
+ const slateMarkup = joinedObj.slateMarkup || (0, _markupUtils.createSlateMarkup)(joinedObj.markup, joinedObj.choices);
139
+ const processedMarkup = (0, _markupUtils.processMarkup)(slateMarkup);
140
+
141
+ // this was added to treat an exception, when the model has choices without the "value" property
142
+ // like: { label: 'test' }
143
+ if (joinedObj.choices) {
144
+ Object.keys(joinedObj.choices).forEach(key => {
145
+ if ((0, _lodashEs.isArray)(joinedObj.choices[key])) {
146
+ joinedObj.choices[key] = (joinedObj.choices[key] || []).map((item, index) => {
147
+ if (!item.value) {
148
+ log('Choice does not contain "value" property, which is required.', item);
149
+ return {
150
+ value: `${index}`,
151
+ ...item
152
+ };
153
+ }
154
+ return item;
155
+ });
156
+ }
157
+ });
158
+ }
159
+ return {
160
+ ...joinedObj,
161
+ slateMarkup,
162
+ markup: processedMarkup
163
+ };
164
+ });
165
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["_react","_interopRequireDefault","require","_client","_debug","_lodashEs","_pieConfigureEvents","_main","_defaults","_markupUtils","log","debug","ExplicitConstructedResponse","HTMLElement","constructor","_defineProperty2","default","m","reset","_model","prepareModel","_render","dispatchModelUpdated","c","_configuration","newInputConfig","responseAreaInputConfiguration","inputConfiguration","onModelChanged","_root","sensibleDefaults","configuration","model","s","defaults","language","enabled","languageChoices","options","length","value","settings","find","option","push","label","disableSidePanel","_disableSidePanel","resetValue","dispatchEvent","ModelUpdatedEvent","insertImage","handler","InsertImageEvent","onDeleteImage","src","done","DeleteImageEvent","insertSound","InsertSoundEvent","onDeleteSound","DeleteSoundEvent","element","React","createElement","Main","onConfigurationChanged","imageSupport","add","bind","delete","uploadSoundSupport","createRoot","render","connectedCallback","disconnectedCallback","unmount","exports","joinedObj","slateMarkup","createSlateMarkup","markup","choices","processedMarkup","processMarkup","Object","keys","forEach","key","isArray","map","item","index"],"sources":["../src/index.js"],"sourcesContent":["import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport debug from 'debug';\nimport { defaults, isArray } from 'lodash-es';\nimport {\n ModelUpdatedEvent,\n DeleteImageEvent,\n InsertImageEvent,\n InsertSoundEvent,\n DeleteSoundEvent,\n} from '@pie-framework/pie-configure-events';\n\nimport Main from './main';\n\nimport sensibleDefaults from './defaults';\nimport { processMarkup, createSlateMarkup } from './markupUtils';\n\nconst log = debug('explicit-constructed-response:configure');\n\nexport default class ExplicitConstructedResponse extends HTMLElement {\n static prepareModel = (model = {}) => {\n const joinedObj = {\n ...sensibleDefaults.model,\n ...model,\n };\n const slateMarkup = joinedObj.slateMarkup || createSlateMarkup(joinedObj.markup, joinedObj.choices);\n const processedMarkup = processMarkup(slateMarkup);\n\n // this was added to treat an exception, when the model has choices without the \"value\" property\n // like: { label: 'test' }\n if (joinedObj.choices) {\n Object.keys(joinedObj.choices).forEach((key) => {\n if (isArray(joinedObj.choices[key])) {\n joinedObj.choices[key] = (joinedObj.choices[key] || []).map((item, index) => {\n if (!item.value) {\n log('Choice does not contain \"value\" property, which is required.', item);\n return { value: `${index}`, ...item };\n }\n\n return item;\n });\n }\n });\n }\n\n return {\n ...joinedObj,\n slateMarkup,\n markup: processedMarkup,\n };\n };\n\n constructor() {\n super();\n this._root = null;\n this._model = ExplicitConstructedResponse.prepareModel();\n this._configuration = sensibleDefaults.configuration;\n }\n\n set model(s) {\n this._model = ExplicitConstructedResponse.prepareModel(s);\n if (this._model.responseAreaInputConfiguration) {\n this._model.responseAreaInputConfiguration =\n this._configuration.responseAreaInputConfiguration?.inputConfiguration;\n }\n this._render();\n }\n\n set configuration(c) {\n this._configuration = defaults(c, sensibleDefaults.configuration);\n\n // if language:enabled is true, then the corresponding default item model should include a language value;\n // if it is false, then the language field should be omitted from the item model.\n // if a default item model includes a language value (e.g., en_US) and the corresponding authoring view settings have language:settings = true,\n // then (a) language:enabled should also be true, and (b) that default language value should be represented in languageChoices[] (as a key).\n if (c.language?.enabled) {\n if (c.languageChoices?.options?.length) {\n this._model.language = c.languageChoices.options[0].value;\n }\n } else if (c.language.settings && this._model.language) {\n this._configuration.language.enabled = true;\n\n if (!this._configuration.languageChoices.options || !this._configuration.languageChoices.options.length) {\n this._configuration.languageChoices.options = [];\n }\n\n // check if the language is already included in the languageChoices.options array\n // and if not, then add it.\n if (!this._configuration.languageChoices.options.find((option) => option.value === this._model.language)) {\n this._configuration.languageChoices.options.push({\n value: this._model.language,\n label: this._model.language,\n });\n }\n } else {\n delete this._model.language;\n }\n\n this._render();\n }\n\n set disableSidePanel(s) {\n this._disableSidePanel = s;\n this._render();\n }\n\n dispatchModelUpdated(reset) {\n const resetValue = !!reset;\n\n this.dispatchEvent(new ModelUpdatedEvent(this._model, resetValue));\n }\n\n onModelChanged = (m, reset)=> {\n this._model = ExplicitConstructedResponse.prepareModel({\n ...this._model,\n ...m,\n });\n this._render();\n this.dispatchModelUpdated(reset);\n };\n\n onConfigurationChanged =(c) => {\n this._configuration = c;\n\n const newInputConfig = this._configuration?.responseAreaInputConfiguration?.inputConfiguration;\n\n this._model = {\n ...this._model,\n responseAreaInputConfiguration: newInputConfig,\n };\n\n this.onModelChanged(this._model);\n };\n\n /** @param {done, progress, file} handler */\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 insertSound(handler) {\n this.dispatchEvent(new InsertSoundEvent(handler));\n }\n\n onDeleteSound(src, done) {\n this.dispatchEvent(new DeleteSoundEvent(src, done));\n }\n\n _render() {\n log('_render');\n\n let element = React.createElement(Main, {\n model: this._model,\n configuration: this._configuration,\n onModelChanged: this.onModelChanged,\n onConfigurationChanged: this.onConfigurationChanged,\n disableSidePanel: this._disableSidePanel,\n imageSupport: {\n add: this.insertImage.bind(this),\n delete: this.onDeleteImage.bind(this),\n },\n uploadSoundSupport: {\n add: this.insertSound.bind(this),\n delete: this.onDeleteSound.bind(this),\n },\n });\n\n if (!this._root) {\n this._root = createRoot(this);\n }\n this._root.render(element);\n }\n\n connectedCallback() {\n this._render();\n }\n\n disconnectedCallback() {\n if (this._root) {\n this._root.unmount();\n this._root = null;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}