Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow editing of lesson group fields in script editor gui #36968

Merged
merged 40 commits into from Oct 8, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
fd66126
Update script editor gui to use unit - lesson group - lesson as model
dmcavoy Sep 28, 2020
78c5e29
Generate lesson group key when adding new lesson group
dmcavoy Sep 29, 2020
71d96de
Merge branch 'editor-redux-rename' into script-editor-updates
dmcavoy Sep 29, 2020
c645eca
Add lesson key to script editor. Make move and remove lesson group work
dmcavoy Sep 29, 2020
024277b
Get back to a set of functional tests
dmcavoy Sep 29, 2020
7476a79
Make lessons draggable
dmcavoy Sep 29, 2020
c5a901f
Mark if a lesson is assessment or unplugged
dmcavoy Sep 29, 2020
2d713fb
Merge branch 'pass-info-script-edit' into script-editor-updates
dmcavoy Sep 29, 2020
2a288ee
Merge branch 'pass-info-script-edit' into script-editor-updates
dmcavoy Sep 29, 2020
cc7a671
Add fields to edit lesson group big questions and description
dmcavoy Sep 29, 2020
737d172
Add input to edit lesson group name and deal with user facing issues
dmcavoy Sep 29, 2020
e1a0dca
Merge branch 'staging' into script-editor-updates
dmcavoy Sep 29, 2020
5c46145
Merge branch 'script-editor-updates' into lesson-group-fields
dmcavoy Sep 29, 2020
4d67d3f
Update icon on Add Lesson Button
dmcavoy Sep 30, 2020
fa753b4
Merge branch 'staging' into script-editor-updates
dmcavoy Sep 30, 2020
da862c8
Merge branch 'script-editor-updates' into lesson-group-fields
dmcavoy Sep 30, 2020
4627f8f
Update tests
dmcavoy Sep 30, 2020
55f8d6b
Merge branch 'staging' into script-editor-updates
dmcavoy Oct 1, 2020
b78ce53
Merge branch 'script-editor-updates' into lesson-group-fields
dmcavoy Oct 1, 2020
5d2b683
Merge branch 'level-token-rename' into script-editor-updates
dmcavoy Oct 1, 2020
599dd88
Fix some reordering of things thats not needed
dmcavoy Oct 1, 2020
c8e199f
Merge branch 'script-editor-redux-updates' into script-editor-updates
dmcavoy Oct 1, 2020
6364aa6
Merge branch 'script-editor-updates' into lesson-group-fields
dmcavoy Oct 1, 2020
1d1b9ab
Merge branch 'new-editor-components' into lesson-group-fields
dmcavoy Oct 1, 2020
0a3e50e
Merge branch 'new-editor-components' into lesson-group-fields
dmcavoy Oct 1, 2020
920aa2a
Merge branch 'new-editor-components' into lesson-group-fields
dmcavoy Oct 1, 2020
8c35cd7
Merge branch 'new-editor-components' into lesson-group-fields
dmcavoy Oct 2, 2020
7c06057
Only make non user facing lesson group if first lesson group in script
dmcavoy Oct 2, 2020
ba248e7
Make tests run
dmcavoy Oct 2, 2020
a6d6404
Always have at least non user facing lesson group. Change to enable l…
dmcavoy Oct 2, 2020
a2f3210
Make sure lesson token does not overlap with no header on lesson card
dmcavoy Oct 2, 2020
1b7040a
Update LessonGroupCardTest
dmcavoy Oct 3, 2020
71b360d
Update UnitCardTests
dmcavoy Oct 3, 2020
b59451b
Update scriptEditorReduxTests
dmcavoy Oct 3, 2020
c8f4ffd
Fix snake case in script editor files
dmcavoy Oct 6, 2020
337d4c0
Merge branch 'staging' into lesson-group-fields
dmcavoy Oct 7, 2020
7dc44da
Allow user to turn off lesson groups if only one lesson group
dmcavoy Oct 8, 2020
afb6efc
Merge branch 'staging' into lesson-group-fields
dmcavoy Oct 8, 2020
ea99082
Update LessonGroupCard test
dmcavoy Oct 8, 2020
4ebf4a4
Update UnitCardTest
dmcavoy Oct 8, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
127 changes: 84 additions & 43 deletions apps/src/lib/levelbuilder/script-editor/LessonGroupCard.jsx
Expand Up @@ -6,14 +6,14 @@ import ReactDOM from 'react-dom';
import {borderRadius, tokenMargin} from '@cdo/apps/lib/levelbuilder/constants';
import OrderControls from '@cdo/apps/lib/levelbuilder/OrderControls';
import {
moveLesson,
moveGroup,
removeLesson,
addLesson,
removeGroup,
moveGroup,
setLessonGroup,
reorderLesson,
removeLesson,
moveLesson,
convertGroupToUserFacing
updateLessonGroupField
} from '@cdo/apps/lib/levelbuilder/script-editor/scriptEditorRedux';
import LessonToken from '@cdo/apps/lib/levelbuilder/script-editor/LessonToken';

Expand All @@ -33,7 +33,8 @@ const styles = {
},
lessonGroupCardHeader: {
color: '#5b6770',
marginBottom: 15
marginBottom: 15,
minHeight: 10
},
bottomControls: {
height: 30
Expand All @@ -44,6 +45,12 @@ const styles = {
border: '1px solid #ddd',
boxShadow: 'inset 0 1px 0 0 rgba(255, 255, 255, 0.8)',
margin: '0 5px 0 0'
},
input: {
width: '100%'
},
title: {
marginRight: 5
}
};

Expand All @@ -70,7 +77,7 @@ class LessonGroupCard extends Component {
removeLesson: PropTypes.func.isRequired,
setLessonGroup: PropTypes.func.isRequired,
reorderLesson: PropTypes.func.isRequired,
convertGroupToUserFacing: PropTypes.func.isRequired
updateLessonGroupField: PropTypes.func.isRequired
};

/**
Expand Down Expand Up @@ -228,25 +235,34 @@ class LessonGroupCard extends Component {
}
};

handleMakeUserFacing = lessonGroupPosition => {
const newLessonGroupKey = prompt('Enter new lesson group key');
const newLessonGroupDisplayName = prompt(
'Enter new lesson group display name'
handleChangeDescription = event => {
this.props.updateLessonGroupField(
this.props.lessonGroup.position,
'description',
event.target.value
);
};

handleChangeBigQuestions = event => {
this.props.updateLessonGroupField(
this.props.lessonGroup.position,
'bigQuestions',
event.target.value
);
};

handleChangeLessonGroupName = event => {
this.props.updateLessonGroupField(
this.props.lessonGroup.position,
'name',
event.target.value
);
if (newLessonGroupKey && newLessonGroupDisplayName) {
this.props.convertGroupToUserFacing(
lessonGroupPosition,
newLessonGroupKey,
newLessonGroupDisplayName
);
}
};

render() {
const {lessonGroup, targetLessonGroupPos} = this.props;
const {draggedLessonPos} = this.state;
const isTargetLessonGroup = targetLessonGroupPos === lessonGroup.position;

return (
<div
style={
Expand All @@ -256,15 +272,54 @@ class LessonGroupCard extends Component {
}
>
<div style={styles.lessonGroupCardHeader}>
{lessonGroup.user_facing
? `Lesson Group: "${lessonGroup.display_name}"`
: 'Lesson Group: Not User Facing (No Display Name)'}
<OrderControls
name={lessonGroup.key || '(none)'}
move={this.handleMoveLessonGroup}
remove={this.handleRemoveLessonGroup}
/>
{lessonGroup.userFacing && (
<span>
<span style={styles.title}>Lesson Group Name:</span>
<input
value={this.props.lessonGroup.displayName}
onChange={this.handleChangeLessonGroupName}
style={{width: 300}}
/>
</span>
)}
{lessonGroup.userFacing && (
<OrderControls
name={lessonGroup.key || '(none)'}
move={this.handleMoveLessonGroup}
remove={this.handleRemoveLessonGroup}
/>
)}
</div>
{lessonGroup.userFacing && (
<div>
<label>
Description
<textarea
value={this.props.lessonGroup.description}
rows={Math.max(
this.props.lessonGroup.description.split(/\r\n|\r|\n/)
.length + 1,
2
)}
style={styles.input}
onChange={this.handleChangeDescription}
/>
</label>
<label>
Big Questions
<textarea
value={this.props.lessonGroup.bigQuestions}
rows={Math.max(
this.props.lessonGroup.bigQuestions.split(/\r\n|\r|\n/)
.length + 1,
2
)}
style={styles.input}
onChange={this.handleChangeBigQuestions}
/>
</label>
</div>
)}
{lessonGroup.lessons.map(lesson => (
<LessonToken
ref={lessonToken => {
Expand Down Expand Up @@ -293,22 +348,8 @@ class LessonGroupCard extends Component {
type="button"
>
<i style={{marginRight: 7}} className="fa fa-plus-circle" />
Add Lesson
Lesson
</button>
{!this.props.lessonGroup.user_facing && (
<button
onMouseDown={this.handleMakeUserFacing.bind(
null,
lessonGroup.position
)}
className="btn"
style={styles.addButton}
type="button"
>
<i style={{marginRight: 7}} className="fa fa-plus-circle" />
Set Display Name
</button>
)}
</div>
</div>
);
Expand All @@ -325,8 +366,8 @@ export default connect(
removeLesson,
removeGroup,
addLesson,
convertGroupToUserFacing,
setLessonGroup,
reorderLesson
reorderLesson,
updateLessonGroupField
}
)(LessonGroupCard);
86 changes: 64 additions & 22 deletions apps/src/lib/levelbuilder/script-editor/UnitCard.jsx
Expand Up @@ -4,7 +4,11 @@ import {connect} from 'react-redux';
import color from '@cdo/apps/util/color';
import {borderRadius} from '@cdo/apps/lib/levelbuilder/constants';
import LessonGroupCard from '@cdo/apps/lib/levelbuilder/script-editor/LessonGroupCard';
import {addGroup} from '@cdo/apps/lib/levelbuilder/script-editor/scriptEditorRedux';
import {
addGroup,
convertGroupToUserFacing,
convertGroupToNonUserFacing
} from '@cdo/apps/lib/levelbuilder/script-editor/scriptEditorRedux';
import ReactDOM from 'react-dom';

const styles = {
Expand Down Expand Up @@ -32,7 +36,6 @@ const styles = {
margin: '0 10px 10px 10px'
},
addGroupWithWarning: {
margin: '0 0 30px 0',
display: 'flex',
alignItems: 'center'
},
Expand All @@ -49,7 +52,9 @@ class UnitCard extends Component {
static propTypes = {
// from redux
lessonGroups: PropTypes.array.isRequired,
addGroup: PropTypes.func.isRequired
addGroup: PropTypes.func.isRequired,
convertGroupToUserFacing: PropTypes.func.isRequired,
convertGroupToNonUserFacing: PropTypes.func.isRequired
};

constructor(props) {
Expand All @@ -74,9 +79,9 @@ class UnitCard extends Component {
serializeLessonGroups = lessonGroups => {
let s = [];
lessonGroups.forEach(lessonGroup => {
if (lessonGroup.user_facing && lessonGroup.lessons.length > 0) {
if (lessonGroup.userFacing && lessonGroup.lessons.length > 0) {
let t = `lesson_group '${lessonGroup.key}'`;
t += `, display_name: '${escape(lessonGroup.display_name)}'`;
t += `, display_name: '${escape(lessonGroup.displayName)}'`;
s.push(t);
}
lessonGroup.lessons.forEach(lesson => {
Expand Down Expand Up @@ -125,6 +130,24 @@ class UnitCard extends Component {
);
};

handleMakeUserFacing = () => {
const newLessonGroupKey = this.generateLessonGroupKey();
const newLessonGroupDisplayName = prompt(
'Enter a display name for first lesson group'
);
if (newLessonGroupKey && newLessonGroupDisplayName) {
this.props.convertGroupToUserFacing(
1,
newLessonGroupKey,
newLessonGroupDisplayName
);
}
};

handleMakeNonUserFacing = () => {
this.props.convertGroupToNonUserFacing(1);
};

render() {
const {lessonGroups} = this.props;

Expand All @@ -148,26 +171,43 @@ class UnitCard extends Component {
lessonGroupMetrics={this.lessonGroupMetrics}
setTargetLessonGroup={this.setTargetLessonGroup}
targetLessonGroupPos={this.state.targetLessonGroupPos}
generateLessonGroupKey={this.generateLessonGroupKey}
/>
))}
<div style={styles.addGroupWithWarning}>
<button
onMouseDown={this.handleAddLessonGroup}
className="btn"
style={styles.addGroup}
type="button"
disabled={!this.props.lessonGroups[0].user_facing}
>
<i style={{marginRight: 7}} className="fa fa-plus-circle" />
Add Lesson Group
</button>
{this.props.lessonGroups[0].userFacing && (
<button
onMouseDown={this.handleAddLessonGroup}
className="btn"
type="button"
style={styles.addGroup}
>
<i style={{marginRight: 7}} className="fa fa-plus-circle" />
Add Lesson Group
</button>
)}
{!this.props.lessonGroups[0].userFacing && (
<button
onMouseDown={this.handleMakeUserFacing}
className="btn"
style={styles.addGroup}
type="button"
>
Enable Lesson Groups
</button>
)}
{this.props.lessonGroups.length === 1 &&
this.props.lessonGroups[0].userFacing && (
<button
onMouseDown={this.handleMakeNonUserFacing}
className="btn"
style={styles.addGroup}
type="button"
>
Disable Lesson Groups
</button>
)}
</div>
{!this.props.lessonGroups[0].user_facing && (
<span style={styles.displayNameWarning}>
You must set the display name of the existing lesson group before
adding more.
</span>
)}
</div>
<input
type="hidden"
Expand All @@ -186,6 +226,8 @@ export default connect(
lessonGroups: state.lessonGroups
}),
{
addGroup
addGroup,
convertGroupToUserFacing,
convertGroupToNonUserFacing
}
)(UnitCard);