refactor: move xmodule folder to root
- Moving xmodule folder to root as we're dissolving sub-projects of common folder in edx-platform
- More info: https://openedx.atlassian.net/browse/BOM-2579
- -e common/lib/xmodule has been removed from the requirements as xmodule has itself become the part of edx-platform and not being installed through requirements
- The test files common/lib/xmodule/test_files/ have been removed as they are not being used anymore
This commit is contained in:
176
xmodule/js/src/conditional/display.js
Normal file
176
xmodule/js/src/conditional/display.js
Normal file
@@ -0,0 +1,176 @@
|
||||
// Once generated by CoffeeScript 1.9.3, but now lives as pure JS
|
||||
/* eslint-disable */
|
||||
(function() {
|
||||
this.Conditional = (function() {
|
||||
function Conditional(element, runtime, callerElId) {
|
||||
var dependencies;
|
||||
this.el = $(element).find('.conditional-wrapper');
|
||||
this.callerElId = callerElId;
|
||||
if (callerElId !== void 0) {
|
||||
dependencies = this.el.data('depends');
|
||||
if ((typeof dependencies === 'string') && (dependencies.length > 0) && (dependencies.indexOf(callerElId) === -1)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
this.url = this.el.data('url');
|
||||
if (this.url) {
|
||||
this.render(element);
|
||||
}
|
||||
}
|
||||
|
||||
Conditional.prototype.render = function(element) {
|
||||
return $.postWithPrefix(this.url + "/conditional_get", (function(_this) {
|
||||
return function(response) {
|
||||
var i, len, parentEl, parentId, ref, renderedFragments=[];
|
||||
_this.el.html('');
|
||||
fragments = response.fragments;
|
||||
for (i = 0, len = fragments.length; i < len; i++) {
|
||||
renderedFragments.push(_this.renderXBlockFragment(fragments[i]));
|
||||
console.log("Started fragment loading", fragments[i])
|
||||
}
|
||||
parentEl = $(element).parent();
|
||||
parentId = parentEl.attr('id');
|
||||
if (response.message === false) {
|
||||
if (parentEl.hasClass('vert')) {
|
||||
parentEl.hide();
|
||||
} else {
|
||||
$(element).hide();
|
||||
}
|
||||
} else {
|
||||
if (parentEl.hasClass('vert')) {
|
||||
parentEl.show();
|
||||
} else {
|
||||
$(element).show();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
The children are rendered with a new request, so they have a different request-token.
|
||||
Use that token instead of @requestToken by simply not passing a token into initializeBlocks.
|
||||
*/
|
||||
$.when.apply(null, renderedFragments).done(function() {
|
||||
console.log("All fragments loaded, initializing blocks");
|
||||
XBlock.initializeBlocks(_this.el);
|
||||
});
|
||||
};
|
||||
})(this));
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Renders an xblock fragment into the specified element. The fragment has two attributes:
|
||||
* html: the HTML to be rendered
|
||||
* resources: any JavaScript or CSS resources that the HTML depends upon
|
||||
* Note that the XBlock is rendered asynchronously, and so a promise is returned that
|
||||
* represents this process.
|
||||
* @param fragment The fragment returned from the xblock_handler
|
||||
* @returns {Promise} A promise representing the rendering process
|
||||
*/
|
||||
Conditional.prototype.renderXBlockFragment = function(fragment) {
|
||||
var html = fragment.content,
|
||||
resources = fragment.resources || [],
|
||||
element = this.el;
|
||||
// Render the HTML first as the scripts might depend upon it, and then
|
||||
// asynchronously add the resources to the page. Any errors that are thrown
|
||||
// by included scripts are logged to the console but are then ignored assuming
|
||||
// that at least the rendered HTML will be in place.
|
||||
try {
|
||||
return this.addXBlockFragmentResources(resources).done(function () {
|
||||
// We give XBlock fragments free-reign to add javascript and CSS to
|
||||
// to the page, so XSS escaping doesn't matter much in this context
|
||||
console.log("Fragment resources loaded, appending HTML");
|
||||
// xss-lint: disable=javascript-jquery-append
|
||||
element.append(html);
|
||||
});
|
||||
} catch (e) {
|
||||
console.error(e, e.stack);
|
||||
return $.Deferred().resolve();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Dynamically loads all of an XBlock's dependent resources. This is an asynchronous
|
||||
* process so a promise is returned.
|
||||
* @param resources The resources to be rendered
|
||||
* @returns {Promise} A promise representing the rendering process
|
||||
*/
|
||||
Conditional.prototype.addXBlockFragmentResources = function(resources) {
|
||||
var self = this;
|
||||
var applyResource;
|
||||
var numResources;
|
||||
var deferred;
|
||||
var numResources = resources.length;
|
||||
var deferred = $.Deferred();
|
||||
|
||||
applyResource = function (index) {
|
||||
var hash, resource, value, promise;
|
||||
if (index >= numResources) {
|
||||
deferred.resolve();
|
||||
return;
|
||||
}
|
||||
resource = resources[index];
|
||||
window.loadedXBlockResources = window.loadedXBlockResources || [];
|
||||
if (_.indexOf(loadedXBlockResources, resource) < 0) {
|
||||
promise = self.loadResource(resource);
|
||||
loadedXBlockResources.push(resource);
|
||||
promise.done(function () {
|
||||
applyResource(index + 1);
|
||||
}).fail(function () {
|
||||
deferred.reject();
|
||||
});
|
||||
} else {
|
||||
applyResource(index + 1);
|
||||
}
|
||||
};
|
||||
applyResource(0);
|
||||
return deferred.promise();
|
||||
};
|
||||
|
||||
/**
|
||||
* Loads the specified resource into the page.
|
||||
* @param resource The resource to be loaded.
|
||||
* @returns {Promise} A promise representing the loading of the resource.
|
||||
*/
|
||||
Conditional.prototype.loadResource = function(resource) {
|
||||
// We give XBlock fragments free-reign to add javascript and CSS to
|
||||
// to the page, so XSS escaping doesn't matter much in this context
|
||||
var $head = $('head'),
|
||||
mimetype = resource.mimetype,
|
||||
kind = resource.kind,
|
||||
placement = resource.placement,
|
||||
data = resource.data;
|
||||
var loaded;
|
||||
if (mimetype === 'text/css') {
|
||||
if (kind === 'text') {
|
||||
// xss-lint: disable=javascript-jquery-append,javascript-concat-html
|
||||
$head.append("<style type='text/css'>" + data + '</style>');
|
||||
} else if (kind === 'url') {
|
||||
// xss-lint: disable=javascript-jquery-append,javascript-concat-html
|
||||
$head.append("<link rel='stylesheet' href='" + data + "' type='text/css'>");
|
||||
}
|
||||
} else if (mimetype === 'application/javascript') {
|
||||
if (kind === 'text') {
|
||||
// xss-lint: disable=javascript-jquery-append,javascript-concat-html
|
||||
$head.append('<script>' + data + '</script>');
|
||||
} else if (kind === 'url') {
|
||||
loaded = $.Deferred();
|
||||
$script(data, data, function() {
|
||||
loaded.resolve()
|
||||
});
|
||||
return loaded.promise();
|
||||
}
|
||||
} else if (mimetype === 'text/html') {
|
||||
if (placement === 'head') {
|
||||
// xss-lint: disable=javascript-jquery-append
|
||||
$head.append(data);
|
||||
}
|
||||
}
|
||||
// Return an already resolved promise for synchronous updates
|
||||
return $.Deferred().resolve().promise();
|
||||
};
|
||||
|
||||
return Conditional;
|
||||
|
||||
})();
|
||||
|
||||
}).call(this);
|
||||
Reference in New Issue
Block a user