diff --git a/cms/djangoapps/contentstore/views.py b/cms/djangoapps/contentstore/views.py index 2cc7cfca0d9990bd04f648f23e2c61e7a6c90f4c..be4a157de44452ced1a1b2920a2f442bb71c4e47 100644 --- a/cms/djangoapps/contentstore/views.py +++ b/cms/djangoapps/contentstore/views.py @@ -96,7 +96,10 @@ def login_page(request): Display the login form. """ csrf_token = csrf(request)['csrf_token'] - return render_to_response('login.html', {'csrf': csrf_token}) + return render_to_response('login.html', { + 'csrf': csrf_token, + 'forgot_password_link': "//{base}/#forgot-password-modal".format(base=settings.LMS_BASE), + }) # ==== Views for any logged-in user ================================== @@ -574,11 +577,11 @@ def save_item(request): store = _modulestore(Location(item_location)); - if request.POST['data'] is not None: + if request.POST.get('data') is not None: data = request.POST['data'] store.update_item(item_location, data) - if request.POST['children'] is not None: + if request.POST.get('children') is not None: children = request.POST['children'] store.update_children(item_location, children) @@ -587,7 +590,7 @@ def save_item(request): # NOTE, that the postback is not the complete metadata, as there's system metadata which is # not presented to the end-user for editing. So let's fetch the original and # 'apply' the submitted metadata, so we don't end up deleting system metadata - if request.POST['metadata'] is not None: + if request.POST.get('metadata') is not None: posted_metadata = request.POST['metadata'] # fetch original existing_item = modulestore().get_item(item_location) diff --git a/cms/static/coffee/src/models/module.coffee b/cms/static/coffee/src/models/module.coffee index d344bda17d2f6d3481e19478d4ff82aaa752a869..2a1fcc785d4dbe8fcd5c70160892e6bb78124308 100644 --- a/cms/static/coffee/src/models/module.coffee +++ b/cms/static/coffee/src/models/module.coffee @@ -1,6 +1,2 @@ class CMS.Models.Module extends Backbone.Model url: '/save_item' - defaults: - data: null - children: null - metadata: null diff --git a/cms/static/js/base.js b/cms/static/js/base.js index 023cc0a6a612d1d030861bdf932b2dd6b20e10fe..d221acb7f28263bc66656f20cf6a30032c9a913c 100644 --- a/cms/static/js/base.js +++ b/cms/static/js/base.js @@ -137,7 +137,7 @@ function showImportSubmit(e) { var filepath = $(this).val(); if(filepath.substr(filepath.length - 6, 6) == 'tar.gz') { $('.error-block').hide(); - $('.file-name').html($(this).val()); + $('.file-name').html($(this).val().replace('C:\\fakepath\\', '')); $('.file-name-block').show(); $('.import .choose-file-button').hide(); $('.submit-button').show(); @@ -218,7 +218,7 @@ function onUnitReordered() { type: "POST", dataType: "json", contentType: "application/json", - data:JSON.stringify({ 'id' : subsection_id, 'metadata' : null, 'data': null, 'children' : children}) + data:JSON.stringify({ 'id' : subsection_id, 'children' : children}) }); } @@ -234,7 +234,7 @@ function onSubsectionReordered() { type: "POST", dataType: "json", contentType: "application/json", - data:JSON.stringify({ 'id' : section_id, 'metadata' : null, 'data': null, 'children' : children}) + data:JSON.stringify({ 'id' : section_id, 'children' : children}) }); } @@ -250,7 +250,7 @@ function onSectionReordered() { type: "POST", dataType: "json", contentType: "application/json", - data:JSON.stringify({ 'id' : course_id, 'metadata' : null, 'data': null, 'children' : children}) + data:JSON.stringify({ 'id' : course_id, 'children' : children}) }); } @@ -360,15 +360,12 @@ function saveSubsection() { metadata['start'] = getEdxTimeFromDateTimeInputs('start_date', 'start_time'); metadata['due'] = getEdxTimeFromDateTimeInputs('due_date', 'due_time', 'MMMM dd HH:mm'); - // reordering is done through immediate callbacks when the resorting has completed in the UI - children =[]; - $.ajax({ url: "/save_item", type: "POST", dataType: "json", contentType: "application/json", - data:JSON.stringify({ 'id' : id, 'metadata' : metadata, 'data': null, 'children' : children}), + data:JSON.stringify({ 'id' : id, 'metadata' : metadata}), success: function() { $spinner.delay(500).fadeOut(150); }, @@ -745,7 +742,7 @@ function saveEditSectionName(e) { type: "POST", dataType: "json", contentType: "application/json", - data:JSON.stringify({ 'id' : id, 'metadata' : {'display_name' : display_name}, 'data': null, 'children' : null}) + data:JSON.stringify({ 'id' : id, 'metadata' : {'display_name' : display_name}}) }).success(function() { $spinner.delay(250).fadeOut(250); @@ -785,7 +782,7 @@ function saveSetSectionScheduleDate(e) { type: "POST", dataType: "json", contentType: "application/json", - data:JSON.stringify({ 'id' : id, 'metadata' : {'start' : start}, 'data': null, 'children' : null}) + data:JSON.stringify({ 'id' : id, 'metadata' : {'start' : start}}) }).success(function() { var $thisSection = $('.courseware-section[data-id="' + id + '"]'); diff --git a/cms/templates/login.html b/cms/templates/login.html index 1785d457ead9bf4603b1724d613e871b4256c82f..580dd90309027a21b7b1bfdc3547f4a54dc49833 100644 --- a/cms/templates/login.html +++ b/cms/templates/login.html @@ -17,7 +17,7 @@ <input name="email" type="email" class="email-field" tabindex="1"> </div> <div class="row"> - <label>Password <a href="#" class="forgot-button">Forgot password?</a></label> + <label>Password <a href="${forgot_password_link}" class="forgot-button">Forgot password?</a></label> <input name="password" type="password" class="password-field" tabindex="2"> </div> <div class="row form-actions"> diff --git a/common/static/js/vendor/jquery.ba-bbq.min.js b/common/static/js/vendor/jquery.ba-bbq.min.js new file mode 100644 index 0000000000000000000000000000000000000000..bcbf24834ac7ef0ccf0a690fdc4966c67389a079 --- /dev/null +++ b/common/static/js/vendor/jquery.ba-bbq.min.js @@ -0,0 +1,18 @@ +/* + * jQuery BBQ: Back Button & Query Library - v1.2.1 - 2/17/2010 + * http://benalman.com/projects/jquery-bbq-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d="hashchange",A="querystring",D="fragment",y="elemUrlAttr",g="location",k="href",t="src",x=/^.*\?|#.*$/g,w=/^.*\#/,h,C={};function E(F){return typeof F==="string"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,"$1")}function o(F){return F.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);J=K[3]||"";if(G===2&&E(I)){L=I.replace(H?w:x,"")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?"#":L||!K[1]?"?":"")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||"";var F=$.map(G.split(""),encodeURIComponent);h=new RegExp(F.join("|"),"g")};c.noEscape(",/");$.deparam=l=function(I,F){var H={},G={"true":!0,"false":!1,"null":null};$.each(I.replace(/\+/g," ").split("&"),function(L,Q){var K=Q.split("="),P=r(K[0]),J,O=H,M=0,R=P.split("]["),N=R.length-1;if(/\[/.test(R[0])&&/\]$/.test(R[N])){R[N]=R[N].replace(/\]$/,"");R=R.shift().split("[").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===""?O.length:R[M];O=O[P]=M<N?O[P]||(R[M+1]&&isNaN(R[M+1])?{}:[]):J}}else{if($.isArray(H[P])){H[P].push(J)}else{if(H[P]!==i){H[P]=[H[P],J]}else{H[P]=J}}}}else{if(P){H[P]=F?i:""}}});return H};function z(H,F,G){if(F===i||typeof F==="boolean"){G=F;F=a[H?D:A]()}else{F=E(F)?F.replace(H?w:x,""):F}return l(F,G)}l[A]=B(z,0);l[D]=v=B(z,1);$[y]||($[y]=function(F){return $.extend(C,F)})({a:k,base:k,iframe:t,img:t,input:t,form:"action",link:k,script:t});j=$[y];function s(I,G,H,F){if(!E(H)&&typeof H!=="object"){F=H;H=G;G=i}return this.each(function(){var L=$(this),J=G||j()[(this.nodeName||"").toLowerCase()]||"",K=J&&L.attr(J)||"";L.attr(J,a[I](K,H,F))})}$.fn[A]=B(s,A);$.fn[D]=B(s,D);b.pushState=q=function(I,F){if(E(I)&&/^#/.test(I)&&F===i){F=2}var H=I!==i,G=c(p[g][k],H?I:{},H?F:2);p[g][k]=G+(/#/.test(G)?"":"#")};b.getState=u=function(F,G){return F===i||typeof F==="boolean"?v(F):v(G)[F]};b.removeState=function(F){var G={};if(F!==i){G=u();$.each($.isArray(F)?F:arguments,function(I,H){delete G[H]})}q(G,2)};e[d]=$.extend(e[d],{add:function(F){var H;function G(J){var I=J[D]=c();J.getState=function(K,L){return K===i||typeof K==="boolean"?l(I,K):l(I,L)[K]};H.apply(this,arguments)}if($.isFunction(F)){H=F;return G}else{H=F.handler;F.handler=G}}})})(jQuery,this); +/* + * jQuery hashchange event - v1.2 - 2/11/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,i,b){var j,k=$.event.special,c="location",d="hashchange",l="href",f=$.browser,g=document.documentMode,h=f.msie&&(g===b||g<8),e="on"+d in i&&!h;function a(m){m=m||i[c][l];return m.replace(/^[^#]*#?(.*)$/,"$1")}$[d+"Delay"]=100;k[d]=$.extend(k[d],{setup:function(){if(e){return false}$(j.start)},teardown:function(){if(e){return false}$(j.stop)}});j=(function(){var m={},r,n,o,q;function p(){o=q=function(s){return s};if(h){n=$('<iframe src="javascript:0"/>').hide().insertAfter("body")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash="#"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,"")+"#"+u}}r=setTimeout(s,$[d+"Delay"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this); \ No newline at end of file diff --git a/lms/envs/common.py b/lms/envs/common.py index 3330bf0ce30004995fb0d85c22b3f8721775724a..62d0db957765a9e732c5df699b4dba13b90944e0 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -391,6 +391,7 @@ main_vendor_js = [ 'js/vendor/jquery.cookie.js', 'js/vendor/jquery.qtip.min.js', 'js/vendor/swfobject/swfobject.js', + 'js/vendor/jquery.ba-bbq.min.js', ] discussion_js = sorted(rooted_glob(PROJECT_ROOT / 'static', 'coffee/src/discussion/**/*.coffee')) diff --git a/lms/templates/university_profile/edge.html b/lms/templates/university_profile/edge.html index f3213e8d399cfc3da215b1801a749623ecd96744..a3e115ddd894220d179e38e87ea24607d6af670d 100644 --- a/lms/templates/university_profile/edge.html +++ b/lms/templates/university_profile/edge.html @@ -37,21 +37,26 @@ <%block name="js_extra"> <script type="text/javascript"> (function() { - $(document).delegate('#login_form', 'ajax:success', function(data, json, xhr) { - if(json.success) { - next = getParameterByName('next'); - if(next) { - location.href = next; - } else { - location.href = "${reverse('dashboard')}"; - } + $(document).ready(function() { + if ($.deparam.fragment()['forgot-password-modal'] !== undefined) { + $('.pwd-reset').click(); + } + }) + $(document).delegate('#login_form', 'ajax:success', function(data, json, xhr) { + if(json.success) { + next = getParameterByName('next'); + if(next) { + location.href = next; } else { - if($('#login_error').length == 0) { - $('#login_form').prepend('<div id="login_error" class="modal-form-error"></div>'); - } - $('#login_error').html(json.value).stop().css("display", "block"); + location.href = "${reverse('dashboard')}"; } - }); + } else { + if($('#login_error').length == 0) { + $('#login_form').prepend('<div id="login_error" class="modal-form-error"></div>'); + } + $('#login_error').html(json.value).stop().css("display", "block"); + } + }); })(this) </script> </%block>