diff --git a/controller/translationcontroller.php b/controller/translationcontroller.php index 2e293b33..e7e4ec55 100644 --- a/controller/translationcontroller.php +++ b/controller/translationcontroller.php @@ -420,6 +420,19 @@ class TranslationController extends ApiController { 'share.page.link_loading' => $this->trans->t('Loading…'), 'expired.share' => $this->trans->t('Awwhh… credential not found. Maybe it expired'), + //searchboxexpanderservice + 'search.settings.input.label' => $this->trans->t('Label'), + 'search.settings.input.username' => $this->trans->t('Username'), + 'search.settings.input.email' => $this->trans->t('email'), + 'search.settings.input.custom_fields' => $this->trans->t('Custom Fields'), + 'search.settings.input.password' => $this->trans->t('Password'), + 'search.settings.input.description' => $this->trans->t('Description'), + 'search.settings.input.url' => $this->trans->t('Url'), + + 'search.settings.title' => $this->trans->t('Custom Search:'), + 'search.settings.defaults_button' => $this->trans->t('Revert to defaults'), + + ); return new JSONResponse($translations); } diff --git a/js/app/controllers/credential.js b/js/app/controllers/credential.js index 0ad511aa..ff9f881a 100644 --- a/js/app/controllers/credential.js +++ b/js/app/controllers/credential.js @@ -328,8 +328,11 @@ }; //searchboxfix - $scope.$on('nc_searchbox', function(event, args) { + $scope.$on('nc_searchbox', function(event, args, fields) { $scope.filterOptions.filterText=args; + if(fields){ + $scope.filterOptions.fields=fields; + } }); $scope.filtered_credentials = []; diff --git a/js/app/controllers/menu.js b/js/app/controllers/menu.js index fdb3a208..0c1ed6b2 100644 --- a/js/app/controllers/menu.js +++ b/js/app/controllers/menu.js @@ -31,8 +31,8 @@ * Controller of the passmanApp */ angular.module('passmanApp') - .controller('MenuCtrl', ['$scope', 'VaultService', '$location', '$rootScope', 'TagService','SettingsService', '$translate', - function ($scope, VaultService, $location, $rootScope, TagService, SettingsService, $translate) { + .controller('MenuCtrl', ['$scope', 'VaultService', '$location', '$rootScope', 'TagService','SettingsService', '$translate', 'SearchboxexpanderService', + function ($scope, VaultService, $location, $rootScope, TagService, SettingsService, $translate, SearchboxexpanderService) { $rootScope.logout = function () { //see vault.js:54 $rootScope.override_default_vault=true; @@ -124,28 +124,8 @@ } }; - //searchboxfix - var native_search = document.getElementById("searchbox"); - if(native_search !== null){ - native_search.nextElementSibling.addEventListener('click', function (e) { - $scope.$apply(function () { - $rootScope.$broadcast('nc_searchbox',""); - }); - }); - native_search.classList.remove('hidden'); - native_search.addEventListener('keypress', function (e) { - if(e.keyCode === 13){ - e.preventDefault(); - } - }); - - native_search.addEventListener('keyup', function (e) { - $scope.$apply(function () { - $rootScope.$broadcast('nc_searchbox',native_search.value); - }); - }); - } + SearchboxexpanderService.expandSearch($rootScope, $scope); $scope.clickedNavigationItem="all"; diff --git a/js/app/services/searchboxexpanderservice.js b/js/app/services/searchboxexpanderservice.js new file mode 100644 index 00000000..20e76e36 --- /dev/null +++ b/js/app/services/searchboxexpanderservice.js @@ -0,0 +1,199 @@ +/** + * Nextcloud - passman + * + * @copyright Copyright (c) 2019, Felix Nüsse (felix.nuesse@t-online.de) + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +(function () { + 'use strict'; + /** + * @ngdoc service + * @name passmanApp.SearchboxexpanderService + * @description + * # SearchboxexpanderService + * Service in the passmanApp. + */ + angular.module('passmanApp') + .service('SearchboxexpanderService', ['SettingsService', '$translate', function (SettingsService, $translate) { + + var defaults = {'label':true, 'username':true, 'email':true, 'custom_fields':true, 'password':false, 'description':false, 'url':false}; + var native_search = document.getElementById("searchbox"); + + + var translations ={}; + + $translate.onReady(function() { + for (var key in defaults) { + translations[key]=$translate.instant('search.settings.input.'+key); + } + + var title=$translate.instant('search.settings.title'); + var defaults_button=$translate.instant('search.settings.defaults_button'); + buildPopup(title, defaults_button); + }); + + + function getSearchFieldArray(){ + var fields=[]; + for (var key in defaults) { + if(defaults[key]){ + fields.push(key); + } + } + } + + //searchboxfix + function buildDefaultFix(rootScope, scope) { + if (native_search === null) { + return; + } + native_search.nextElementSibling.addEventListener('click', function (e) { + scope.$apply(function () { + rootScope.$broadcast('nc_searchbox', ""); + }); + }); + + native_search.classList.remove('hidden'); + native_search.addEventListener('keypress', function (e) { + if (e.keyCode === 13) { + e.preventDefault(); + } + }); + + native_search.addEventListener('keyup', function (e) { + scope.$apply(function () { + rootScope.$broadcast('nc_searchbox', native_search.value, getSearchFieldArray()); + }); + }); + + } + + function buildCog() { + if (native_search === null) { + return; + } + + var parent = document.createElement("div"); + parent.classList.add("notifications"); + parent.id = "searchbox-settings"; + //parent.classList.add("hidden"); + + var node = document.createElement("div"); + node.classList.add("icon-category-tools"); + node.classList.add("searchbox-settings"); + node.id = "searchbox-settings-icon"; + + parent.appendChild(node); + native_search.after(parent); + } + + function addListenerToCog() { + if (native_search === null) { + return; + } + + $('#searchbox').on("focus", function (evt) { + //$('#searchbox-settings').removeClass("hidden"); + + }); + + $('#searchbox').on("blur", function (evt) { + if (!native_search.value) { + //$('#searchbox-settings').addClass("hidden"); + } + }); + } + + function openPopup() { + if (native_search === null) { + return; + } + + $(function () { + $("#dialog").dialog({ + width: 280, + height: 280, + dialogClass: 'custom-search-dialog', + close: function() { + $(this).dialog('destroy'); + } + }).removeClass('ui-corner-all'); + + }); + } + + function buildPopup(title) { + + var dialogdiv = document.createElement("div"); + dialogdiv.id = "dialog"; + dialogdiv.title = title; + dialogdiv.classList.add("hidden"); + native_search.after(dialogdiv); + + for (var key in defaults) { + var div_inner=document.createElement("div"); + + var input = document.createElement("input"); + input.id=key+"_input"; + input.type="checkbox"; + if(defaults[key]){ + input.checked="true"; + } + input.innerText=key; + + var label = document.createElement("label"); + label.htmlFor=key+"_input"; + label.innerHTML=translations[key]; + + div_inner.appendChild(input); + div_inner.appendChild(label); + dialogdiv.appendChild(div_inner); + + + + } + + } + + + function addListenerToDefault(rootScope, scope) { + if (native_search === null) { + return; + } + } + + return { + expandSearch: function ($rootScope, $scope, translation) { + + buildDefaultFix($rootScope, $scope); + buildCog(); + addListenerToCog(); + buildPopup(translation); + + + + $('#searchbox-settings-icon').on("click", function (evt) { + console.log("click?"); + openPopup(); + }); + + + }, + }; + }]); +}()); \ No newline at end of file diff --git a/sass/app.scss b/sass/app.scss index f064c217..9570352a 100644 --- a/sass/app.scss +++ b/sass/app.scss @@ -31,6 +31,7 @@ @import 'menu'; @import 'share_credential'; @import 'settings'; +@import 'searchboxexpander'; .template-hidden{ diff --git a/sass/searchboxexpander.scss b/sass/searchboxexpander.scss new file mode 100644 index 00000000..5ca3a65d --- /dev/null +++ b/sass/searchboxexpander.scss @@ -0,0 +1,66 @@ +/** + * Nextcloud - passman + * + * @copyright Copyright (c) 2019, Felix Nüsse (felix.nuesse@t-online.de) + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +.searchbox-settings{ + position: relative; + top: 50%; + transform: translateY(-50%); +} + +.custom-search-dialog{ + border-radius: var(--border-radius-large) !important; + box-shadow: 0 0 30px var(--color-box-shadow); + .ui-dialog { + border-radius: var(--border-radius-large); + box-shadow: 0 0 30px var(--color-box-shadow); + } + .ui-widget-header { + background: none; + } + + //closebutton top right + .ui-icon-closethick { + background-position: inherit; + } + + .ui-button-icon { + border: none !important; + } + .ui-icon { + border: none !important; + } + + .ui-button .ui-icon { + background-image: var(--icon-close-000); + } + + .ui-icon-closethick { + border: none !important; + } + + //closebutton top right end + + //bottom line removal + .ui-dialog-buttonpane.ui-helper-clearfix{ + display: none; + } + //bottom line end +} \ No newline at end of file diff --git a/templates/main.php b/templates/main.php index 0cae6042..4bc649a3 100644 --- a/templates/main.php +++ b/templates/main.php @@ -64,6 +64,7 @@ script('passman', 'app/services/iconservice'); script('passman', 'app/services/tagservice'); script('passman', 'app/services/notificationservice'); script('passman', 'app/services/shareservice'); +script('passman', 'app/services/searchboxexpanderservice'); script('passman', 'app/factory/sharingacl'); script('passman', 'app/directives/passwordgen'); script('passman', 'app/directives/fileselect');