Files
edx-platform/cms/static/js/views/license.js
2020-08-19 13:59:36 +05:00

149 lines
6.0 KiB
JavaScript

define([
'js/views/baseview',
'underscore',
'text!templates/license-selector.underscore'
], function(BaseView, _, licenseSelectorTemplate) {
var defaultLicenseInfo = {
'all-rights-reserved': {
name: gettext('All Rights Reserved'),
tooltip: gettext('You reserve all rights for your work')
},
'creative-commons': {
name: gettext('Creative Commons'),
tooltip: gettext('You waive some rights for your work, such that others can use it too'),
url: 'https://creativecommons.org/about',
options: {
ver: {
name: gettext('Version'),
type: 'string',
default: '4.0'
},
BY: {
name: gettext('Attribution'),
type: 'boolean',
default: true,
help: gettext('Allow others to copy, distribute, display and perform your copyrighted work but only if they give credit the way you request. Currently, this option is required.'),
disabled: true
},
NC: {
name: gettext('Noncommercial'),
type: 'boolean',
default: true,
help: gettext('Allow others to copy, distribute, display and perform your work - and derivative works based upon it - but for noncommercial purposes only.')
},
ND: {
name: gettext('No Derivatives'),
type: 'boolean',
default: true,
help: gettext('Allow others to copy, distribute, display and perform only verbatim copies of your work, not derivative works based upon it. This option is incompatible with "Share Alike".'),
conflictsWith: ['SA']
},
SA: {
name: gettext('Share Alike'),
type: 'boolean',
default: false,
help: gettext('Allow others to distribute derivative works only under a license identical to the license that governs your work. This option is incompatible with "No Derivatives".'),
conflictsWith: ['ND']
}
},
option_order: ['BY', 'NC', 'ND', 'SA']
}
};
var LicenseView = BaseView.extend({
events: {
'click ul.license-types li button': 'onLicenseClick',
'click ul.license-options li': 'onOptionClick'
},
initialize: function(options) {
this.licenseInfo = options.licenseInfo || defaultLicenseInfo;
this.showPreview = !!options.showPreview; // coerce to boolean
// Rerender when the model changes
this.listenTo(this.model, 'change', this.render);
this.render();
},
getDefaultOptionsForLicenseType: function(licenseType) {
if (!this.licenseInfo[licenseType]) {
// custom license type, no options
return {};
}
if (!this.licenseInfo[licenseType].options) {
// defined license type without options
return {};
}
var defaults = {};
_.each(this.licenseInfo[licenseType].options, function(value, key) {
defaults[key] = value.default;
});
return defaults;
},
render: function() {
edx.HtmlUtils.setHtml(this.$el, edx.HtmlUtils.template(licenseSelectorTemplate)({
model: this.model.attributes,
licenseString: this.model.toString() || '',
licenseInfo: this.licenseInfo,
showPreview: this.showPreview,
previewButton: false
}));
return this;
},
onLicenseClick: function(e) {
var $li = $(e.srcElement || e.target).closest('li');
var licenseType = $li.data('license');
// Check that we've selected a different license type than what's currently selected
if (licenseType != this.model.attributes.type) {
this.model.set({
type: licenseType,
options: this.getDefaultOptionsForLicenseType(licenseType)
});
// Fire the change event manually
this.model.trigger('change change:type');
}
e.preventDefault();
},
onOptionClick: function(e) {
var licenseType = this.model.get('type'),
licenseOptions = $.extend({}, this.model.get('options')),
$li = $(e.srcElement || e.target).closest('li');
var optionKey = $li.data('option');
var licenseInfo = this.licenseInfo[licenseType];
var optionInfo = licenseInfo.options[optionKey];
if (optionInfo.disabled) {
// we're done here
return;
}
var currentOptionValue = licenseOptions[optionKey];
if (optionInfo.type === 'boolean') {
// toggle current value
currentOptionValue = !currentOptionValue;
licenseOptions[optionKey] = currentOptionValue;
}
// check for conflicts
if (currentOptionValue && optionInfo.conflictsWith) {
var conflicts = optionInfo.conflictsWith;
for (var i = 0; i < conflicts.length; i++) {
// Uncheck all conflicts
licenseOptions[conflicts[i]] = false;
console.log(licenseOptions);
}
}
this.model.set({options: licenseOptions});
// Backbone has trouble identifying when objects change, so we'll
// fire the change event manually.
this.model.trigger('change change:options');
e.preventDefault();
}
});
return LicenseView;
});