From bc10d080df9dfc2669f3e5e1bd8c6c8e09cefb63 Mon Sep 17 00:00:00 2001 From: cahrens Date: Tue, 8 Jan 2013 13:39:16 -0500 Subject: [PATCH 1/4] Save work --- cms/static/js/speed-editor.js | 8 ++- cms/templates/widgets/problem-edit.html | 58 ++++++++++++++++++- .../xmodule/js/src/problem/edit.coffee | 26 +++++++++ 3 files changed, 89 insertions(+), 3 deletions(-) diff --git a/cms/static/js/speed-editor.js b/cms/static/js/speed-editor.js index 9ff7c0248e..eec4341b6a 100644 --- a/cms/static/js/speed-editor.js +++ b/cms/static/js/speed-editor.js @@ -13,7 +13,9 @@ var commandDown; (function() { $body.on('click', '.editor-bar a', onEditorButton); $body.on('click', '.cheatsheet-toggle', toggleCheatsheet); +// NOTE: we are showing metadata in the standard way, not in an "Advanced" section below. $body.on('click', '.problem-settings-button', toggleProblemSettings); +// NOTE: not doing keybindings at this time. $(document).bind('keyup', onKeyboard); })(); @@ -21,7 +23,7 @@ function initProblemEditors($editor, $prev) { $currentEditor = $editor; simpleEditor = CodeMirror.fromTextArea($editor.find('.edit-box')[0], { lineWrapping: true, -// TODO: I left out the extra keys for now. +// NOTE: keybindings have been left out at this point. Needs further work. extraKeys: { 'Ctrl-N': newUnit, 'Ctrl-H': makeHeader, @@ -44,13 +46,15 @@ function initProblemEditors($editor, $prev) { currentEditor = simpleEditor; +// NOTE: I left out setting the background color. Does not appear necessary. $(simpleEditor.getWrapperElement()).css('background', '#fff'); $(xmlEditor.getWrapperElement()).css({ 'background': '#fff' }).hide(); -// TODO: is this necessary?? +// NOTE: I left this out, doesn't seem to be necessary. $(simpleEditor.getWrapperElement()).bind('click', setFocus); +// NOTE: we are not supporting preview at this time. $preview = $prev.find('.problem'); } diff --git a/cms/templates/widgets/problem-edit.html b/cms/templates/widgets/problem-edit.html index f6baae4d2d..7e7db57bfc 100644 --- a/cms/templates/widgets/problem-edit.html +++ b/cms/templates/widgets/problem-edit.html @@ -25,4 +25,60 @@ %endif - + + + diff --git a/common/lib/xmodule/xmodule/js/src/problem/edit.coffee b/common/lib/xmodule/xmodule/js/src/problem/edit.coffee index a52ebaebbd..486d080a1e 100644 --- a/common/lib/xmodule/xmodule/js/src/problem/edit.coffee +++ b/common/lib/xmodule/xmodule/js/src/problem/edit.coffee @@ -8,6 +8,7 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor constructor: (element) -> $body.on('click', '.editor-tabs .tab', @changeEditor) $body.on('click', '.editor-bar a', @onToolbarButton); + $body.on('click', '.cheatsheet-toggle', @toggleCheatsheet); @xml_editor = CodeMirror.fromTextArea($(".xml-box", element)[0], { mode: "xml" @@ -51,6 +52,15 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor @markdown_editor.replaceSelection(revisedSelection) @markdown_editor.focus() + toggleCheatsheet: (e) => + e.preventDefault(); + +# TODO: don't base off of current_editor + if !$(@current_editor.getWrapperElement()).find('.simple-editor-cheatsheet')[0] + @cheatsheet = $($('#simple-editor-cheatsheet').html()) + $(@current_editor.getWrapperElement()).append(@cheatsheet) + + setTimeout (=> @cheatsheet.toggleClass('shown')), 10 setCurrentEditor: (editor) -> $(@current_editor.getWrapperElement()).hide() @@ -61,6 +71,7 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor save: -> $body.off('click', '.editor-tabs .tab', @changeEditor) $body.off('click', '.editor-bar a', @onToolbarButton); + $body.off('click', '.cheatsheet-toggle', @toggleCheatsheet); data: @xml_editor.getValue() @insertMultipleChoice: (selectedText) -> @@ -111,6 +122,21 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor else return template +# We may wish to add insertHeader and insertVideo. Here is Tom's code. +# function makeHeader() { +# var selection = simpleEditor.getSelection(); +# var revisedSelection = selection + '\n'; +# for(var i = 0; i < selection.length; i++) { +#revisedSelection += '='; +# } +# simpleEditor.replaceSelection(revisedSelection); +#} +# +#function makeVideo() { +#var selection = simpleEditor.getSelection(); +#simpleEditor.replaceSelection('{{video ' + selection + '}}'); +#} +# @markdownToXml: (markdown)-> toXml = `function(markdown) { var xml = markdown; From 94696786c02f8070b58d2ef4cdb473d916bfc574 Mon Sep 17 00:00:00 2001 From: cahrens Date: Tue, 8 Jan 2013 14:57:15 -0500 Subject: [PATCH 2/4] Merge in Don's change. --- .../lib/xmodule/xmodule/js/src/problem/edit.coffee | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/common/lib/xmodule/xmodule/js/src/problem/edit.coffee b/common/lib/xmodule/xmodule/js/src/problem/edit.coffee index 486d080a1e..465bd33f86 100644 --- a/common/lib/xmodule/xmodule/js/src/problem/edit.coffee +++ b/common/lib/xmodule/xmodule/js/src/problem/edit.coffee @@ -70,9 +70,17 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor save: -> $body.off('click', '.editor-tabs .tab', @changeEditor) - $body.off('click', '.editor-bar a', @onToolbarButton); - $body.off('click', '.cheatsheet-toggle', @toggleCheatsheet); - data: @xml_editor.getValue() + $body.off('click', '.editor-bar a', @onToolbarButton) + $body.off('click', '.cheatsheet-toggle', @toggleCheatsheet) + # TODO when logic is in place to remove the markdown if xml is edited, ensure this doesn't overwrite that + if @current_editor == @markdown_editor + { + data: MarkdownEditingDescriptor.markdownToXml(@markdown_editor.getValue()) + metadata: + markdown: @markdown_editor.getValue() + } + else + data: @xml_editor.getValue() @insertMultipleChoice: (selectedText) -> return MarkdownEditingDescriptor.insertGenericChoice(selectedText, '(', ')', MarkdownEditingDescriptor.multipleChoiceTemplate) From 4ac15daf44d15d23657c459b21709555538b8332 Mon Sep 17 00:00:00 2001 From: cahrens Date: Tue, 8 Jan 2013 15:04:48 -0500 Subject: [PATCH 3/4] Fix formatting. --- cms/templates/widgets/problem-edit.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cms/templates/widgets/problem-edit.html b/cms/templates/widgets/problem-edit.html index eb4804216e..a6ef824ce6 100644 --- a/cms/templates/widgets/problem-edit.html +++ b/cms/templates/widgets/problem-edit.html @@ -36,9 +36,9 @@
-
( ) red
-                ( ) green
-                (x) blue
+
( ) red
+( ) green
+(x) blue
@@ -47,9 +47,9 @@
-
[ ] earth
-                [ ] wind
-                [x] water
+
[x] earth
+[ ] wind
+[x] water
From c7feee5b67b62093e2525d3c63df38a8b507a3fa Mon Sep 17 00:00:00 2001 From: cahrens Date: Tue, 8 Jan 2013 15:39:45 -0500 Subject: [PATCH 4/4] Delete speed-editor.js and cruft from unit.html. --- cms/static/js/speed-editor.js | 438 ---------------------------------- cms/templates/unit.html | 94 -------- 2 files changed, 532 deletions(-) delete mode 100644 cms/static/js/speed-editor.js diff --git a/cms/static/js/speed-editor.js b/cms/static/js/speed-editor.js deleted file mode 100644 index eec4341b6a..0000000000 --- a/cms/static/js/speed-editor.js +++ /dev/null @@ -1,438 +0,0 @@ -var $body; -var $preview; -var $tooltip; -var $cheatsheet; -var $currentEditor; -var simpleEditor; -var xmlEditor; -var currentEditor; -var controlDown; -var commandDown; - - -(function() { - $body.on('click', '.editor-bar a', onEditorButton); - $body.on('click', '.cheatsheet-toggle', toggleCheatsheet); -// NOTE: we are showing metadata in the standard way, not in an "Advanced" section below. - $body.on('click', '.problem-settings-button', toggleProblemSettings); -// NOTE: not doing keybindings at this time. - $(document).bind('keyup', onKeyboard); -})(); - -function initProblemEditors($editor, $prev) { - $currentEditor = $editor; - simpleEditor = CodeMirror.fromTextArea($editor.find('.edit-box')[0], { - lineWrapping: true, -// NOTE: keybindings have been left out at this point. Needs further work. - extraKeys: { - 'Ctrl-N': newUnit, - 'Ctrl-H': makeHeader, - 'Ctrl-V': makeVideo, - 'Ctrl-M': makeMultipleChoice, - 'Ctrl-C': makeCheckboxes, - 'Ctrl-S': makeStringInput, - 'Shift-Ctrl-3': makeNumberInput, - 'Shift-Ctrl-S': makeSelect - }, - mode: null, - onChange: onSimpleEditorUpdate - }); - - xmlEditor = CodeMirror.fromTextArea($editor.find('.xml-box')[0], { - lineWrapping: true, - mode: 'xml', - lineNumbers: true - }); - - currentEditor = simpleEditor; - -// NOTE: I left out setting the background color. Does not appear necessary. - $(simpleEditor.getWrapperElement()).css('background', '#fff'); - $(xmlEditor.getWrapperElement()).css({ - 'background': '#fff' - }).hide(); - -// NOTE: I left this out, doesn't seem to be necessary. - $(simpleEditor.getWrapperElement()).bind('click', setFocus); -// NOTE: we are not supporting preview at this time. - $preview = $prev.find('.problem'); -} - -function toggleProblemSettings(e) { - e.preventDefault(); - - $(this).toggleClass('is-open'); - - if($(this).hasClass('is-open')) { - $(this).find('.button-label').html('Hide Advanced Settings'); - $('.problem-settings').slideDown(150); - } else { - $(this).find('.button-label').html('Show Advanced Settings'); - $('.problem-settings').slideUp(150); - } -} - -function toggleCheatsheet(e) { - e.preventDefault(); - - if(!$currentEditor.find('.simple-editor-cheatsheet')[0]) { - $cheatsheet = $($('#simple-editor-cheatsheet').html()); - $currentEditor.append($cheatsheet); - } - - setTimeout(function() { - $cheatsheet.toggleClass('shown'); - }, 10); -} - -function setFocus(e) { - $(simpleEditor).focus(); -} - -function onSimpleEditorUpdate() { - console.log('update'); - updatePreview(); - updateXML(); -} - -function updateXML() { - var val = simpleEditor.getValue(); - var xml = val; - - // replace headers - xml = xml.replace(/(^.*?$)(?=\n\=\=+$)/gm, '

$1

'); - xml = xml.replace(/\n^\=\=+$/gm, ''); - - // group multiple choice answers - xml = xml.replace(/(^\s*\(.?\).*?$\n*)+/gm, function(match, p) { - var groupString = '\n'; - groupString += ' \n'; - var options = match.split('\n'); - for(var i = 0; i < options.length; i++) { - if(options[i].length > 0) { - var value = options[i].split(/^\s*\(.?\)\s*/)[1]; - var correct = /^\s*\(x\)/i.test(options[i]); - groupString += ' ' + value + '\n'; - } - } - groupString += ' \n'; - groupString += '\n\n'; - return groupString; - }); - - // group check answers - xml = xml.replace(/(^\s*\[.?\].*?$\n*)+/gm, function(match, p) { - var groupString = '\n'; - groupString += ' \n'; - var options = match.split('\n'); - for(var i = 0; i < options.length; i++) { - if(options[i].length > 0) { - var value = options[i].split(/^\s*\[.?\]\s*/)[1]; - var correct = /^\s*\[x\]/i.test(options[i]); - groupString += ' ' + value + '\n'; - } - } - groupString += ' \n'; - groupString += '\n\n'; - return groupString; - }); - - // replace videos - xml = xml.replace(/\{\{video\s(.*?)\}\}/g, '