diff options
author | fnuesse <felix.nuesse@t-online.de> | 2018-06-16 22:44:18 +0200 |
---|---|---|
committer | John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com> | 2018-07-12 16:49:37 +0200 |
commit | fc4baed6e5e862492ac1e2f12a408971d8ee6a26 (patch) | |
tree | 4e7be115ef44fedcb145a2a5141b9c947e63447f | |
parent | 72ace9697c0951b3379a88c3cb639e1c9abe0170 (diff) | |
download | nextcloud-server-fc4baed6e5e862492ac1e2f12a408971d8ee6a26.tar.gz nextcloud-server-fc4baed6e5e862492ac1e2f12a408971d8ee6a26.zip |
Added toggleable QuickAccess
Signed-off-by: fnuesse <felix.nuesse@t-online.de>
Deleted wrongly commited File
Signed-off-by: fnuesse <felix.nuesse@t-online.de>
Added quickaccess-state persistence
Signed-off-by: fnuesse <felix.nuesse@t-online.de>
Started implementing sorting-algorithm for proper alphabetical display
Signed-off-by: fnuesse <felix.nuesse@t-online.de>
Finished Sorting of Quickaccess elements
Signed-off-by: fnuesse <felix.nuesse@t-online.de>
Implemented persistence for reverse-list and sorting-strategy
Signed-off-by: fnuesse <felix.nuesse@t-online.de>
Implemented initial sorting for reverse-list and sorting-strategy
Signed-off-by: fnuesse <felix.nuesse@t-online.de>
Refactored Code
Signed-off-by: fnuesse <felix.nuesse@t-online.de>
Refactored Code
Signed-off-by: fnuesse <felix.nuesse@t-online.de>
Refactored Code
Signed-off-by: fnuesse <felix.nuesse@t-online.de>
-rw-r--r-- | apps/files/appinfo/routes.php | 20 | ||||
-rw-r--r-- | apps/files/js/app.js | 40 | ||||
-rw-r--r-- | apps/files/js/navigation.js | 195 | ||||
-rw-r--r-- | apps/files/lib/Controller/ApiController.php | 54 | ||||
-rw-r--r-- | apps/files/lib/Controller/ViewController.php | 91 | ||||
-rw-r--r-- | apps/files/templates/appnavigation.php | 56 | ||||
-rw-r--r-- | core/css/apps.scss | 17 |
7 files changed, 360 insertions, 113 deletions
diff --git a/apps/files/appinfo/routes.php b/apps/files/appinfo/routes.php index 3273d6d97db..ed2373149f2 100644 --- a/apps/files/appinfo/routes.php +++ b/apps/files/appinfo/routes.php @@ -86,6 +86,26 @@ $application->registerRoutes( 'url' => '/api/v1/hidequickaccess', 'verb' => 'GET', ], + [ + 'name' => 'API#setSortingStrategy', + 'url' => '/api/v1/setsortingstrategy', + 'verb' => 'GET', + ], + [ + 'name' => 'API#setReverseQuickaccess', + 'url' => '/api/v1/setreversequickaccess', + 'verb' => 'GET', + ], + [ + 'name' => 'API#getSortingStrategy', + 'url' => '/api/v1/getsortingstrategy', + 'verb' => 'GET', + ], + [ + 'name' => 'API#getReverseQuickaccess', + 'url' => '/api/v1/getreversequickaccess', + 'verb' => 'GET', + ] ] ] ); diff --git a/apps/files/js/app.js b/apps/files/js/app.js index 97b8b630f72..ec223e418b7 100644 --- a/apps/files/js/app.js +++ b/apps/files/js/app.js @@ -54,18 +54,13 @@ var showHidden = $('#showHiddenFiles').val() === "1"; this.$showHiddenFiles.prop('checked', showHidden); - this.$showQuickAccess = $('input#showfavoritequickaccessToggle'); - var showQuickAccess = $('#showFavoriteQuickAccess').val() === "1"; - this.$showQuickAccess.prop('checked', showQuickAccess); - if ($('#fileNotFound').val() === "1") { OC.Notification.show(t('files', 'File could not be found'), {type: 'error'}); } this._filesConfig = new OC.Backbone.Model({ - showhidden: showHidden, - showQuickAccess: showQuickAccess + showhidden: showHidden }); var urlParams = OC.Util.History.parseUrlQuery(); @@ -138,7 +133,6 @@ }); this._debouncedPersistShowHiddenFilesState = _.debounce(this._persistShowHiddenFilesState, 1200); - this._debouncedPersistShowQuickAccessState = _.debounce(this._persistShowQuickAccessState, 1200); }, /** @@ -213,7 +207,6 @@ $('#app-navigation').on('itemChanged', _.bind(this._onNavigationChanged, this)); this.$showHiddenFiles.on('change', _.bind(this._onShowHiddenFilesChange, this)); - this.$showQuickAccess.on('change', _.bind(this._onShowQuickAccessChange, this)); }, /** @@ -228,7 +221,7 @@ }, /** - * Persist show hidden preference on ther server + * Persist show hidden preference on the server * * @returns {undefined} */ @@ -239,35 +232,6 @@ }); }, - - /** - * Toggle showing hidden files according to the settings checkbox - * - * @returns {undefined} - */ - _onShowQuickAccessChange: function() { - var qa = this.$showQuickAccess.is(':checked'); - this._filesConfig.set('show_quick_access', qa); - this._debouncedPersistShowQuickAccessState(); - }, - - /** - * Persist show hidden preference on ther server - * - * @returns {undefined} - */ - _persistShowQuickAccessState: function() { - var qa = this._filesConfig.get('show_quick_access'); - var url="/apps/files/api/v1/hidequickaccess"; - if(qa){ - url="/apps/files/api/v1/showquickaccess"; - } - - $.get(OC.generateUrl(url),function(data, status){ - }); - }, - - /** * Event handler for when the current navigation item has changed */ diff --git a/apps/files/js/navigation.js b/apps/files/js/navigation.js index d213d0467b6..cf4de7d61e5 100644 --- a/apps/files/js/navigation.js +++ b/apps/files/js/navigation.js @@ -4,6 +4,8 @@ * @author Vincent Petry * @copyright 2014 Vincent Petry <pvince81@owncloud.com> * + * Edited by: Felix Nüsse <felix.nuesse@t-online.de> 2018 + * * This file is licensed under the Affero General Public License version 3 * or later. * @@ -39,6 +41,10 @@ $currentContent: null, /** + * Strategy by which the quickaccesslist is sorted + */ + $sortingStrategy: 'alphabet', + /** * Initializes the navigation from the given container * * @private @@ -49,13 +55,16 @@ this._activeItem = null; this.$currentContent = null; this._setupEvents(); + this.initialSort(); }, /** * Setup UI events */ _setupEvents: function() { - this.$el.on('click', 'li a', _.bind(this._onClickItem, this)); + this.$el.on('click', 'li a', _.bind(this._onClickItem, this)) + this.$el.on('click', 'li button', _.bind(this._onClickMenuButton, this)); + this.$el.on('click', 'li input', _.bind(this._onClickMenuItem, this)); }, /** @@ -127,9 +136,193 @@ this.setActiveItem(itemId); } ev.preventDefault(); + }, + /** + * Event handler for when clicking on an three-dot-menu. + */ + _onClickMenuButton: function(ev) { + var $target = $(ev.target); + var itemId = $target.closest('button').attr('id'); + if(itemId==='button-favorites'){ + document.getElementById('menu-favorites').classList.toggle('open'); + } + ev.preventDefault(); + }, + + /** + * Event handler for when clicking on a menuitem. + */ + _onClickMenuItem: function(ev) { + + var qaSelector= '#quickaccess-list'; + var qaKey= 'quickaccess-list'; + + var itemId = $(ev.target).closest('input').attr('id'); + var list = document.getElementById(qaKey).getElementsByTagName('li'); + + if(itemId==='enableQuickAccess'){ + $.get(OC.generateUrl("/apps/files/api/v1/showquickaccess"), {show: document.getElementById('enableQuickAccess').checked}, function(data, status){ + }); + $(qaSelector ).toggle(); + document.getElementById('menu-favorites').classList.toggle('open'); + } + + if(itemId==='sortByAlphabet'){ + //Prevents deselecting Group-Item + if(!document.getElementById('sortByAlphabet').checked){ + ev.preventDefault(); + return; + } + this.sortingStrategy='alphabet'; + document.getElementById('sortByDate').checked=false; + $.get(OC.generateUrl("/apps/files/api/v1/setsortingstrategy"), {strategy: this.sortingStrategy}, function(data, status){}); + this.QuickSort(list, 0, list.length - 1); + document.getElementById('menu-favorites').classList.toggle('open'); + } + + if(itemId==='sortByDate'){ + //Prevents deselecting Group-Item + if(!document.getElementById('sortByDate').checked){ + ev.preventDefault(); + return; + } + this.sortingStrategy='date'; + document.getElementById('sortByAlphabet').checked=false; + $.get(OC.generateUrl("/apps/files/api/v1/setsortingstrategy"), {strategy: this.sortingStrategy}, function(data, status){}); + this.QuickSort(list, 0, list.length - 1); + document.getElementById('menu-favorites').classList.toggle('open'); + } + + if(itemId==='enableReverse'){ + this.reverse(list); + var state = document.getElementById('enableReverse').checked; + $.get(OC.generateUrl("/apps/files/api/v1/setreversequickaccess"), {reverse: state}, function(data, status){}); + document.getElementById('menu-favorites').classList.toggle('open'); + } + //ev.preventDefault(); + }, + + /** + * Sort initially as setup of sidebar for QuickAccess + */ + initialSort: function() { + + var domRevState=document.getElementById('enableReverse').checked; + var domSortAlphabetState=document.getElementById('sortByAlphabet').checked; + var domSortDateState=document.getElementById('sortByDate').checked; + + var qaKey= 'quickaccess-list'; + var list = document.getElementById(qaKey).getElementsByTagName('li'); + + if(domSortAlphabetState){ + this.sortingStrategy='alphabet'; + } + if(domSortDateState){ + this.sortingStrategy='date'; + } + + this.QuickSort(list, 0, list.length - 1); + + if(domRevState){ + this.reverse(list); + } + + /*This creates flashes the UI, which is bad userexperience. It is the cleaner way to do it, that is why i haven't deleted it yet. + var scope=this; + $.get(OC.generateUrl("/apps/files/api/v1/getsortingstrategy"), function(data, status){ + scope.sortingStrategy=data; + scope.QuickSort(list, 0, list.length - 1); + + }); + + $.get(OC.generateUrl("/apps/files/api/v1/getreversequickaccess"), function(data, status){ + if(data){ + scope.reverse(list); + } + }); + */ + }, + + /** + * Sorting-Algorithm for QuickAccess + */ + QuickSort: function(list, start, end) { + var lastmatch; + if(list.length > 1){ + lastmatch = this.quicksort_helper(list, start, end); + if(start < lastmatch - 1){ + this.QuickSort(list, start, lastmatch - 1); + } + if(lastmatch < end){ + this.QuickSort(list, lastmatch, end); + } + } + }, + + /** + * Sorting-Algorithm-Helper for QuickAccess + */ + quicksort_helper: function(list, start, end) { + var pivot = Math.floor((end + start) / 2); + var pivotelem = this.getCompareValue(list,pivot); + var i = start; + var j = end; + + while(i <= j){ + while(this.getCompareValue(list,i) < pivotelem){ + i++; + } + while(this.getCompareValue(list,j) > pivotelem){ + j--; + } + if(i <= j){ + this.swap(list, i, j); + i++; + j--; + } + } + return i; + }, + + /** + * Sorting-Algorithm-Helper for QuickAccess + * This method allows easy access to the element which is sorted by. + */ + getCompareValue: function(nodes, int){ + if(this.sortingStrategy==='alphabet'){ + ; return nodes[int].getElementsByTagName('a')[0].innerHTML.toLowerCase() + }else if(this.sortingStrategy==='date'){ + return nodes[int].getAttribute('folderPos').toLowerCase(); + } + return nodes[int].getElementsByTagName('a')[0].innerHTML.toLowerCase(); + }, + + /** + * Sorting-Algorithm-Helper for QuickAccess + * This method allows easy swapping of elements. + */ + swap: function(list, j, i){ + list[i].before(list[j]); + list[j].before(list[i]); + }, + + /** + * Reverse QuickAccess-List + */ + reverse: function(list){ + var len=list.length-1; + for(var i = 0; i < len/2; i++) { + this.swap(list, i, len-i); + } } + }; OCA.Files.Navigation = Navigation; })(); + + + + + diff --git a/apps/files/lib/Controller/ApiController.php b/apps/files/lib/Controller/ApiController.php index b1af121ed6e..53a8e1b55ee 100644 --- a/apps/files/lib/Controller/ApiController.php +++ b/apps/files/lib/Controller/ApiController.php @@ -45,6 +45,7 @@ use OCP\IPreview; use OCP\Share\IManager; use OC\Files\Node\Node; use OCP\IUserSession; +use Sabre\VObject\Property\Boolean; /** * Class ApiController @@ -270,27 +271,64 @@ class ApiController extends Controller { * * @NoAdminRequired * - * @param int $value + * @param bool $show + * * @return Response */ - public function showQuickAccess() { - $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'show_Quick_Access', 1); + public function showQuickAccess($show) { + $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'show_Quick_Access', (int) $show); return new Response(); } /** - * Toggle default for showing/hiding QuickAccess folder + * quickaccess-sorting-strategy * * @NoAdminRequired * - * @param int $value + * @param string $strategy * @return Response */ - public function hideQuickAccess() { - $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'show_Quick_Access', 0); + public function setSortingStrategy($strategy) { + $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'quickaccess_sorting_strategy', (String) $strategy); return new Response(); - } + } + /** + * Get reverse-state for quickaccess-list + * + * @NoAdminRequired + * + * @return String + */ + public function getSortingStrategy() { + return $this->config->getUserValue($this->userSession->getUser()->getUID(), 'files', 'quickaccess_sorting_strategy', 'date'); + } + /** + * Toggle for reverse quickaccess-list + * + * @NoAdminRequired + * + * @param bool $reverse + * @return Response + */ + public function setReverseQuickaccess($reverse) { + $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'quickaccess_reverse_list', (int) $reverse); + return new Response(); + } + + /** + * Get reverse-state for quickaccess-list + * + * @NoAdminRequired + * + * @return bool + */ + public function getReverseQuickaccess() { + if($this->config->getUserValue($this->userSession->getUser()->getUID(), 'files', 'quickaccess_reverse_list', false)){ + return true; + } + return false; + } } diff --git a/apps/files/lib/Controller/ViewController.php b/apps/files/lib/Controller/ViewController.php index 54602839eb0..11a42fb5291 100644 --- a/apps/files/lib/Controller/ViewController.php +++ b/apps/files/lib/Controller/ViewController.php @@ -159,58 +159,73 @@ class ViewController extends Controller { // FIXME: Make non static $storageInfo = $this->getStorageInfo(); + $user = $this->userSession->getUser()->getUID(); + + $sorting=$this->config->getUserValue($user,$this->appName,'quickaccess_sorting_strategy','date'); + $reverseListSetting=$this->config->getUserValue($user,$this->appName,'quickaccess_reverse_list','false'); + if($this->config->getUserValue($user,$this->appName,'show_Quick_Access',true)){ + $expanded='true'; + }else{ + $expanded='false'; + } \OCA\Files\App::getNavigationManager()->add( [ 'id' => 'favorites', 'appname' => 'files', 'script' => 'simplelist.php', + 'enableQuickaccess' => $expanded, + 'quickaccessSortingStrategy' => $sorting, + 'quickaccessSortingReverse' => $reverseListSetting, 'order' => 5, 'name' => $this->l10n->t('Favorites') ] ); - - - $user = $this->userSession->getUser()->getUID(); - $tagger=\OC::$server->getTagManager(); - $helper= new \OCA\Files\Activity\Helper($tagger); $favElements = $helper->getFavoriteFilePaths($this->userSession->getUser()->getUID()); - $favItems = $favElements['items']; - - $key='show_Quick_Access'; - - if($this->config->getUserValue($user,$this->appName,$key,true) && sizeof($favElements['folders'])>0){ - /*$nav->assign('showQuickAccess', 1); - \OCA\Files\App::getNavigationManager()->add( - [ - 'id' => 'Spacer', - 'classes' => 'app-navigation-caption', - 'order' => 6, - 'name' => $this->l10n->t('Quick-Access') - ] - );*/ - - $i=0; - foreach($favElements['folders'] as $elem){ - - \OCA\Files\App::getNavigationManager()->add( - [ - 'id' => substr( $elem, strrpos($elem,'/')+1, strlen($elem)), - 'href' => \OC::$WEBROOT.'/index.php/apps/files/?dir='.$elem, - 'order' => 7+$i, - 'classes' => 'app-navigation-subelement', - 'name' => substr( $elem, strrpos($elem,'/')+1, strlen($elem)), - 'icon' => 'files' - ] - ); - $i++; - } - } + $FavoritesFolderCount=sizeof($favElements['folders']); + if($FavoritesFolderCount>0){ + + $NavBarPositionPosition=6; + $currentCount=0; + foreach($favElements['folders'] as $elem){ + + $id=substr( $elem, strrpos($elem,'/')+1, strlen($elem)); + $link=\OC::$WEBROOT.'/index.php/apps/files/?dir='.$elem; + + $SortingValue=++$currentCount; + if($currentCount!=$FavoritesFolderCount){ + \OCA\Files\App::getNavigationManager()->add( + [ + 'id' => $id, + 'href' => $link, + 'order' => $NavBarPositionPosition, + 'folderPosition' => $SortingValue, + 'name' => $id, + 'icon' => 'files', + 'quickaccesselement' => 'true' + ] + ); + }else{ + \OCA\Files\App::getNavigationManager()->add( + [ + 'id' => $id, + 'href' => $link, + 'order' => $NavBarPositionPosition, + 'folderPosition' => $SortingValue, + 'name' => $id, + 'icon' => 'files', + 'quickaccesselement' => 'last' + ] + ); + } + $NavBarPositionPosition++; + } + } $navItems = \OCA\Files\App::getNavigationManager()->getAll(); @@ -218,10 +233,6 @@ class ViewController extends Controller { return $item1['order'] - $item2['order']; }); - - - - $nav->assign('navigationItems', $navItems); $nav->assign('usage', \OC_Helper::humanFileSize($storageInfo['used'])); diff --git a/apps/files/templates/appnavigation.php b/apps/files/templates/appnavigation.php index 749f36a44e8..c2f15fde801 100644 --- a/apps/files/templates/appnavigation.php +++ b/apps/files/templates/appnavigation.php @@ -5,12 +5,55 @@ <?php foreach ($_['navigationItems'] as $item) { strpos($item['classes'], 'pinned')!==false ? $pinned++ : ''; ?> - <li data-id="<?php p(isset($item['href']) ? $item['href'] : $item['id']) ?>" class="nav-<?php p($item['id']) ?> <?php p($item['classes']) ?> <?php p($pinned===1?'first-pinned':'') ?>"> + + <li data-id="<?php p(isset($item['href']) ? $item['href'] : $item['id']) ?>" + class="nav-<?php p($item['id']) ?> <?php p($item['classes']) ?> <?php p($pinned===1?'first-pinned':'') ?>" + <?php if(isset($item['folderPosition'])){ ?> folderPos="<?php p($item['folderPosition']);?>"<?php } ?>> + <a href="<?php p(isset($item['href']) ? $item['href'] : '#') ?>" - class="nav-icon-<?php p($item['icon'] !== '' ? $item['icon'] : $item['id']) ?> svg"> - <?php p($item['name']);?> - </a> + class="nav-icon-<?php p($item['icon'] !== '' ? $item['icon'] : $item['id']) ?> svg"><?php p($item['name']);?></a> + <?php if($item['id']=='favorites'){?> + + <div class="app-navigation-entry-utils"> + <ul> + <li class="app-navigation-entry-utils-menu-button svg"><button id="button-<?php p($item['id']) ?>"></button></li> + </ul> + </div> + <div class="app-navigation-entry-menu" id="menu-<?php p($item['id']) ?>"> + <ul> + <li> + <span class="menuitem"> + <input id="enableQuickAccess" type="checkbox" class="checkbox" <?php if($item['enableQuickaccess']=='true'){ ?> checked<?php } ?>/> + <label for="enableQuickAccess"><?php p($l->t('Enable Quickaccess')); ?></label> + </span> + </li> + <li> + <span class="menuitem"> + <input id="sortByAlphabet" type="checkbox" class="checkbox" data-group='SortingStrategy'<?php if($item['quickaccessSortingStrategy']=='alphabet'){ ?> checked<?php } ?>/> + <label for="sortByAlphabet"><?php p($l->t('Sort by Alphabet')); ?></label> + </span> + </li> + <li> + <span class="menuitem"> + <input id="sortByDate" type="checkbox" class="checkbox" data-group='SortingStrategy'<?php if($item['quickaccessSortingStrategy']=='date'){ ?> checked<?php } ?>/> + <label for="sortByDate"><?php p($l->t('Sort by Date')); ?></label> + </span> + </li> + <li> + <span class="menuitem"> + <input id="enableReverse" type="checkbox" class="checkbox" <?php if($item['quickaccessSortingReverse']==true){ ?> checked<?php } ?>/> + <label for="enableReverse"><?php p($l->t('Reverse List')); ?></label> + </span> + </li> + </ul> + </div> + <ul id="quickaccess-list" <?php if($item['enableQuickaccess']=='false'){ ?> style="display: none"<?php } ?>> + <?php } ?> + <?php if($item['quickaccesselement']=='last'){?> + </ul> + <?php } ?> </li> + <?php } ?> <li id="quota" class="pinned <?php p($pinned===0?'first-pinned ':'') ?><?php @@ -42,11 +85,6 @@ <input class="checkbox" id="showhiddenfilesToggle" checked="checked" type="checkbox"> <label for="showhiddenfilesToggle"><?php p($l->t('Show hidden files')); ?></label> </div> - <!--Removed to disable disabling, but kept to allow easy reenabling--> - <!--<div id="files-setting-showFavoriteQuickAccess"> - <input class="checkbox" id="showfavoritequickaccessToggle" <?php /*if($_['showQuickAccess']){ */?>checked="checked"<?php /*} */?> type="checkbox"> - <label for="showfavoritequickaccessToggle"><?php /*p($l->t('Enable Favorites Quick Access')); */?></label> - </div>--> <label for="webdavurl"><?php p($l->t('WebDAV'));?></label> <input id="webdavurl" type="text" readonly="readonly" value="<?php p(\OCP\Util::linkToRemote('webdav')); ?>" /> <em><?php print_unescaped($l->t('Use this address to <a href="%s" target="_blank" rel="noreferrer noopener">access your Files via WebDAV</a>', array(link_to_docs('user-webdav'))));?></em> diff --git a/core/css/apps.scss b/core/css/apps.scss index 2e3ab7b1a28..ab4e338a698 100644 --- a/core/css/apps.scss +++ b/core/css/apps.scss @@ -602,23 +602,6 @@ kbd { user-select: none; pointer-events:none; } - - .app-navigation-subelement { - line-height: 24px; - white-space: nowrap; - text-overflow: ellipsis; - float: left; - padding-left: 14px; - & a { - //Overrides normal size for smaller subelements - line-height: 24px; - min-height: 24px; - //Removes the double border on the a element - &:visited { box-shadow:none;} - &:hover { box-shadow:none;} - &:active {box-shadow:none; } - } - } } /* APP-CONTENT ---------------------------------------------------------------*/ |