Skip to content

Commit ab93b17

Browse files
committed
fix errors and update player with new structure WIP PD-363
1 parent a5c72c6 commit ab93b17

4 files changed

Lines changed: 123 additions & 16 deletions

File tree

packages/select-text/configure/src/design.jsx

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import Chip from '@material-ui/core/Chip';
1010
import Info from '@material-ui/icons/Info';
1111
import debug from 'debug';
1212
import { EditableHtml } from '@pie-lib/pie-toolbox/editable-html';
13+
import { renderMath } from '@pie-lib/pie-toolbox/math-rendering';
1314
import Tooltip from '@material-ui/core/Tooltip';
1415
import { clearSelection, generateValidationMessage } from './utils';
1516
// import {
@@ -24,6 +25,7 @@ import classNames from 'classnames';
2425

2526
import Switch from '@material-ui/core/Switch';
2627
import FormControlLabel from '@material-ui/core/FormControlLabel';
28+
import ReactDOM from 'react-dom';
2729

2830
const { Panel, toggle, radio, dropdown } = settings;
2931

@@ -64,7 +66,8 @@ export class Design extends React.Component {
6466
if (model && model.text) {
6567
this.setState({
6668
text: model.text,
67-
tokenizedText: model.text,
69+
text: model.text,
70+
tokenizedText: model.tokenizedText || model.text,
6871
});
6972

7073
// model.tokens.forEach((annotation) => {
@@ -86,6 +89,15 @@ export class Design extends React.Component {
8689
}
8790
}
8891

92+
componentDidUpdate() {
93+
// console.log('UPDATED');
94+
// console.log('this.state.text', this.state.text);
95+
//eslint-disable-next-line
96+
const domNode = ReactDOM.findDOMNode(this);
97+
98+
renderMath(domNode);
99+
}
100+
89101
updateText = debounce((val) => {
90102
this.apply((u) => {
91103
u.text = val;
@@ -112,6 +124,17 @@ export class Design extends React.Component {
112124
});
113125
};
114126

127+
changeTokenizedText = (text) => {
128+
this.apply((u) => {
129+
u.tokenizedText = text;
130+
131+
// const correctTokenCount = tokens.filter((t) => t.correct).length;
132+
// const max = isFinite(u.maxSelections) ? u.maxSelections : 0;
133+
//
134+
// u.maxSelections = Math.max(max, correctTokenCount);
135+
});
136+
};
137+
115138
changeMaxSelections = (event, max) => {
116139
this.apply((u) => (u.maxSelections = max));
117140
};
@@ -343,6 +366,13 @@ export class Design extends React.Component {
343366
if (selection && selection.rangeCount > 0) {
344367
this.wrapSelectionInSpan(selection);
345368
clearSelection();
369+
370+
if (this.textRef) {
371+
const content = this.textRef.getHTML();
372+
373+
this.changeTokenizedText(content);
374+
// this.setState({ tokenizedText: content });
375+
}
346376
}
347377
};
348378

@@ -359,13 +389,16 @@ export class Design extends React.Component {
359389
clearTokens = () => {
360390
const { model } = this.props;
361391

362-
const container = document.createElement('div');
363-
container.innerHTML = model.text;
392+
if (this.textRef) {
393+
const container = document.createElement('div');
394+
container.innerHTML = model.text;
364395

365-
// Remove all children and add new content
366-
this.textRef.innerHTML = '';
367-
this.textRef.appendChild(container);
396+
// Remove all children and add new content
397+
this.textRef.innerHTML = '';
398+
this.textRef.appendChild(container);
399+
}
368400

401+
this.changeTokenizedText(model.text);
369402
this.setState({ tokenizedText: model.text });
370403
};
371404

@@ -376,6 +409,7 @@ export class Design extends React.Component {
376409

377410
console.log('words:', tokenized);
378411

412+
this.changeTokenizedText(tokenized);
379413
this.setState({ tokenizedText: tokenized });
380414
};
381415

@@ -390,6 +424,7 @@ export class Design extends React.Component {
390424

391425
const tokenized = container.innerHTML;
392426
console.log('sentences:', tokenized);
427+
this.changeTokenizedText(tokenized);
393428
// this.setState({ tokenizedText: tokenized });
394429
};
395430

@@ -404,6 +439,7 @@ export class Design extends React.Component {
404439

405440
const tokenized = container.innerHTML;
406441
console.log('paragraphs:', tokenized);
442+
this.changeTokenizedText(tokenized);
407443
// this.setState({ tokenizedText: tokenized });
408444
};
409445

@@ -619,7 +655,15 @@ export class Design extends React.Component {
619655
<div className={classes.subheader}>
620656
NEW functionality
621657
<FormControlLabel
622-
control={<Switch checked={selectMode} onChange={() => this.setState({ selectMode: !selectMode })} />}
658+
control={
659+
<Switch
660+
checked={selectMode}
661+
onChange={() => {
662+
this.setState({ selectMode: !selectMode });
663+
// renderMath(this);
664+
}}
665+
/>
666+
}
623667
label="Select tokens"
624668
/>
625669
</div>

packages/select-text/configure/src/index.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import {
88
InsertSoundEvent,
99
DeleteSoundEvent,
1010
} from '@pie-framework/pie-configure-events';
11+
import { renderMath } from '@pie-lib/pie-toolbox/math-rendering';
12+
1113
import defaultValues from './defaultConfiguration';
1214
import { generateModel } from './utils';
1315

@@ -57,7 +59,7 @@ export default class SelectTextConfigure extends HTMLElement {
5759

5860
// check if the language is already included in the languageChoices.options array
5961
// and if not, then add it.
60-
if (!this._configuration.languageChoices.options.find(option => option.value === this._model.language)) {
62+
if (!this._configuration.languageChoices.options.find((option) => option.value === this._model.language)) {
6163
this._configuration.languageChoices.options.push({
6264
value: this._model.language,
6365
label: this._model.language,
@@ -127,7 +129,9 @@ export default class SelectTextConfigure extends HTMLElement {
127129
},
128130
});
129131

130-
ReactDOM.render(el, this);
132+
ReactDOM.render(el, this, () => {
133+
renderMath(this);
134+
});
131135
}
132136
}
133137
}

packages/select-text/controller/src/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ export const model = (question, session, env) => {
122122
highlightChoices: normalizedQuestion.highlightChoices,
123123
prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
124124
text: normalizedQuestion.text,
125+
tokenizedText: normalizedQuestion.tokenizedText,
125126
disabled: env.mode !== 'gather',
126127
maxSelections: normalizedQuestion.maxSelections,
127128
correctness,

packages/select-text/src/main.jsx

Lines changed: 65 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
import React from 'react';
22
import PropTypes from 'prop-types';
33
import { TextSelect, Legend } from '@pie-lib/pie-toolbox/text-select';
4-
import {CorrectAnswerToggle} from '@pie-lib/pie-toolbox/correct-answer-toggle';
5-
import {color, Feedback, Collapsible, hasText, hasMedia, PreviewPrompt, UiLayout} from '@pie-lib/pie-toolbox/render-ui';
4+
import { CorrectAnswerToggle } from '@pie-lib/pie-toolbox/correct-answer-toggle';
5+
import {
6+
color,
7+
Feedback,
8+
Collapsible,
9+
hasText,
10+
hasMedia,
11+
PreviewPrompt,
12+
UiLayout,
13+
} from '@pie-lib/pie-toolbox/render-ui';
614
import { withStyles } from '@material-ui/core/styles';
715
import generateModel from './utils';
16+
import classNames from 'classnames';
817

918
import debug from 'debug';
1019

@@ -26,14 +35,27 @@ export class Main extends React.Component {
2635

2736
this.state = {
2837
showCorrectAnswer: this.props.model.alwaysShowCorrect || false,
29-
model: generateModel(props.model),
38+
model: {
39+
...generateModel(props.model),
40+
tokenizedText: this.initializeTokenizedText(
41+
props.model.tokenizedText || props.model.text,
42+
this.handleTokenClick,
43+
),
44+
},
45+
selectedTokens: [],
3046
};
3147
}
3248

3349
UNSAFE_componentWillReceiveProps(nextProps) {
3450
this.setState({
3551
showCorrectAnswer: !!nextProps.model.alwaysShowCorrect,
36-
model: generateModel(nextProps.model),
52+
model: {
53+
...generateModel(nextProps.model),
54+
tokenizedText: this.initializeTokenizedText(
55+
nextProps.model.tokenizedText || nextProps.model.text,
56+
this.handleTokenClick,
57+
),
58+
},
3759
});
3860
}
3961

@@ -47,16 +69,37 @@ export class Main extends React.Component {
4769
return model.tokens.filter((t) => t.correct);
4870
};
4971

72+
initializeTokenizedText = (html, onClick) => {
73+
const { classes } = this.props;
74+
const container = document.createElement('div');
75+
container.innerHTML = html;
76+
77+
const spans = container.querySelectorAll('span');
78+
79+
spans.forEach((span) => {
80+
span.className = classNames(classes.token);
81+
// span.addEventListener('click', (e) => onClick(e));
82+
});
83+
84+
return container.innerHTML;
85+
};
86+
87+
handleTokenClick = (event) => {
88+
console.log('event click', event.target.id);
89+
90+
event.target.classList.toggle('selected');
91+
};
92+
5093
render() {
5194
const { session, onSelectionChange, classes } = this.props;
5295
const { showCorrectAnswer, model } = this.state;
5396
const { env, extraCSSRules } = model;
5497
const { mode } = env || {};
5598

56-
5799
const selectedTokens = showCorrectAnswer ? this.correctAnswer() : session.selectedTokens;
58100
const showRationale = model.rationale && (hasText(model.rationale) || hasMedia(model.rationale));
59-
const showTeacherInstructions = model.teacherInstructions && (hasText(model.teacherInstructions) || hasMedia(model.teacherInstructions));
101+
const showTeacherInstructions =
102+
model.teacherInstructions && (hasText(model.teacherInstructions) || hasMedia(model.teacherInstructions));
60103

61104
log('[render] selectedTokens:', selectedTokens);
62105

@@ -92,7 +135,7 @@ export class Main extends React.Component {
92135
<TextSelect
93136
className={classes.textSelect}
94137
disabled={model.disabled}
95-
text={model.text}
138+
text={model.tokenizedText || model.text}
96139
tokens={model.tokens}
97140
selectedTokens={selectedTokens}
98141
onChange={(selection) => {
@@ -154,6 +197,21 @@ const StyledMain = withStyles((theme) => ({
154197
collapsible: {
155198
marginBottom: theme.spacing.unit * 2,
156199
},
200+
token: {
201+
position: 'relative',
202+
cursor: 'pointer',
203+
border: 'dashed 2px grey',
204+
lineHeight: '24px',
205+
206+
'&:hover': {
207+
backgroundColor: '#9fa8da',
208+
},
209+
210+
'&.selected': {
211+
backgroundColor: '#9fa8da',
212+
border: 'none',
213+
},
214+
},
157215
}))(Main);
158216

159217
export default class Stateful extends React.Component {

0 commit comments

Comments
 (0)