X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=js%2Futil.js;h=c690153abb0adc7756d9e5331c99785ab7a5ad60;hb=874804a0c4c7deb89ca9292a12f684ed9cda388a;hp=2100521869af2a040b28abee2834f8fce77bd0f3;hpb=55b4303ea4da2a74723f7df5dbd1d83ae3922d27;p=quix0rs-gnu-social.git diff --git a/js/util.js b/js/util.js index 2100521869..c690153abb 100644 --- a/js/util.js +++ b/js/util.js @@ -31,7 +31,8 @@ var SN = { // StatusNet CounterBlackout: false, MaxLength: 140, PatternUsername: /^[0-9a-zA-Z\-_.]*$/, - HTTP20x30x: [200, 201, 202, 203, 204, 205, 206, 300, 301, 302, 303, 304, 305, 306, 307] + HTTP20x30x: [200, 201, 202, 203, 204, 205, 206, 300, 301, 302, 303, 304, 305, 306, 307], + NoticeFormMaster: null // to be cloned from the one at top }, /** @@ -103,7 +104,7 @@ var SN = { // StatusNet SN.U.Counter(form); - NDT = form.find('[name=status_textarea]'); + NDT = form.find('.notice_data-text:first'); NDT.bind('keyup', function(e) { SN.U.Counter(form); @@ -182,7 +183,7 @@ var SN = { // StatusNet * @return number of chars */ CharacterCount: function(form) { - return form.find('[name=status_textarea]').val().length; + return form.find('.notice_data-text:first').val().length; }, /** @@ -227,6 +228,9 @@ var SN = { // StatusNet * will be extracted and copied in, replacing the original form. * If there's no form, the first paragraph will be used. * + * This will automatically be applied on the 'submit' event for + * any form with the 'ajax' class. + * * @fixme can sometimes explode confusingly if returnd data is bogus * @fixme error handling is pretty vague * @fixme can't submit file uploads @@ -323,7 +327,7 @@ var SN = { // StatusNet dataType: 'xml', timeout: '60000', beforeSend: function(formData) { - if (form.find('[name=status_textarea]').val() == '') { + if (form.find('.notice_data-text:first').val() == '') { form.addClass(SN.C.S.Warning); return false; } @@ -595,50 +599,51 @@ var SN = { // StatusNet nextStep(); } else { // Remove placeholder if any - $('li.notice-reply-placeholder').remove(); + list.find('li.notice-reply-placeholder').remove(); // Create the reply form entry at the end var replyItem = $('li.notice-reply', list); if (replyItem.length == 0) { - var url = $('#form_notice').attr('action'); replyItem = $('
  • '); - $.get(url, {ajax: 1}, function(data, textStatus, xhr) { - var formEl = document._importNode($('form', data)[0], true); + + var intermediateStep = function(formMaster) { + var formEl = document._importNode(formMaster, true); replyItem.append(formEl); list.append(replyItem); var form = replyForm = $(formEl); - SN.U.NoticeLocationAttach(form); - SN.U.FormNoticeXHR(form); - SN.U.FormNoticeEnhancements(form); - SN.U.NoticeDataAttach(form); + SN.Init.NoticeFormSetup(form); nextStep(); - }); + }; + if (SN.C.I.NoticeFormMaster) { + // We've already saved a master copy of the form. + // Clone it in! + intermediateStep(SN.C.I.NoticeFormMaster); + } else { + // Fetch a fresh copy of the notice form over AJAX. + // Warning: this can have a delay, which looks bad. + // @fixme this fallback may or may not work + var url = $('#form_notice').attr('action'); + $.get(url, {ajax: 1}, function(data, textStatus, xhr) { + intermediateStep($('form', data)[0]); + }); + } } } }, - /** - * Setup function -- DOES NOT apply immediately. - * - * Sets up event handlers for favor/disfavor forms to submit via XHR. - * Uses 'live' rather than 'bind', so applies to future as well as present items. - */ - NoticeFavor: function() { - $('.form_favor').live('click', function() { SN.U.FormXHR($(this)); return false; }); - $('.form_disfavor').live('click', function() { SN.U.FormXHR($(this)); return false; }); - }, - NoticeInlineReplyPlaceholder: function(notice) { var list = notice.find('ul.threaded-replies'); var placeholder = $('
  • ' + '' + '
  • '); - placeholder.click(function() { - SN.U.NoticeInlineReplyTrigger(notice); - }); - placeholder.find('input').val(SN.msg('reply_placeholder')); + placeholder.find('input') + .val(SN.msg('reply_placeholder')) + .focus(function() { + SN.U.NoticeInlineReplyTrigger(notice); + return false; + }); list.append(placeholder); }, @@ -1012,8 +1017,7 @@ var SN = { // StatusNet } var NGW = form.find('.notice_data-geo_wrap'); - var geocodeURL = NGW.attr('title'); - NGW.removeAttr('title'); + var geocodeURL = NGW.attr('data-api'); label .attr('title', label.text()); @@ -1113,6 +1117,7 @@ var SN = { // StatusNet wrapper = $('
    '); wrapper.find('button.close').click(function() { form.find('[name=notice_data-geo]').removeAttr('checked').change(); + return false; }); form.append(wrapper); } @@ -1257,7 +1262,7 @@ var SN = { // StatusNet var profileLink = $('#nav_profile a').attr('href'); if (profileLink) { - var authorUrl = $(notice).find('.entry-title .author a.url').attr('href'); + var authorUrl = $(notice).find('.vcard.author a.url').attr('href'); if (authorUrl == profileLink) { if (action == 'all' || action == 'showstream') { // Posts always show on your own friends and profile streams. @@ -1274,6 +1279,13 @@ var SN = { // StatusNet return false; }, + /** + * Switch to another active input sub-form. + * This will hide the current form (if any), show the new one, and + * update the input type tab selection state. + * + * @param {String} tag + */ switchInputFormTab: function(tag) { // The one that's current isn't current anymore $('.input_form_nav_tab.current').removeClass('current'); @@ -1295,16 +1307,49 @@ var SN = { // StatusNet */ NoticeForm: function() { if ($('body.user_in').length > 0) { - $('.'+SN.C.S.FormNotice).each(function() { + $('.ajax-notice').each(function() { var form = $(this); - SN.U.NoticeLocationAttach(form); - SN.U.FormNoticeXHR(form); - SN.U.FormNoticeEnhancements(form); - SN.U.NoticeDataAttach(form); + SN.Init.NoticeFormSetup(form); + }); + + // Make inline reply forms self-close when clicking out. + $('body').bind('click', function(e) { + var openReplies = $('li.notice-reply'); + if (openReplies.length > 0) { + var target = $(e.target); + openReplies.each(function() { + // Did we click outside this one? + var replyItem = $(this); + if (replyItem.has(e.target).length == 0) { + var textarea = replyItem.find('.notice_data-text:first'); + var cur = $.trim(textarea.val()); + // Only close if there's been no edit. + if (cur == '' || cur == textarea.data('initialText')) { + var parentNotice = replyItem.closest('li.notice'); + replyItem.remove(); + SN.U.NoticeInlineReplyPlaceholder(parentNotice); + } + } + }); + } }); } }, + /** + * Encapsulate notice form setup for a single form. + * Plugins can add extra setup by monkeypatching this + * function. + * + * @param {jQuery} form + */ + NoticeFormSetup: function(form) { + SN.U.NoticeLocationAttach(form); + SN.U.FormNoticeXHR(form); + SN.U.FormNoticeEnhancements(form); + SN.U.NoticeDataAttach(form); + }, + /** * Run setup code for notice timeline views items: * @@ -1313,7 +1358,10 @@ var SN = { // StatusNet */ Notices: function() { if ($('body.user_in').length > 0) { - SN.U.NoticeFavor(); + var masterForm = $('.form_notice:first'); + if (masterForm.length > 0) { + SN.C.I.NoticeFormMaster = document._importNode(masterForm[0], true); + } SN.U.NoticeRepeat(); SN.U.NoticeReply(); SN.U.NoticeInlineReplySetup(); @@ -1330,12 +1378,6 @@ var SN = { // StatusNet */ EntityActions: function() { if ($('body.user_in').length > 0) { - $('.form_user_subscribe').live('click', function() { SN.U.FormXHR($(this)); return false; }); - $('.form_user_unsubscribe').live('click', function() { SN.U.FormXHR($(this)); return false; }); - $('.form_group_join').live('click', function() { SN.U.FormXHR($(this)); return false; }); - $('.form_group_leave').live('click', function() { SN.U.FormXHR($(this)); return false; }); - $('.form_user_nudge').live('click', function() { SN.U.FormXHR($(this)); return false; }); - SN.U.NewDirectMessage(); } }, @@ -1362,6 +1404,16 @@ var SN = { // StatusNet }); }, + /** + * Set up any generic 'ajax' form so it submits via AJAX with auto-replacement. + */ + AjaxForms: function() { + $('form.ajax').live('submit', function() { + SN.U.FormXHR($(this)); + return false; + }); + }, + /** * Add logic to any file upload forms to handle file size limits, * on browsers that support basic FileAPI. @@ -1398,6 +1450,7 @@ var SN = { // StatusNet * don't start them loading until after DOM-ready time! */ $(document).ready(function(){ + SN.Init.AjaxForms(); SN.Init.UploadForms(); if ($('.'+SN.C.S.FormNotice).length > 0) { SN.Init.NoticeForm();