blob: 8efeeb9c585543b6f6631e562f0dcb0f533e9bd4 [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',
'utils/Utils',
'utils/Globals',
'd3',
'marionette',
'jquery-ui'
], function(require, Utils, Globals, d3) {
'use strict';
_.mixin({
numberFormatWithComma: function(number) {
return d3.format(',')(number);
},
numberFormatWithBytes: function(number) {
if (number > -1) {
if (number === 0) {
return "0 Bytes";
}
var i = number == 0 ? 0 : Math.floor(Math.log(number) / Math.log(1024));
if (i > 8) {
return _.numberFormatWithComma(number);
}
return Number((number / Math.pow(1024, i)).toFixed(2)) + " " + ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"][i];
} else {
return number;
}
},
isEmptyArray: function(val) {
if (val && _.isArray(val)) {
return _.isEmpty(val);
} else {
return false;
}
},
toArrayifObject: function(val) {
return _.isObject(val) ? [val] : val;
},
startsWith: function(str, matchStr) {
if (str && matchStr && _.isString(str) && _.isString(matchStr)) {
return str.lastIndexOf(matchStr, 0) === 0
} else {
return;
}
},
isUndefinedNull: function(val) {
if (_.isUndefined(val) || _.isNull(val)) {
return true
} else {
return false;
}
},
trim: function(val) {
if (val && val.trim) {
return val.trim();
} else {
return val;
}
},
isTypePrimitive: function(type) {
if (type === "int" || type === "byte" || type === "short" || type === "long" || type === "float" || type === "double" || type === "string" || type === "boolean" || type === "date") {
return true;
}
return false;
}
});
var getPopoverEl = function(e) {
return $(e.target).parent().data("bs.popover") || $(e.target).data("bs.popover") || $(e.target).parents('.popover').length;
}
$(document).on('click DOMMouseScroll mousewheel', function(e) {
if (e.originalEvent) {
// Do action if it is triggered by a human.
//e.isImmediatePropagationStopped();
var isPopOverEl = getPopoverEl(e)
if (!isPopOverEl) {
$('.popover').popover('hide');
} else if (isPopOverEl.$tip) {
$('.popover').not(isPopOverEl.$tip).popover('hide');
}
$(".tooltip").tooltip("hide");
}
});
$('body').on('hidden.bs.popover', function(e) {
$(e.target).data("bs.popover").inState = { click: false, hover: false, focus: false }
});
$('body').on('show.bs.popover', '[data-js="popover"]', function() {
$('.popover').not(this).popover('hide');
});
$('body').on('keypress', 'input.number-input,.number-input .select2-search__field', function(e) {
if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) {
return false;
}
});
$('body').on('keypress', 'input.number-input-negative,.number-input-negative .select2-search__field', function(e) {
if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) {
if (e.which == 45) {
if (this.value.length) {
return false;
}
} else {
return false;
}
}
});
$('body').on('keypress', 'input.number-input-exponential,.number-input-exponential .select2-search__field', function(e) {
if ((e.which != 8 && e.which != 0) && (e.which < 48 || e.which > 57) && (e.which != 69 && e.which != 101 && e.which != 43 && e.which != 45 && e.which != 46 && e.which != 190)) {
return false;
}
});
$("body").on('click', '.dropdown-menu.dropdown-changetitle li a', function() {
$(this).parents('li').find(".btn:first-child").html($(this).text() + ' <span class="caret"></span>');
});
$("body").on('click', '.btn', function() {
$(this).blur();
});
$('body').on('click', function(e) {
if ($(e.target).hasClass('trumbowyg-editor-hidden')) {
$('.trumbowyg').find('.trumbowyg-button-pane').removeClass('trumbowyg-button-pane-hidden');
$('.trumbowyg').css('border', '1px solid #8fa5b1');
}
});
$('body').on('keyup input', '.modal-body', function(e) {
var target = e.target,
isGlossary = (e.target.dataset.id === "searchTerm" || e.target.dataset.id === "searchCategory") ? true : false; // assign term/category modal
if ((target.type === "text" || target.type === "textarea") && !isGlossary) {
var $this = $(this),
$footerButton = $this.parents(".modal").find('.modal-footer button.ok'),
requiredInputField = _.filter($this.find('input'), function($e) {
if ($e.getAttribute('placeholder') && $e.getAttribute('placeholder').indexOf('require') >= 0) {
return ($e.value.trim() == "");
}
});
if (requiredInputField.length > 0) {
$footerButton.attr("disabled", "true");
} else {
$footerButton.removeAttr("disabled");
}
}
});
if ($.fn.select2) {
$.fn.select2.amd.define("TagHideDeleteButtonAdapter", [
"select2/utils",
"select2/selection/multiple",
"select2/selection/placeholder",
"select2/selection/eventRelay",
"select2/selection/search",
],
function(Utils, MultipleSelection, Placeholder, EventRelay, SelectionSearch) {
// Decorates MultipleSelection with Placeholder
var adapter = Utils.Decorate(MultipleSelection, Placeholder);
adapter = Utils.Decorate(adapter, SelectionSearch);
adapter = Utils.Decorate(adapter, EventRelay);
adapter.prototype.render = function() {
// Use selection-box from SingleSelection adapter
// This implementation overrides the default implementation
var $search = $(
'<li class="select2-search select2-search--inline">' +
'<input class="select2-search__field" type="search" tabindex="-1"' +
' autocomplete="off" autocorrect="off" autocapitalize="none"' +
' spellcheck="false" role="textbox" aria-autocomplete="list" />' +
'</li>'
);
this.$searchContainer = $search;
this.$search = $search.find('input');
var $selection = MultipleSelection.prototype.render.call(this);
this._transferTabIndex();
return $selection;
};
adapter.prototype.update = function(data) {
// copy and modify SingleSelection adapter
var that = this;
this.clear();
if (data.length === 0) {
this.$selection.find('.select2-selection__rendered')
.append(this.$searchContainer);
this.$search.attr('placeholder', this.options.get("placeholder"));
return;
}
this.$search.attr('placeholder', '');
var $rendered = this.$selection.find('.select2-selection__rendered'),
$selectionContainer = [];
if (data.length > 0) {
_.each(data, function(obj) {
var $container = $('<li class="select2-selection__choice"></li>'),
formatted = that.display(obj, $rendered),
$remove = $('<span class="select2-selection__choice__remove" role="presentation">&times;</span>'),
allowRemoveAttr = $(obj.element).data("allowremove"),
allowRemove = obj.allowRemove === undefined ? allowRemoveAttr : obj.allowRemove;
if (allowRemove === undefined || allowRemove !== false) {
$container.append($remove);
}
$container.data("data", obj);
$container.append(formatted);
$selectionContainer.push($container);
});
Utils.appendMany($rendered, $selectionContainer);
}
var searchHadFocus = this.$search[0] == document.activeElement;
this.$search.attr('placeholder', '');
this.$selection.find('.select2-selection__rendered')
.append(this.$searchContainer);
this.resizeSearch();
if (searchHadFocus) {
this.$search.focus();
}
};
return adapter;
});
$.fn.select2.amd.define("ServiceTypeFilterDropdownAdapter", [
"select2/utils",
"select2/dropdown",
"select2/dropdown/attachBody",
"select2/dropdown/attachContainer",
"select2/dropdown/search",
"select2/dropdown/minimumResultsForSearch",
"select2/dropdown/closeOnSelect",
],
function(Utils, Dropdown, AttachBody, AttachContainer, Search, MinimumResultsForSearch, CloseOnSelect) {
// Decorate Dropdown with Search functionalities
var dropdownWithSearch = Utils.Decorate(Utils.Decorate(Dropdown, CloseOnSelect), Search);
dropdownWithSearch.prototype.render = function() {
// Copy and modify default search render method
var $rendered = Dropdown.prototype.render.call(this),
dropdownCssClass = this.options.get("dropdownCssClass")
if (dropdownCssClass) {
$rendered.addClass(dropdownCssClass);
}
// Add ability for a placeholder in the search box
var placeholder = this.options.get("placeholderForSearch") || "";
var $search = $(
'<span class="select2-search select2-search--dropdown"><div class="clearfix">' +
'<div class="col-md-10 no-padding" style="width: calc(100% - 30px);"><input class="select2-search__field" placeholder="' + placeholder + '" type="search"' +
' tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off"' +
' spellcheck="false" role="textbox" /></div>' +
'<div class="col-md-2 no-padding" style="width: 30px;"><button type="button" style="padding: 3px 6px;margin: 0px 4px;" class="btn btn-action btn-sm filter " title="Type Filter"><i class="fa fa-filter"></i></button></div>' +
'</div></span>'
);
if (!this.options.options.getFilterBox) {
throw "In order to render the filter options adapter needed getFilterBox function"
}
var $Filter = $('<ul class="type-filter-ul"></ul>');
this.$Filter = $Filter;
this.$Filter.append(this.options.options.getFilterBox());
this.$Filter.hide();
this.$searchContainer = $search;
if ($Filter.find('input[type="checkbox"]:checked').length) {
$search.find('button.filter').addClass('active');
} else {
$search.find('button.filter').removeClass('active');
}
this.$search = $search.find('input');
$rendered.prepend($search);
$rendered.append($Filter);
return $rendered;
};
var oldDropdownWithSearchBindRef = dropdownWithSearch.prototype.bind;
dropdownWithSearch.prototype.bind = function(container, $container) {
var self = this;
oldDropdownWithSearchBindRef.call(this, container, $container);
var self = this;
this.$Filter.on('click', 'li', function() {
var itemCallback = self.options.options.onFilterItemSelect;
itemCallback && itemCallback(this);
})
this.$searchContainer.find('button.filter').click(function() {
container.$dropdown.find('.select2-search').hide(150);
container.$dropdown.find('.select2-results').hide(150);
self.$Filter.html(self.options.options.getFilterBox());
self.$Filter.show();
});
this.$Filter.on('click', 'button.filterDone', function() {
container.$dropdown.find('.select2-search').show(150);
container.$dropdown.find('.select2-results').show(150);
self.$Filter.hide();
var filterSubmitCallback = self.options.options.onFilterSubmit;
filterSubmitCallback && filterSubmitCallback({
filterVal: _.map(self.$Filter.find('input[type="checkbox"]:checked'), function(item) {
return $(item).data('value')
})
});
});
container.$element.on('hideFilter', function() {
container.$dropdown.find('.select2-search').show();
container.$dropdown.find('.select2-results').show();
self.$Filter.hide();
});
}
// Decorate the dropdown+search with necessary containers
var adapter = Utils.Decorate(dropdownWithSearch, AttachContainer);
adapter = Utils.Decorate(adapter, AttachBody);
return adapter;
});
}
$.widget("custom.atlasAutoComplete", $.ui.autocomplete, {
_create: function() {
this._super();
this.widget().menu("option", "items", "> :not(.ui-autocomplete-category,.empty)");
},
_renderMenu: function(ul, items) {
var that = this,
currentCategory = "";
items = _.sortBy(items, 'order');
$.each(items, function(index, item) {
var li;
if (item.category != currentCategory) {
ul.append("<li class='ui-autocomplete-category'>" + item.category + "</li>");
currentCategory = item.category;
}
that._renderItemData(ul, item);
});
},
_renderItemData: function(ul, item) {
return this._renderItem(ul, item);
}
});
// For placeholder support
if (!('placeholder' in HTMLInputElement.prototype)) {
var originalRender = Backbone.Marionette.LayoutView.prototype.render;
Backbone.Marionette.LayoutView.prototype.render = function() {
originalRender.apply(this, arguments);
this.$('input, textarea').placeholder();
}
}
$('body').on('click', 'pre.code-block .expand-collapse-button', function(e) {
var $el = $(this).parents('.code-block');
if ($el.hasClass('shrink')) {
$el.removeClass('shrink');
} else {
$el.addClass('shrink');
}
});
// For adding tooltip globally
$("body").on('mouseenter', '.select2-selection__choice', function() {
$(this).attr("title", "");
});
if ($('body').tooltip) {
$('body').tooltip({
selector: '[title]:not(".select2-selection__choice,.select2-selection__rendered")',
placement: function() {
return this.$element.attr("data-placement") || "bottom";
},
container: 'body'
});
}
//For closing the modal on browsers navigation
$(window).on('popstate', function() {
$('body').find('.modal-dialog .close').click();
//To close the full-screen mode in lineage on browsers navigation.
if (!Globals.isFullScreenView) {
$('#tab-lineage').removeClass("fullscreen-mode");
$("#r_lineageLayoutView").find('button[data-id="fullScreen-toggler"]').attr("data-original-title", "Full Screen").find("i").removeClass("fa-compress").addClass("fa-expand");
}
Globals.isFullScreenView = false;
});
})