@pie-lib/render-ui 4.15.10-next.1 → 4.16.0-beta.1

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 (54) hide show
  1. package/CHANGELOG.md +20 -52
  2. package/NEXT.CHANGELOG.json +1 -0
  3. package/lib/append-css-rules.js +88 -0
  4. package/lib/append-css-rules.js.map +1 -0
  5. package/lib/assets/enableAudioAutoplayImage.js +9 -0
  6. package/lib/assets/enableAudioAutoplayImage.js.map +1 -0
  7. package/lib/collapsible/index.js +2 -1
  8. package/lib/collapsible/index.js.map +1 -1
  9. package/lib/color.js +123 -2
  10. package/lib/color.js.map +1 -1
  11. package/lib/feedback.js +0 -1
  12. package/lib/feedback.js.map +1 -1
  13. package/lib/has-media.js +27 -0
  14. package/lib/has-media.js.map +1 -0
  15. package/lib/has-text.js +5 -1
  16. package/lib/has-text.js.map +1 -1
  17. package/lib/index.js +32 -0
  18. package/lib/index.js.map +1 -1
  19. package/lib/preview-layout.js +16 -4
  20. package/lib/preview-layout.js.map +1 -1
  21. package/lib/preview-prompt.js +156 -41
  22. package/lib/preview-prompt.js.map +1 -1
  23. package/lib/ui-layout.js +122 -0
  24. package/lib/ui-layout.js.map +1 -0
  25. package/package.json +6 -4
  26. package/src/__tests__/__snapshots__/html-and-math.test.js.snap +11 -0
  27. package/src/__tests__/__snapshots__/preview-prompt.test.jsx.snap +37 -0
  28. package/src/__tests__/__snapshots__/purpose.test.jsx.snap +42 -0
  29. package/src/__tests__/__snapshots__/readable.test.jsx.snap +64 -0
  30. package/src/__tests__/__snapshots__/response-indicators.test.jsx.snap +95 -0
  31. package/src/__tests__/color.test.js +12 -0
  32. package/src/__tests__/has-media.test.js +20 -0
  33. package/src/__tests__/has-text.test.js +21 -0
  34. package/src/__tests__/html-and-math.test.js +46 -0
  35. package/src/__tests__/preview-prompt.test.jsx +56 -0
  36. package/src/__tests__/purpose.test.jsx +47 -0
  37. package/src/__tests__/readable.test.jsx +64 -0
  38. package/src/__tests__/response-indicators.test.jsx +16 -0
  39. package/src/__tests__/ui-layout.test.jsx +34 -0
  40. package/src/__tests__/withUndoReset.test.jsx +254 -0
  41. package/src/append-css-rules.js +51 -0
  42. package/src/assets/enableAudioAutoplayImage.js +1 -0
  43. package/src/collapsible/__tests__/__snapshots__/index.test.jsx.snap +18 -0
  44. package/src/collapsible/__tests__/index.test.jsx +13 -0
  45. package/src/collapsible/index.jsx +1 -0
  46. package/src/color.js +40 -0
  47. package/src/feedback.jsx +0 -1
  48. package/src/has-media.js +16 -0
  49. package/src/has-text.js +5 -1
  50. package/src/index.js +8 -0
  51. package/src/preview-layout.jsx +14 -3
  52. package/src/preview-prompt.jsx +150 -26
  53. package/src/ui-layout.jsx +66 -0
  54. package/README.md +0 -33
@@ -65,7 +65,7 @@ var PreviewPrompt = /*#__PURE__*/function (_Component) {
65
65
 
66
66
  _this = _super.call.apply(_super, [this].concat(args));
67
67
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "parsedText", function (text) {
68
- // fix imported audio content for Safari PD-1419
68
+ var customAudioButton = _this.props.customAudioButton;
69
69
  var div = document.createElement('div');
70
70
  div.innerHTML = text;
71
71
  var audio = div.querySelector('audio');
@@ -75,7 +75,25 @@ var PreviewPrompt = /*#__PURE__*/function (_Component) {
75
75
  source.setAttribute('type', 'audio/mp3');
76
76
  source.setAttribute('src', audio.getAttribute('src'));
77
77
  audio.removeAttribute('src');
78
+ audio.setAttribute('id', 'pie-prompt-audio-player');
78
79
  audio.appendChild(source);
80
+
81
+ if (customAudioButton) {
82
+ audio.style.display = 'none';
83
+ var playButton = document.createElement('div');
84
+ playButton.id = 'play-audio-button';
85
+ Object.assign(playButton.style, {
86
+ cursor: 'pointer',
87
+ display: 'block',
88
+ width: '128px',
89
+ height: '128px',
90
+ backgroundImage: "url(".concat(customAudioButton.pauseImage, ")"),
91
+ backgroundSize: 'cover',
92
+ borderRadius: '50%',
93
+ border: '1px solid #326295'
94
+ });
95
+ audio.parentNode.insertBefore(playButton, audio);
96
+ }
79
97
  }
80
98
 
81
99
  return div.innerHTML;
@@ -84,51 +102,136 @@ var PreviewPrompt = /*#__PURE__*/function (_Component) {
84
102
  }
85
103
 
86
104
  (0, _createClass2["default"])(PreviewPrompt, [{
105
+ key: "addCustomAudioButtonControls",
106
+ value: function addCustomAudioButtonControls() {
107
+ var _this$props = this.props,
108
+ autoplayAudioEnabled = _this$props.autoplayAudioEnabled,
109
+ customAudioButton = _this$props.customAudioButton;
110
+ var playButton = document.getElementById('play-audio-button');
111
+ var audio = document.getElementById('pie-prompt-audio-player');
112
+
113
+ if (autoplayAudioEnabled && audio) {
114
+ audio.play().then(function () {
115
+ if (playButton && customAudioButton) {
116
+ audio.addEventListener('ended', handleAudioEnded);
117
+ }
118
+ })["catch"](function (error) {
119
+ console.error('Error playing audio', error);
120
+ });
121
+ }
122
+
123
+ if (!playButton || !audio || !customAudioButton) return;
124
+
125
+ var handlePlayClick = function handlePlayClick() {
126
+ // if already playing, don't play again
127
+ if (!audio.paused) return;
128
+ if (playButton.style.backgroundImage.includes(customAudioButton.pauseImage)) return;
129
+ audio.play();
130
+ };
131
+
132
+ var handleAudioEnded = function handleAudioEnded() {
133
+ playButton.style.backgroundImage = "url(".concat(customAudioButton.playImage, ")");
134
+ };
135
+
136
+ var handleAudioPlay = function handleAudioPlay() {
137
+ Object.assign(playButton.style, {
138
+ backgroundImage: "url(".concat(customAudioButton.pauseImage, ")"),
139
+ border: '1px solid #ccc'
140
+ });
141
+ };
142
+
143
+ var handleAudioPause = function handleAudioPause() {
144
+ Object.assign(playButton.style, {
145
+ backgroundImage: "url(".concat(customAudioButton.playImage, ")"),
146
+ border: '1px solid #326295'
147
+ });
148
+ };
149
+
150
+ playButton.addEventListener('click', handlePlayClick);
151
+ audio.addEventListener('play', handleAudioPlay);
152
+ audio.addEventListener('pause', handleAudioPause);
153
+ audio.addEventListener('ended', handleAudioEnded); // store event handler references so they can be removed later
154
+
155
+ this._handlePlayClick = handlePlayClick;
156
+ this._handleAudioPlay = handleAudioPlay;
157
+ this._handleAudioPause = handleAudioPause;
158
+ this._handleAudioEnded = handleAudioEnded;
159
+ }
160
+ }, {
161
+ key: "removeCustomAudioButtonListeners",
162
+ value: function removeCustomAudioButtonListeners() {
163
+ var playButton = document.getElementById('play-audio-button');
164
+ var audio = document.querySelector('audio');
165
+ if (!playButton || !audio) return; // remove event listeners using stored references
166
+
167
+ playButton.removeEventListener('click', this._handlePlayClick);
168
+ audio.removeEventListener('play', this._handleAudioPlay);
169
+ audio.removeEventListener('pause', this._handleAudioPause);
170
+ audio.removeEventListener('ended', this._handleAudioEnded);
171
+ }
172
+ }, {
173
+ key: "componentDidMount",
174
+ value: function componentDidMount() {
175
+ this.alignImages();
176
+ this.addCustomAudioButtonControls();
177
+ }
178
+ }, {
87
179
  key: "componentDidUpdate",
88
180
  value: function componentDidUpdate() {
89
- // set image parent style so it can be horizontally aligned
90
- var previewPrompt = document.querySelector('#preview-prompt');
91
- var images = previewPrompt && previewPrompt.getElementsByTagName('img');
92
-
93
- if (images && images.length) {
94
- var _iterator = _createForOfIteratorHelper(images),
95
- _step;
96
-
97
- try {
98
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
99
- var image = _step.value;
100
-
101
- // check if alignment property was set
102
- if (image.attributes && image.attributes.alignment && image.attributes.alignment.value) {
103
- var parentNode = image.parentElement; // check if div is not already added to dom and replace current image with wrapped image
104
-
105
- if (!(parentNode.tagName === 'DIV' && parentNode.style.display === 'flex' && parentNode.style.width === '100%')) {
106
- var div = document.createElement('div');
107
- div.style.display = 'flex';
108
- div.style.width = '100%';
109
- var copyImage = image.cloneNode(true);
110
- div.appendChild(copyImage);
111
- parentNode.replaceChild(div, image);
181
+ this.alignImages();
182
+ }
183
+ }, {
184
+ key: "componentWillUnmount",
185
+ value: function componentWillUnmount() {
186
+ this.removeCustomAudioButtonListeners();
187
+ }
188
+ }, {
189
+ key: "alignImages",
190
+ value: function alignImages() {
191
+ var previewPrompts = document.querySelectorAll('#preview-prompt');
192
+ previewPrompts.forEach(function (previewPrompt) {
193
+ var images = previewPrompt.getElementsByTagName('img');
194
+
195
+ if (images && images.length) {
196
+ var _iterator = _createForOfIteratorHelper(images),
197
+ _step;
198
+
199
+ try {
200
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
201
+ var image = _step.value;
202
+
203
+ // check if alignment property was set
204
+ if (image.attributes && image.attributes.alignment && image.attributes.alignment.value) {
205
+ var parentNode = image.parentElement; // check if div is not already added to dom and replace current image with wrapped image
206
+
207
+ if (!(parentNode.tagName === 'DIV' && parentNode.style.display === 'flex' && parentNode.style.width === '100%')) {
208
+ var div = document.createElement('div');
209
+ div.style.display = 'flex';
210
+ div.style.width = '100%';
211
+ var copyImage = image.cloneNode(true);
212
+ div.appendChild(copyImage);
213
+ parentNode.replaceChild(div, image);
214
+ }
112
215
  }
113
216
  }
217
+ } catch (err) {
218
+ _iterator.e(err);
219
+ } finally {
220
+ _iterator.f();
114
221
  }
115
- } catch (err) {
116
- _iterator.e(err);
117
- } finally {
118
- _iterator.f();
119
222
  }
120
- }
223
+ });
121
224
  }
122
225
  }, {
123
226
  key: "render",
124
227
  value: function render() {
125
- var _this$props = this.props,
126
- prompt = _this$props.prompt,
127
- classes = _this$props.classes,
128
- tagName = _this$props.tagName,
129
- className = _this$props.className,
130
- onClick = _this$props.onClick,
131
- defaultClassName = _this$props.defaultClassName;
228
+ var _this$props2 = this.props,
229
+ prompt = _this$props2.prompt,
230
+ classes = _this$props2.classes,
231
+ tagName = _this$props2.tagName,
232
+ className = _this$props2.className,
233
+ onClick = _this$props2.onClick,
234
+ defaultClassName = _this$props2.defaultClassName;
132
235
  var CustomTag = tagName || 'div'; // legend tag was added once with accessibility tasks, wee need extra style to make it work with images alignment
133
236
 
134
237
  var legendClass = tagName === 'legend' ? 'legend' : '';
@@ -153,7 +256,12 @@ exports.PreviewPrompt = PreviewPrompt;
153
256
  tagName: _propTypes["default"].string,
154
257
  className: _propTypes["default"].string,
155
258
  onClick: _propTypes["default"].func,
156
- defaultClassName: _propTypes["default"].string
259
+ defaultClassName: _propTypes["default"].string,
260
+ autoplayAudioEnabled: _propTypes["default"].bool,
261
+ customAudioButton: {
262
+ playImage: _propTypes["default"].string,
263
+ pauseImage: _propTypes["default"].string
264
+ }
157
265
  });
158
266
  (0, _defineProperty2["default"])(PreviewPrompt, "defaultProps", {
159
267
  onClick: function onClick() {}
@@ -176,7 +284,8 @@ var styles = function styles(theme) {
176
284
  label: {
177
285
  color: "".concat(color.text(), " !important"),
178
286
  //'var(--choice-input-color, black)',
179
- display: 'inline-block',
287
+ display: 'flex',
288
+ flexDirection: 'column',
180
289
  verticalAlign: 'middle',
181
290
  cursor: 'pointer',
182
291
  '& > p': {
@@ -189,12 +298,18 @@ var styles = function styles(theme) {
189
298
  },
190
299
  '&:not(.MathJax) > table tr': {
191
300
  '&:nth-child(2n)': {
192
- backgroundColor: '#f6f8fa'
301
+ backgroundColor: '#f6f8fa',
302
+ color: theme.palette.common.black
193
303
  }
194
304
  },
195
- '&:not(.MathJax) > table td, &:not(.MathJax) > table th': {
305
+ // align table content to left as per STAR requirement PD-3687
306
+ '&:not(.MathJax) table td, &:not(.MathJax) table th': {
196
307
  padding: '.6em 1em',
197
- textAlign: 'center'
308
+ textAlign: 'left'
309
+ },
310
+ // added this to fix alignment of text in prompt imported from studio (PD-3423)
311
+ '&:not(.MathJax) > table td > p.kds-indent': {
312
+ textAlign: 'initial'
198
313
  }
199
314
  }
200
315
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/preview-prompt.jsx"],"names":["NEWLINE_BLOCK_REGEX","NEWLINE_LATEX","PreviewPrompt","text","div","document","createElement","innerHTML","audio","querySelector","source","setAttribute","getAttribute","removeAttribute","appendChild","previewPrompt","images","getElementsByTagName","length","image","attributes","alignment","value","parentNode","parentElement","tagName","style","display","width","copyImage","cloneNode","replaceChild","props","prompt","classes","className","onClick","defaultClassName","CustomTag","legendClass","customClasses","promptTable","__html","parsedText","replace","Component","PropTypes","object","string","func","styles","theme","verticalAlign","color","legend","fontSize","rationale","paddingLeft","spacing","unit","paddingBottom","label","cursor","margin","borderCollapse","backgroundColor","padding","textAlign"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\nimport * as color from './color';\n\n//Used these below to replace \\\\embed{newLine} with \\\\newline from prompt which will get parsed in MathJax\nconst NEWLINE_BLOCK_REGEX = /\\\\embed\\{newLine\\}\\[\\]/g;\nconst NEWLINE_LATEX = '\\\\newline ';\n\nexport class PreviewPrompt extends Component {\n static propTypes = {\n classes: PropTypes.object,\n prompt: PropTypes.string,\n tagName: PropTypes.string,\n className: PropTypes.string,\n onClick: PropTypes.func,\n defaultClassName: PropTypes.string,\n };\n\n static defaultProps = {\n onClick: () => {},\n };\n\n parsedText = (text) => {\n // fix imported audio content for Safari PD-1419\n const div = document.createElement('div');\n div.innerHTML = text;\n\n const audio = div.querySelector('audio');\n if (audio) {\n const source = document.createElement('source');\n\n source.setAttribute('type', 'audio/mp3');\n source.setAttribute('src', audio.getAttribute('src'));\n\n audio.removeAttribute('src');\n audio.appendChild(source);\n }\n\n return div.innerHTML;\n };\n\n componentDidUpdate() {\n // set image parent style so it can be horizontally aligned\n const previewPrompt = document.querySelector('#preview-prompt');\n const images = previewPrompt && previewPrompt.getElementsByTagName('img');\n\n if (images && images.length) {\n for (let image of images) {\n // check if alignment property was set\n if (image.attributes && image.attributes.alignment && image.attributes.alignment.value) {\n const parentNode = image.parentElement;\n\n // check if div is not already added to dom and replace current image with wrapped image\n if (\n !(parentNode.tagName === 'DIV' && parentNode.style.display === 'flex' && parentNode.style.width === '100%')\n ) {\n const div = document.createElement('div');\n div.style.display = 'flex';\n div.style.width = '100%';\n\n const copyImage = image.cloneNode(true);\n div.appendChild(copyImage);\n parentNode.replaceChild(div, image);\n }\n }\n }\n }\n }\n\n render() {\n const { prompt, classes, tagName, className, onClick, defaultClassName } = this.props;\n const CustomTag = tagName || 'div';\n // legend tag was added once with accessibility tasks, wee need extra style to make it work with images alignment\n const legendClass = tagName === 'legend' ? 'legend' : '';\n const customClasses = `${classes.promptTable} ${classes[className] || ''} ${defaultClassName || ''} ${classes[\n legendClass\n ] || ''}`;\n\n return (\n <CustomTag\n id={'preview-prompt'}\n onClick={onClick}\n className={customClasses}\n dangerouslySetInnerHTML={{\n __html: this.parsedText(prompt || '').replace(NEWLINE_BLOCK_REGEX, NEWLINE_LATEX),\n }}\n />\n );\n }\n}\n\nconst styles = (theme) => ({\n prompt: {\n verticalAlign: 'middle',\n color: color.text(),\n },\n legend: {\n width: '100%',\n fontSize: 'inherit !important',\n },\n rationale: {\n paddingLeft: theme.spacing.unit * 4,\n paddingBottom: theme.spacing.unit,\n },\n label: {\n color: `${color.text()} !important`, //'var(--choice-input-color, black)',\n display: 'inline-block',\n verticalAlign: 'middle',\n cursor: 'pointer',\n '& > p': {\n margin: '0 0 0 0 !important',\n },\n },\n promptTable: {\n '&:not(.MathJax) > table': {\n borderCollapse: 'collapse',\n },\n '&:not(.MathJax) > table tr': {\n '&:nth-child(2n)': {\n backgroundColor: '#f6f8fa',\n },\n },\n '&:not(.MathJax) > table td, &:not(.MathJax) > table th': {\n padding: '.6em 1em',\n textAlign: 'center',\n },\n },\n});\nexport default withStyles(styles)(PreviewPrompt);\n"],"file":"preview-prompt.js"}
1
+ {"version":3,"sources":["../src/preview-prompt.jsx"],"names":["NEWLINE_BLOCK_REGEX","NEWLINE_LATEX","PreviewPrompt","text","customAudioButton","props","div","document","createElement","innerHTML","audio","querySelector","source","setAttribute","getAttribute","removeAttribute","appendChild","style","display","playButton","id","Object","assign","cursor","width","height","backgroundImage","pauseImage","backgroundSize","borderRadius","border","parentNode","insertBefore","autoplayAudioEnabled","getElementById","play","then","addEventListener","handleAudioEnded","error","console","handlePlayClick","paused","includes","playImage","handleAudioPlay","handleAudioPause","_handlePlayClick","_handleAudioPlay","_handleAudioPause","_handleAudioEnded","removeEventListener","alignImages","addCustomAudioButtonControls","removeCustomAudioButtonListeners","previewPrompts","querySelectorAll","forEach","previewPrompt","images","getElementsByTagName","length","image","attributes","alignment","value","parentElement","tagName","copyImage","cloneNode","replaceChild","prompt","classes","className","onClick","defaultClassName","CustomTag","legendClass","customClasses","promptTable","__html","parsedText","replace","Component","PropTypes","object","string","func","bool","styles","theme","verticalAlign","color","legend","fontSize","rationale","paddingLeft","spacing","unit","paddingBottom","label","flexDirection","margin","borderCollapse","backgroundColor","palette","common","black","padding","textAlign"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\nimport * as color from './color';\n\n//Used these below to replace \\\\embed{newLine} with \\\\newline from prompt which will get parsed in MathJax\nconst NEWLINE_BLOCK_REGEX = /\\\\embed\\{newLine\\}\\[\\]/g;\nconst NEWLINE_LATEX = '\\\\newline ';\n\nexport class PreviewPrompt extends Component {\n static propTypes = {\n classes: PropTypes.object,\n prompt: PropTypes.string,\n tagName: PropTypes.string,\n className: PropTypes.string,\n onClick: PropTypes.func,\n defaultClassName: PropTypes.string,\n autoplayAudioEnabled: PropTypes.bool,\n customAudioButton: {\n playImage: PropTypes.string,\n pauseImage: PropTypes.string,\n },\n };\n\n static defaultProps = {\n onClick: () => {},\n };\n\n parsedText = (text) => {\n const { customAudioButton } = this.props;\n const div = document.createElement('div');\n div.innerHTML = text;\n\n const audio = div.querySelector('audio');\n if (audio) {\n const source = document.createElement('source');\n\n source.setAttribute('type', 'audio/mp3');\n source.setAttribute('src', audio.getAttribute('src'));\n\n audio.removeAttribute('src');\n audio.setAttribute('id', 'pie-prompt-audio-player');\n\n audio.appendChild(source);\n\n if (customAudioButton) {\n audio.style.display = 'none';\n\n const playButton = document.createElement('div');\n playButton.id = 'play-audio-button';\n\n Object.assign(playButton.style, {\n cursor: 'pointer',\n display: 'block',\n width: '128px',\n height: '128px',\n backgroundImage: `url(${customAudioButton.pauseImage})`,\n backgroundSize: 'cover',\n borderRadius: '50%',\n border: '1px solid #326295',\n });\n\n audio.parentNode.insertBefore(playButton, audio);\n }\n }\n\n return div.innerHTML;\n };\n\n addCustomAudioButtonControls() {\n const { autoplayAudioEnabled, customAudioButton } = this.props;\n const playButton = document.getElementById('play-audio-button');\n const audio = document.getElementById('pie-prompt-audio-player');\n\n if (autoplayAudioEnabled && audio) {\n audio\n .play()\n .then(() => {\n if (playButton && customAudioButton) {\n audio.addEventListener('ended', handleAudioEnded);\n }\n })\n .catch((error) => {\n console.error('Error playing audio', error);\n });\n }\n\n if (!playButton || !audio || !customAudioButton) return;\n\n const handlePlayClick = () => {\n // if already playing, don't play again\n if (!audio.paused) return;\n if (playButton.style.backgroundImage.includes(customAudioButton.pauseImage)) return;\n\n audio.play();\n };\n\n const handleAudioEnded = () => {\n playButton.style.backgroundImage = `url(${customAudioButton.playImage})`;\n };\n\n const handleAudioPlay = () => {\n Object.assign(playButton.style, {\n backgroundImage: `url(${customAudioButton.pauseImage})`,\n border: '1px solid #ccc',\n });\n };\n\n const handleAudioPause = () => {\n Object.assign(playButton.style, {\n backgroundImage: `url(${customAudioButton.playImage})`,\n border: '1px solid #326295',\n });\n };\n\n playButton.addEventListener('click', handlePlayClick);\n audio.addEventListener('play', handleAudioPlay);\n audio.addEventListener('pause', handleAudioPause);\n audio.addEventListener('ended', handleAudioEnded);\n\n // store event handler references so they can be removed later\n this._handlePlayClick = handlePlayClick;\n this._handleAudioPlay = handleAudioPlay;\n this._handleAudioPause = handleAudioPause;\n this._handleAudioEnded = handleAudioEnded;\n }\n\n removeCustomAudioButtonListeners() {\n const playButton = document.getElementById('play-audio-button');\n const audio = document.querySelector('audio');\n\n if (!playButton || !audio) return;\n\n // remove event listeners using stored references\n playButton.removeEventListener('click', this._handlePlayClick);\n audio.removeEventListener('play', this._handleAudioPlay);\n audio.removeEventListener('pause', this._handleAudioPause);\n audio.removeEventListener('ended', this._handleAudioEnded);\n }\n\n componentDidMount() {\n this.alignImages();\n this.addCustomAudioButtonControls();\n }\n\n componentDidUpdate() {\n this.alignImages();\n }\n\n componentWillUnmount() {\n this.removeCustomAudioButtonListeners();\n }\n\n alignImages() {\n const previewPrompts = document.querySelectorAll('#preview-prompt');\n\n previewPrompts.forEach((previewPrompt) => {\n const images = previewPrompt.getElementsByTagName('img');\n\n if (images && images.length) {\n for (let image of images) {\n // check if alignment property was set\n if (image.attributes && image.attributes.alignment && image.attributes.alignment.value) {\n const parentNode = image.parentElement;\n\n // check if div is not already added to dom and replace current image with wrapped image\n if (\n !(\n parentNode.tagName === 'DIV' &&\n parentNode.style.display === 'flex' &&\n parentNode.style.width === '100%'\n )\n ) {\n const div = document.createElement('div');\n div.style.display = 'flex';\n div.style.width = '100%';\n\n const copyImage = image.cloneNode(true);\n div.appendChild(copyImage);\n parentNode.replaceChild(div, image);\n }\n }\n }\n }\n });\n }\n\n render() {\n const { prompt, classes, tagName, className, onClick, defaultClassName } = this.props;\n const CustomTag = tagName || 'div';\n // legend tag was added once with accessibility tasks, wee need extra style to make it work with images alignment\n const legendClass = tagName === 'legend' ? 'legend' : '';\n const customClasses = `${classes.promptTable} ${classes[className] || ''} ${defaultClassName || ''} ${classes[\n legendClass\n ] || ''}`;\n\n return (\n <CustomTag\n id={'preview-prompt'}\n onClick={onClick}\n className={customClasses}\n dangerouslySetInnerHTML={{\n __html: this.parsedText(prompt || '').replace(NEWLINE_BLOCK_REGEX, NEWLINE_LATEX),\n }}\n />\n );\n }\n}\n\nconst styles = (theme) => ({\n prompt: {\n verticalAlign: 'middle',\n color: color.text(),\n },\n legend: {\n width: '100%',\n fontSize: 'inherit !important',\n },\n rationale: {\n paddingLeft: theme.spacing.unit * 4,\n paddingBottom: theme.spacing.unit,\n },\n label: {\n color: `${color.text()} !important`, //'var(--choice-input-color, black)',\n display: 'flex',\n flexDirection: 'column',\n verticalAlign: 'middle',\n cursor: 'pointer',\n '& > p': {\n margin: '0 0 0 0 !important',\n },\n },\n promptTable: {\n '&:not(.MathJax) > table': {\n borderCollapse: 'collapse',\n },\n '&:not(.MathJax) > table tr': {\n '&:nth-child(2n)': {\n backgroundColor: '#f6f8fa',\n color: theme.palette.common.black,\n },\n },\n // align table content to left as per STAR requirement PD-3687\n '&:not(.MathJax) table td, &:not(.MathJax) table th': {\n padding: '.6em 1em',\n textAlign: 'left',\n },\n // added this to fix alignment of text in prompt imported from studio (PD-3423)\n '&:not(.MathJax) > table td > p.kds-indent': {\n textAlign: 'initial',\n },\n },\n});\nexport default withStyles(styles)(PreviewPrompt);\n"],"file":"preview-prompt.js"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
+
12
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
13
+
14
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
15
+
16
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
+
18
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
19
+
20
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
21
+
22
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
23
+
24
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
25
+
26
+ var _react = _interopRequireDefault(require("react"));
27
+
28
+ var _styles = require("@material-ui/core/styles");
29
+
30
+ var _propTypes = _interopRequireDefault(require("prop-types"));
31
+
32
+ var _classnames = _interopRequireDefault(require("classnames"));
33
+
34
+ var _appendCssRules = _interopRequireDefault(require("./append-css-rules"));
35
+
36
+ var _excluded = ["children", "className", "classes", "fontSizeFactor"],
37
+ _excluded2 = ["extraCSSRules"];
38
+
39
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
40
+
41
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
42
+
43
+ var UiLayout = /*#__PURE__*/function (_AppendCSSRules) {
44
+ (0, _inherits2["default"])(UiLayout, _AppendCSSRules);
45
+
46
+ var _super = _createSuper(UiLayout);
47
+
48
+ function UiLayout(props) {
49
+ var _this;
50
+
51
+ (0, _classCallCheck2["default"])(this, UiLayout);
52
+ _this = _super.call(this, props);
53
+ _this.classesSheet = document.createElement('style');
54
+ return _this;
55
+ }
56
+
57
+ (0, _createClass2["default"])(UiLayout, [{
58
+ key: "computeStyle",
59
+ value: function computeStyle(fontSizeFactor) {
60
+ var getFontSize = function getFontSize(element) {
61
+ return parseFloat(getComputedStyle(element).fontSize);
62
+ };
63
+
64
+ var rootFontSize = getFontSize(document.documentElement);
65
+ var bodyFontSize = getFontSize(document.body);
66
+ var effectiveFontSize = Math.max(rootFontSize, bodyFontSize);
67
+ return fontSizeFactor !== 1 ? {
68
+ fontSize: "".concat(effectiveFontSize * fontSizeFactor, "px")
69
+ } : null;
70
+ }
71
+ }, {
72
+ key: "render",
73
+ value: function render() {
74
+ var _this$props = this.props,
75
+ children = _this$props.children,
76
+ className = _this$props.className,
77
+ classes = _this$props.classes,
78
+ fontSizeFactor = _this$props.fontSizeFactor,
79
+ rest = (0, _objectWithoutProperties2["default"])(_this$props, _excluded);
80
+ var finalClass = (0, _classnames["default"])(className, classes.extraCSSRules, classes.uiLayoutContainer);
81
+ var extraCSSRules = rest.extraCSSRules,
82
+ restProps = (0, _objectWithoutProperties2["default"])(rest, _excluded2);
83
+ var style = this.computeStyle(fontSizeFactor);
84
+ return /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({
85
+ className: finalClass
86
+ }, restProps, style && {
87
+ style: style
88
+ }), children);
89
+ }
90
+ }]);
91
+ return UiLayout;
92
+ }(_appendCssRules["default"]);
93
+
94
+ (0, _defineProperty2["default"])(UiLayout, "propTypes", {
95
+ classes: _propTypes["default"].object,
96
+ className: _propTypes["default"].string,
97
+ children: _propTypes["default"].array,
98
+ extraCSSRules: _propTypes["default"].shape({
99
+ names: _propTypes["default"].arrayOf(_propTypes["default"].string),
100
+ rules: _propTypes["default"].string
101
+ }),
102
+ fontSizeFactor: _propTypes["default"].number
103
+ });
104
+ (0, _defineProperty2["default"])(UiLayout, "defaultProps", {
105
+ extraCSSRules: {},
106
+ fontSizeFactor: 1
107
+ });
108
+ var styles = {
109
+ extraCSSRules: {},
110
+ // need this because some browsers set their own style on table
111
+ uiLayoutContainer: {
112
+ '& table, th, td': {
113
+ fontSize: 'inherit'
114
+ /* Ensure table elements inherit font size */
115
+
116
+ }
117
+ }
118
+ };
119
+ var Styled = (0, _styles.withStyles)(styles)(UiLayout);
120
+ var _default = Styled;
121
+ exports["default"] = _default;
122
+ //# sourceMappingURL=ui-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui-layout.jsx"],"names":["UiLayout","props","classesSheet","document","createElement","fontSizeFactor","getFontSize","element","parseFloat","getComputedStyle","fontSize","rootFontSize","documentElement","bodyFontSize","body","effectiveFontSize","Math","max","children","className","classes","rest","finalClass","extraCSSRules","uiLayoutContainer","restProps","style","computeStyle","AppendCSSRules","PropTypes","object","string","array","shape","names","arrayOf","rules","number","styles","Styled"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;IAEMA,Q;;;;;AAiBJ,oBAAYC,KAAZ,EAAmB;AAAA;;AAAA;AACjB,8BAAMA,KAAN;AACA,UAAKC,YAAL,GAAoBC,QAAQ,CAACC,aAAT,CAAuB,OAAvB,CAApB;AAFiB;AAGlB;;;;WAED,sBAAaC,cAAb,EAA6B;AAC3B,UAAMC,WAAW,GAAG,SAAdA,WAAc,CAACC,OAAD;AAAA,eAAaC,UAAU,CAACC,gBAAgB,CAACF,OAAD,CAAhB,CAA0BG,QAA3B,CAAvB;AAAA,OAApB;;AAEA,UAAMC,YAAY,GAAGL,WAAW,CAACH,QAAQ,CAACS,eAAV,CAAhC;AACA,UAAMC,YAAY,GAAGP,WAAW,CAACH,QAAQ,CAACW,IAAV,CAAhC;AACA,UAAMC,iBAAiB,GAAGC,IAAI,CAACC,GAAL,CAASN,YAAT,EAAuBE,YAAvB,CAA1B;AAEA,aAAOR,cAAc,KAAK,CAAnB,GAAuB;AAAEK,QAAAA,QAAQ,YAAKK,iBAAiB,GAAGV,cAAzB;AAAV,OAAvB,GAAiF,IAAxF;AACD;;;WAED,kBAAS;AACP,wBAAkE,KAAKJ,KAAvE;AAAA,UAAQiB,QAAR,eAAQA,QAAR;AAAA,UAAkBC,SAAlB,eAAkBA,SAAlB;AAAA,UAA6BC,OAA7B,eAA6BA,OAA7B;AAAA,UAAsCf,cAAtC,eAAsCA,cAAtC;AAAA,UAAyDgB,IAAzD;AAEA,UAAMC,UAAU,GAAG,4BAAWH,SAAX,EAAsBC,OAAO,CAACG,aAA9B,EAA6CH,OAAO,CAACI,iBAArD,CAAnB;AACA,UAAQD,aAAR,GAAwCF,IAAxC,CAAQE,aAAR;AAAA,UAA0BE,SAA1B,6CAAwCJ,IAAxC;AACA,UAAMK,KAAK,GAAG,KAAKC,YAAL,CAAkBtB,cAAlB,CAAd;AAEA,0BACE;AAAK,QAAA,SAAS,EAAEiB;AAAhB,SAAgCG,SAAhC,EAAgDC,KAAK,IAAI;AAAEA,QAAAA,KAAK,EAALA;AAAF,OAAzD,GACGR,QADH,CADF;AAKD;;;EA5CoBU,0B;;iCAAjB5B,Q,eACe;AACjBoB,EAAAA,OAAO,EAAES,sBAAUC,MADF;AAEjBX,EAAAA,SAAS,EAAEU,sBAAUE,MAFJ;AAGjBb,EAAAA,QAAQ,EAAEW,sBAAUG,KAHH;AAIjBT,EAAAA,aAAa,EAAEM,sBAAUI,KAAV,CAAgB;AAC7BC,IAAAA,KAAK,EAAEL,sBAAUM,OAAV,CAAkBN,sBAAUE,MAA5B,CADsB;AAE7BK,IAAAA,KAAK,EAAEP,sBAAUE;AAFY,GAAhB,CAJE;AAQjB1B,EAAAA,cAAc,EAAEwB,sBAAUQ;AART,C;iCADfrC,Q,kBAYkB;AACpBuB,EAAAA,aAAa,EAAE,EADK;AAEpBlB,EAAAA,cAAc,EAAE;AAFI,C;AAmCxB,IAAMiC,MAAM,GAAG;AACbf,EAAAA,aAAa,EAAE,EADF;AAEb;AACAC,EAAAA,iBAAiB,EAAE;AACjB,uBAAmB;AACjBd,MAAAA,QAAQ,EAAE;AAAU;;AADH;AADF;AAHN,CAAf;AAUA,IAAM6B,MAAM,GAAG,wBAAWD,MAAX,EAAmBtC,QAAnB,CAAf;eAEeuC,M","sourcesContent":["import React from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport AppendCSSRules from './append-css-rules';\n\nclass UiLayout extends AppendCSSRules {\n static propTypes = {\n classes: PropTypes.object,\n className: PropTypes.string,\n children: PropTypes.array,\n extraCSSRules: PropTypes.shape({\n names: PropTypes.arrayOf(PropTypes.string),\n rules: PropTypes.string,\n }),\n fontSizeFactor: PropTypes.number,\n };\n\n static defaultProps = {\n extraCSSRules: {},\n fontSizeFactor: 1,\n };\n\n constructor(props) {\n super(props);\n this.classesSheet = document.createElement('style');\n }\n\n computeStyle(fontSizeFactor) {\n const getFontSize = (element) => parseFloat(getComputedStyle(element).fontSize);\n\n const rootFontSize = getFontSize(document.documentElement);\n const bodyFontSize = getFontSize(document.body);\n const effectiveFontSize = Math.max(rootFontSize, bodyFontSize);\n\n return fontSizeFactor !== 1 ? { fontSize: `${effectiveFontSize * fontSizeFactor}px` } : null;\n }\n\n render() {\n const { children, className, classes, fontSizeFactor, ...rest } = this.props;\n\n const finalClass = classNames(className, classes.extraCSSRules, classes.uiLayoutContainer);\n const { extraCSSRules, ...restProps } = rest;\n const style = this.computeStyle(fontSizeFactor);\n\n return (\n <div className={finalClass} {...restProps} {...(style && { style })}>\n {children}\n </div>\n );\n }\n}\n\nconst styles = {\n extraCSSRules: {},\n // need this because some browsers set their own style on table\n uiLayoutContainer: {\n '& table, th, td': {\n fontSize: 'inherit' /* Ensure table elements inherit font size */,\n },\n },\n};\n\nconst Styled = withStyles(styles)(UiLayout);\n\nexport default Styled;\n"],"file":"ui-layout.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pie-lib/render-ui",
3
- "version": "4.15.10-next.1+23991a09",
3
+ "version": "4.16.0-beta.1",
4
4
  "description": "Some shared ui elements when rendering - but not worthy of their own package yet.",
5
5
  "module": "src/index.js",
6
6
  "main": "lib/index.js",
@@ -11,14 +11,16 @@
11
11
  "dependencies": {
12
12
  "@material-ui/core": "^3.8.3",
13
13
  "@material-ui/icons": "^3.0.2",
14
- "@pie-lib/icons": "^2.4.43",
15
- "@pie-lib/math-rendering": "2.5.18",
14
+ "@pie-lib/icons": "latest",
15
+ "@pie-lib/math-rendering": "latest",
16
16
  "classnames": "^2.2.6",
17
17
  "debug": "^4.1.1",
18
+ "lodash": "^4.17.11",
18
19
  "prop-types": "^15.7.2",
19
20
  "react-transition-group": "^2.5.2"
20
21
  },
21
22
  "peerDependencies": {
23
+ "@pie-lib/test-utils": "latest",
22
24
  "react": "^16.8.1",
23
25
  "react-dom": "^16.8.1"
24
26
  },
@@ -26,5 +28,5 @@
26
28
  "react": "^16.8.1",
27
29
  "react-dom": "^16.8.1"
28
30
  },
29
- "gitHead": "23991a09b77492c24dcb5235049667cdcc211d80"
31
+ "gitHead": "e2aa3ddac60f49bcb8c2562370f496323642f453"
30
32
  }
@@ -0,0 +1,11 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`html-and-math render renders 1`] = `
4
+ <div
5
+ dangerouslySetInnerHTML={
6
+ Object {
7
+ "__html": "<p>hi</p>",
8
+ }
9
+ }
10
+ />
11
+ `;
@@ -0,0 +1,37 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Prompt with Custom tag renders with custom tag "span" correctly renders 1`] = `
4
+ <PreviewPrompt
5
+ className="prompt"
6
+ classes={
7
+ Object {
8
+ "label": "PreviewPrompt-label-4",
9
+ "legend": "PreviewPrompt-legend-2",
10
+ "prompt": "PreviewPrompt-prompt-1",
11
+ "promptTable": "PreviewPrompt-promptTable-5",
12
+ "rationale": "PreviewPrompt-rationale-3",
13
+ }
14
+ }
15
+ onClick={[Function]}
16
+ prompt="Which of these northern European countries are EU members? <math><mstack><msrow><mn>111</mn></msrow><msline/></mstack></math>"
17
+ tagName="span"
18
+ />
19
+ `;
20
+
21
+ exports[`Prompt without Custom tag default class with markup renders 1`] = `
22
+ <PreviewPrompt
23
+ className=""
24
+ classes={
25
+ Object {
26
+ "label": "PreviewPrompt-label-4",
27
+ "legend": "PreviewPrompt-legend-2",
28
+ "prompt": "PreviewPrompt-prompt-1",
29
+ "promptTable": "PreviewPrompt-promptTable-5",
30
+ "rationale": "PreviewPrompt-rationale-3",
31
+ }
32
+ }
33
+ onClick={[Function]}
34
+ prompt="Which of these northern European countries are EU members? <math><mstack><msrow><mn>111</mn></msrow><msline/></mstack></math>"
35
+ tagName=""
36
+ />
37
+ `;
@@ -0,0 +1,42 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Purpose renders fine renders child unaltered 1`] = `
4
+ <Purpose
5
+ purpose="passage"
6
+ >
7
+ <div
8
+ data-pie-purpose="passage"
9
+ key=".0"
10
+ >
11
+ text
12
+ </div>
13
+ </Purpose>
14
+ `;
15
+
16
+ exports[`Purpose renders fine renders child unaltered without purpose prop 1`] = `
17
+ <Purpose>
18
+ <div
19
+ key=".0"
20
+ >
21
+ text
22
+ </div>
23
+ </Purpose>
24
+ `;
25
+
26
+ exports[`Purpose renders fine renders children unaltered 1`] = `
27
+ <Purpose
28
+ purpose="something"
29
+ >
30
+ <div
31
+ data-pie-purpose="something"
32
+ key=".0"
33
+ >
34
+ <div>
35
+ text1
36
+ </div>
37
+ <div>
38
+ text2
39
+ </div>
40
+ </div>
41
+ </Purpose>
42
+ `;
@@ -0,0 +1,64 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Readable renders fine renders child unaltered 1`] = `
4
+ <Readable>
5
+ <div
6
+ data-pie-readable={true}
7
+ key=".0"
8
+ >
9
+ text
10
+ </div>
11
+ </Readable>
12
+ `;
13
+
14
+ exports[`Readable renders fine renders children unaltered 1`] = `
15
+ <Readable>
16
+ <div
17
+ data-pie-readable={true}
18
+ key=".0"
19
+ >
20
+ <div>
21
+ text1
22
+ </div>
23
+ <div>
24
+ text2
25
+ </div>
26
+ </div>
27
+ </Readable>
28
+ `;
29
+
30
+ exports[`Readable renders fine renders even with specific true tag 1`] = `
31
+ <Readable
32
+ false={true}
33
+ >
34
+ <div
35
+ data-pie-readable={false}
36
+ key=".0"
37
+ >
38
+ <div>
39
+ text1
40
+ </div>
41
+ <div>
42
+ text2
43
+ </div>
44
+ </div>
45
+ </Readable>
46
+ `;
47
+
48
+ exports[`Readable renders fine renders with false tag 1`] = `
49
+ <Readable
50
+ false={true}
51
+ >
52
+ <div
53
+ data-pie-readable={false}
54
+ key=".0"
55
+ >
56
+ <div>
57
+ text1
58
+ </div>
59
+ <div>
60
+ text2
61
+ </div>
62
+ </div>
63
+ </Readable>
64
+ `;