1let captchaFeedbackSent = false; 2 3$('#show-feedback').on('click', function () { 4 let feedbackContainer = $('.captcha-feedback-container'); 5 if (feedbackContainer.html()) { 6 feedbackContainer.empty(); 7 feedbackContainer.hide(); 8 } else { 9 createCaptchaFeedbackForm('.captcha-feedback-container'); 10 feedbackContainer.show(); 11 } 12}); 13 14function createCaptchaFeedbackForm(feedbackContainerSelector) { 15 let feedbackContainer = $(feedbackContainerSelector); 16 feedbackContainer.append('<i name="close-feedback-form" class="mwicon-x float-right cursor-pointer"></i>'); 17 feedbackContainer.append( 18 `<label for="email">${_lang('feedback.input.email')}<span class="warning">*</span></label>` 19 ); 20 feedbackContainer.append('<input class="form-control" type="text" id="email"/>'); 21 feedbackContainer.append(`<label for="name">${_lang('general.name')}<span class="warning">*</span></label>`); 22 feedbackContainer.append('<input class="form-control" type="text" id="name">'); 23 feedbackContainer.append( 24 `<label for="description">${_lang('general.description')}<span class="warning">*</span></label>` 25 ); 26 feedbackContainer.append('<textarea class="form-control" id="description" rows="5"></textarea>'); 27 feedbackContainer.append(`<button class="btn btn-primary" id="send-feedback">${_lang('general.send')}</button>`); 28 feedbackContainer.append( 29 `<button class="btn btn-secondary" name="close-feedback-form">${_lang('general.cancel')}</button>` 30 ); 31 32 $('[name="close-feedback-form"]').on('click', function () { 33 feedbackContainer.empty(); 34 feedbackContainer.hide(); 35 }); 36 37 $('#send-feedback').on('click', function () { 38 if (captchaFeedbackSent) { 39 return; 40 } 41 42 captchaFeedbackSent = true; 43 $.post('api/v1/captcha-feedback', { 44 email: $('#email').val().trim(), 45 name: $('#name').val().trim(), 46 description: $('#description').val(), 47 consoleErrors: JSON.stringify(consoleErrors), 48 currentUrl: window.location.href, 49 }) 50 .then((response) => { 51 const dialogMessage = `${_lang('feedback.feedback_sent_new')}<br>${_lang('feedback.new_feedback_id')} <b>${response.feedback_id}</b>`; 52 BootstrapDialog.show({ 53 type: BootstrapDialog.TYPE_SUCCESS, 54 draggable: true, 55 closable: false, 56 title: _lang('feedback.page_title'), 57 message: $(`<div>${dialogMessage}</div>`), 58 buttons: [ 59 { 60 label: _lang('general.ok'), 61 cssClass: 'btn-success pull-right', 62 action: function (dialog) { 63 dialog.close(); 64 feedbackContainer.empty(); 65 feedbackContainer.hide(); 66 captchaFeedbackSent = false; 67 }, 68 }, 69 ], 70 }); 71 }) 72 .fail((errorResponse) => { 73 const presentErrorMessageContainer = $('div.error-message-container'); 74 let errorMessageContainer = 75 presentErrorMessageContainer.length > 0 76 ? presentErrorMessageContainer 77 : $('<div class="error-message-container alert alert-danger"></div>'); 78 errorMessageContainer.empty(); 79 if (errorResponse.hasOwnProperty('responseJSON')) { 80 const errorMessages = errorResponse.responseJSON.error; 81 errorMessageContainer.html(errorMessages.join('<br>')); 82 } 83 feedbackContainer.append(errorMessageContainer); 84 captchaFeedbackSent = false; 85 }); 86 }); 87}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.