X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/43ce98844279dacea6c81d671e275063540e4992..e3641b9e658a4ff9797bf1a523dea032e7450656:/forum/skins/default/media/js/osqa.main.js?ds=sidebyside diff --git a/forum/skins/default/media/js/osqa.main.js b/forum/skins/default/media/js/osqa.main.js index b52fd61..8fb4d63 100644 --- a/forum/skins/default/media/js/osqa.main.js +++ b/forum/skins/default/media/js/osqa.main.js @@ -1,3 +1,32 @@ +/** + * We do not want the CSRF protection enabled for the AJAX post requests, it causes only trouble. + * Get the csrftoken cookie and pass it to the X-CSRFToken HTTP request property. + */ + +$('html').ajaxSend(function(event, xhr, settings) { + function getCookie(name) { + var cookieValue = null; + if (document.cookie && document.cookie != '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) == (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } + try { + if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { + // Only send the token to relative URLs i.e. locally. + xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); + } + } catch (e) {} +}); + var response_commands = { refresh_page: function() { window.location.reload(true) @@ -71,7 +100,11 @@ var response_commands = { }); }, - insert_comment: function(post_id, comment_id, comment, username, profile_url, delete_url, edit_url) { + award_points: function(id) { + alert('ok'); + }, + + insert_comment: function(post_id, comment_id, comment, username, profile_url, delete_url, edit_url, convert_url, can_convert) { var $container = $('#comments-container-' + post_id); var skeleton = $('#new-comment-skeleton-' + post_id).html().toString(); @@ -80,10 +113,16 @@ var response_commands = { .replace(new RegExp('%USERNAME%', 'g'), username) .replace(new RegExp('%PROFILE_URL%', 'g'), profile_url) .replace(new RegExp('%DELETE_URL%', 'g'), delete_url) - .replace(new RegExp('%EDIT_URL%', 'g'), edit_url); + .replace(new RegExp('%EDIT_URL%', 'g'), edit_url) + .replace(new RegExp('%CONVERT_URL%', 'g'), convert_url); $container.append(skeleton); + // Show the convert comment to answer tool only if the current comment can be converted + if (can_convert == true) { + $('#comment-' + comment_id + '-convert').show(); + } + $('#comment-' + comment_id).slideDown('slow'); }, @@ -95,12 +134,12 @@ var response_commands = { }, mark_deleted: function(post_type, post_id) { - if (post_type == 'answer') { - var $answer = $('#answer-container-' + post_id); - $answer.addClass('deleted'); - } else { + if (post_type == 'question') { var $container = $('#question-table'); $container.addClass('deleted'); + } else { + var $el = $('#' + post_type + '-container-' + post_id); + $el.addClass('deleted'); } }, @@ -120,6 +159,9 @@ var response_commands = { set_subscription_status: function(text) { $('.subscription-status').html(text); + }, + + copy_url: function(url) { } } @@ -141,11 +183,17 @@ function show_dialog (extern) { yes_callback: default_close_function, no_text: messages.cancel, show_no: false, - close_on_clickoutside: false + close_on_clickoutside: false, + copy: false } $.extend(options, extern); + var copy_id = ''; + if (options.copy) { + copy_id = ' id="copy_clip_button"' + } + if (options.event != undefined) { options.pos = {x: options.event.pageX, y: options.event.pageY}; } @@ -157,8 +205,7 @@ function show_dialog (extern) { html += ''; } - html += '' - + ''; + html += '' + ''; $dialog = $(html); $('body').append($dialog); @@ -184,10 +231,29 @@ function show_dialog (extern) { top: options.pos.y, left: options.pos.x }); - + + top_position_change = (options.dim.h / 2) + left_position_change = (options.dim.w / 2) + + new_top_position = options.pos.y - top_position_change + new_left_position = options.pos.x - left_position_change + + if (new_left_position < 0) { + left_position_change = 0 + } + if (($(window).scrollTop() - new_top_position) > 0) { + top_position_change = 0 + } + if ((options.event.pageY + options.dim.h) > ($(window).height() + $(window).scrollTop())) { + top_position_change = options.dim.h + } + if ((options.event.pageX + options.dim.w) > ($(window).width() + $(window).scrollLeft())) { + left_position_change = options.dim.w + } + $dialog.animate({ - top: "-=" + (options.dim.h / 2), - left: "-=" + (options.dim.w / 2), + top: "-=" + top_position_change, + left: "-=" + left_position_change, width: options.dim.w, height: options.dim.h }, 200, function() { @@ -245,7 +311,12 @@ function load_prompt(evt, el, url) { process_ajax_response(data, evt); }, 'json'); }, - show_no: true + show_no: true, + copy: false + } + + if (el.hasClass('copy')) { + $.extend(doptions, { yes_text : 'Copy', copy: true}); } if (!el.is('.centered')) { @@ -260,9 +331,12 @@ function process_ajax_response(data, evt, callback) { if (!data.success && data['error_message'] != undefined) { show_message(evt, data.error_message, function() {if (callback) callback(true);}); end_command(false); - } else if (typeof data['commands'] != undefined){ + } + if (typeof data['commands'] != undefined){ for (var command in data.commands) { response_commands[command].apply(null, data.commands[command]) + + } if (data['message'] != undefined) { @@ -294,23 +368,47 @@ function end_command(success) { } } +var comment_box_cursor_position = 0; +function canned_comment(post_id, comment) { + textarea = $('#comment-' + post_id + '-form textarea') + + // Get the text from the beginning to the caret + textarea_start = textarea.val().substr(0, comment_box_cursor_position) + + // Get the text from the caret to the end + textarea_end = textarea.val().substr(comment_box_cursor_position, textarea.val().length) + + textarea.val(textarea_start + comment + textarea_end); +} + $(function() { + $('textarea.commentBox').bind('keydown keyup mousedown mouseup mousemove', function(evt) { + comment_box_cursor_position = $(this).caret().start; + }); + + $('textarea.commentBox').blur(function() { + //alert(comment_box_cursor_position); + }); + $('a.ajax-command').live('click', function(evt) { if (running) return false; - $('.context-menu-dropdown').slideUp('fast'); - var el = $(this); + var ajax_url = el.attr('href') + ajax_url = ajax_url + "?nocache=" + new Date().getTime() + + $('.context-menu-dropdown').slideUp('fast'); + if (el.is('.withprompt')) { - load_prompt(evt, el, el.attr('href')); + load_prompt(evt, el, ajax_url); } else if(el.is('.confirm')) { var doptions = { html: messages.confirm, extra_class: 'confirm', yes_callback: function() { start_command(); - $.getJSON(el.attr('href'), function(data) { + $.getJSON(ajax_url, function(data) { process_ajax_response(data, evt); $dialog.fadeOut('fast', function() { $dialog.remove(); @@ -328,7 +426,7 @@ $(function() { var $dialog = show_dialog(doptions); } else { start_command(); - $.getJSON(el.attr('href'), function(data) { + $.getJSON(ajax_url, function(data) { process_ajax_response(data, evt); }); } @@ -512,6 +610,14 @@ $(function() { return false; }); + // Submit comment with CTRL + Enter + $textarea.keydown(function(e) { + if (e.ctrlKey && e.keyCode == 13 && !$button.attr('disabled')) { + // console.log('submit'); + $(this).parent().find('input.comment-submit').click(); + } + }); + $cancel.click(function(event) { if (confirm("You will lose all of your changes in this comment. Do you still wish to proceed?")){ if (comment_in_form) { @@ -537,8 +643,8 @@ $(function() { var $previewer = $('#previewer'); var $container = $('#editor-metrics'); - var initial_whitespace_rExp = /^[^A-Za-z0-9]+/gi; - var non_alphanumerics_rExp = rExp = /[^A-Za-z0-9]+/gi; + var initial_whitespace_rExp = /^[^A-Za-zА-Яа-я0-9]+/gi; + var non_alphanumerics_rExp = rExp = /[^A-Za-zА-Яа-я0-9]+/gi; var editor_interval = null; $editor.focus(function() { @@ -655,9 +761,9 @@ function pickedTags(){ tag_link.attr('rel','tag'); tag_link.attr('href', scriptUrl + $.i18n._('tags/') + tagname + '/'); tag_link.html(tagname); - var del_link = $(''); + var del_link = $(''); del_link.addClass('delete-icon'); - del_link.attr('src', mediaUrl('/media/images/close-small-dark.png')); + del_link.attr('src', mediaUrl('media/images/close-small-dark.png')); setupTagDeleteEvents(del_link, to_target, tagname, reason, true); @@ -894,8 +1000,8 @@ var i18nZh = { 'please confirm offensive':"??????????????????????", 'anonymous users cannot flag offensive posts':'???????????', 'cannot flag message as offensive twice':'???????', - 'flag offensive cap exhausted':'?????????????5?‘??’???', - 'need >15 points to report spam':"??+15??????‘???’?", + 'flag offensive cap exhausted':'?????????????5?‘??’???', + 'need >15 points to report spam':"??+15??????‘???’?", 'confirm delete':"?????/????????", 'anonymous users cannot delete/undelete':"???????????????", 'post recovered':"?????????????", @@ -973,8 +1079,8 @@ var i18nEs = { 'insufficient privilege':'privilegio insuficiente', 'cannot pick own answer as best':'no puede escoger su propia respuesta como la mejor', 'anonymous users cannot select favorite questions':'usuarios anonimos no pueden seleccionar', - 'please login':'por favor inicie sesión', - 'anonymous users cannot vote':'usuarios anónimos no pueden votar', + 'please login':'por favor inicie sesión', + 'anonymous users cannot vote':'usuarios anónimos no pueden votar', '>15 points requried to upvote': '>15 puntos requeridos para votar positivamente', '>100 points required to downvote':'>100 puntos requeridos para votar negativamente', 'please see': 'por favor vea', @@ -982,31 +1088,31 @@ var i18nEs = { 'daily vote cap exhausted':'cuota de votos diarios excedida', 'cannot revoke old vote':'no puede revocar un voto viejo', 'please confirm offensive':"por favor confirme ofensiva", - 'anonymous users cannot flag offensive posts':'usuarios anónimos no pueden marcar publicaciones como ofensivas', + 'anonymous users cannot flag offensive posts':'usuarios anónimos no pueden marcar publicaciones como ofensivas', 'cannot flag message as offensive twice':'no puede marcar mensaje como ofensivo dos veces', 'flag offensive cap exhausted':'cuota para marcar ofensivas ha sido excedida', 'need >15 points to report spam':"necesita >15 puntos para reportar spam", - 'confirm delete':"¿Está seguro que desea borrar esto?", - 'anonymous users cannot delete/undelete':"usuarios anónimos no pueden borrar o recuperar publicaciones", - 'post recovered':"publicación recuperada", - 'post deleted':"publicación borrada?", + 'confirm delete':"¿Está seguro que desea borrar esto?", + 'anonymous users cannot delete/undelete':"usuarios anónimos no pueden borrar o recuperar publicaciones", + 'post recovered':"publicación recuperada", + 'post deleted':"publicación borrada?", 'add comment':'agregar comentario', - 'community karma points':'reputación comunitaria', - 'to comment, need':'para comentar, necesita reputación', + 'community karma points':'reputación comunitaria', + 'to comment, need':'para comentar, necesita reputación', 'delete this comment':'borrar este comentario', 'hide comments':"ocultar comentarios", 'add a comment':"agregar comentarios", 'comments':"comentarios", - 'confirm delete comment':"¿Realmente desea borrar este comentario?", + 'confirm delete comment':"¿Realmente desea borrar este comentario?", 'characters':'caracteres faltantes', 'can write':'tiene ', 'click to close':'haga click para cerrar', 'loading...':'cargando...', - 'tags cannot be empty':'las etiquetas no pueden estar vacías', + 'tags cannot be empty':'las etiquetas no pueden estar vacías', 'tablimits info':"hasta 5 etiquetas de no mas de 20 caracteres cada una", - 'content cannot be empty':'el contenido no puede estar vacío', + 'content cannot be empty':'el contenido no puede estar vacío', 'content minchars': 'por favor introduzca mas de {0} caracteres', - 'please enter title':'por favor ingrese un título', + 'please enter title':'por favor ingrese un título', 'title minchars':"por favor introduzca al menos {0} caracteres", 'delete':'borrar', 'undelete': 'recuperar', @@ -1045,7 +1151,7 @@ var i18n_dict = i18n[i18nLang]; /* * Autocomplete - jQuery plugin 1.0.3 * - * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer + * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php