Create option to hide the blue main menu bar on top (#596)

* ability to hide main menu bar; minor fixes for typos, JSDoc etc.

* fix CSS issue when mainMenuBar is hidden in all modes; other minor refactoring
This commit is contained in:
Tanmay Rajani 2018-11-13 00:41:09 +05:30 committed by Jos de Jong
parent 4e24601823
commit d7551da7e6
6 changed files with 238 additions and 220 deletions

View File

@ -234,6 +234,10 @@ Constructs a new JSONEditor.
- Can return an object `{startFrom: number, options: string[]}`. Here `startFrom` determines the start character from where the existing text will be replaced. `startFrom` is `0` by default, replacing the whole text. - Can return an object `{startFrom: number, options: string[]}`. Here `startFrom` determines the start character from where the existing text will be replaced. `startFrom` is `0` by default, replacing the whole text.
- Can return a `Promise` resolving one of the return types above to support asynchronously retrieving a list with options. - Can return a `Promise` resolving one of the return types above to support asynchronously retrieving a list with options.
- `{boolean} mainMenuBar`
Adds main menu bar - Contains format, sort, transform, search etc. functionality. True by default. Applicable in all types of `mode`.
- `{boolean} navigationBar` - `{boolean} navigationBar`
Adds navigation bar to the menu - the navigation bar visualize the current position on the tree structure as well as allows breadcrumbs navigation. True by default. Only applicable when `mode` is 'tree', 'form' or 'view'. Adds navigation bar to the menu - the navigation bar visualize the current position on the tree structure as well as allows breadcrumbs navigation. True by default. Only applicable when `mode` is 'tree', 'form' or 'view'.

View File

@ -253,8 +253,8 @@ div.jsoneditor-outer {
position: static; position: static;
width: 100%; width: 100%;
height: 100%; height: 100%;
margin: -35px 0 0 0; margin: 0;
padding: 35px 0 0 0; padding: 0;
-moz-box-sizing: border-box; -moz-box-sizing: border-box;
-webkit-box-sizing: border-box; -webkit-box-sizing: border-box;
@ -262,13 +262,23 @@ div.jsoneditor-outer {
} }
div.jsoneditor-outer.has-nav-bar { div.jsoneditor-outer.has-nav-bar {
margin: -61px 0 0 0; margin-top: -26px;
padding: 61px 0 0 0; padding-top: 26px;
} }
div.jsoneditor-outer.has-status-bar { div.jsoneditor-outer.has-status-bar {
margin: -35px 0 -26px 0; margin-bottom: -26px;
padding: 35px 0 26px 0; padding-bottom: 26px;
}
div.jsoneditor-outer.has-main-menu-bar {
margin-top: -35px;
padding-top: 35px;
}
div.jsoneditor-outer.has-nav-bar.has-main-menu-bar {
margin-top: -61px;
padding-top: 61px;
} }
textarea.jsoneditor-text, textarea.jsoneditor-text,

View File

@ -167,7 +167,7 @@ JSONEditor.VALID_OPTIONS = [
'colorPicker', 'onColorPicker', 'colorPicker', 'onColorPicker',
'timestampTag', 'timestampTag',
'escapeUnicode', 'history', 'search', 'mode', 'modes', 'name', 'indentation', 'escapeUnicode', 'history', 'search', 'mode', 'modes', 'name', 'indentation',
'sortObjectKeys', 'navigationBar', 'statusBar', 'languages', 'language', 'enableSort', 'enableTransform' 'sortObjectKeys', 'navigationBar', 'statusBar', 'mainMenuBar', 'languages', 'language', 'enableSort', 'enableTransform'
]; ];
/** /**

View File

@ -1396,7 +1396,7 @@ Node.prototype.changeType = function (newType) {
this.childs = []; this.childs = [];
} }
this.childs.forEach(function (child, index) { this.childs.forEach(function (child) {
child.clearDom(); child.clearDom();
delete child.index; delete child.index;
child.fieldEditable = true; child.fieldEditable = true;
@ -3372,7 +3372,7 @@ Node.prototype._showColorPicker = function () {
} }
}); });
} }
} };
/** /**
* Remove nodes * Remove nodes
@ -3870,7 +3870,7 @@ Node.targetIsColorPicker = function (target) {
} }
return false; return false;
} };
/** /**
* Remove the focus of given nodes, and move the focus to the (a) node before, * Remove the focus of given nodes, and move the focus to the (a) node before,

View File

@ -41,10 +41,13 @@ textmode.create = function (container, options) {
// read options // read options
options = options || {}; options = options || {};
if(typeof options.statusBar === 'undefined') { if (typeof options.statusBar === 'undefined') {
options.statusBar = true; options.statusBar = true;
} }
// setting default for textmode
options.mainMenuBar = options.mainMenuBar !== false;
this.options = options; this.options = options;
// indentation // indentation
@ -108,67 +111,89 @@ textmode.create = function (container, options) {
this.frame.onkeydown = function (event) { this.frame.onkeydown = function (event) {
me._onKeyDown(event); me._onKeyDown(event);
}; };
// create menu
this.menu = document.createElement('div');
this.menu.className = 'jsoneditor-menu';
this.frame.appendChild(this.menu);
// create format button this.content = document.createElement('div');
var buttonFormat = document.createElement('button'); this.content.className = 'jsoneditor-outer';
buttonFormat.type = 'button';
buttonFormat.className = 'jsoneditor-format';
buttonFormat.title = 'Format JSON data, with proper indentation and line feeds (Ctrl+\\)';
this.menu.appendChild(buttonFormat);
buttonFormat.onclick = function () {
try {
me.format();
me._onChange();
}
catch (err) {
me._onError(err);
}
};
// create compact button if (this.options.mainMenuBar) {
var buttonCompact = document.createElement('button'); util.addClassName(this.content, 'has-main-menu-bar');
buttonCompact.type = 'button';
buttonCompact.className = 'jsoneditor-compact';
buttonCompact.title = 'Compact JSON data, remove all whitespaces (Ctrl+Shift+\\)';
this.menu.appendChild(buttonCompact);
buttonCompact.onclick = function () {
try {
me.compact();
me._onChange();
}
catch (err) {
me._onError(err);
}
};
// create repair button // create menu
var buttonRepair = document.createElement('button'); this.menu = document.createElement('div');
buttonRepair.type = 'button'; this.menu.className = 'jsoneditor-menu';
buttonRepair.className = 'jsoneditor-repair'; this.frame.appendChild(this.menu);
buttonRepair.title = 'Repair JSON: fix quotes and escape characters, remove comments and JSONP notation, turn JavaScript objects into JSON.';
this.menu.appendChild(buttonRepair);
buttonRepair.onclick = function () {
try {
me.repair();
me._onChange();
}
catch (err) {
me._onError(err);
}
};
// create mode box // create format button
if (this.options && this.options.modes && this.options.modes.length) { var buttonFormat = document.createElement('button');
this.modeSwitcher = new ModeSwitcher(this.menu, this.options.modes, this.options.mode, function onSwitch(mode) { buttonFormat.type = 'button';
// switch mode and restore focus buttonFormat.className = 'jsoneditor-format';
me.setMode(mode); buttonFormat.title = 'Format JSON data, with proper indentation and line feeds (Ctrl+\\)';
me.modeSwitcher.focus(); this.menu.appendChild(buttonFormat);
}); buttonFormat.onclick = function () {
try {
me.format();
me._onChange();
}
catch (err) {
me._onError(err);
}
};
// create compact button
var buttonCompact = document.createElement('button');
buttonCompact.type = 'button';
buttonCompact.className = 'jsoneditor-compact';
buttonCompact.title = 'Compact JSON data, remove all whitespaces (Ctrl+Shift+\\)';
this.menu.appendChild(buttonCompact);
buttonCompact.onclick = function () {
try {
me.compact();
me._onChange();
}
catch (err) {
me._onError(err);
}
};
// create repair button
var buttonRepair = document.createElement('button');
buttonRepair.type = 'button';
buttonRepair.className = 'jsoneditor-repair';
buttonRepair.title = 'Repair JSON: fix quotes and escape characters, remove comments and JSONP notation, turn JavaScript objects into JSON.';
this.menu.appendChild(buttonRepair);
buttonRepair.onclick = function () {
try {
me.repair();
me._onChange();
}
catch (err) {
me._onError(err);
}
};
// create mode box
if (this.options && this.options.modes && this.options.modes.length) {
this.modeSwitcher = new ModeSwitcher(this.menu, this.options.modes, this.options.mode, function onSwitch(mode) {
// switch mode and restore focus
me.setMode(mode);
me.modeSwitcher.focus();
});
}
if (this.mode == 'code') {
var poweredBy = document.createElement('a');
poweredBy.appendChild(document.createTextNode('powered by ace'));
poweredBy.href = 'http://ace.ajax.org';
poweredBy.target = '_blank';
poweredBy.className = 'jsoneditor-poweredBy';
poweredBy.onclick = function () {
// TODO: this anchor falls below the margin of the content,
// therefore the normal a.href does not work. We use a click event
// for now, but this should be fixed.
window.open(poweredBy.href, poweredBy.target);
};
this.menu.appendChild(poweredBy);
}
} }
var emptyNode = {}; var emptyNode = {};
@ -176,10 +201,7 @@ textmode.create = function (container, options) {
&& typeof(this.options.onEditable === 'function') && typeof(this.options.onEditable === 'function')
&& !this.options.onEditable(emptyNode)); && !this.options.onEditable(emptyNode));
this.content = document.createElement('div');
this.content.className = 'jsoneditor-outer';
this.frame.appendChild(this.content); this.frame.appendChild(this.content);
this.container.appendChild(this.frame); this.container.appendChild(this.frame);
if (this.mode == 'code') { if (this.mode == 'code') {
@ -224,19 +246,6 @@ textmode.create = function (container, options) {
}); });
} }
var poweredBy = document.createElement('a');
poweredBy.appendChild(document.createTextNode('powered by ace'));
poweredBy.href = 'http://ace.ajax.org';
poweredBy.target = '_blank';
poweredBy.className = 'jsoneditor-poweredBy';
poweredBy.onclick = function () {
// TODO: this anchor falls below the margin of the content,
// therefore the normal a.href does not work. We use a click event
// for now, but this should be fixed.
window.open(poweredBy.href, poweredBy.target);
};
this.menu.appendChild(poweredBy);
// register onchange event // register onchange event
aceEditor.on('change', this._onChange.bind(this)); aceEditor.on('change', this._onChange.bind(this));
aceEditor.on('changeSelection', this._onSelect.bind(this)); aceEditor.on('changeSelection', this._onSelect.bind(this));
@ -269,12 +278,12 @@ textmode.create = function (container, options) {
this.dom.validationErrorsContainer = validationErrorsContainer; this.dom.validationErrorsContainer = validationErrorsContainer;
this.frame.appendChild(validationErrorsContainer); this.frame.appendChild(validationErrorsContainer);
var additinalErrorsIndication = document.createElement('div'); var additionalErrorsIndication = document.createElement('div');
additinalErrorsIndication.style.display = 'none'; additionalErrorsIndication.style.display = 'none';
additinalErrorsIndication.className = "jsoneditor-additional-errors fadein"; additionalErrorsIndication.className = "jsoneditor-additional-errors fadein";
additinalErrorsIndication.innerHTML = "Scroll for more ▿"; additionalErrorsIndication.innerHTML = "Scroll for more ▿";
this.dom.additinalErrorsIndication = additinalErrorsIndication; this.dom.additionalErrorsIndication = additionalErrorsIndication;
validationErrorsContainer.appendChild(additinalErrorsIndication); validationErrorsContainer.appendChild(additionalErrorsIndication);
if (options.statusBar) { if (options.statusBar) {
util.addClassName(this.content, 'has-status-bar'); util.addClassName(this.content, 'has-status-bar');
@ -428,20 +437,18 @@ textmode._onKeyDown = function (event) {
/** /**
* Event handler for mousedown. * Event handler for mousedown.
* @param {Event} event
* @private * @private
*/ */
textmode._onMouseDown = function (event) { textmode._onMouseDown = function () {
this._updateCursorInfo(); this._updateCursorInfo();
this._emitSelectionChange(); this._emitSelectionChange();
}; };
/** /**
* Event handler for blur. * Event handler for blur.
* @param {Event} event
* @private * @private
*/ */
textmode._onBlur = function (event) { textmode._onBlur = function () {
var me = this; var me = this;
// this allows to avoid blur when clicking inner elements (like the errors panel) // this allows to avoid blur when clicking inner elements (like the errors panel)
// just make sure to set the isFocused to true on the inner element onclick callback // just make sure to set the isFocused to true on the inner element onclick callback
@ -481,7 +488,7 @@ textmode._updateCursorInfo = function () {
line: line, line: line,
column: col, column: col,
count: count count: count
} };
if(me.options.statusBar) { if(me.options.statusBar) {
updateDisplay(); updateDisplay();
@ -500,7 +507,7 @@ textmode._updateCursorInfo = function () {
line: line, line: line,
column: col, column: col,
count: count count: count
} };
if(this.options.statusBar) { if(this.options.statusBar) {
updateDisplay(); updateDisplay();
@ -528,7 +535,7 @@ textmode._emitSelectionChange = function () {
var currentSelection = this.getTextSelection(); var currentSelection = this.getTextSelection();
this._selectionChangedHandler(currentSelection.start, currentSelection.end, currentSelection.text); this._selectionChangedHandler(currentSelection.start, currentSelection.end, currentSelection.text);
} }
} };
/** /**
* refresh ERROR annotations state * refresh ERROR annotations state
@ -543,7 +550,7 @@ textmode._refreshAnnotations = function () {
var errEnnotations = session.getAnnotations().filter(function(annotation) {return annotation.type === 'error' }); var errEnnotations = session.getAnnotations().filter(function(annotation) {return annotation.type === 'error' });
session.setAnnotations(errEnnotations); session.setAnnotations(errEnnotations);
} }
} };
/** /**
* Destroy the editor. Clean up DOM, event listeners, and web workers. * Destroy the editor. Clean up DOM, event listeners, and web workers.
@ -848,7 +855,7 @@ textmode._renderErrors = function(errors) {
if (this.dom.validationErrors) { if (this.dom.validationErrors) {
this.dom.validationErrors.parentNode.removeChild(this.dom.validationErrors); this.dom.validationErrors.parentNode.removeChild(this.dom.validationErrors);
this.dom.validationErrors = null; this.dom.validationErrors = null;
this.dom.additinalErrorsIndication.style.display = 'none'; this.dom.additionalErrorsIndication.style.display = 'none';
this.content.style.marginBottom = ''; this.content.style.marginBottom = '';
this.content.style.paddingBottom = ''; this.content.style.paddingBottom = '';
@ -933,12 +940,12 @@ textmode._renderErrors = function(errors) {
this.dom.validationErrors = validationErrors; this.dom.validationErrors = validationErrors;
this.dom.validationErrorsContainer.appendChild(validationErrors); this.dom.validationErrorsContainer.appendChild(validationErrors);
this.dom.additinalErrorsIndication.title = errors.length + " errors total"; this.dom.additionalErrorsIndication.title = errors.length + " errors total";
if (this.dom.validationErrorsContainer.clientHeight < this.dom.validationErrorsContainer.scrollHeight) { if (this.dom.validationErrorsContainer.clientHeight < this.dom.validationErrorsContainer.scrollHeight) {
this.dom.additinalErrorsIndication.style.display = 'block'; this.dom.additionalErrorsIndication.style.display = 'block';
this.dom.validationErrorsContainer.onscroll = function () { this.dom.validationErrorsContainer.onscroll = function () {
me.dom.additinalErrorsIndication.style.display = me.dom.additionalErrorsIndication.style.display =
(me.dom.validationErrorsContainer.clientHeight > 0 && me.dom.validationErrorsContainer.scrollTop === 0) ? 'block' : 'none'; (me.dom.validationErrorsContainer.clientHeight > 0 && me.dom.validationErrorsContainer.scrollTop === 0) ? 'block' : 'none';
} }
} else { } else {
@ -1027,13 +1034,10 @@ textmode.getTextSelection = function () {
}; };
/** /**
* Callback registraion for selection change * Callback registration for selection change
* @param {selectionCallback} callback * @param {selectionCallback} callback
* *
* @callback selectionCallback * @callback selectionCallback
* @param {{row:Number, column:Number}} startPos selection start position
* @param {{row:Number, column:Number}} endPos selected end position
* @param {String} text selected text
*/ */
textmode.onTextSelectionChange = function (callback) { textmode.onTextSelectionChange = function (callback) {
if (typeof callback === 'function') { if (typeof callback === 'function') {

View File

@ -129,8 +129,6 @@ treemode.destroy = function () {
* @private * @private
*/ */
treemode._setOptions = function (options) { treemode._setOptions = function (options) {
var editor = this;
this.options = { this.options = {
search: true, search: true,
history: true, history: true,
@ -140,6 +138,7 @@ treemode._setOptions = function (options) {
schemaRefs: null, schemaRefs: null,
autocomplete: null, autocomplete: null,
navigationBar : true, navigationBar : true,
mainMenuBar: true,
onSelectionChange: null, onSelectionChange: null,
colorPicker: true, colorPicker: true,
onColorPicker: function (parent, color, onChange) { onColorPicker: function (parent, color, onChange) {
@ -149,11 +148,11 @@ treemode._setOptions = function (options) {
color: color, color: color,
popup: 'bottom', popup: 'bottom',
onDone: function (color) { onDone: function (color) {
var alpha = color.rgba[3] var alpha = color.rgba[3];
var hex = (alpha === 1) var hex = (alpha === 1)
? color.hex.substr(0, 7) // return #RRGGBB ? color.hex.substr(0, 7) // return #RRGGBB
: color.hex // return #RRGGBBAA : color.hex; // return #RRGGBBAA
onChange(hex) onChange(hex);
} }
}).show(); }).show();
} }
@ -942,6 +941,9 @@ treemode._createFrame = function () {
this.frame.className = 'jsoneditor jsoneditor-mode-' + this.options.mode; this.frame.className = 'jsoneditor jsoneditor-mode-' + this.options.mode;
this.container.appendChild(this.frame); this.container.appendChild(this.frame);
this.contentOuter = document.createElement('div');
this.contentOuter.className = 'jsoneditor-outer';
// create one global event listener to handle all events from all nodes // create one global event listener to handle all events from all nodes
var editor = this; var editor = this;
function onEvent(event) { function onEvent(event) {
@ -980,105 +982,109 @@ treemode._createFrame = function () {
this.frame.onfocusin = onEvent; // for IE this.frame.onfocusin = onEvent; // for IE
this.frame.onfocusout = onEvent; // for IE this.frame.onfocusout = onEvent; // for IE
// create menu if (this.options.mainMenuBar) {
this.menu = document.createElement('div'); util.addClassName(this.contentOuter, 'has-main-menu-bar');
this.menu.className = 'jsoneditor-menu';
this.frame.appendChild(this.menu);
// create expand all button // create menu
var expandAll = document.createElement('button'); this.menu = document.createElement('div');
expandAll.type = 'button'; this.menu.className = 'jsoneditor-menu';
expandAll.className = 'jsoneditor-expand-all'; this.frame.appendChild(this.menu);
expandAll.title = translate('expandAll');
expandAll.onclick = function () {
editor.expandAll();
};
this.menu.appendChild(expandAll);
// create collapse all button // create expand all button
var collapseAll = document.createElement('button'); var expandAll = document.createElement('button');
collapseAll.type = 'button'; expandAll.type = 'button';
collapseAll.title = translate('collapseAll'); expandAll.className = 'jsoneditor-expand-all';
collapseAll.className = 'jsoneditor-collapse-all'; expandAll.title = translate('expandAll');
collapseAll.onclick = function () { expandAll.onclick = function () {
editor.collapseAll(); editor.expandAll();
};
this.menu.appendChild(collapseAll);
// create sort button
if (this.options.enableSort) {
var sort = document.createElement('button');
sort.type = 'button';
sort.className = 'jsoneditor-sort';
sort.title = translate('sortTitleShort');
sort.onclick = function () {
var anchor = editor.options.modalAnchor || DEFAULT_MODAL_ANCHOR;
showSortModal(editor.node, anchor)
}; };
this.menu.appendChild(sort); this.menu.appendChild(expandAll);
// create collapse all button
var collapseAll = document.createElement('button');
collapseAll.type = 'button';
collapseAll.title = translate('collapseAll');
collapseAll.className = 'jsoneditor-collapse-all';
collapseAll.onclick = function () {
editor.collapseAll();
};
this.menu.appendChild(collapseAll);
// create sort button
if (this.options.enableSort) {
var sort = document.createElement('button');
sort.type = 'button';
sort.className = 'jsoneditor-sort';
sort.title = translate('sortTitleShort');
sort.onclick = function () {
var anchor = editor.options.modalAnchor || DEFAULT_MODAL_ANCHOR;
showSortModal(editor.node, anchor)
};
this.menu.appendChild(sort);
}
// create transform button
if (this.options.enableTransform) {
var transform = document.createElement('button');
transform.type = 'button';
transform.title = translate('transformTitleShort');
transform.className = 'jsoneditor-transform';
transform.onclick = function () {
var anchor = editor.options.modalAnchor || DEFAULT_MODAL_ANCHOR;
showTransformModal(editor.node, anchor)
};
this.menu.appendChild(transform);
}
// create undo/redo buttons
if (this.history) {
// create undo button
var undo = document.createElement('button');
undo.type = 'button';
undo.className = 'jsoneditor-undo jsoneditor-separator';
undo.title = translate('undo');
undo.onclick = function () {
editor._onUndo();
};
this.menu.appendChild(undo);
this.dom.undo = undo;
// create redo button
var redo = document.createElement('button');
redo.type = 'button';
redo.className = 'jsoneditor-redo';
redo.title = translate('redo');
redo.onclick = function () {
editor._onRedo();
};
this.menu.appendChild(redo);
this.dom.redo = redo;
// register handler for onchange of history
this.history.onChange = function () {
undo.disabled = !editor.history.canUndo();
redo.disabled = !editor.history.canRedo();
};
this.history.onChange();
}
// create mode box
if (this.options && this.options.modes && this.options.modes.length) {
var me = this;
this.modeSwitcher = new ModeSwitcher(this.menu, this.options.modes, this.options.mode, function onSwitch(mode) {
// switch mode and restore focus
me.setMode(mode);
me.modeSwitcher.focus();
});
}
// create search box
if (this.options.search) {
this.searchBox = new SearchBox(this, this.menu);
}
} }
// create transform button if (this.options.navigationBar) {
if (this.options.enableTransform) {
var transform = document.createElement('button');
transform.type = 'button';
transform.title = translate('transformTitleShort');
transform.className = 'jsoneditor-transform';
transform.onclick = function () {
var anchor = editor.options.modalAnchor || DEFAULT_MODAL_ANCHOR;
showTransformModal(editor.node, anchor)
};
this.menu.appendChild(transform);
}
// create undo/redo buttons
if (this.history) {
// create undo button
var undo = document.createElement('button');
undo.type = 'button';
undo.className = 'jsoneditor-undo jsoneditor-separator';
undo.title = translate('undo');
undo.onclick = function () {
editor._onUndo();
};
this.menu.appendChild(undo);
this.dom.undo = undo;
// create redo button
var redo = document.createElement('button');
redo.type = 'button';
redo.className = 'jsoneditor-redo';
redo.title = translate('redo');
redo.onclick = function () {
editor._onRedo();
};
this.menu.appendChild(redo);
this.dom.redo = redo;
// register handler for onchange of history
this.history.onChange = function () {
undo.disabled = !editor.history.canUndo();
redo.disabled = !editor.history.canRedo();
};
this.history.onChange();
}
// create mode box
if (this.options && this.options.modes && this.options.modes.length) {
var me = this;
this.modeSwitcher = new ModeSwitcher(this.menu, this.options.modes, this.options.mode, function onSwitch(mode) {
// switch mode and restore focus
me.setMode(mode);
me.modeSwitcher.focus();
});
}
// create search box
if (this.options.search) {
this.searchBox = new SearchBox(this, this.menu);
}
if(this.options.navigationBar) {
// create second menu row for treepath // create second menu row for treepath
this.navBar = document.createElement('div'); this.navBar = document.createElement('div');
this.navBar.className = 'jsoneditor-navigation-bar nav-bar-empty'; this.navBar.className = 'jsoneditor-navigation-bar nav-bar-empty';
@ -1209,7 +1215,7 @@ treemode._updateTreePath = function (pathNodes) {
name: getName(node), name: getName(node),
node: node, node: node,
children: [] children: []
} };
if (node.childs && node.childs.length) { if (node.childs && node.childs.length) {
node.childs.forEach(function (childNode) { node.childs.forEach(function (childNode) {
pathObj.children.push({ pathObj.children.push({
@ -1373,10 +1379,9 @@ treemode._onMultiSelect = function (event) {
/** /**
* End of multiselect nodes by dragging * End of multiselect nodes by dragging
* @param event
* @private * @private
*/ */
treemode._onMultiSelectEnd = function (event) { treemode._onMultiSelectEnd = function () {
// set focus to the context menu button of the first node // set focus to the context menu button of the first node
if (this.multiselection.nodes[0]) { if (this.multiselection.nodes[0]) {
this.multiselection.nodes[0].dom.menu.focus(); this.multiselection.nodes[0].dom.menu.focus();
@ -1600,16 +1605,13 @@ treemode._onKeyDown = function (event) {
* @private * @private
*/ */
treemode._createTable = function () { treemode._createTable = function () {
var contentOuter = document.createElement('div'); if (this.options.navigationBar) {
contentOuter.className = 'jsoneditor-outer'; util.addClassName(this.contentOuter, 'has-nav-bar');
if(this.options.navigationBar) {
util.addClassName(contentOuter, 'has-nav-bar');
} }
this.contentOuter = contentOuter;
this.scrollableContent = document.createElement('div'); this.scrollableContent = document.createElement('div');
this.scrollableContent.className = 'jsoneditor-tree'; this.scrollableContent.className = 'jsoneditor-tree';
contentOuter.appendChild(this.scrollableContent); this.contentOuter.appendChild(this.scrollableContent);
// the jsoneditor-tree-inner div with bottom padding is here to // the jsoneditor-tree-inner div with bottom padding is here to
// keep space for the action menu dropdown. It's created as a // keep space for the action menu dropdown. It's created as a
@ -1643,7 +1645,7 @@ treemode._createTable = function () {
this.tbody = document.createElement('tbody'); this.tbody = document.createElement('tbody');
this.table.appendChild(this.tbody); this.table.appendChild(this.tbody);
this.frame.appendChild(contentOuter); this.frame.appendChild(this.contentOuter);
}; };
/** /**
@ -1707,12 +1709,10 @@ treemode.getSelection = function () {
}; };
/** /**
* Callback registraion for selection change * Callback registration for selection change
* @param {selectionCallback} callback * @param {selectionCallback} callback
* *
* @callback selectionCallback * @callback selectionCallback
* @param {SerializableNode=} start
* @param {SerializableNode=} end
*/ */
treemode.onSelectionChange = function (callback) { treemode.onSelectionChange = function (callback) {
if (typeof callback === 'function') { if (typeof callback === 'function') {
@ -1731,7 +1731,7 @@ treemode.onSelectionChange = function (callback) {
treemode.setSelection = function (start, end) { treemode.setSelection = function (start, end) {
// check for old usage // check for old usage
if (start && start.dom && start.range) { if (start && start.dom && start.range) {
console.warn('setSelection/getSelection usage for text selection is depracated and should not be used, see documantaion for supported selection options'); console.warn('setSelection/getSelection usage for text selection is deprecated and should not be used, see documentation for supported selection options');
this.setDomSelection(start); this.setDomSelection(start);
} }
@ -1747,7 +1747,7 @@ treemode.setSelection = function (start, end) {
* Returns a set of Nodes according to a range of selection * Returns a set of Nodes according to a range of selection
* @param {{path: Array.<String>}} start object contains the path for range start * @param {{path: Array.<String>}} start object contains the path for range start
* @param {{path: Array.<String>}=} end object contains the path for range end * @param {{path: Array.<String>}=} end object contains the path for range end
* @return {Array.<Node>} Node intances on the given range * @return {Array.<Node>} Node instances on the given range
* @private * @private
*/ */
treemode._getNodeInstancesByRange = function (start, end) { treemode._getNodeInstancesByRange = function (start, end) {