diff --git a/js/extensions/documentManager.js b/js/extensions/documentManager.js index 45e5b58a..f1602bbd 100644 --- a/js/extensions/documentManager.js +++ b/js/extensions/documentManager.js @@ -108,8 +108,6 @@ define([ delete folderList[folderDesc.folderIndex]; }); eventMgr.onFoldersChanged(); - - refreshManager(); } var liMoveElt = undefined; @@ -232,11 +230,10 @@ define([ var fileDesc = fileSystem[parentElt.data('fileIndex')]; if(name && folderDesc && name != folderDesc.name) { folderDesc.name = name; - refreshManager(); + eventMgr.onFoldersChanged(); } else if(name && fileDesc && name != fileDesc.title) { fileDesc.title = name; - refreshManager(); eventMgr.onTitleChanged(fileDesc); } else { @@ -286,6 +283,7 @@ define([ documentManager.onSyncRemoved = refreshManager; documentManager.onNewPublishSuccess = refreshManager; documentManager.onPublishRemoved = refreshManager; + documentManager.onFoldersChanged = refreshManager; documentManager.onReady = function() { modalElt = document.querySelector('.modal-document-manager'); @@ -318,12 +316,11 @@ define([ // Add the index to the folder list utils.appendIndexToArray("folder.list", folderIndex); folderList[folderIndex] = folderDesc; - - refreshManager(); + eventMgr.onFoldersChanged(); // Edit the name when folder has just been created var renameButtonElt = $(modalElt.querySelector('[data-folder-index="' + folderIndex + '"] .button-rename')).click(); - modalElt.scrollTop = modalElt.scrollTop + renameButtonElt.offset().top - 50; + modalElt.scrollTop += renameButtonElt.offset().top - 50; }); // Selection dropdown menu actions @@ -390,8 +387,6 @@ define([ }); eventMgr.onFoldersChanged(); - refreshManager(); - $(modalElt.querySelectorAll('.document-list')).removeClass('hide'); $(modalElt.querySelectorAll('.choose-folder, .select-folder-list')).addClass('hide'); }); diff --git a/js/extensions/documentPanel.js b/js/extensions/documentPanel.js index 75e7ea3b..c3b65968 100644 --- a/js/extensions/documentPanel.js +++ b/js/extensions/documentPanel.js @@ -41,6 +41,9 @@ define([ var panelElt = undefined; var documentListElt = undefined; + var $documentListElt = undefined; + var documentListFilteredElt = undefined; + var $documentListFilteredElt = undefined; var refreshPanel = function() { // List orphan documents @@ -78,7 +81,19 @@ define([ }); documentListElt.innerHTML = documentListHtml; + + // Create filtered list + var documentListFilteredHtml = _.chain(fileSystem).sortBy(function(fileDesc) { + return fileDesc.title.toLowerCase(); + }).reduce(function(result, fileDesc) { + return result + '
  • ' + _.template(documentEltTmpl, { + fileDesc: fileDesc, + }) + '
  • '; + }, '').value(); + documentListFilteredHtml = ''; + documentListFilteredElt.innerHTML = documentListFilteredHtml; + // Add click listeners _.each(documentListElt.querySelectorAll('.file'), function(fileElt) { fileElt = $(fileElt); @@ -107,37 +122,73 @@ define([ documentPanel.onFoldersChanged = refreshPanel; // Filter for search input in file selector - function filterFileSelector(filter) { - var liList = $(".file-selector > li"); - liList.show(); - if(filter) { - var words = filter.toLowerCase().split(/\s+/); - liList.each(function() { - var fileTitle = $(this).text().toLowerCase(); - if(_.some(words, function(word) { - return fileTitle.indexOf(word) === -1; - })) { - $(this).hide(); - } - }); + var panelContentElt = undefined; + var previousFilterValue = ''; + function filterFiles(filterValue) { + if(filterValue == previousFilterValue) { + return; } + previousFilterValue = filterValue; + + // Scroll to top + panelContentElt.scrollTop = 0; + + if(!filterValue) { + $documentListFilteredElt.addClass('hide'); + $documentListElt.removeClass('hide'); + return; + } + var wordList = filterValue.toLowerCase().split(/\s+/); + _.each(documentListFilteredElt.querySelectorAll('.file'), function(fileElt) { + var $fileElt = $(fileElt); + var fileTitle = $fileElt.text().toLowerCase(); + $fileElt.toggle(!_.some(wordList, function(word) { + return fileTitle.indexOf(word) === -1; + })); + }); + $documentListFilteredElt.removeClass('hide'); + $documentListElt.addClass('hide'); } documentPanel.onReady = function() { panelElt = document.querySelector('.document-panel'); - documentListElt = panelElt.querySelector('.list-group'); - + panelContentElt = panelElt.querySelector('.panel-content'); + documentListElt = panelElt.querySelector('.document-list'); + $documentListElt = $(documentListElt); + documentListFilteredElt = panelElt.querySelector('.document-list-filtered'); + $documentListFilteredElt = $(documentListFilteredElt); + // Open current folder before opening $(panelElt).on('show.bs.collapse', function(e) { - var folderDesc = selectedFileDesc.folder; - if(e.target === panelElt && folderDesc !== undefined) { - $(panelElt.querySelector('.file-list.' + folderDesc.folderIndex.replace('.', ''))).collapse('show'); + if(e.target === panelElt) { + var folderDesc = selectedFileDesc.folder; + if(folderDesc !== undefined) { + $(panelElt.querySelector('.file-list.' + folderDesc.folderIndex.replace('.', ''))).collapse('show'); + } } }).on('shown.bs.collapse', function(e) { - // Scroll to the active file if(e.target === panelElt) { + // Unset the filter + $filterInputElt.val(''); + filterFiles(''); + + // Scroll to the active file + panelContentElt.scrollTop += documentListElt.querySelector('.file.active').getBoundingClientRect().top - 100; } }); + + // Search bar input change + var $filterInputElt = $(panelElt.querySelector('.search-bar .form-control')); + $filterInputElt.bind("propertychange keyup input paste", function() { + filterFiles($filterInputElt.val()); + }); + + // Clear button + $(panelElt.querySelector('.search-bar .close')).click(function() { + $filterInputElt.val(''); + filterFiles(''); + $filterInputElt.focus(); + }); }; return documentPanel; diff --git a/js/html/bodyIndex.html b/js/html/bodyIndex.html index 7ac188a5..89ef43fb 100644 --- a/js/html/bodyIndex.html +++ b/js/html/bodyIndex.html @@ -141,17 +141,21 @@ data-target=".document-panel" title="Select document"> -
    + +
    +
    diff --git a/js/styles/default.less b/js/styles/default.less index bc7f1637..09f5ea6d 100644 --- a/js/styles/default.less +++ b/js/styles/default.less @@ -5,7 +5,7 @@ @text-light: #888; @error-border: #ff8661; @menu-panel-width: 280px; -@document-panel-width: 330px; +@document-panel-width: 350px; @panel-bg: @bg-navbar-hover; @folder-color: #555; @transparent: fade(#000, 0%); @@ -270,7 +270,6 @@ body { // Common style .menu-panel, .document-panel { display: block; - background-color: @panel-bg; position: absolute; height: 100%; z-index: 10; @@ -281,8 +280,6 @@ body { font-size: 18px; } .panel-content { - padding-top: 6px; - padding-bottom: 25px; overflow: auto; height: 100%; a > i { @@ -293,6 +290,7 @@ body { } .menu-panel { + background-color: @panel-bg; width: @menu-panel-width !important; margin-left: (-@menu-panel-width - 32); -webkit-transition: margin-left 0.35s ease; @@ -313,6 +311,8 @@ body { z-index: -1; } .panel-content { + padding-top: 6px; + padding-bottom: 25px; border-right: 5px solid @preview-bg-light; .nav { margin-bottom: 20px; @@ -321,6 +321,7 @@ body { } .document-panel { + background-color: @list-group-bg; right: 0; width: @document-panel-width !important; margin-right: (-@document-panel-width - 32); @@ -349,11 +350,27 @@ body { .icon-layers { font-size: 135%; } - .input-group { - background-color: @list-group-bg; - padding: 15px 5px 15px 20px; - } } + .search-bar { + position: absolute; + background-color: @panel-bg; + margin: -10px 25px 0; + padding: 20px 5px 10px 20px; + z-index: 3; + border: 1px solid #e8e8e8; + border-top: 0; + border-radius: 6px; + .form-control { + padding: 8px 30px 8px 12px; + } + .close { + position: absolute; + line-height: 10px; + margin-left: -30px; + margin-top: 5px; + padding: 8px; + } + } .list-group-item { margin: 0; } @@ -363,10 +380,15 @@ body { font-size: 15px; border-bottom-color: @modal-content-separator-color; } - .list-group .nav { - border: 0; - margin: 0 20px 20px; - } + .list-group { + padding-top: 70px; + padding-bottom: 30px; + margin: 0; + .nav { + border: 0; + margin: 0 20px 20px; + } + } } // Dropdown document selector