Fixes after rebase to Django 1.8
This commit is contained in:
committed by
muzaffaryousaf
parent
3792943960
commit
8bdc097293
12
lms/static/js/bookmarks/bookmarks_factory.js
Normal file
12
lms/static/js/bookmarks/bookmarks_factory.js
Normal file
@@ -0,0 +1,12 @@
|
||||
;(function (define) {
|
||||
'use strict';
|
||||
define([
|
||||
'js/bookmarks/views/bookmarks_list_button'
|
||||
],
|
||||
function(BookmarksListButton) {
|
||||
return function() {
|
||||
return new BookmarksListButton();
|
||||
};
|
||||
}
|
||||
);
|
||||
}).call(this, define || RequireJS.define);
|
||||
@@ -8,8 +8,13 @@
|
||||
PagingCollection.prototype.initialize.call(this);
|
||||
|
||||
this.url = options.url;
|
||||
this.server_api.course_id = function () { return encodeURIComponent(options.course_id); };
|
||||
this.server_api.fields = function () { return encodeURIComponent('display_name,path'); };
|
||||
this.server_api = _.extend(
|
||||
{
|
||||
course_id: function () { return encodeURIComponent(options.course_id); },
|
||||
fields : function () { return encodeURIComponent('display_name,path'); }
|
||||
},
|
||||
PagingCollection.prototype.server_api
|
||||
);
|
||||
delete this.server_api.sort_order; // Sort order is not specified for the Bookmark API
|
||||
},
|
||||
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
RequireJS.require([
|
||||
'js/bookmarks/views/bookmarks_list_button'
|
||||
], function (BookmarksListButton) {
|
||||
'use strict';
|
||||
|
||||
return new BookmarksListButton();
|
||||
});
|
||||
@@ -1,7 +1,7 @@
|
||||
;(function (define, undefined) {
|
||||
'use strict';
|
||||
define(['gettext', 'jquery', 'underscore', 'backbone', 'js/views/message'],
|
||||
function (gettext, $, _, Backbone, MessageView) {
|
||||
define(['gettext', 'jquery', 'underscore', 'backbone', 'js/views/message_banner'],
|
||||
function (gettext, $, _, Backbone, MessageBannerView) {
|
||||
|
||||
return Backbone.View.extend({
|
||||
|
||||
@@ -81,9 +81,8 @@
|
||||
|
||||
showError: function() {
|
||||
if (!this.messageView) {
|
||||
this.messageView = new MessageView({
|
||||
el: $('.coursewide-message-banner'),
|
||||
templateId: '#message_banner-tpl'
|
||||
this.messageView = new MessageBannerView({
|
||||
el: $('.message-banner')
|
||||
});
|
||||
}
|
||||
this.messageView.showMessage(this.errorMessage, this.errorIcon);
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
;(function (define, undefined) {
|
||||
'use strict';
|
||||
define(['gettext', 'jquery', 'underscore', 'backbone', 'logger', 'moment',
|
||||
'common/js/components/views/paging_header', 'common/js/components/views/paging_footer'],
|
||||
function (gettext, $, _, Backbone, Logger, _moment, PagingHeaderView, PagingFooterView) {
|
||||
'common/js/components/views/paging_header', 'common/js/components/views/paging_footer',
|
||||
'text!templates/bookmarks/bookmarks-list.underscore'
|
||||
],
|
||||
function (gettext, $, _, Backbone, Logger, _moment,
|
||||
PagingHeaderView, PagingFooterView, BookmarksListTemplate) {
|
||||
|
||||
var moment = _moment || window.moment;
|
||||
|
||||
@@ -24,7 +27,7 @@
|
||||
},
|
||||
|
||||
initialize: function (options) {
|
||||
this.template = _.template($('#bookmarks-list-tpl').text());
|
||||
this.template = _.template(BookmarksListTemplate);
|
||||
this.loadingMessageView = options.loadingMessageView;
|
||||
this.errorMessageView = options.errorMessageView;
|
||||
this.langCode = $(this.el).data('langCode');
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
;(function (define, undefined) {
|
||||
'use strict';
|
||||
define(['gettext', 'jquery', 'underscore', 'backbone', 'js/bookmarks/views/bookmarks_list',
|
||||
'js/bookmarks/collections/bookmarks', 'js/views/message'],
|
||||
function (gettext, $, _, Backbone, BookmarksListView, BookmarksCollection, MessageView) {
|
||||
'js/bookmarks/collections/bookmarks', 'js/views/message_banner'],
|
||||
function (gettext, $, _, Backbone, BookmarksListView, BookmarksCollection, MessageBannerView) {
|
||||
|
||||
return Backbone.View.extend({
|
||||
|
||||
@@ -26,8 +26,8 @@
|
||||
this.bookmarksListView = new BookmarksListView(
|
||||
{
|
||||
collection: bookmarksCollection,
|
||||
loadingMessageView: new MessageView({el: $(this.loadingMessageElement)}),
|
||||
errorMessageView: new MessageView({el: $(this.errorMessageElement)})
|
||||
loadingMessageView: new MessageBannerView({el: $(this.loadingMessageElement)}),
|
||||
errorMessageView: new MessageBannerView({el: $(this.errorMessageElement)})
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
<div class="coursewide-message-banner" aria-live="polite"></div>
|
||||
<div class="message-banner" aria-live="polite"></div>
|
||||
|
||||
<div class="xblock xblock-student_view xblock-student_view-vertical xblock-initialized">
|
||||
<div class="bookmark-button-wrapper">
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
RequireJS.require([
|
||||
'jquery',
|
||||
'backbone',
|
||||
'js/search/course/search_app',
|
||||
'js/search/base/routers/search_router',
|
||||
'js/search/course/views/search_form',
|
||||
'js/search/base/collections/search_collection',
|
||||
'js/search/course/views/search_results_view'
|
||||
], function ($, Backbone, SearchApp, SearchRouter, CourseSearchForm, SearchCollection, CourseSearchResultsView) {
|
||||
'use strict';
|
||||
|
||||
var courseId = $('.courseware-results').data('courseId');
|
||||
var app = new SearchApp(
|
||||
courseId,
|
||||
SearchRouter,
|
||||
CourseSearchForm,
|
||||
SearchCollection,
|
||||
CourseSearchResultsView
|
||||
);
|
||||
Backbone.history.start();
|
||||
|
||||
});
|
||||
@@ -68,7 +68,8 @@ define(['backbone', 'jquery', 'underscore', 'common/js/spec_helpers/ajax_helpers
|
||||
};
|
||||
var requests = AjaxHelpers.requests(this);
|
||||
|
||||
_.each([[addBookmarkedData, removeBookmarkData], [removeBookmarkData, addBookmarkedData]], function(actionsData) {
|
||||
var bookmarkedData = [[addBookmarkedData, removeBookmarkData], [removeBookmarkData, addBookmarkedData]];
|
||||
_.each(bookmarkedData, function(actionsData) {
|
||||
var firstActionData = actionsData[0];
|
||||
var secondActionData = actionsData[1];
|
||||
|
||||
@@ -110,13 +111,14 @@ define(['backbone', 'jquery', 'underscore', 'common/js/spec_helpers/ajax_helpers
|
||||
expect(secondActionData.event).toHaveBeenTriggeredOn(bookmarkButtonView.$el);
|
||||
|
||||
verifyBookmarkButtonState(bookmarkButtonView, firstActionData.bookmarked);
|
||||
bookmarkButtonView.undelegateEvents();
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
it("shows an error message for HTTP 500", function () {
|
||||
var requests = AjaxHelpers.requests(this),
|
||||
$messageBanner = $('.coursewide-message-banner'),
|
||||
$messageBanner = $('.message-banner'),
|
||||
bookmarkButtonView = createBookmarkButtonView(false);
|
||||
bookmarkButtonView.$el.click();
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ define(['backbone',
|
||||
loadFixtures('js/fixtures/bookmarks/bookmarks.html');
|
||||
TemplateHelpers.installTemplates(
|
||||
[
|
||||
'templates/message_view',
|
||||
'templates/fields/message_banner',
|
||||
'templates/bookmarks/bookmarks-list'
|
||||
]
|
||||
);
|
||||
|
||||
@@ -66,8 +66,6 @@
|
||||
'_split': 'js/split',
|
||||
'mathjax_delay_renderer': 'coffee/src/mathjax_delay_renderer',
|
||||
'MathJaxProcessor': 'coffee/src/customwmd',
|
||||
'moment': 'xmodule_js/common_static/js/src/moment',
|
||||
'moment': 'xmodule_js/common_static/js/vendor/moment-with-locales.min',
|
||||
|
||||
// Manually specify LMS files that are not converted to RequireJS
|
||||
'history': 'js/vendor/history',
|
||||
@@ -75,7 +73,6 @@
|
||||
'js/vendor/jquery.qubit': 'js/vendor/jquery.qubit',
|
||||
'js/utils/navigation': 'js/utils/navigation',
|
||||
|
||||
|
||||
// Backbone classes loaded explicitly until they are converted to use RequireJS
|
||||
'js/models/notification': 'js/models/notification',
|
||||
'js/views/file_uploader': 'js/views/file_uploader',
|
||||
@@ -94,7 +91,7 @@
|
||||
'js/bookmarks/views/bookmarks_list_button': 'js/bookmarks/views/bookmarks_list_button',
|
||||
'js/bookmarks/views/bookmarks_list': 'js/bookmarks/views/bookmarks_list',
|
||||
'js/bookmarks/views/bookmark_button': 'js/bookmarks/views/bookmark_button',
|
||||
'js/views/message': 'js/views/message',
|
||||
'js/views/message_banner': 'js/views/message_banner',
|
||||
|
||||
// edxnotes
|
||||
'annotator_1.2.9': 'xmodule_js/common_static/js/vendor/edxnotes/annotator-full.min',
|
||||
@@ -744,11 +741,9 @@
|
||||
'lms/include/teams/js/spec/views/topics_spec.js',
|
||||
'lms/include/teams/js/spec/views/team_profile_header_actions_spec.js',
|
||||
'lms/include/js/spec/financial-assistance/financial_assistance_form_view_spec.js',
|
||||
'lms/include/teams/js/spec/views/team_join_spec.js'
|
||||
'lms/include/js/spec/discovery/discovery_spec.js',
|
||||
'lms/include/js/spec/ccx/schedule_spec.js',
|
||||
'lms/include/js/spec/bookmarks/bookmarks_list_view_spec.js',
|
||||
'lms/include/js/spec/bookmarks/bookmark_button_view_spec.js'
|
||||
'lms/include/js/spec/bookmarks/bookmark_button_view_spec.js',
|
||||
'lms/include/js/spec/views/message_banner_spec.js'
|
||||
]);
|
||||
|
||||
}).call(this, requirejs, define);
|
||||
|
||||
@@ -361,90 +361,20 @@ define([
|
||||
expect($('.search-button')).toBeVisible();
|
||||
}
|
||||
|
||||
function rendersSearchResults () {
|
||||
var searchResults = [{
|
||||
location: ['section', 'subsection', 'unit'],
|
||||
url: '/some/url/to/content',
|
||||
content_type: 'text',
|
||||
course_name: '',
|
||||
excerpt: 'this is a short excerpt'
|
||||
}];
|
||||
this.collection.set(searchResults);
|
||||
this.collection.latestModelsCount = 1;
|
||||
this.collection.totalCount = 1;
|
||||
|
||||
this.resultsView.render();
|
||||
expect(this.resultsView.$el.find('ol')[0]).toExist();
|
||||
expect(this.resultsView.$el.find('li').length).toEqual(1);
|
||||
expect(this.resultsView.$el).toContainHtml('Search Results');
|
||||
expect(this.resultsView.$el).toContainHtml('this is a short excerpt');
|
||||
|
||||
this.collection.set(searchResults);
|
||||
this.collection.totalCount = 2;
|
||||
this.resultsView.renderNext();
|
||||
expect(this.resultsView.$el.find('.search-count')).toContainHtml('2');
|
||||
expect(this.resultsView.$el.find('li').length).toEqual(2);
|
||||
}
|
||||
|
||||
function showsMoreResultsLink () {
|
||||
this.collection.totalCount = 123;
|
||||
this.collection.hasNextPage = function () { return true; };
|
||||
this.resultsView.render();
|
||||
expect(this.resultsView.$el.find('a.search-load-next')[0]).toExist();
|
||||
|
||||
this.collection.totalCount = 123;
|
||||
this.collection.hasNextPage = function () { return false; };
|
||||
this.resultsView.render();
|
||||
expect(this.resultsView.$el.find('a.search-load-next')[0]).not.toExist();
|
||||
}
|
||||
|
||||
function triggersNextPageEvent () {
|
||||
var onNext = jasmine.createSpy('onNext');
|
||||
this.resultsView.on('next', onNext);
|
||||
this.collection.totalCount = 123;
|
||||
this.collection.hasNextPage = function () { return true; };
|
||||
this.resultsView.render();
|
||||
this.resultsView.$el.find('a.search-load-next').click();
|
||||
expect(onNext).toHaveBeenCalled();
|
||||
}
|
||||
|
||||
function showsLoadMoreSpinner () {
|
||||
this.collection.totalCount = 123;
|
||||
this.collection.hasNextPage = function () { return true; };
|
||||
this.resultsView.render();
|
||||
expect(this.resultsView.$el.find('a.search-load-next .icon')).toBeHidden();
|
||||
this.resultsView.loadNext();
|
||||
// toBeVisible does not work with inline
|
||||
expect(this.resultsView.$el.find('a.search-load-next .icon')).toHaveCss({ 'display': 'inline' });
|
||||
this.resultsView.renderNext();
|
||||
expect(this.resultsView.$el.find('a.search-load-next .icon')).toBeHidden();
|
||||
}
|
||||
|
||||
function beforeEachHelper(SearchResultsView) {
|
||||
appendSetFixtures(
|
||||
'<section id="courseware-search-results"></section>' +
|
||||
'<section id="course-content"></section>' +
|
||||
'<section id="dashboard-search-results"></section>' +
|
||||
'<section id="my-courses"></section>'
|
||||
);
|
||||
|
||||
TemplateHelpers.installTemplates([
|
||||
'templates/search/course_search_item',
|
||||
'templates/search/dashboard_search_item',
|
||||
'templates/search/course_search_results',
|
||||
'templates/search/dashboard_search_results',
|
||||
'templates/search/search_list',
|
||||
'templates/search/search_loading',
|
||||
'templates/search/search_error'
|
||||
]);
|
||||
|
||||
var MockCollection = Backbone.Collection.extend({
|
||||
hasNextPage: function () {},
|
||||
latestModelsCount: 0,
|
||||
pageSize: 20,
|
||||
latestModels: function () {
|
||||
return SearchCollection.prototype.latestModels.apply(this, arguments);
|
||||
}
|
||||
describe('CourseSearchForm', function () {
|
||||
beforeEach(function () {
|
||||
loadFixtures('js/fixtures/search/course_search_form.html');
|
||||
this.form = new CourseSearchForm();
|
||||
this.onClear = jasmine.createSpy('onClear');
|
||||
this.onSearch = jasmine.createSpy('onSearch');
|
||||
this.form.on('clear', this.onClear);
|
||||
this.form.on('search', this.onSearch);
|
||||
});
|
||||
it('trims input string', trimsInputString);
|
||||
it('handles calls to doSearch', doesSearch);
|
||||
it('triggers a search event and changes to active state', triggersSearchEvent);
|
||||
it('clears search when clicking on cancel button', clearsSearchOnCancel);
|
||||
it('clears search when search box is empty', clearsSearchOnEmpty);
|
||||
});
|
||||
|
||||
describe('DashSearchForm', function () {
|
||||
@@ -557,12 +487,12 @@ define([
|
||||
|
||||
function beforeEachHelper(SearchResultsView) {
|
||||
appendSetFixtures(
|
||||
'<section id="courseware-search-results"></section>' +
|
||||
'<div class="courseware-results"></div>' +
|
||||
'<section id="course-content"></section>' +
|
||||
'<section id="dashboard-search-results"></section>' +
|
||||
'<section id="my-courses"></section>'
|
||||
);
|
||||
|
||||
|
||||
TemplateHelpers.installTemplates([
|
||||
'templates/search/course_search_item',
|
||||
'templates/search/dashboard_search_item',
|
||||
@@ -573,12 +503,6 @@ define([
|
||||
'templates/search/search_error'
|
||||
]);
|
||||
|
||||
var courseId = 'a/b/c';
|
||||
CourseSearchFactory(courseId);
|
||||
spyOn(Backbone.history, 'navigate');
|
||||
this.$contentElement = $('#course-content');
|
||||
this.$searchResults = $('.courseware-results');
|
||||
|
||||
var MockCollection = Backbone.Collection.extend({
|
||||
hasNextPage: function () {},
|
||||
latestModelsCount: 0,
|
||||
@@ -749,7 +673,7 @@ define([
|
||||
beforeEach(function () {
|
||||
loadFixtures('js/fixtures/search/course_search_form.html');
|
||||
appendSetFixtures(
|
||||
'<section id="courseware-search-results"></section>' +
|
||||
'<div class="courseware-results"></div>' +
|
||||
'<section id="course-content"></section>'
|
||||
);
|
||||
loadTemplates.call(this);
|
||||
@@ -758,7 +682,7 @@ define([
|
||||
CourseSearchFactory(courseId);
|
||||
spyOn(Backbone.history, 'navigate');
|
||||
this.$contentElement = $('#course-content');
|
||||
this.$searchResults = $('#courseware-search-results');
|
||||
this.$searchResults = $('.courseware-results');
|
||||
});
|
||||
|
||||
it('shows loading message on search', showsLoadingMessage);
|
||||
@@ -825,4 +749,4 @@ define([
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -8,7 +8,7 @@ define(['backbone', 'jquery', 'underscore', 'common/js/spec_helpers/ajax_helpers
|
||||
'js/student_profile/views/learner_profile_view',
|
||||
'js/student_profile/views/learner_profile_fields',
|
||||
'js/student_profile/views/learner_profile_factory',
|
||||
'js/views/message'
|
||||
'js/views/message_banner'
|
||||
],
|
||||
function (Backbone, $, _, AjaxHelpers, TemplateHelpers, Helpers, LearnerProfileHelpers, FieldViews,
|
||||
UserAccountModel, UserPreferencesModel, LearnerProfileView, LearnerProfileFields, LearnerProfilePage) {
|
||||
|
||||
@@ -2,10 +2,10 @@ define(['backbone', 'jquery', 'underscore', 'common/js/spec_helpers/ajax_helpers
|
||||
'js/spec/student_account/helpers',
|
||||
'js/student_account/models/user_account_model',
|
||||
'js/student_profile/views/learner_profile_fields',
|
||||
'js/views/message'
|
||||
'js/views/message_banner'
|
||||
],
|
||||
function (Backbone, $, _, AjaxHelpers, TemplateHelpers, Helpers, UserAccountModel, LearnerProfileFields,
|
||||
MessageView) {
|
||||
MessageBannerView) {
|
||||
'use strict';
|
||||
|
||||
describe("edx.user.LearnerProfileFields", function () {
|
||||
@@ -31,9 +31,8 @@ define(['backbone', 'jquery', 'underscore', 'common/js/spec_helpers/ajax_helpers
|
||||
|
||||
accountSettingsModel.url = Helpers.USER_ACCOUNTS_API_URL;
|
||||
|
||||
var messageView = new MessageView({
|
||||
el: $('.message-banner'),
|
||||
templateId: '#message_banner-tpl'
|
||||
var messageView = new MessageBannerView({
|
||||
el: $('.message-banner')
|
||||
});
|
||||
|
||||
return new LearnerProfileFields.ProfileImageFieldView({
|
||||
|
||||
@@ -7,11 +7,11 @@ define(['backbone', 'jquery', 'underscore', 'common/js/spec_helpers/ajax_helpers
|
||||
'js/student_profile/views/learner_profile_fields',
|
||||
'js/student_profile/views/learner_profile_view',
|
||||
'js/student_account/views/account_settings_fields',
|
||||
'js/views/message'
|
||||
'js/views/message_banner'
|
||||
],
|
||||
function (Backbone, $, _, AjaxHelpers, TemplateHelpers, Helpers, LearnerProfileHelpers, FieldViews,
|
||||
UserAccountModel, AccountPreferencesModel, LearnerProfileFields, LearnerProfileView,
|
||||
AccountSettingsFieldViews, MessageView) {
|
||||
AccountSettingsFieldViews, MessageBannerView) {
|
||||
'use strict';
|
||||
|
||||
describe("edx.user.LearnerProfileView", function () {
|
||||
@@ -45,9 +45,8 @@ define(['backbone', 'jquery', 'underscore', 'common/js/spec_helpers/ajax_helpers
|
||||
accountSettingsPageUrl: '/account/settings/'
|
||||
});
|
||||
|
||||
var messageView = new MessageView({
|
||||
el: $('.message-banner'),
|
||||
templateId: '#message_banner-tpl'
|
||||
var messageView = new MessageBannerView({
|
||||
el: $('.message-banner')
|
||||
});
|
||||
|
||||
var profileImageFieldView = new LearnerProfileFields.ProfileImageFieldView({
|
||||
|
||||
@@ -1,46 +1,28 @@
|
||||
define(['backbone', 'jquery', 'underscore', 'js/views/message', 'js/common_helpers/template_helpers'
|
||||
define(['backbone', 'jquery', 'underscore',
|
||||
'common/js/spec_helpers/template_helpers', 'js/views/message_banner'
|
||||
],
|
||||
function (Backbone, $, _, MessageView, TemplateHelpers) {
|
||||
function (Backbone, $, _, TemplateHelpers, MessageBannerView) {
|
||||
'use strict';
|
||||
|
||||
describe("MessageView", function () {
|
||||
|
||||
var messageEl = '.message-banner';
|
||||
describe("MessageBannerView", function () {
|
||||
|
||||
beforeEach(function () {
|
||||
setFixtures('<div class="message-banner"></div>');
|
||||
TemplateHelpers.installTemplate("templates/fields/message_banner");
|
||||
TemplateHelpers.installTemplate("templates/message_view");
|
||||
});
|
||||
|
||||
var createMessageView = function (messageContainer, templateId) {
|
||||
return new MessageView({
|
||||
el: $(messageContainer),
|
||||
templateId: templateId
|
||||
it('renders message correctly', function() {
|
||||
var messageSelector = '.message-banner';
|
||||
var messageView = new MessageBannerView({
|
||||
el: $(messageSelector)
|
||||
});
|
||||
};
|
||||
|
||||
it('renders correctly with the /fields/message_banner template', function() {
|
||||
var messageView = createMessageView(messageSelector, '#message_banner-tpl');
|
||||
|
||||
messageView.showMessage('I am message view');
|
||||
expect($(messageEl).text().trim()).toBe('I am message view');
|
||||
// Verify error message
|
||||
expect($(messageSelector).text().trim()).toBe('I am message view');
|
||||
|
||||
messageView.hideMessage();
|
||||
expect($(messageEl).text().trim()).toBe('');
|
||||
});
|
||||
|
||||
it('renders correctly with the /message_view template', function() {
|
||||
var messageView = createMessageView(messageEl, '#message-tpl');
|
||||
var icon = '<i class="fa fa-thumbs-up"></i>';
|
||||
|
||||
messageView.showMessage('I am message view', icon);
|
||||
|
||||
expect($(messageEl).text().trim()).toBe('I am message view');
|
||||
expect($(messageEl).html()).toContain(icon);
|
||||
|
||||
messageView.hideMessage();
|
||||
expect($(messageEl).text().trim()).toBe('');
|
||||
expect($(messageSelector).text().trim()).toBe('');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
'js/student_profile/views/learner_profile_fields',
|
||||
'js/student_profile/views/learner_profile_view',
|
||||
'js/student_account/views/account_settings_fields',
|
||||
'js/views/message',
|
||||
'js/views/message_banner',
|
||||
'string_utils'
|
||||
], function (gettext, $, _, Backbone, Logger, AccountSettingsModel, AccountPreferencesModel, FieldsView,
|
||||
LearnerProfileFieldsView, LearnerProfileView, AccountSettingsFieldViews, MessageView) {
|
||||
LearnerProfileFieldsView, LearnerProfileView, AccountSettingsFieldViews, MessageBannerView) {
|
||||
|
||||
return function (options) {
|
||||
|
||||
@@ -36,9 +36,8 @@
|
||||
|
||||
var editable = options.own_profile ? 'toggle' : 'never';
|
||||
|
||||
var messageView = new MessageView({
|
||||
el: $('.message-banner'),
|
||||
templateId: '#message_banner-tpl'
|
||||
var messageView = new MessageBannerView({
|
||||
el: $('.message-banner')
|
||||
});
|
||||
|
||||
var accountPrivacyFieldView = new LearnerProfileFieldsView.AccountPrivacyFieldView({
|
||||
|
||||
@@ -1,356 +0,0 @@
|
||||
var onVideoFail = function(e) {
|
||||
if(e === 'NO_DEVICES_FOUND') {
|
||||
$('#no-webcam').show();
|
||||
$('#face_capture_button').hide();
|
||||
$('#photo_id_capture_button').hide();
|
||||
}
|
||||
else {
|
||||
console.log('Failed to get camera access!', e);
|
||||
}
|
||||
};
|
||||
|
||||
// Returns true if we are capable of video capture (regardless of whether the
|
||||
// user has given permission).
|
||||
function initVideoCapture() {
|
||||
window.URL = window.URL || window.webkitURL;
|
||||
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
|
||||
navigator.mozGetUserMedia || navigator.msGetUserMedia;
|
||||
return !(navigator.getUserMedia === undefined);
|
||||
}
|
||||
|
||||
var submitReverificationPhotos = function() {
|
||||
// add photos to the form
|
||||
$('<input>').attr({
|
||||
type: 'hidden',
|
||||
name: 'face_image',
|
||||
value: $("#face_image")[0].src,
|
||||
}).appendTo("#reverify_form");
|
||||
$('<input>').attr({
|
||||
type: 'hidden',
|
||||
name: 'photo_id_image',
|
||||
value: $("#photo_id_image")[0].src,
|
||||
}).appendTo("#reverify_form");
|
||||
|
||||
$("#reverify_form").submit();
|
||||
|
||||
};
|
||||
|
||||
var submitMidcourseReverificationPhotos = function() {
|
||||
$('<input>').attr({
|
||||
type: 'hidden',
|
||||
name: 'face_image',
|
||||
value: $("#face_image")[0].src,
|
||||
}).appendTo("#reverify_form");
|
||||
$("#reverify_form").submit();
|
||||
};
|
||||
|
||||
function showSubmissionError() {
|
||||
if (xhr.status === 400) {
|
||||
$('#order-error .copy p').html(xhr.responseText);
|
||||
}
|
||||
$('#order-error').show();
|
||||
$("html, body").animate({ scrollTop: 0 });
|
||||
}
|
||||
|
||||
function submitForm(data) {
|
||||
for (prop in data) {
|
||||
$('<input>').attr({
|
||||
type: 'hidden',
|
||||
name: prop,
|
||||
value: data[prop]
|
||||
}).appendTo('#pay_form');
|
||||
}
|
||||
$("#pay_form").submit();
|
||||
}
|
||||
|
||||
function refereshPageMessage() {
|
||||
$('#photo-error').show();
|
||||
$("html, body").animate({ scrollTop: 0 });
|
||||
}
|
||||
|
||||
var submitToPaymentProcessing = function() {
|
||||
$(".payment-button").addClass('is-disabled').attr('aria-disabled', true);
|
||||
var contribution_input = $("input[name='contribution']:checked");
|
||||
var contribution = 0;
|
||||
if(contribution_input.attr('id') == 'contribution-other') {
|
||||
contribution = $("input[name='contribution-other-amt']").val();
|
||||
}
|
||||
else {
|
||||
contribution = contribution_input.val();
|
||||
}
|
||||
var course_id = $("input[name='course_id']").val();
|
||||
$.ajax({
|
||||
url: "/verify_student/create_order",
|
||||
type: 'POST',
|
||||
data: {
|
||||
"course_id" : course_id,
|
||||
"contribution": contribution,
|
||||
"face_image" : $("#face_image")[0].src,
|
||||
"photo_id_image" : $("#photo_id_image")[0].src
|
||||
},
|
||||
success:function(data) {
|
||||
if (data.success) {
|
||||
submitForm(data);
|
||||
} else {
|
||||
refereshPageMessage();
|
||||
}
|
||||
},
|
||||
error:function() {
|
||||
$(".payment-button").removeClass('is-disabled').attr('aria-disabled', false);
|
||||
showSubmissionError();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function doResetButton(resetButton, captureButton, approveButton, nextButtonNav, nextLink) {
|
||||
approveButton.removeClass('approved');
|
||||
nextButtonNav.addClass('is-not-ready');
|
||||
nextLink.attr('href', "#");
|
||||
|
||||
captureButton.show();
|
||||
resetButton.hide();
|
||||
approveButton.hide();
|
||||
}
|
||||
|
||||
function doApproveButton(approveButton, nextButtonNav, nextLink) {
|
||||
nextButtonNav.removeClass('is-not-ready');
|
||||
approveButton.addClass('approved');
|
||||
nextLink.attr('href', "#next");
|
||||
}
|
||||
|
||||
function doSnapshotButton(captureButton, resetButton, approveButton) {
|
||||
captureButton.hide();
|
||||
resetButton.show();
|
||||
approveButton.show();
|
||||
}
|
||||
|
||||
function submitNameChange(event) {
|
||||
event.preventDefault();
|
||||
$("#lean_overlay").fadeOut(200);
|
||||
$("#edit-name").css({ 'display' : 'none' });
|
||||
var full_name = $('input[name="name"]').val();
|
||||
var xhr = $.post(
|
||||
"/change_name",
|
||||
{
|
||||
"new_name" : full_name,
|
||||
"rationale": "Want to match ID for ID Verified Certificates."
|
||||
},
|
||||
function() {
|
||||
$('#full-name').html(full_name);
|
||||
}
|
||||
)
|
||||
.fail(function(jqXhr) {
|
||||
$('.message-copy').html(jqXhr.responseText);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function initSnapshotHandler(names, hasHtml5CameraSupport) {
|
||||
var name = names.pop();
|
||||
if (name == undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
var video = $('#' + name + '_video');
|
||||
var canvas = $('#' + name + '_canvas');
|
||||
var image = $('#' + name + "_image");
|
||||
var captureButton = $("#" + name + "_capture_button");
|
||||
var resetButton = $("#" + name + "_reset_button");
|
||||
var approveButton = $("#" + name + "_approve_button");
|
||||
var nextButtonNav = $("#" + name + "_next_button_nav");
|
||||
var nextLink = $("#" + name + "_next_link");
|
||||
var flashCapture = $("#" + name + "_flash");
|
||||
|
||||
var ctx = null;
|
||||
if (hasHtml5CameraSupport) {
|
||||
ctx = canvas[0].getContext('2d');
|
||||
}
|
||||
|
||||
var localMediaStream = null;
|
||||
|
||||
function snapshot(event) {
|
||||
if (hasHtml5CameraSupport) {
|
||||
if (localMediaStream) {
|
||||
ctx.drawImage(video[0], 0, 0);
|
||||
image[0].src = canvas[0].toDataURL('image/png');
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
video[0].pause();
|
||||
}
|
||||
else {
|
||||
if (flashCapture[0].cameraAuthorized()) {
|
||||
image[0].src = flashCapture[0].snap();
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
doSnapshotButton(captureButton, resetButton, approveButton);
|
||||
return false;
|
||||
}
|
||||
|
||||
function reset() {
|
||||
image[0].src = "";
|
||||
|
||||
if (hasHtml5CameraSupport) {
|
||||
video[0].play();
|
||||
}
|
||||
else {
|
||||
flashCapture[0].reset();
|
||||
}
|
||||
|
||||
doResetButton(resetButton, captureButton, approveButton, nextButtonNav, nextLink);
|
||||
return false;
|
||||
}
|
||||
|
||||
function approve() {
|
||||
doApproveButton(approveButton, nextButtonNav, nextLink);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Initialize state for this picture taker
|
||||
captureButton.show();
|
||||
resetButton.hide();
|
||||
approveButton.hide();
|
||||
nextButtonNav.addClass('is-not-ready');
|
||||
nextLink.attr('href', "#");
|
||||
|
||||
// Connect event handlers...
|
||||
video.click(snapshot);
|
||||
captureButton.click(snapshot);
|
||||
resetButton.click(reset);
|
||||
approveButton.click(approve);
|
||||
|
||||
// If it's flash-based, we can just immediate initialize the next one.
|
||||
// If it's HTML5 based, we have to do it in the callback from getUserMedia
|
||||
// so that Firefox doesn't eat the second request.
|
||||
if (hasHtml5CameraSupport) {
|
||||
navigator.getUserMedia({video: true}, function(stream) {
|
||||
video[0].src = window.URL.createObjectURL(stream);
|
||||
localMediaStream = stream;
|
||||
|
||||
// We do this in a recursive call on success because Firefox seems to
|
||||
// simply eat the request if you stack up two on top of each other before
|
||||
// the user has a chance to approve the first one.
|
||||
//
|
||||
// This appears to be necessary for older versions of Firefox (before 28).
|
||||
// For more info, see https://github.com/edx/edx-platform/pull/3053
|
||||
initSnapshotHandler(names, hasHtml5CameraSupport);
|
||||
}, onVideoFail);
|
||||
}
|
||||
else {
|
||||
initSnapshotHandler(names, hasHtml5CameraSupport);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function browserHasFlash() {
|
||||
var hasFlash = false;
|
||||
try {
|
||||
var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
|
||||
if(fo) hasFlash = true;
|
||||
} catch(e) {
|
||||
if(navigator.mimeTypes["application/x-shockwave-flash"] != undefined) hasFlash = true;
|
||||
}
|
||||
return hasFlash;
|
||||
}
|
||||
|
||||
function objectTagForFlashCamera(name) {
|
||||
// detect whether or not flash is available
|
||||
if(browserHasFlash()) {
|
||||
// I manually update this to have ?v={2,3,4, etc} to avoid caching of flash
|
||||
// objects on local dev.
|
||||
return '<object type="application/x-shockwave-flash" id="' +
|
||||
name + '" name="' + name + '" data=' +
|
||||
'"/static/js/verify_student/CameraCapture.swf?v=3"' +
|
||||
'width="500" height="375"><param name="quality" ' +
|
||||
'value="high"><param name="allowscriptaccess" ' +
|
||||
'value="sameDomain"></object>';
|
||||
}
|
||||
else {
|
||||
// display a message informing the user to install flash
|
||||
$('#no-flash').show();
|
||||
}
|
||||
}
|
||||
|
||||
function waitForFlashLoad(func, flash_object) {
|
||||
if(!flash_object.hasOwnProperty('percentLoaded') || flash_object.percentLoaded() < 100){
|
||||
setTimeout(function() {
|
||||
waitForFlashLoad(func, flash_object);
|
||||
},
|
||||
50);
|
||||
}
|
||||
else {
|
||||
func(flash_object);
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
$(".carousel-nav").addClass('sr');
|
||||
$(".payment-button").click(function(){
|
||||
analytics.pageview("Payment Form");
|
||||
submitToPaymentProcessing();
|
||||
});
|
||||
|
||||
$("#reverify_button").click(function() {
|
||||
submitReverificationPhotos();
|
||||
});
|
||||
|
||||
$("#midcourse_reverify_button").click(function() {
|
||||
submitMidcourseReverificationPhotos();
|
||||
});
|
||||
|
||||
// prevent browsers from keeping this button checked
|
||||
$("#confirm_pics_good").prop("checked", false);
|
||||
$("#confirm_pics_good").change(function() {
|
||||
$(".payment-button").toggleClass('disabled');
|
||||
$("#reverify_button").toggleClass('disabled');
|
||||
$("#midcourse_reverify_button").toggleClass('disabled');
|
||||
});
|
||||
|
||||
|
||||
// add in handlers to add/remove the correct classes to the body
|
||||
// when moving between steps
|
||||
$('#face_next_link').click(function(){
|
||||
analytics.pageview("Capture ID Photo");
|
||||
$('#photo-error').hide();
|
||||
$('body').addClass('step-photos-id').removeClass('step-photos-cam');
|
||||
});
|
||||
|
||||
$('#photo_id_next_link').click(function(){
|
||||
analytics.pageview("Review Photos");
|
||||
$('body').addClass('step-review').removeClass('step-photos-id');
|
||||
});
|
||||
|
||||
// set up edit information dialog
|
||||
$('#edit-name div[role="alert"]').hide();
|
||||
$('#edit-name .action-save').click(submitNameChange);
|
||||
|
||||
var hasHtml5CameraSupport = initVideoCapture();
|
||||
|
||||
// If HTML5 WebRTC capture is not supported, we initialize jpegcam
|
||||
if (!hasHtml5CameraSupport) {
|
||||
$("#face_capture_div").html(objectTagForFlashCamera("face_flash"));
|
||||
$("#photo_id_capture_div").html(objectTagForFlashCamera("photo_id_flash"));
|
||||
// wait for the flash object to be loaded and then check for a camera
|
||||
if(browserHasFlash()) {
|
||||
waitForFlashLoad(function(flash_object) {
|
||||
if(!flash_object.hasOwnProperty('hasCamera')){
|
||||
onVideoFail('NO_DEVICES_FOUND');
|
||||
}
|
||||
}, $('#face_flash')[0]);
|
||||
}
|
||||
}
|
||||
|
||||
analytics.pageview("Capture Face Photo");
|
||||
initSnapshotHandler(["photo_id", "face"], hasHtml5CameraSupport);
|
||||
|
||||
$('a[rel="external"]').attr({
|
||||
title: gettext('This link will open in a new browser window/tab'),
|
||||
target: '_blank'
|
||||
});
|
||||
|
||||
});
|
||||
@@ -17,17 +17,15 @@
|
||||
if (_.isUndefined(this.message) || _.isNull(this.message)) {
|
||||
this.$el.html('');
|
||||
} else {
|
||||
this.$el.html(this.template({
|
||||
message: this.message,
|
||||
icon: this.icon
|
||||
}));
|
||||
this.$el.html(_.template(messageBannerTemplate, _.extend(this.options, {
|
||||
message: this.message
|
||||
})));
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
showMessage: function (message, icon) {
|
||||
showMessage: function (message) {
|
||||
this.message = message;
|
||||
this.icon = icon;
|
||||
this.render();
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user