blob: b77ee1f1d2ec16659ceb87f45e51a7f98b75665d [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
define(['require',
'hbs!tmpl/site/Header',
'utils/CommonViewFunction',
'utils/Globals',
'utils/Utils',
'utils/UrlLinks',
'jquery-ui'
], function(require, tmpl, CommonViewFunction, Globals, Utils, UrlLinks) {
'use strict';
var Header = Marionette.LayoutView.extend({
template: tmpl,
regions: {},
templateHelpers: function() {
return {
glossaryImportTempUrl: UrlLinks.glossaryImportTempUrl(),
businessMetadataImportTempUrl: UrlLinks.businessMetadataImportTempUrl()
};
},
ui: {
backButton: "[data-id='backButton']",
menuHamburger: "[data-id='menuHamburger']",
globalSearch: "[data-id='globalSearch']",
clearGlobalSearch: "[data-id='clearGlobalSearch']",
signOut: "[data-id='signOut']",
administrator: "[data-id='administrator']",
uiSwitch: "[data-id='uiSwitch']",
glossaryImport: "[data-id='glossaryImport']",
businessMetadataImport: "[data-id='businessMetadataImport']"
},
events: function() {
var events = {};
events['click ' + this.ui.backButton] = function() {
Utils.backButtonClick();
};
events['click ' + this.ui.clearGlobalSearch] = function() {
this.ui.globalSearch.val("");
this.ui.globalSearch.autocomplete("search");
this.ui.clearGlobalSearch.removeClass("in");
};
events['click ' + this.ui.menuHamburger] = function() {
this.setSearchBoxWidth({
updateWidth: function(atlasHeaderWidth) {
return $('body').hasClass('full-screen') ? atlasHeaderWidth - 350 : atlasHeaderWidth + 350
}
});
$('body').toggleClass("full-screen");
};
events['click ' + this.ui.signOut] = function() {
Utils.localStorage.setValue("last_ui_load", "v1");
var path = Utils.getBaseUrl(window.location.pathname);
window.location = path + "/logout.html";
};
events["click " + this.ui.uiSwitch] = function() {
var path = Utils.getBaseUrl(window.location.pathname) + "/n/index.html";
if (window.location.hash.length > 2) {
path += window.location.hash;
}
window.location.href = path;
};
events['click ' + this.ui.administrator] = function() {
Utils.setUrl({
url: "#!/administrator",
mergeBrowserUrl: false,
trigger: true,
updateTabState: true
});
};
events['click ' + this.ui.glossaryImport] = function() {
this.onClickImport(true);
};
events['click ' + this.ui.businessMetadataImport] = function() {
this.onClickImport()
};
return events;
},
initialize: function(options) {
this.bindEvent();
this.options = options;
},
setSearchBoxWidth: function(options) {
var atlasHeaderWidth = this.$el.find(".atlas-header").width(),
minusWidth = (Utils.getUrlState.isDetailPage() || Utils.getUrlState.isBSDetail()) ? 360 : 210;
if (options && options.updateWidth) {
atlasHeaderWidth = options.updateWidth(atlasHeaderWidth);
}
if (atlasHeaderWidth > minusWidth) {
this.$el.find(".global-search-container").width(atlasHeaderWidth - minusWidth);
}
},
bindEvent: function() {
var that = this;
$(window).resize(function() {
that.setSearchBoxWidth();
});
},
onRender: function() {
var that = this;
if (Globals.userLogedIn.status) {
that.$('.userName').html(Globals.userLogedIn.response.userName);
}
this.initializeGlobalSearch();
},
onShow: function() {
this.setSearchBoxWidth();
},
onBeforeDestroy: function() {
this.ui.globalSearch.atlasAutoComplete("destroy");
},
manualRender: function() {
this.setSearchBoxWidth();
},
fetchSearchData: function(options) {
var that = this,
request = options.request,
response = options.response,
term = request.term,
data = {},
sendResponse = function() {
var query = data.query,
suggestions = data.suggestions;
if (query !== undefined && suggestions !== undefined) {
response(data);
}
};
$.ajax({
url: UrlLinks.searchApiUrl('quick'),
contentType: 'application/json',
data: {
"query": this.getSearchString(term),
"limit": 5,
"offset": 0
},
cache: true,
success: function(response) {
var rData = response.searchResults.entities || [];
data.query = { category: "entities", data: rData, order: 1 };
sendResponse();
}
});
$.ajax({
url: UrlLinks.searchApiUrl('suggestions'),
contentType: 'application/json',
data: {
"prefixString": term
},
cache: true,
success: function(response) {
var rData = response.suggestions || [];
data.suggestions = { category: "suggestions", data: rData, order: 2 };
sendResponse();
}
});
},
getSearchString: function(str) {
if (str && str.length) {
return (str.match(/[+\-&|!(){}[\]^"~*?:/]/g) === null ? (str + "*") : str);
} else {
return str;
}
},
triggerBuasicSearch: function(query) {
Utils.setUrl({
url: '#!/search/searchResult?query=' + encodeURIComponent(query) + '&searchType=basic',
mergeBrowserUrl: false,
trigger: true,
updateTabState: true
});
},
initializeGlobalSearch: function() {
var that = this;
this.ui.globalSearch.atlasAutoComplete({
minLength: 1,
autoFocus: false,
search: function() {
$(this).siblings('span.fa-search').removeClass("fa-search").addClass("fa-refresh fa-spin-custom");
},
focus: function(event, ui) {
return false;
},
open: function() {
$(this).siblings('span.fa-refresh').removeClass("fa-refresh fa-spin-custom").addClass("fa-search");
},
select: function(event, ui) {
var item = ui && ui.item;
event.preventDefault();
event.stopPropagation();
var $el = $(this);
if (_.isString(item)) {
$el.val(item);
$el.data("valSelected", true);
that.triggerBuasicSearch(item);
} else if (_.isObject(item) && item.guid) {
Utils.setUrl({
url: '#!/detailPage/' + item.guid,
mergeBrowserUrl: false,
trigger: true
});
}
$el.blur();
return true;
},
source: function(request, response) {
that.fetchSearchData({
request: request,
response: response
});
}
}).focus(function() {
$(this).atlasAutoComplete("search");
}).keyup(function(event) {
if ($(this).val().trim() === "") {
that.ui.clearGlobalSearch.removeClass("in");
} else {
that.ui.clearGlobalSearch.addClass("in");
if (event.keyCode == 13) {
if ($(this).data("valSelected") !== true) {
that.triggerBuasicSearch(that.getSearchString($(this).val()));
} else {
$(this).data("valSelected", false);
}
}
}
}).atlasAutoComplete("instance")._renderItem = function(ul, searchItem) {
if (searchItem) {
var data = searchItem.data,
searchTerm = this.term,
getHighlightedTerm = function(resultStr) {
try {
return resultStr.replace(new RegExp(searchTerm, "gi"), function(foundStr) {
return "<span class='searched-term'>" + foundStr + "</span>";
});
} catch (error) {
return resultStr;
}
}
if (data) {
if (data.length == 0) {
return $("<li class='empty'></li>")
.append("<span class='empty-message'>No " + searchItem.category + " found</span>")
.appendTo(ul);
} else {
var items = [];
_.each(data, function(item) {
var li = null;
if (_.isObject(item)) {
item.itemText = Utils.getName(item) + " (" + item.typeName + ")";
var options = {},
table = '';
options.entityData = item;
var imgEl = $('<img src="' + Utils.getEntityIconPath(options) + '">').on("error", function(error, s) {
this.src = Utils.getEntityIconPath(_.extend(options, { errorUrl: this.src }));
});
var img = $('<div class="globalsearchImgItem isIncomplete ' + (item.isIncomplete ? "show" : "") + '"><i class="fa fa-hourglass-half"></i><div>').prepend(imgEl);
var span = $("<span>" + (getHighlightedTerm(item.itemText)) + "</span>")
.prepend(img);
li = $("<li class='with-icon'>")
.append(span);
} else {
li = $("<li>")
.append("<span>" + (getHighlightedTerm(_.escape(item))) + "</span>");
}
li.data("ui-autocomplete-item", item);
if (searchItem.category) {
items.push(li.attr("aria-label", searchItem.category + " : " + (_.isObject(item) ? item.itemText : item)));
}
});
return ul.append(items);
}
}
}
};
},
onClickImport: function(isGlossary) {
var that = this;
require([
'views/import/ImportLayoutView'
], function(ImportLayoutView) {
var view = new ImportLayoutView({
callback: function() {
if (isGlossary) {
that.options.importVent.trigger("Import:Glossary:Update");
} else {
that.options.importVent.trigger("Import:BM:Update");
}
},
isGlossary: isGlossary
});
});
}
});
return Header;
});