URSH: prettier-ify JS code

This commit is contained in:
Adrian Moennich 2019-08-20 15:00:40 +02:00
parent 00d1dddfa7
commit ef3d06e637

View File

@ -5,138 +5,146 @@
// them and/or modify them under the terms of the MIT License;
// see the LICENSE file for more details.
import {handleAxiosError, indicoAxios} from 'indico/utils/axios';
/* global $T:false */
import {handleAxiosError, indicoAxios} from 'indico/utils/axios';
const $t = $T.domain('ursh');
function _showTip(element, msg, hideEvent = 'unfocus') {
element.qtip({
content: {
text: msg
},
hide: {
event: hideEvent,
fixed: true,
delay: 700
},
show: {
event: false,
ready: true
}
});
element.qtip({
content: {
text: msg,
},
hide: {
event: hideEvent,
fixed: true,
delay: 700,
},
show: {
event: false,
ready: true,
},
});
}
async function _makeUrshRequest(originalURL) {
const urshEndpoint = '/ursh';
const urshEndpoint = '/ursh';
let response;
try {
response = await indicoAxios.post(urshEndpoint, {
original_url: originalURL,
});
} catch (error) {
handleAxiosError(error);
return;
}
let response;
try {
response = await indicoAxios.post(urshEndpoint, {
original_url: originalURL,
});
} catch (error) {
handleAxiosError(error);
return;
}
return response.data.url;
return response.data.url;
}
function _validateAndFormatURL(url) {
if (!url) {
throw Error($t.gettext('Please fill in a URL to shorten'));
}
if (!url) {
throw Error($t.gettext('Please fill in a URL to shorten'));
}
// if protocol is missing, prepend it
if (url.startsWith(location.hostname)) {
url = `${location.protocol}//${url}`;
}
// if protocol is missing, prepend it
if (url.startsWith(location.hostname)) {
url = `${location.protocol}//${url}`;
}
// regular expression, because I.E. does not like the URL class
// provides minimal validation, leaving the serious job to the server
const re = RegExp(`^([\\d\\w]+:)//([^/ .]+(?:\\.[^/ .]+)*)(/.*)?$`);
const urlTokens = url.match(re);
if (!urlTokens) {
throw Error($t.gettext('This does not look like a valid URL'));
}
// regular expression, because I.E. does not like the URL class
// provides minimal validation, leaving the serious job to the server
const re = RegExp(`^([\\d\\w]+:)//([^/ .]+(?:\\.[^/ .]+)*)(/.*)?$`);
const urlTokens = url.match(re);
if (!urlTokens) {
throw Error($t.gettext('This does not look like a valid URL'));
}
// extract tokens
const hostname = urlTokens[2];
const path = urlTokens[3] ? urlTokens[3] : '/';
// extract tokens
const hostname = urlTokens[2];
const path = urlTokens[3] ? urlTokens[3] : '/';
const protocol = location.protocol; // patch protocol to match server
if (hostname !== location.hostname) {
throw Error($t.gettext('Invalid host: only Indico URLs are allowed'));
}
const protocol = location.protocol; // patch protocol to match server
if (hostname !== location.hostname) {
throw Error($t.gettext('Invalid host: only Indico URLs are allowed'));
}
return `${protocol}//${hostname}${path}`;
return `${protocol}//${hostname}${path}`;
}
function _getUrshInput(input) {
const inputURL = input.val().trim();
input.val(inputURL);
const inputURL = input.val().trim();
input.val(inputURL);
try {
const formattedURL = _validateAndFormatURL(inputURL);
input.val(formattedURL);
return formattedURL;
} catch (err) {
_showTip(input, err.message);
input.focus().select();
return null;
}
try {
const formattedURL = _validateAndFormatURL(inputURL);
input.val(formattedURL);
return formattedURL;
} catch (err) {
_showTip(input, err.message);
input.focus().select();
return null;
}
}
async function _handleUrshPageInput(evt) {
evt.preventDefault();
evt.preventDefault();
const input = $('#ursh-shorten-input');
const originalURL = _getUrshInput(input);
if (originalURL) {
const result = await _makeUrshRequest(originalURL);
if (result) {
const outputElement = $('#ursh-shorten-output');
$('#ursh-shorten-response-form').slideDown();
outputElement.val(result);
outputElement.select();
} else {
_showTip(input, $t.gettext('This does not look like a valid URL'));
input.focus().select();
}
const input = $('#ursh-shorten-input');
const originalURL = _getUrshInput(input);
if (originalURL) {
const result = await _makeUrshRequest(originalURL);
if (result) {
const outputElement = $('#ursh-shorten-output');
$('#ursh-shorten-response-form').slideDown();
outputElement.val(result);
outputElement.select();
} else {
_showTip(input, $t.gettext('This does not look like a valid URL'));
input.focus().select();
}
}
}
async function _handleUrshClick(evt) {
evt.preventDefault();
const originalURL = evt.target.dataset.originalUrl;
const result = await _makeUrshRequest(originalURL);
$(evt.target).copyURLTooltip(result, 'unfocus');
evt.preventDefault();
const originalURL = evt.target.dataset.originalUrl;
const result = await _makeUrshRequest(originalURL);
$(evt.target).copyURLTooltip(result, 'unfocus');
}
function _validateUrshCustomShortcut(shortcut) {
return shortcut.length >= 5;
return shortcut.length >= 5;
}
$(document)
.on('click', '#ursh-shorten-button', _handleUrshPageInput)
.on('keydown', '#ursh-shorten-input', (evt) => {
if (evt.key === 'Enter') {
_handleUrshPageInput(evt);
}
})
.on('click', '.ursh-get', _handleUrshClick)
.on('input', '#ursh-custom-shortcut-input', (evt) => {
const value = $(evt.target).val();
$('#ursh-custom-shortcut-submit-button').prop('disabled', !_validateUrshCustomShortcut(value));
})
.on('mouseenter', '#ursh-custom-shortcut-submit-button', (evt) => {
if (evt.target.disabled) {
_showTip($(evt.target), $t.gettext('Please check that the shortcut is correct'), 'mouseleave');
}
});
.on('click', '#ursh-shorten-button', _handleUrshPageInput)
.on('keydown', '#ursh-shorten-input', evt => {
if (evt.key === 'Enter') {
_handleUrshPageInput(evt);
}
})
.on('click', '.ursh-get', _handleUrshClick)
.on('input', '#ursh-custom-shortcut-input', evt => {
const value = $(evt.target).val();
$('#ursh-custom-shortcut-submit-button').prop('disabled', !_validateUrshCustomShortcut(value));
})
.on('mouseenter', '#ursh-custom-shortcut-submit-button', evt => {
if (evt.target.disabled) {
_showTip(
$(evt.target),
$t.gettext('Please check that the shortcut is correct'),
'mouseleave'
);
}
});
$(document).ready(() => {
// keep dropdown menu open when clicking on an entry
$('.ursh-dropdown').next('ul').find('li a').on('menu_select', () => true);
// keep dropdown menu open when clicking on an entry
$('.ursh-dropdown')
.next('ul')
.find('li a')
.on('menu_select', () => true);
});