blob: c0cc37d62464114de7d6f7c84803b8f034d379b6 [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.
*/
/* global define, module, require, exports */
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], function ($) {
return (nf.UniversalCapture = factory($));
});
} else if (typeof exports === 'object' && typeof module === 'object') {
module.exports = (nf.UniversalCapture = factory(require('jquery')));
} else {
nf.UniversalCapture = factory(root.$);
}
}(this, function ($) {
'use strict';
/**
* Captures keydown on the window to ensure certain keystrokes are handled in a consistent manner, particularly those
* that can lead to browser navigation/reload.
*/
$(document).ready(function ($) {
// setup a listener to ensure keystrokes are being overridden in a consistent manner
$(window).on('keydown', function (evt) {
// consider escape, before checking dialogs
var isCtrl = evt.ctrlKey || evt.metaKey;
if (!isCtrl && evt.keyCode === 27) {
// esc
// prevent escape when editing a property with allowable values - that component does not handle key
// events so it can bubble up to here. once here we are unable to cancel the current edit so we simply
// return. this is not an issue for viewing in read only mode as the table is not in an edit mode. this
// is not an issue for other fields as they can handle key events locally and cancel the edit appropriately
var visibleCombo = $('div.value-combo');
if (visibleCombo.is(':visible') && visibleCombo.parent().hasClass('combo-editor')) {
return;
}
// consider property detail dialogs
if ($('div.property-detail').is(':visible')) {
nfUniversalDialog.removeAllPropertyDetailDialogs();
// prevent further bubbling as we're already handled it
evt.stopImmediatePropagation();
evt.preventDefault();
} else {
var target = $(evt.target);
if (target.length) {
// special handling for body as the target
var cancellables = $('.cancellable');
if (cancellables.length) {
var zIndexMax = null;
var dialogMax = null;
// identify the top most cancellable
$.each(cancellables, function (_, cancellable) {
var dialog = $(cancellable);
var zIndex = dialog.css('zIndex');
// if the dialog has a zIndex consider it
if (dialog.is(':visible') && (zIndex !== null && typeof zIndex !== 'undefined')) {
zIndex = parseInt(zIndex, 10);
if (zIndexMax === null || zIndex > zIndexMax) {
zIndexMax = zIndex;
dialogMax = dialog;
}
}
});
// if we've identified a dialog to close do so and stop propagation
if (dialogMax !== null) {
// hide the cancellable
if (dialogMax.hasClass('modal')) {
dialogMax.modal('hide');
} else {
dialogMax.hide();
}
// prevent further bubbling as we're already handled it
evt.stopImmediatePropagation();
evt.preventDefault();
return;
}
}
// now see if we're in a frame
if (top !== window) {
// and our parent has shell defined
if (typeof parent.nf !== 'undefined' && typeof parent.nf.Shell !== 'undefined') {
parent.$('#shell-close-button').click();
// prevent further bubbling as we're already handled it
evt.stopImmediatePropagation();
evt.preventDefault();
return;
}
}
}
}
} else {
if (isCtrl) {
if (evt.keyCode === 82) {
// ctrl-r
evt.preventDefault();
}
} else {
if (!$('input, textarea').is(':focus') && (evt.keyCode == 8 || evt.keyCode === 46)) {
// backspace or delete
evt.preventDefault();
}
}
}
});
});
var nfUniversalDialog = {
/**
* Removes all read only property detail dialogs.
*/
removeAllPropertyDetailDialogs: function () {
var propertyDetails = $('body').find('div.property-detail');
propertyDetails.find('div.nf-editor').nfeditor('destroy'); // look for any nfel editors
propertyDetails.find('div.value-combo').combo('destroy'); // look for any combos
propertyDetails.hide().remove();
}
};
return nfUniversalDialog;
}));