jsoneditor
Version:
A web-based tool to view, edit, format, and validate JSON
158 lines (134 loc) • 4.71 kB
JavaScript
'use strict';
var translate = require('./i18n').translate;
/**
* A factory function to create an ShowMoreNode, which depends on a Node
* @param {function} Node
*/
function showMoreNodeFactory(Node) {
/**
* @constructor ShowMoreNode
* @extends Node
* @param {TreeEditor} editor
* @param {Node} parent
* Create a new ShowMoreNode. This is a special node which is created
* for arrays or objects having more than 100 items
*/
function ShowMoreNode (editor, parent) {
/** @type {TreeEditor} */
this.editor = editor;
this.parent = parent;
this.dom = {};
}
ShowMoreNode.prototype = new Node();
/**
* Return a table row with an append button.
* @return {Element} dom TR element
*/
ShowMoreNode.prototype.getDom = function () {
if (this.dom.tr) {
return this.dom.tr;
}
this._updateEditability();
// display "show more"
if (!this.dom.tr) {
var me = this;
var parent = this.parent;
var showMoreButton = document.createElement('a');
showMoreButton.appendChild(document.createTextNode(translate('showMore')));
showMoreButton.href = '#';
showMoreButton.onclick = function (event) {
// TODO: use callback instead of accessing a method of the parent
parent.visibleChilds = Math.floor(parent.visibleChilds / parent.getMaxVisibleChilds() + 1) *
parent.getMaxVisibleChilds();
me.updateDom();
parent.showChilds();
event.preventDefault();
return false;
};
var showAllButton = document.createElement('a');
showAllButton.appendChild(document.createTextNode(translate('showAll')));
showAllButton.href = '#';
showAllButton.onclick = function (event) {
// TODO: use callback instead of accessing a method of the parent
parent.visibleChilds = Infinity;
me.updateDom();
parent.showChilds();
event.preventDefault();
return false;
};
var moreContents = document.createElement('div');
var moreText = document.createTextNode(this._getShowMoreText());
moreContents.className = 'jsoneditor-show-more';
moreContents.appendChild(moreText);
moreContents.appendChild(showMoreButton);
moreContents.appendChild(document.createTextNode('. '));
moreContents.appendChild(showAllButton);
moreContents.appendChild(document.createTextNode('. '));
var tdContents = document.createElement('td');
tdContents.appendChild(moreContents);
var moreTr = document.createElement('tr');
if (this.editor.options.mode === 'tree') {
moreTr.appendChild(document.createElement('td'));
moreTr.appendChild(document.createElement('td'));
}
moreTr.appendChild(tdContents);
moreTr.className = 'jsoneditor-show-more';
this.dom.tr = moreTr;
this.dom.moreContents = moreContents;
this.dom.moreText = moreText;
}
this.updateDom();
return this.dom.tr;
};
/**
* Update the HTML dom of the Node
*/
ShowMoreNode.prototype.updateDom = function(options) {
if (this.isVisible()) {
// attach to the right child node (the first non-visible child)
this.dom.tr.node = this.parent.childs[this.parent.visibleChilds];
if (!this.dom.tr.parentNode) {
var nextTr = this.parent._getNextTr();
if (nextTr) {
nextTr.parentNode.insertBefore(this.dom.tr, nextTr);
}
}
// update the counts in the text
this.dom.moreText.nodeValue = this._getShowMoreText();
// update left margin
this.dom.moreContents.style.marginLeft = (this.getLevel() + 1) * 24 + 'px';
}
else {
if (this.dom.tr && this.dom.tr.parentNode) {
this.dom.tr.parentNode.removeChild(this.dom.tr);
}
}
};
ShowMoreNode.prototype._getShowMoreText = function() {
return translate('showMoreStatus', {
visibleChilds: this.parent.visibleChilds,
totalChilds: this.parent.childs.length
}) + ' ';
};
/**
* Check whether the ShowMoreNode is currently visible.
* the ShowMoreNode is visible when it's parent has more childs than
* the current visibleChilds
* @return {boolean} isVisible
*/
ShowMoreNode.prototype.isVisible = function () {
return this.parent.expanded && this.parent.childs.length > this.parent.visibleChilds;
};
/**
* Handle an event. The event is caught centrally by the editor
* @param {Event} event
*/
ShowMoreNode.prototype.onEvent = function (event) {
var type = event.type;
if (type === 'keydown') {
this.onKeyDown(event);
}
};
return ShowMoreNode;
}
module.exports = showMoreNodeFactory;