diff --git a/apps/common/main/lib/view/SearchBar.js b/apps/common/main/lib/view/SearchBar.js index 5f5346bd48..64ab68fcc0 100644 --- a/apps/common/main/lib/view/SearchBar.js +++ b/apps/common/main/lib/view/SearchBar.js @@ -62,7 +62,10 @@ define([ this.template = [ '
', - '', + '
', + '', + '
0/0
', + '
', '
', '
', '
', @@ -128,9 +131,14 @@ define([ this.hide(); }, this)) + this.searchResults = $('#search-bar-results'); + this.on('animate:before', _.bind(this.focus, this)); - Common.NotificationCenter.on('search:updateresults', _.bind(this.disableNavButtons, this)); + Common.NotificationCenter.on('search:updateresults', _.bind(function (resultNumber, allResults) { + this.disableNavButtons(resultNumber, allResults); + this.updateResultsNumber(resultNumber, allResults); + }, this)); return this; }, @@ -192,6 +200,12 @@ define([ this.btnNext.setDisabled(disable); }, + updateResultsNumber: function (current, all) { + this.searchResults.text(!all || (this.inputSearch.val() === '' && !window.SSE) ? '0/0' : + (Common.UI.isRTL() ? all + '/' + (current + 1) : current + 1 + '/' + all)); + this.inputSearch.css(Common.UI.isRTL() ? 'padding-left' : 'padding-right', this.searchResults.outerWidth() + 'px'); + }, + textFind: 'Find', tipPreviousResult: 'Previous result', tipNextResult: 'Next result', diff --git a/apps/common/main/resources/less/searchdialog.less b/apps/common/main/resources/less/searchdialog.less index e0f4cd875f..ae41eb17db 100644 --- a/apps/common/main/resources/less/searchdialog.less +++ b/apps/common/main/resources/less/searchdialog.less @@ -87,8 +87,25 @@ .box { padding: 15px; display: flex; - input[type=text] { - width: 192px; + .search-input-group { + display: flex; + position: relative; + input[type=text] { + width: 192px; + } + #search-bar-results { + position: absolute; + right: 0; + height: 100%; + line-height: 22px; + padding: 0 4px; + color: @text-secondary-ie; + color: @text-secondary; + .rtl & { + right: auto; + left: 0; + } + } } .tools { display: flex; @@ -97,6 +114,14 @@ margin-left: 5px; &:first-of-type { margin-left: 7px; + .rtl & { + margin-left: 0; + margin-right: 7px; + } + } + .rtl & { + margin-left: 0; + margin-right: 5px; } } } diff --git a/apps/documenteditor/main/app/controller/Search.js b/apps/documenteditor/main/app/controller/Search.js index 84f950baf9..9457439f32 100644 --- a/apps/documenteditor/main/app/controller/Search.js +++ b/apps/documenteditor/main/app/controller/Search.js @@ -186,6 +186,8 @@ define([ me.view.disableReplaceButtons(true); clearInterval(me.searchTimer); me.searchTimer = undefined; + + Common.NotificationCenter.trigger('search:updateresults'); } }, 10); } @@ -211,6 +213,8 @@ define([ this._state.currentResult = 0; this._state.resultsNumber = 0; this.view.disableNavButtons(); + + Common.NotificationCenter.trigger('search:updateresults'); return false; } if (update && this.view.$el.is(':visible') && this.view.$resultsContainer.find('.many-results').length === 0) { @@ -485,6 +489,10 @@ define([ return this._state.searchText; }, + getResultsNumber: function () { + return [this._state.currentResult, this._state.resultsNumber]; + }, + notcriticalErrorTitle: 'Warning', warnReplaceString: '{0} is not a valid special character for the Replace With box.', textReplaceSuccess: 'Search has been done. {0} occurrences have been replaced', diff --git a/apps/documenteditor/main/app/controller/Viewport.js b/apps/documenteditor/main/app/controller/Viewport.js index 42edcf4c51..7c0853ad33 100644 --- a/apps/documenteditor/main/app/controller/Viewport.js +++ b/apps/documenteditor/main/app/controller/Viewport.js @@ -311,8 +311,11 @@ define([ }, this)); } if (this.header.btnSearch.pressed) { - var selectedText = this.api.asc_GetSelectedText(); - this.searchBar.show(selectedText && selectedText.trim() || this.getApplication().getController('Search').getSearchText()); + var selectedText = this.api.asc_GetSelectedText(), + searchController = this.getApplication().getController('Search'), + resultsNumber = searchController.getResultsNumber(); + this.searchBar.show(selectedText && selectedText.trim() || searchController.getSearchText()); + this.searchBar.updateResultsNumber(resultsNumber[0], resultsNumber[1]); } else { this.searchBar.hide(); } diff --git a/apps/presentationeditor/main/app/controller/Search.js b/apps/presentationeditor/main/app/controller/Search.js index 3104d65171..47ca569904 100644 --- a/apps/presentationeditor/main/app/controller/Search.js +++ b/apps/presentationeditor/main/app/controller/Search.js @@ -183,6 +183,8 @@ define([ me.view.disableReplaceButtons(true); clearInterval(me.searchTimer); me.searchTimer = undefined; + + Common.NotificationCenter.trigger('search:updateresults'); } }, 10); } @@ -208,6 +210,8 @@ define([ this._state.currentResult = 0; this._state.resultsNumber = 0; this.view.disableNavButtons(); + + Common.NotificationCenter.trigger('search:updateresults'); return false; } @@ -435,6 +439,10 @@ define([ return this._state.searchText; }, + getResultsNumber: function () { + return [this._state.currentResult, this._state.resultsNumber]; + }, + notcriticalErrorTitle: 'Warning', warnReplaceString: '{0} is not a valid special character for the Replace With box.', textReplaceSuccess: 'Search has been done. {0} occurrences have been replaced', diff --git a/apps/presentationeditor/main/app/controller/Viewport.js b/apps/presentationeditor/main/app/controller/Viewport.js index 38ddd10208..f77933b19f 100644 --- a/apps/presentationeditor/main/app/controller/Viewport.js +++ b/apps/presentationeditor/main/app/controller/Viewport.js @@ -372,8 +372,11 @@ define([ }, this)); } if (this.header.btnSearch.pressed) { - var selectedText = this.api.asc_GetSelectedText(); - this.searchBar.show(selectedText && selectedText.trim() || this.getApplication().getController('Search').getSearchText()); + var selectedText = this.api.asc_GetSelectedText(), + searchController = this.getApplication().getController('Search'), + resultsNumber = searchController.getResultsNumber(); + this.searchBar.show(selectedText && selectedText.trim() || searchController.getSearchText()); + this.searchBar.updateResultsNumber(resultsNumber[0], resultsNumber[1]); } else { this.searchBar.hide(); } diff --git a/apps/spreadsheeteditor/main/app/controller/Search.js b/apps/spreadsheeteditor/main/app/controller/Search.js index ba14d0560d..af1687e5a8 100644 --- a/apps/spreadsheeteditor/main/app/controller/Search.js +++ b/apps/spreadsheeteditor/main/app/controller/Search.js @@ -292,6 +292,7 @@ define([ } else { this.removeResultItems(); } + Common.NotificationCenter.trigger('search:updateresults'); return false; } this._state.isResults = true; @@ -605,6 +606,10 @@ define([ return this._state.searchText; }, + getResultsNumber: function () { + return [this._state.currentResult, this._state.resultsNumber]; + }, + onApiUpdateSearchElem: function (data) { // [id, sheet, name, cell, value, formula] if (this.resultItems && this.resultItems.length > 0) { var me = this; diff --git a/apps/spreadsheeteditor/main/app/controller/Viewport.js b/apps/spreadsheeteditor/main/app/controller/Viewport.js index 0714b4e66f..081af455bc 100644 --- a/apps/spreadsheeteditor/main/app/controller/Viewport.js +++ b/apps/spreadsheeteditor/main/app/controller/Viewport.js @@ -338,8 +338,11 @@ define([ }, this)); } if (this.header.btnSearch.pressed) { - var selectedText = this.api.asc_GetSelectedText(); - this.searchBar.show(selectedText && selectedText.trim() || this.getApplication().getController('Search').getSearchText()); + var selectedText = this.api.asc_GetSelectedText(), + searchController = this.getApplication().getController('Search'), + resultsNumber = searchController.getResultsNumber(); + this.searchBar.show(selectedText && selectedText.trim() || searchController.getSearchText()); + this.searchBar.updateResultsNumber(resultsNumber[0], resultsNumber[1]); } else { this.searchBar.hide(); }