Commit 57311cd3 authored by Phil Höfer's avatar Phil Höfer

Merge branch '688' into 'development'

688

Closes #688

See merge request !1193
parents 5a16b41b 9e991119
$(function () {
setFocusCreatorActionListeners();
loadInitialCustomFocuses();
loadInitialSelectedFocus();
focusChanged();
$(function() {
setLabelText();
setKeyListeners();
setDropdownListeners();
});
/**
* Sets all action listeners for this page
*/
function setFocusCreatorActionListeners () {
$('.focusCheckbox').click(checkboxCheckListener);
$('#addFocusBtn').click(() => showFocusCreateDialog(''));
$('#editFocusBtn').click(editCurrentFocus);
$('.save-focus-btn').click(saveFocus);
$('.delete-focus-btn').click(deleteFocus);
$('#focus-select').change(focusChanged);
// Save Focus on clicking enter while in the focus name input
$('#focus-name').keyup(function (event) {
if (event.keyCode == 13) {
saveFocus();
}
});
$('#create-focus-modal').on('shown.bs.modal', function () {
$('#focus-name').focus();
});
}
/**
* Loads all the custom focuses stored in local storage
*/
function loadInitialCustomFocuses () {
for (var key in localStorage) {
if (key.startsWith('focus_')) {
var focus = loadFocusById(key);
addFocus(focus.name);
}
}
}
function loadInitialSelectedFocus () {
setFocus(getFocusInUrl());
}
/**
* Shows the focus create dialog
* If an id is given it will try to load a focus for the given id
*/
function showFocusCreateDialog (id) {
if (id === undefined) {
id = '';
}
document.getElementById('original-id').value = id;
$('#create-focus-modal').modal('show');
var storedFocus = loadFocusById(id);
var focus = {};
// Try to load a focus for the given id
$('#focus-name').val('');
uncheckAll();
if (storedFocus !== null) {
try {
focus = JSON.parse(localStorage.getItem(id));
$('#focus-name').val(focus.name);
for (var key in focus) {
if (key.startsWith('engine_')) {
$('.focusCheckbox[name=' + key + ']').prop('checked', true);
}
function setKeyListeners() {
$(document).keydown(function(event) {
if ($("input#show-create-focus").is(":checked")) {
if (event.keyCode == 27) {
$("input#show-create-focus").prop("checked", false);
} else if (event.keyCode == 13) {
$("#customSearchForm").submit();
}
} catch (ex) {
console.error(ex);
}
}
toggleDeleteButton();
}
/**
* Shows the focus create dialog for a given id
*/
function showFocusEditDialog (id) {
showFocusCreateDialog(id);
}
function getCurrentFocus () {
return $('#foki > div.active').attr('id');
}
/**
* Shows an edit dialog for the current selected focus
*/
function editCurrentFocus () {
var currentFocus = getCurrentFocus();
if (currentFocus !== undefined) {
showFocusEditDialog(currentFocus);
}
}
/**
* Shows/Hides the delete button if (no) checkboxes are selected
*/
function toggleDeleteButton () {
if (atLeastOneChecked()) {
$('.delete-focus-btn').show();
} else {
$('.delete-focus-btn').hide();
}
}
/**
* Save the current Focus
* Listens for save button
*/
function saveFocus () {
/* Vorprüfungen */
// Falls keine Suchmaschine ausgewählt wurde
if (!atLeastOneChecked()) {
switch (document.documentElement.lang) {
case 'en':
alert('Please select at least 1 search engine.');
break;
case 'es':
alert('Por favor, seleccione al menos un motor de búsqueda.');
break;
default:
alert('Bitte mindestens 1 Suchmaschine auswählen.');
break;
}
return;
}
// Falls der Name zu kurz ist oder ungültige Zeichen enthält
var name = document.getElementById('focus-name').value;
if (!isValidName(name)) {
switch (document.documentElement.lang) {
case 'en':
alert('No characters other than a-z, A-Z, 0-9, ä, ö, ü, ß, -, _ allowed, at least 1 character');
break;
case 'es':
alert('Por favor, introduzca un nombre válido');
break;
default:
alert('Bitte gültigen Namen eingeben:\n* Keine Sonderzeichen\n* Mindestens 1 Buchstabe\n');
break;
}
return;
}
// Liest die original-id des aktuellen fokus-dialogs (gesetzt wenn man einen Fokus bearbeitet)
var oldId = document.getElementById('original-id').value;
var id = getIdFromName(name);
var overwrite = true;
// Wenn bereits ein Fokus mit dem Namen existiert, man diesen aber nicht editiert sondern gerade einen Neuen erstellt
if (alreadyInUse(name) && oldId !== id) {
// Fragt den Nutzer ob er den Fokus überschreiben möchte
if (!confirm('Name bereits genutzt\nüberschreiben?')) {
// Falls nicht wird das Speichern abgebrochen
return;
}
// Ansonsten wird der andere Fokus gelöscht
deleteFocusById(id);
}
/* Fokus speichern */
var focus = {};
// Ausgewählte Suchmaschinen lesen und zu Fokus hinzufügen
$('input[type=checkbox]:checked').each(function (el) {
focus[$(this).attr('name')] = $(this).val();
});
// Name setzen
focus['name'] = name;
// Alte Version des Fokus löschen (aus localStorage und von der Webseite, falls eine existiert)
if (oldId !== '') {
localStorage.removeItem(oldId);
removeFocusById(oldId);
}
// Neue Version des Fokus hinzufügen (zu localStorage und der Webseite)
localStorage.setItem(id, JSON.stringify(focus));
addFocus(name);
setFocus(id);
// Fokus-Formular verbergen
$('#create-focus-modal').modal('hide');
}
/**
* Delete current Focus
* Listens for delete button
*/
function deleteFocusById (id) {
localStorage.removeItem(id);
removeFocusById(id);
$('#focus-select').change();
}
/**
* Delete current Focus
* Listens for delete button
*/
function deleteFocus () {
var oldId = document.getElementById('original-id').value;
deleteFocusById(oldId);
$('#create-focus-modal').modal('hide');
$('#focus-select').change();
}
/**
* Is the name valid (in terms of characters)?
*/
function isValidName (name) {
// no Characters other then a-z, A-Z, 0-9, ä, ö, ü, ß, -, _ allowed
// at least 1 character
return /^[a-zA-Z0-9äöüß\-_ ]+$/.test(name);
}
/**
* Is at least one focus selected?
*/
function atLeastOneChecked () {
return $('.focusCheckbox:checked').length > 0;
}
/**
* Is there already a focus with this name?
*/
function alreadyInUse (name) {
return localStorage.hasOwnProperty(getIdFromName(name));
}
/**
* Adds an option to the focus selector
*/
function addFocus (name) {
var id = getIdFromName(name);
var customFocus = $('<div id="' + id + '"><a href="#" target="_self">' + name + '</a><a class="edit-focus" data-id="' + id + '" href="#"><i class="fa fa-wrench"></i></div>');
$(customFocus).find('.edit-focus').click(function () {
showFocusEditDialog($(this).attr('data-id'));
function setDropdownListeners() {
// Listener for 'Open/Collapse all' label
$("input:checkbox#toggle-dropdowns").change(function() {
if ($(this).is(":checked")) {
// Open all dropdowns
$(".focus-dropdown-toggle").prop("checked", true);
} else {
// Close all dropdowns
$(".focus-dropdown-toggle").prop("checked", false);
}
setLabelText();
});
$('#foki .search-option-frame').before(customFocus);
}
/**
* Remove the focuses html-elements
*/
function removeFocus (name) {
removeFocusById(getIdFromName(name));
}
/**
* Remove the focuses html-elements
*/
function removeFocusById (id) {
if (id == '') {
return;
}
$('#focus-select option[value="' + id + '"]').remove();
}
/**
* Turns a name into an id
* Converts special characters and spaces
*/
function getIdFromName (name) {
name = name.toLowerCase();
name = name.split(' ').join('_');
name = name.split('ä').join('ae');
name = name.split('ö').join('oe');
name = name.split('ü').join('ue');
return 'focus_' + name;
}
/**
* Loads the focus object for the given id from local storage
*/
function loadFocusById (id) {
return JSON.parse(localStorage.getItem(id));
}
/**
* Unchecks all focuses from the focus creator dialog
*/
function uncheckAll () {
$('.focusCheckbox').prop('checked', false);
}
/**
* Sets the selected focus to default
*/
function setFocusToDefault () {
setFocus(DEFAULT_FOCUS);
}
/**
* Sets the selected focus
* @param {String} focusID The id of the focus, without #
*/
function setFocus (focusID) {
$('#focus-select option[value="' + focusID + '"]').prop('selected', true);
$('#focus-select').change();
}
function focusChanged () {
var selectedFocus = getCurrentFocus();
if (typeof(currentFocus) !== 'undefined') {
if (focusIsEditable(selectedFocus)) {
enableEditFocusBtn();
// Change 'Open/Collapse' all when single dropdown is changed
$(".focus-dropdown-toggle").change(function() {
var expanded = false;
$(".focus-dropdown-toggle").each(function() {
if ($(this).is(":checked")) {
expanded = true;
}
});
if (expanded === true) {
$("input:checkbox#toggle-dropdowns").prop("checked", true);
} else {
disableEditFocusBtn();
$("input:checkbox#toggle-dropdowns").prop("checked", false);
}
loadFocusForSearch(selectedFocus);
}
setLabelText();
});
}
function focusIsEditable (focus) {
if (focus.startsWith('focus_')) {
return true;
//
// Adjusts the 'Open/Colapse all' label
function setLabelText() {
if ($("input:checkbox#toggle-dropdowns").is(":checked")) {
$("#toggle-dropdowns-label").html(
t("close-dropdowns") +
' <i class="fa fa-minus-square" aria-hidden="true"></i>'
);
} else {
return false;
}
}
function enableEditFocusBtn () {
$('#editFocusBtn').removeClass('disabled').click(editCurrentFocus);
}
function disableEditFocusBtn () {
$('#editFocusBtn').addClass('disabled').off('click');
}
function loadFocusForSearch (focus) {
var focus = loadFocusById(focus);
var url = '/meta/meta.ger3?eingabe=x&focus=';
// clearCustomSearch()
for (var key in focus) {
if (key.startsWith('engine_') && focus[key] == 'on') {
addSumaToCustomSearch(key);
}
}
}
function getFocusInUrl () {
var url = window.location;
var focReg = /focus=(focus_\w+)/.exec(url);
if (focReg && focReg[1]) {
return focReg[1];
$("#toggle-dropdowns-label").html(
t("open-dropdowns") +
' <i class="fa fa-plus-square" aria-hidden="true"></i>'
);
}
}
function checkboxCheckListener (event) {
toggleDeleteButton();
var elem = event.target;
if (elem.name) {
if (elem.checked) {
setCheckedForAllWithName(elem.name, true);
} else {
setCheckedForAllWithName(elem.name, false);
}
}
}
function setCheckedForAllWithName (name, checked) {
$('.focusCheckbox[name=' + name + ']').prop('checked', checked);
}
......@@ -21,7 +21,9 @@ var translations = {
'result-saver.deleteAll': '<span class="hidden-xs">Ergebnisse</span> löschen</button>',
'result-saver.save.this': 'ÖFFNEN',
'result-saver.save.newtab': 'IN NEUEM TAB',
'result-saver.save.anonymous': 'ANONYM ÖFFNEN'
'result-saver.save.anonymous': 'ANONYM ÖFFNEN',
'close-dropdowns' : 'Alle zuklappen',
'open-dropdowns' : 'Alle aufklappen'
},
'en': {
......@@ -39,7 +41,9 @@ var translations = {
'result-saver.deleteAll': 'delete <span class="hidden-xs">results</span>',
'result-saver.save.this': 'OPEN',
'result-saver.save.newtab': 'IN NEW TAB',
'result-saver.save.anonymous': 'OPEN ANONYMOUSLY'
'result-saver.save.anonymous': 'OPEN ANONYMOUSLY',
'close-dropdowns' : 'Collapse all',
'open-dropdowns' : 'Expand all'
},
'es': {
......@@ -64,7 +68,7 @@ var translations = {
function t (key, lang) {
if (arguments.length == 1) {
var lang = $('html').attr('lang');
return translations[lang][key];
return t(key, lang);
} else if (arguments.length == 2 && translations[lang] && translations[lang][key]) {
return translations[lang][key];
} else {
......
......@@ -12,8 +12,8 @@
display: none;
position: fixed;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
-ms-flex-pack: center;
justify-content: center;
min-height: 100%;
width: 100%;
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .7)), to(rgba(0, 0, 0, .7)));
......@@ -39,6 +39,13 @@
}
}
}
#toggle-dropdowns-label {
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.focus-dropdown-toggle {
display: none;
&:not(:checked) {
......@@ -49,15 +56,17 @@
}
&:checked {
&~.focus-dropdown-label::after {
content: "🡡";
content: "";
}
}
}
.focus-dropdown-label {
cursor: pointer;
&::after {
font-size: 16px;
content: "🡣";
content: "";
margin-left: 3px;
vertical-align: middle;
}
&~.row {
-webkit-transition: max-height 0.4s ease;
......
......@@ -7,6 +7,8 @@ return [
'options.2' => ':host ausblenden',
'options.3' => '*.:domain ausblenden',
'options.4' => 'Partnershop',
'options.5' => 'anonym öffnen',
'options.5' => 'ANONYM ÖFFNEN',
'options.6' => 'IN NEUEM TAB ÖFFNEN',
'options.7' => 'ÖFFNEN',
'proxytext' => 'Der Link wird anonymisiert geöffnet. Ihre Daten werden nicht zum Zielserver übertragen. Möglicherweise funktionieren manche Webseiten nicht wie gewohnt.',
];
<?php
return [
"options.headline" => "Options",
"options.savetab" => "Save result in TAB",
"options.1" => "start a new search on this domain",
"options.2" => "hide :host",
"options.3" => "hide *.:domain",
"options.4" => "partnershop",
"options.5" => "open anonymously",
"proxytext" => "Result link is opened anonymously. Your data will not be transfered to destination servers. Eventually some links will not work as usual."
'options.headline' => 'Options',
'options.savetab' => 'Save result in TAB',
'options.1' => 'start a new search on this domain',
'options.2' => 'hide :host',
'options.3' => 'hide *.:domain',
'options.4' => 'partnershop',
'options.5' => 'OPEN ANONYMOUSLY',
'options.6' => 'OPEN IN NEW TAB',
'options.7' => 'OPEN',
'proxytext' => 'Result link is opened anonymously. Your data will not be transfered to destination servers. Eventually some links will not work as usual.'
];
\ No newline at end of file
<?php
return [
"options.headline" => "Opciónes",
"options.savetab" => "Grabar resultado",
"options.1" => "Nueva búsqueda en este dominio",
"options.2" => "ocultar :host",
"options.3" => "ocultar *.:domain",
"options.4" => "Tienda asociada",
"options.5" => "abrir anónimo",
"proxytext" => "Abrirá el link anonimizado."
'options.headline' => 'Opciónes',
'options.savetab' => 'Grabar resultado',
'options.1' => 'Nueva búsqueda en este dominio',
'options.2' => 'ocultar :host',
'options.3' => 'ocultar *.:domain',
'options.4' => 'Tienda asociada',
'options.5' => 'ABRIR ANÓNIMO',
'options.6' => 'ABRIR NUEVA PESTAÑA',
'options.7' => 'ABRIR',
'proxytext' => 'Abrirá el link anonimizado.'
];
......@@ -50,13 +50,13 @@
</div>
<div class="result-footer">
<a class="result-open" href="{{ $result->link }}" target="_self" rel="noopener">
ÖFFNEN
{!! trans('result.options.7') !!}
</a>
<a class="result-open-newtab" href="{{ $result->link }}" target="_blank" rel="noopener">
IN NEUEM TAB
{!! trans('result.options.6') !!}
</a>
<a class="result-open-proxy" onmouseover="$(this).popover('show');" onmouseout="$(this).popover('hide');" data-toggle="popover" data-placement="auto right" data-container="body" data-content="@lang('result.proxytext')" href="{{ $result->proxyLink }}" target="{{ $metager->getNewtab() }}" rel="noopener">
ANONYM ÖFFNEN
{!! trans('result.options.5') !!}
</a>
<label class="open-result-options" for="result-toggle-{{$result->number}}" role="button">
MEHR
......
......@@ -17,6 +17,8 @@
</div>
</div>
<div class="modal-body">
<input type="checkbox" class="hidden" id="toggle-dropdowns" checked>
<label id="toggle-dropdowns-label" for="toggle-dropdowns" class="js-only"></label>
<form id="customSearchForm" method="GET" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/meta/meta.ger3 ") }}" accept-charset="UTF-8">
<input type="hidden" name="eingabe" value="@if(isset($eingabe)){{$eingabe}}@endif">
<input type="hidden" name="encoding" value="utf8">
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment