diff --git a/resources/assets/js/focus-creator.js b/resources/assets/js/focus-creator.js index 30e8739c3e6a84246401b54dd569e2c499b2fc3e..f5eea805db4a211889e24bfc0ccccca1d45a7c18 100644 --- a/resources/assets/js/focus-creator.js +++ b/resources/assets/js/focus-creator.js @@ -1,359 +1,65 @@ -$(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); -} diff --git a/resources/assets/js/translations.js b/resources/assets/js/translations.js index d0ca59cbcefc00be097dd56f8e3b9c44905014a6..1d6ce9a98d6929f976c4e91d3f6d555ca5627e09 100644 --- a/resources/assets/js/translations.js +++ b/resources/assets/js/translations.js @@ -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 { diff --git a/resources/assets/less/metager/foki.less b/resources/assets/less/metager/foki.less index f280ae9e9423135e5b43c561b436705f75549345..53d7279892a2a4e5e7245d640d79a607b3be715f 100644 --- a/resources/assets/less/metager/foki.less +++ b/resources/assets/less/metager/foki.less @@ -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; diff --git a/resources/lang/de/result.php b/resources/lang/de/result.php index 833947b5df97e1fba0402cd0bd703ec0f3a8f163..7eec7c55cc387a1c895cb50b84d4bb708f198a06 100644 --- a/resources/lang/de/result.php +++ b/resources/lang/de/result.php @@ -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.', ]; diff --git a/resources/lang/en/result.php b/resources/lang/en/result.php index 7f9b4ee0d19f9ca2b2e9bce61666c087f9f2a108..923e34995a981288887732a33df9394212630eff 100644 --- a/resources/lang/en/result.php +++ b/resources/lang/en/result.php @@ -1,12 +1,14 @@ <?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 diff --git a/resources/lang/es/result.php b/resources/lang/es/result.php index 8e67954d0f7724a0f9b1ace67748ddc6e10694c8..59b01b7125e33a36d87680f899446dbe5eda84b3 100644 --- a/resources/lang/es/result.php +++ b/resources/lang/es/result.php @@ -1,12 +1,14 @@ <?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.' ]; diff --git a/resources/views/layouts/result.blade.php b/resources/views/layouts/result.blade.php index 9e69a0e5c6b157d33c3c3856e37e247a8f5b4a7b..6615b06b2ccc9c6d7273c1cae2e8f742716a0b0c 100644 --- a/resources/views/layouts/result.blade.php +++ b/resources/views/layouts/result.blade.php @@ -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 diff --git a/resources/views/modals/create-focus-modal.blade.php b/resources/views/modals/create-focus-modal.blade.php index 52d81837c9bffede2643b4982ae441d8efdf893f..7a355a3727cb62309059720a1cc9d9811f371a40 100644 --- a/resources/views/modals/create-focus-modal.blade.php +++ b/resources/views/modals/create-focus-modal.blade.php @@ -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">