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; });