mirror of
https://github.com/roytam1/UXP.git
synced 2026-05-27 13:28:28 +00:00
199 lines
5.2 KiB
JavaScript
199 lines
5.2 KiB
JavaScript
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
|
||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||
|
||
"use strict";
|
||
|
||
// Make this available to both AMD and CJS environments
|
||
define(function (require, exports, module) {
|
||
// Dependencies
|
||
const React = require("devtools/client/shared/vendor/react");
|
||
const { createFactories, isGrip } = require("./rep-utils");
|
||
const { Caption } = createFactories(require("./caption"));
|
||
|
||
// Shortcuts
|
||
const { span } = React.DOM;
|
||
|
||
/**
|
||
* Renders an array. The array is enclosed by left and right bracket
|
||
* and the max number of rendered items depends on the current mode.
|
||
*/
|
||
let GripArray = React.createClass({
|
||
displayName: "GripArray",
|
||
|
||
propTypes: {
|
||
object: React.PropTypes.object.isRequired,
|
||
mode: React.PropTypes.string,
|
||
provider: React.PropTypes.object,
|
||
},
|
||
|
||
getLength: function (grip) {
|
||
if (!grip.preview) {
|
||
return 0;
|
||
}
|
||
|
||
return grip.preview.length || grip.preview.childNodesLength || 0;
|
||
},
|
||
|
||
getTitle: function (object, context) {
|
||
let objectLink = this.props.objectLink || span;
|
||
if (this.props.mode != "tiny") {
|
||
return objectLink({
|
||
object: object
|
||
}, object.class + " ");
|
||
}
|
||
return "";
|
||
},
|
||
|
||
getPreviewItems: function (grip) {
|
||
if (!grip.preview) {
|
||
return null;
|
||
}
|
||
|
||
return grip.preview.items || grip.preview.childNodes || null;
|
||
},
|
||
|
||
arrayIterator: function (grip, max) {
|
||
let items = [];
|
||
const gripLength = this.getLength(grip);
|
||
|
||
if (!gripLength) {
|
||
return items;
|
||
}
|
||
|
||
const previewItems = this.getPreviewItems(grip);
|
||
if (!previewItems) {
|
||
return items;
|
||
}
|
||
|
||
let delim;
|
||
// number of grip preview items is limited to 10, but we may have more
|
||
// items in grip-array.
|
||
let delimMax = gripLength > previewItems.length ?
|
||
previewItems.length : previewItems.length - 1;
|
||
let provider = this.props.provider;
|
||
|
||
for (let i = 0; i < previewItems.length && i < max; i++) {
|
||
try {
|
||
let itemGrip = previewItems[i];
|
||
let value = provider ? provider.getValue(itemGrip) : itemGrip;
|
||
|
||
delim = (i == delimMax ? "" : ", ");
|
||
|
||
items.push(GripArrayItem(Object.assign({}, this.props, {
|
||
object: value,
|
||
delim: delim
|
||
})));
|
||
} catch (exc) {
|
||
items.push(GripArrayItem(Object.assign({}, this.props, {
|
||
object: exc,
|
||
delim: delim
|
||
})));
|
||
}
|
||
}
|
||
if (previewItems.length > max || gripLength > previewItems.length) {
|
||
let objectLink = this.props.objectLink || span;
|
||
let leftItemNum = gripLength - max > 0 ?
|
||
gripLength - max : gripLength - previewItems.length;
|
||
items.push(Caption({
|
||
object: objectLink({
|
||
object: this.props.object
|
||
}, leftItemNum + " more…")
|
||
}));
|
||
}
|
||
|
||
return items;
|
||
},
|
||
|
||
render: function () {
|
||
let mode = this.props.mode || "short";
|
||
let object = this.props.object;
|
||
|
||
let items;
|
||
let brackets;
|
||
let needSpace = function (space) {
|
||
return space ? { left: "[ ", right: " ]"} : { left: "[", right: "]"};
|
||
};
|
||
|
||
if (mode == "tiny") {
|
||
let objectLength = this.getLength(object);
|
||
let isEmpty = objectLength === 0;
|
||
items = [span({className: "length"}, isEmpty ? "" : objectLength)];
|
||
brackets = needSpace(false);
|
||
} else {
|
||
let max = (mode == "short") ? 3 : 300;
|
||
items = this.arrayIterator(object, max);
|
||
brackets = needSpace(items.length > 0);
|
||
}
|
||
|
||
let objectLink = this.props.objectLink || span;
|
||
let title = this.getTitle(object);
|
||
|
||
return (
|
||
span({
|
||
className: "objectBox objectBox-array"},
|
||
title,
|
||
objectLink({
|
||
className: "arrayLeftBracket",
|
||
object: object
|
||
}, brackets.left),
|
||
...items,
|
||
objectLink({
|
||
className: "arrayRightBracket",
|
||
object: object
|
||
}, brackets.right),
|
||
span({
|
||
className: "arrayProperties",
|
||
role: "group"}
|
||
)
|
||
)
|
||
);
|
||
},
|
||
});
|
||
|
||
/**
|
||
* Renders array item. Individual values are separated by
|
||
* a delimiter (a comma by default).
|
||
*/
|
||
let GripArrayItem = React.createFactory(React.createClass({
|
||
displayName: "GripArrayItem",
|
||
|
||
propTypes: {
|
||
delim: React.PropTypes.string,
|
||
},
|
||
|
||
render: function () {
|
||
let { Rep } = createFactories(require("./rep"));
|
||
|
||
return (
|
||
span({},
|
||
Rep(Object.assign({}, this.props, {
|
||
mode: "tiny"
|
||
})),
|
||
this.props.delim
|
||
)
|
||
);
|
||
}
|
||
}));
|
||
|
||
function supportsObject(grip, type) {
|
||
if (!isGrip(grip)) {
|
||
return false;
|
||
}
|
||
|
||
return (grip.preview && (
|
||
grip.preview.kind == "ArrayLike" ||
|
||
type === "DocumentFragment"
|
||
)
|
||
);
|
||
}
|
||
|
||
// Exports from this module
|
||
exports.GripArray = {
|
||
rep: GripArray,
|
||
supportsObject: supportsObject
|
||
};
|
||
});
|