Commit f6592477 by Valera Rozuvan Committed by Alexander Kryklia

Client-side Drag and Drop: work in progress. Part 2.

parent 8d690497
...@@ -822,7 +822,7 @@ class DragAndDropInput(InputTypeBase): ...@@ -822,7 +822,7 @@ class DragAndDropInput(InputTypeBase):
try: try:
dic[attr_name] = Attribute(attr_name).parse_from_xml(x) dic[attr_name] = Attribute(attr_name).parse_from_xml(x)
except ValueError: except ValueError:
dic[attr_name] = None dic[attr_name] = ""
dic['name'] = dic['name'] or slugify(dic['label']) dic['name'] = dic['name'] or slugify(dic['label'])
dic['label'] = dic['label'] or dic['name'] dic['label'] = dic['label'] or dic['name']
......
<section id="inputtype_${id}" class="capa_inputtype" > <section id="inputtype_${id}" class="capa_inputtype" >
<div class="drag_and_drop_problem" id="drag_and_drop_div_${id}" <div class="drag_and_drop_problem_div" id="drag_and_drop_div_${id}"
data-plain-id="${id}" data-course-folder="${course_folder}"> data-plain-id="${id}" data-course-folder="${course_folder}">
</div> </div>
<div class="drag_and_drop_problem" id="drag_and_drop_json_${id}" <div class="drag_and_drop_problem_json" id="drag_and_drop_json_${id}"
style="display:none;">${drag_and_drop_json}</div> style="display:none;">${drag_and_drop_json}</div>
<div class="script_placeholder" data-src="/static/js/capa/drag_and_drop.js"></div> <div class="script_placeholder" data-src="/static/js/capa/drag_and_drop.js"></div>
......
...@@ -4,11 +4,66 @@ ...@@ -4,11 +4,66 @@
// See https://edx-wiki.atlassian.net/wiki/display/LMS/Integration+of+Require+JS+into+the+system // See https://edx-wiki.atlassian.net/wiki/display/LMS/Integration+of+Require+JS+into+the+system
(function (requirejs, require, define) { (function (requirejs, require, define) {
define([], function () { define(['logme'], function (logme) {
return configParser; return configParser;
function configParser(config, state) { function configParser(config, imageDir, state) {
state.config = 1; var returnStatus;
returnStatus = true;
state.config = {
'imageDir': '/static/' + imageDir + '/images/',
'draggable': [],
'target': ''
};
if ($.isArray(config.draggable) === true) {
(function (i) {
while (i < config.draggable.length) {
if (processDraggable(config.draggable[i]) !== true) {
returnStatus = false;
}
i += 1;
}
}(0));
} else if ($.isPlainObject(config.draggable) === true) {
if (processDraggable(config.draggable) !== true) {
returnStatus = false;
}
} else {
logme('ERROR: The type of config.draggable is no supported.');
returnStatus = false;
}
if (typeof config.target === 'string') {
state.config.target = config.target;
} else {
logme('ERROR: Property config.target is not of type "string".');
returnStatus = false;
}
return true;
function processDraggable(obj) {
if (typeof obj.icon !== 'string') {
logme('ERROR: Attribute "obj.icon" is not a string.');
return false;
} else if (typeof obj.label !== 'string') {
logme('ERROR: Attribute "obj.label" is not a string.');
return false;
} else if (typeof obj.name !== 'string') {
logme('ERROR: Attribute "obj.name" is not a string.');
return false;
}
state.config.draggable.push(obj);
true;
}
} }
}); });
......
// Wrapper for RequireJS. It will make the standard requirejs(), require(), and
// define() functions from Require JS available inside the anonymous function.
//
// See https://edx-wiki.atlassian.net/wiki/display/LMS/Integration+of+Require+JS+into+the+system
(function (requirejs, require, define) {
define(['logme'], function (logme) {
return Container;
function Container(state) {
}
});
// End of wrapper for RequireJS. As you can see, we are passing
// namespaced Require JS variables to an anonymous function. Within
// it, you can use the standard requirejs(), require(), and define()
// functions as if they were in the global namespace.
}(RequireJS.requirejs, RequireJS.require, RequireJS.define)); // End-of: (function (requirejs, require, define)
...@@ -12,6 +12,8 @@ define([], function () { ...@@ -12,6 +12,8 @@ define([], function () {
return logme; return logme;
function logme() { function logme() {
var i;
if ( if (
(debugMode !== true) || (debugMode !== true) ||
(typeof window.console === 'undefined') (typeof window.console === 'undefined')
...@@ -19,12 +21,11 @@ define([], function () { ...@@ -19,12 +21,11 @@ define([], function () {
return; return;
} }
(function (i) { i = 0;
while (i < arguments.length) { while (i < arguments.length) {
window.console.log(arguments[i]); window.console.log(arguments[i]);
i += 1; i += 1;
} }
}(0);
} }
}); });
......
...@@ -6,26 +6,33 @@ ...@@ -6,26 +6,33 @@
define( define(
['logme', 'state', 'config_parser', 'target', 'draggables'], ['logme', 'state', 'config_parser', 'target', 'draggables'],
function (logme, State, configParser, Target, raggables) { function (logme, State, configParser, Target, Draggables) {
return Main; return Main;
function Main() { function Main() {
$('.drag_and_drop_problem').each(processProblem); $('.drag_and_drop_problem_div').each(processProblem);
} }
// $(value) - get the element of the entire problem // $(value) - get the element of the entire problem
function processProblem(index, value) { function processProblem(index, value) {
var problemId, config, state; var problemId, imageDir, config, state;
problemId = $(value).attr('data-plain-id'); problemId = $(value).attr('data-plain-id');
if (typeof problemId !== 'string') { if (typeof problemId !== 'string') {
logme('ERROR: Could not find a problem DOM element ID.'); logme('ERROR: Could not find the ID of the problem DOM element.');
return;
}
imageDir = $(value).attr('data-plain-id');
if (typeof imageDir !== 'string') {
logme('ERROR: Could not find the name of the image directory.');
return; return;
} }
try { try {
config = JSON.parse($(value).html()); config = JSON.parse($('#drag_and_drop_json_' + problemId).html());
} catch (err) { } catch (err) {
logme('ERROR: Could not parse the JSON configuration options.'); logme('ERROR: Could not parse the JSON configuration options.');
logme('Error message: "' + err.message + '".'); logme('Error message: "' + err.message + '".');
...@@ -35,9 +42,13 @@ define( ...@@ -35,9 +42,13 @@ define(
state = State(problemId); state = State(problemId);
configParser(config, state); if (configParser(config, imageDir, state) !== true) {
logme('ERROR: Could not make sense of the JSON configuration options.');
return;
}
// Container(state); Container(state);
Target(state); Target(state);
// Scroller(state); // Scroller(state);
Draggables(state); Draggables(state);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment