web-apps/apps/documenteditor/embed/js/SearchBar.js

175 lines
6.4 KiB
JavaScript
Raw Normal View History

2022-04-27 19:12:59 +00:00
/*
*
* (c) Copyright Ascensio System SIA 2010-2020
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
/**
* SearchBar.js
*
* Created by Julia Svinareva on 27.04.2022
* Copyright (c) 2022 Ascensio System SIA. All rights reserved.
*
*/
+function () {
!window.common && (window.common = {});
!common.controller && (common.controller = {});
common.controller.SearchBar = new(function() {
var $searchBar,
$searchBtn,
$searchInput,
appConfig,
api,
_state = {
searchText: ''
},
_lastInputChange,
_searchTimer;
var setApi = function (appApi) {
api = appApi;
if (api) {
api.asc_registerCallback('asc_onSetSearchCurrent', onApiUpdateSearchCurrent);
}
};
var create = function () {
$searchBar = common.view.SearchBar.create();
if (appConfig.toolbarDocked === 'bottom') {
$searchBar.css({'right': '45px', 'bottom': '31px'});
} else {
$searchBar.css({'right': '45px', 'top': '31px'});
}
$searchInput = $searchBar.find('#search-bar-text');
$searchInput.on('input', function(e){
common.view.SearchBar.disableNavButtons();
onInputSearchChange($searchInput.val());
}).on('keydown', function (e) {
onSearchNext('keydown', $searchInput.val(), e);
});
$searchBar.find('#search-bar-back').on('click', function(e){
onSearchNext('back', $searchInput.val());
});
$searchBar.find('#search-bar-next').on('click', function(e){
onSearchNext('next', $searchInput.val());
});
$searchBar.find('#search-bar-close').on('click', function(e){
highlightResults(false);
$searchBar.hide();
$searchBtn.find('button').button('toggle');
});
common.view.SearchBar.disableNavButtons();
};
var attachToView = function(config) {
if ( !$searchBar ) {
create();
}
$searchBtn = $(config.search);
$searchBtn.on('click', function(e){
if ($searchBar.is(':visible')) {
highlightResults(false);
$searchBar.hide();
} else {
highlightResults(true);
var text = (api && api.asc_GetSelectedText()) || _state.searchText;
$searchInput.val(text);
(text.length > 0) && onInputSearchChange(text);
$searchBar.show();
$searchInput.focus();
$searchInput.select();
}
$searchBtn.find('button').button('toggle');
});
};
var onInputSearchChange = function (text) {
if (_state.searchText !== text) {
_state.newSearchText = text;
_lastInputChange = (new Date());
if (_searchTimer === undefined) {
_searchTimer = setInterval(function() {
if ((new Date()) - _lastInputChange < 400) return;
_state.searchText = _state.newSearchText;
(_state.newSearchText !== '') && onQuerySearch();
clearInterval(_searchTimer);
_searchTimer = undefined;
}, 10);
}
}
};
var onQuerySearch = function (d, w) {
var searchSettings = new AscCommon.CSearchSettings();
searchSettings.put_Text(_state.searchText);
searchSettings.put_MatchCase(false);
searchSettings.put_WholeWords(false);
if (!api.asc_findText(searchSettings, d != 'back')) {
common.view.SearchBar.disableNavButtons();
return false;
}
return true;
};
var onSearchNext = function (type, text, e) {
if (text && text.length > 0 && (type === 'keydown' && e.keyCode === 13 || type !== 'keydown')) {
_state.searchText = text;
if (onQuerySearch(type) && _searchTimer) {
clearInterval(_searchTimer);
_searchTimer = undefined;
}
}
};
var onApiUpdateSearchCurrent = function (current, all) {
common.view.SearchBar.disableNavButtons(current, all);
};
var highlightResults = function (val) {
if (_state.isHighlightedResults !== val) {
api.asc_selectSearchingResults(val);
_state.isHighlightedResults = val;
}
};
return {
init: function(config) { appConfig = config; },
attach: attachToView,
setApi: setApi
};
});
}();