- SOL-465: Initial implementation of certificates web view and signatories (names/titles) - SOL-718 Close button is working properly - SOL-801 Backbone Signatories Modeling - SOL-803 Underscore template: Editor (Add) - SOL-802 Signatories: Underscore template - Details - SOL-804 Signatories: Underscore template: Editor (Edit) - Add signatory delete Django view - SOL-805 Signatory editor (Delete) - Add Coffeescript router - SOL-716 Jasmine Tests - Added missing minified JS library - client side validation of signatory fields - SOL-390 signatories names - Remove obsolete extends Sass files - input maxlength limiting for signatory information - SOL-389: Course title override - SOL-466: Add capability to upload digitized signatures in Studio - ziafazal: fixed css for upload signature image - ziafazal: completed deletion of signature images - UX-1741: Add initial static rendering/styling for Open edX web certs * creating new global static dir * adding static version of edX UX pattern library assets * adding web certificates static assets * adding static (+abstracted) web certificates rendering * creating two tiers of rendering (base + distinguished) * providing sample assets for certificate rendering * supporting RTL layouts * adding certifcates assests to edX static asset pipeline * temporarily hiding the mozilla open badges share action * wiring print button to print view/page * fixup! addressing conflict artifact in valid cert template * fixup! adding missing %hd-subsection sass extend + components comment clean up * fixup! correcting pattern library .hd-4 font-weight value - SOL-468 Linked Student View for Web View Credential - SOL-467: Add capability to upload organization logos for certificates - SOL-391 / SOL-387: Signatory related info (assets) in certificates web view - kelketek: Fixes for static asset collection in certificate HTML view. - SOL-398 Web View: Public Access - mattdrayer: Post-merge branch stabilization - catong: Initial changes to Studio template and Help config file - ziafazal: Branch stabilizations - SOL-387: Display organization logo on LMS web view - talbs/mattdrayer: Branch Stabilizations - talbs: converting backpack action to use a button HTML element - talbs: revising placeholder assets + their rendering in cert view - mattdrayer: Username web view wireup - SOL-386 Certificate Mode Previews - SOL-905: Make organization logo and signatory signature uneditable - SOL-922: Improve test coverage - SOL-765: Add LinkedIn sharing - [marco] temporary styling adjustment to account for smaller linkedin share image / fake button - SOL-921: Address hardcoded template items - SOL-927: Deleting certificate should delete org logo image also * updated invalid template * removed hr * fix invalid certificate error - clrux: Add i18n to certificate templates and partials - mattdrayer: Pylint violations - SOL-920 Certificate Activation/Deactivation - mattdrayer: Added LMS support - SOL-932: Fix preview mode support in certificate view - SOL-934: Fixed bug reported and broken tests - SOL-935 removed the 'valid' word from web view title - talbs: RTL support updates/fixes * revising certificate type icon/name vertical alignment * removing unused older certificate template * revising styling for message/banner actions * abstracting accomplishment type to use course mode + adding in honor/verified-specific placeholders - mattdrayer: JSHint violations
186 lines
7.1 KiB
JavaScript
186 lines
7.1 KiB
JavaScript
// Backbone Application View: Certificate Editor
|
|
|
|
define([ // jshint ignore:line
|
|
'jquery',
|
|
'underscore',
|
|
'backbone',
|
|
'gettext',
|
|
'js/views/list_item_editor',
|
|
'js/certificates/models/signatory',
|
|
'js/certificates/views/signatory_editor',
|
|
'js/models/uploads',
|
|
'js/views/uploads'
|
|
],
|
|
function($, _, Backbone, gettext,
|
|
ListItemEditorView, SignatoryModel, SignatoryEditorView, FileUploadModel, FileUploadDialog) {
|
|
'use strict';
|
|
var MAX_SIGNATORIES_LIMIT = 4;
|
|
var CertificateEditorView = ListItemEditorView.extend({
|
|
tagName: 'div',
|
|
events: {
|
|
'change .collection-name-input': 'setName',
|
|
'change .certificate-description-input': 'setDescription',
|
|
'change .certificate-course-title-input': 'setCourseTitle',
|
|
'change .org-logo-input': 'setOrgLogoPath',
|
|
'focus .input-text': 'onFocus',
|
|
'blur .input-text': 'onBlur',
|
|
'submit': 'setAndClose',
|
|
'click .action-cancel': 'cancel',
|
|
'click .action-add-signatory': 'addSignatory',
|
|
'click .action-upload-org-logo': 'uploadLogoImage'
|
|
},
|
|
|
|
className: function () {
|
|
// Determine the CSS class names for this model instance
|
|
var index = this.model.collection.indexOf(this.model);
|
|
|
|
return [
|
|
'collection-edit',
|
|
'certificates',
|
|
'certificate-edit',
|
|
'certificate-edit-' + index
|
|
].join(' ');
|
|
},
|
|
|
|
initialize: function() {
|
|
// Set up the initial state of the attributes set for this model instance
|
|
_.bindAll(this, "onSignatoryRemoved", "clearErrorMessage");
|
|
this.eventAgg = _.extend({}, Backbone.Events);
|
|
this.eventAgg.bind("onSignatoryRemoved", this.onSignatoryRemoved);
|
|
this.eventAgg.bind("onSignatoryUpdated", this.clearErrorMessage);
|
|
ListItemEditorView.prototype.initialize.call(this);
|
|
this.template = this.loadTemplate('certificate-editor');
|
|
},
|
|
|
|
onSignatoryRemoved: function() {
|
|
// Event handler for model deletions
|
|
this.model.setOriginalAttributes();
|
|
this.render();
|
|
},
|
|
|
|
clearErrorMessage: function() {
|
|
// Hides away the error message displayed during field validations
|
|
this.$('.certificate-edit-error').remove();
|
|
},
|
|
|
|
render: function() {
|
|
// Assemble the editor view for this model
|
|
ListItemEditorView.prototype.render.call(this);
|
|
var self = this;
|
|
// Ensure we have at least one signatory associated with the certificate.
|
|
this.model.get("signatories").each(function( modelSignatory) {
|
|
var signatory_view = new SignatoryEditorView({
|
|
model: modelSignatory,
|
|
isEditingAllCollections: true,
|
|
eventAgg: self.eventAgg
|
|
});
|
|
self.$('div.signatory-edit-list').append($(signatory_view.render()));
|
|
});
|
|
this.disableAddSignatoryButton();
|
|
return this;
|
|
},
|
|
|
|
addSignatory: function() {
|
|
// Append a new signatory to the certificate model's signatories collection
|
|
var signatory = new SignatoryModel({certificate: this.getSaveableModel()}); // jshint ignore:line
|
|
this.render();
|
|
},
|
|
|
|
disableAddSignatoryButton: function() {
|
|
// Disable the 'Add Signatory' link if the constraint has been met.
|
|
if(this.$(".signatory-edit-list > div.signatory-edit").length >= MAX_SIGNATORIES_LIMIT) {
|
|
this.$(".action-add-signatory").addClass("disableClick");
|
|
}
|
|
},
|
|
|
|
getTemplateOptions: function() {
|
|
// Retrieves the current attributes/options for the model
|
|
return {
|
|
id: this.model.get('id'),
|
|
uniqueId: _.uniqueId(),
|
|
name: this.model.escape('name'),
|
|
description: this.model.escape('description'),
|
|
course_title: this.model.escape('course_title'),
|
|
org_logo_path: this.model.escape('org_logo_path'),
|
|
isNew: this.model.isNew()
|
|
};
|
|
},
|
|
|
|
getSaveableModel: function() {
|
|
// Returns the current model instance
|
|
return this.model;
|
|
},
|
|
|
|
setName: function(event) {
|
|
// Updates the indicated model field (still requires persistence on server)
|
|
if (event && event.preventDefault) { event.preventDefault(); }
|
|
this.model.set(
|
|
'name', this.$('.collection-name-input').val(),
|
|
{ silent: true }
|
|
);
|
|
},
|
|
|
|
setDescription: function(event) {
|
|
// Updates the indicated model field (still requires persistence on server)
|
|
if (event && event.preventDefault) { event.preventDefault(); }
|
|
this.model.set(
|
|
'description',
|
|
this.$('.certificate-description-input').val(),
|
|
{ silent: true }
|
|
);
|
|
},
|
|
|
|
setCourseTitle: function(event) {
|
|
// Updates the indicated model field (still requires persistence on server)
|
|
if (event && event.preventDefault) { event.preventDefault(); }
|
|
this.model.set(
|
|
'course_title',
|
|
this.$('.certificate-course-title-input').val(),
|
|
{ silent: true }
|
|
);
|
|
},
|
|
|
|
setOrgLogoPath: function(event) {
|
|
// Updates the indicated model field (still requires persistence on server)
|
|
if (event && event.preventDefault) { event.preventDefault(); }
|
|
var org_logo_path = this.$('.org-logo-input').val();
|
|
this.model.set(
|
|
'org_logo_path', org_logo_path,
|
|
{ silent: true }
|
|
);
|
|
this.$('.current-org-logo img.org-logo').attr('src', org_logo_path);
|
|
},
|
|
|
|
setValues: function() {
|
|
// Update the specified values in the local model instance
|
|
this.setName();
|
|
this.setDescription();
|
|
this.setCourseTitle();
|
|
this.setOrgLogoPath();
|
|
return this;
|
|
},
|
|
|
|
uploadLogoImage: function(event) {
|
|
event.preventDefault();
|
|
var upload = new FileUploadModel({
|
|
title: gettext("Upload organization logo."),
|
|
message: gettext("Maximum logo height should be 125px."),
|
|
mimeTypes: ['image/png', 'image/jpeg']
|
|
});
|
|
var self = this;
|
|
var modal = new FileUploadDialog({
|
|
model: upload,
|
|
onSuccess: function(response) {
|
|
var org_logo_path = response.asset.url;
|
|
self.model.set('org_logo_path', org_logo_path);
|
|
self.$('.current-org-logo img.org-logo').attr('src', org_logo_path);
|
|
self.$('.current-org-logo').show();
|
|
self.$('input.org-logo-input').attr('value', org_logo_path);
|
|
}
|
|
});
|
|
modal.show();
|
|
}
|
|
});
|
|
return CertificateEditorView;
|
|
});
|