Merge branch 'fix-function-editor'
This commit is contained in:
@@ -69,6 +69,7 @@
|
|||||||
"react-table": "^6.8.6",
|
"react-table": "^6.8.6",
|
||||||
"react-test-renderer": "^16.7.0",
|
"react-test-renderer": "^16.7.0",
|
||||||
"react-transition-group": "^2.5.2",
|
"react-transition-group": "^2.5.2",
|
||||||
|
"rst2html": "github:thoward/rst2html#990cb89",
|
||||||
"sass-loader": "^7.1.0",
|
"sass-loader": "^7.1.0",
|
||||||
"style-loader": "^0.23.1",
|
"style-loader": "^0.23.1",
|
||||||
"tether-drop": "^1.4.2",
|
"tether-drop": "^1.4.2",
|
||||||
|
|||||||
109
src/datasource-zabbix/components/FunctionEditor.tsx
Normal file
109
src/datasource-zabbix/components/FunctionEditor.tsx
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
import React from 'react';
|
||||||
|
// import rst2html from 'rst2html';
|
||||||
|
import { FunctionDescriptor, FunctionEditorControlsProps, FunctionEditorControls } from './FunctionEditorControls';
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
import { PopperController, Popper } from '@grafana/ui';
|
||||||
|
|
||||||
|
interface FunctionEditorProps extends FunctionEditorControlsProps {
|
||||||
|
func: FunctionDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FunctionEditorState {
|
||||||
|
showingDescription: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
class FunctionEditor extends React.PureComponent<FunctionEditorProps, FunctionEditorState> {
|
||||||
|
private triggerRef = React.createRef<HTMLSpanElement>();
|
||||||
|
|
||||||
|
constructor(props: FunctionEditorProps) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
showingDescription: false,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
renderContent = ({ updatePopperPosition }) => {
|
||||||
|
const {
|
||||||
|
onMoveLeft,
|
||||||
|
onMoveRight,
|
||||||
|
func: {
|
||||||
|
def: { name, description },
|
||||||
|
},
|
||||||
|
} = this.props;
|
||||||
|
const { showingDescription } = this.state;
|
||||||
|
|
||||||
|
if (showingDescription) {
|
||||||
|
return (
|
||||||
|
<div style={{ overflow: 'auto', maxHeight: '30rem', textAlign: 'left', fontWeight: 'normal' }}>
|
||||||
|
<h4 style={{ color: 'white' }}> {name} </h4>
|
||||||
|
<div>{description}</div>
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<FunctionEditorControls
|
||||||
|
{...this.props}
|
||||||
|
onMoveLeft={() => {
|
||||||
|
onMoveLeft(this.props.func);
|
||||||
|
updatePopperPosition();
|
||||||
|
}}
|
||||||
|
onMoveRight={() => {
|
||||||
|
onMoveRight(this.props.func);
|
||||||
|
updatePopperPosition();
|
||||||
|
}}
|
||||||
|
onDescriptionShow={() => {
|
||||||
|
this.setState({ showingDescription: true }, () => {
|
||||||
|
updatePopperPosition();
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<PopperController content={this.renderContent} placement="top" hideAfter={300}>
|
||||||
|
{(showPopper, hidePopper, popperProps) => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{this.triggerRef && (
|
||||||
|
<Popper
|
||||||
|
{...popperProps}
|
||||||
|
referenceElement={this.triggerRef.current}
|
||||||
|
wrapperClassName="popper"
|
||||||
|
className="popper__background"
|
||||||
|
onMouseLeave={() => {
|
||||||
|
this.setState({ showingDescription: false });
|
||||||
|
hidePopper();
|
||||||
|
}}
|
||||||
|
onMouseEnter={showPopper}
|
||||||
|
renderArrow={({ arrowProps, placement }) => (
|
||||||
|
<div className="popper__arrow" data-placement={placement} {...arrowProps} />
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<span
|
||||||
|
ref={this.triggerRef}
|
||||||
|
onClick={popperProps.show ? hidePopper : showPopper}
|
||||||
|
onMouseLeave={() => {
|
||||||
|
hidePopper();
|
||||||
|
this.setState({ showingDescription: false });
|
||||||
|
}}
|
||||||
|
style={{ cursor: 'pointer' }}
|
||||||
|
>
|
||||||
|
{this.props.func.def.name}
|
||||||
|
</span>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
</PopperController>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export { FunctionEditor };
|
||||||
67
src/datasource-zabbix/components/FunctionEditorControls.tsx
Normal file
67
src/datasource-zabbix/components/FunctionEditorControls.tsx
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
const DOCS_FUNC_REF_URL = 'https://alexanderzobnin.github.io/grafana-zabbix/reference/functions/';
|
||||||
|
|
||||||
|
export interface FunctionDescriptor {
|
||||||
|
text: string;
|
||||||
|
params: string[];
|
||||||
|
def: {
|
||||||
|
category: string;
|
||||||
|
defaultParams: string[];
|
||||||
|
description?: string;
|
||||||
|
fake: boolean;
|
||||||
|
name: string;
|
||||||
|
params: string[];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface FunctionEditorControlsProps {
|
||||||
|
onMoveLeft: (func: FunctionDescriptor) => void;
|
||||||
|
onMoveRight: (func: FunctionDescriptor) => void;
|
||||||
|
onRemove: (func: FunctionDescriptor) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FunctionHelpButton = (props: { description: string; name: string; onDescriptionShow: () => void }) => {
|
||||||
|
if (props.description) {
|
||||||
|
return <span className="pointer fa fa-question-circle" onClick={props.onDescriptionShow} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<span
|
||||||
|
className="pointer fa fa-question-circle"
|
||||||
|
onClick={() => {
|
||||||
|
window.open(
|
||||||
|
DOCS_FUNC_REF_URL + '#' + props.name,
|
||||||
|
'_blank'
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const FunctionEditorControls = (
|
||||||
|
props: FunctionEditorControlsProps & {
|
||||||
|
func: FunctionDescriptor;
|
||||||
|
onDescriptionShow: () => void;
|
||||||
|
}
|
||||||
|
) => {
|
||||||
|
const { func, onMoveLeft, onMoveRight, onRemove, onDescriptionShow } = props;
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: 'flex',
|
||||||
|
width: '60px',
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<span className="pointer fa fa-arrow-left" onClick={() => onMoveLeft(func)} />
|
||||||
|
<FunctionHelpButton
|
||||||
|
name={func.def.name}
|
||||||
|
description={func.def.description}
|
||||||
|
onDescriptionShow={onDescriptionShow}
|
||||||
|
/>
|
||||||
|
<span className="pointer fa fa-remove" onClick={() => onRemove(func)} />
|
||||||
|
<span className="pointer fa fa-arrow-right" onClick={() => onMoveRight(func)} />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -1,248 +0,0 @@
|
|||||||
import angular from 'angular';
|
|
||||||
import _ from 'lodash';
|
|
||||||
import $ from 'jquery';
|
|
||||||
|
|
||||||
const DOCS_FUNC_REF_URL = 'https://alexanderzobnin.github.io/grafana-zabbix/reference/functions/';
|
|
||||||
|
|
||||||
angular
|
|
||||||
.module('grafana.directives')
|
|
||||||
.directive('metricFunctionEditor',
|
|
||||||
|
|
||||||
/** @ngInject */
|
|
||||||
function($compile, templateSrv) {
|
|
||||||
|
|
||||||
var funcSpanTemplate = '<a ng-click="">{{func.def.name}}</a><span>(</span>';
|
|
||||||
var paramTemplate = '<input type="text" style="display:none"' +
|
|
||||||
' class="input-mini tight-form-func-param"></input>';
|
|
||||||
|
|
||||||
var funcControlsTemplate =
|
|
||||||
'<div class="tight-form-func-controls">' +
|
|
||||||
'<span class="pointer fa fa-arrow-left"></span>' +
|
|
||||||
'<span class="pointer fa fa-question-circle"></span>' +
|
|
||||||
'<span class="pointer fa fa-remove" ></span>' +
|
|
||||||
'<span class="pointer fa fa-arrow-right"></span>' +
|
|
||||||
'</div>';
|
|
||||||
|
|
||||||
return {
|
|
||||||
restrict: 'A',
|
|
||||||
link: function postLink($scope, elem) {
|
|
||||||
var $funcLink = $(funcSpanTemplate);
|
|
||||||
var $funcControls = $(funcControlsTemplate);
|
|
||||||
var ctrl = $scope.ctrl;
|
|
||||||
var func = $scope.func;
|
|
||||||
var funcDef = func.def;
|
|
||||||
var scheduledRelink = false;
|
|
||||||
var paramCountAtLink = 0;
|
|
||||||
|
|
||||||
function clickFuncParam(paramIndex) {
|
|
||||||
/*jshint validthis:true */
|
|
||||||
|
|
||||||
var $link = $(this);
|
|
||||||
var $input = $link.next();
|
|
||||||
|
|
||||||
$input.val(func.params[paramIndex]);
|
|
||||||
$input.css('width', ($link.width() + 16) + 'px');
|
|
||||||
|
|
||||||
$link.hide();
|
|
||||||
$input.show();
|
|
||||||
$input.focus();
|
|
||||||
$input.select();
|
|
||||||
|
|
||||||
var typeahead = $input.data('typeahead');
|
|
||||||
if (typeahead) {
|
|
||||||
$input.val('');
|
|
||||||
typeahead.lookup();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function scheduledRelinkIfNeeded() {
|
|
||||||
if (paramCountAtLink === func.params.length) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!scheduledRelink) {
|
|
||||||
scheduledRelink = true;
|
|
||||||
setTimeout(function() {
|
|
||||||
relink();
|
|
||||||
scheduledRelink = false;
|
|
||||||
}, 200);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function inputBlur(paramIndex) {
|
|
||||||
/*jshint validthis:true */
|
|
||||||
var $input = $(this);
|
|
||||||
var $link = $input.prev();
|
|
||||||
var newValue = $input.val();
|
|
||||||
|
|
||||||
if (newValue !== '' || func.def.params[paramIndex].optional) {
|
|
||||||
$link.html(templateSrv.highlightVariablesAsHtml(newValue));
|
|
||||||
|
|
||||||
func.updateParam($input.val(), paramIndex);
|
|
||||||
scheduledRelinkIfNeeded();
|
|
||||||
|
|
||||||
$scope.$apply(function() {
|
|
||||||
ctrl.targetChanged();
|
|
||||||
});
|
|
||||||
|
|
||||||
$input.hide();
|
|
||||||
$link.show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function inputKeyPress(paramIndex, e) {
|
|
||||||
/*jshint validthis:true */
|
|
||||||
if(e.which === 13) {
|
|
||||||
inputBlur.call(this, paramIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function inputKeyDown() {
|
|
||||||
/*jshint validthis:true */
|
|
||||||
this.style.width = (3 + this.value.length) * 8 + 'px';
|
|
||||||
}
|
|
||||||
|
|
||||||
function addTypeahead($input, paramIndex) {
|
|
||||||
$input.attr('data-provide', 'typeahead');
|
|
||||||
|
|
||||||
var options = funcDef.params[paramIndex].options;
|
|
||||||
if (funcDef.params[paramIndex].type === 'int' ||
|
|
||||||
funcDef.params[paramIndex].type === 'float') {
|
|
||||||
options = _.map(options, function(val) { return val.toString(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
$input.typeahead({
|
|
||||||
source: options,
|
|
||||||
minLength: 0,
|
|
||||||
items: 20,
|
|
||||||
updater: function (value) {
|
|
||||||
setTimeout(function() {
|
|
||||||
inputBlur.call($input[0], paramIndex);
|
|
||||||
}, 0);
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var typeahead = $input.data('typeahead');
|
|
||||||
typeahead.lookup = function () {
|
|
||||||
this.query = this.$element.val() || '';
|
|
||||||
return this.process(this.source);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function toggleFuncControls() {
|
|
||||||
var targetDiv = elem.closest('.tight-form');
|
|
||||||
|
|
||||||
if (elem.hasClass('show-function-controls')) {
|
|
||||||
elem.removeClass('show-function-controls');
|
|
||||||
targetDiv.removeClass('has-open-function');
|
|
||||||
$funcControls.hide();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
elem.addClass('show-function-controls');
|
|
||||||
targetDiv.addClass('has-open-function');
|
|
||||||
|
|
||||||
$funcControls.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
function addElementsAndCompile() {
|
|
||||||
$funcControls.appendTo(elem);
|
|
||||||
$funcLink.appendTo(elem);
|
|
||||||
|
|
||||||
_.each(funcDef.params, function(param, index) {
|
|
||||||
if (param.optional && func.params.length <= index) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index > 0) {
|
|
||||||
$('<span>, </span>').appendTo(elem);
|
|
||||||
}
|
|
||||||
|
|
||||||
var paramValue = templateSrv.highlightVariablesAsHtml(func.params[index]);
|
|
||||||
var $paramLink = $('<a ng-click="" class="graphite-func-param-link">' + paramValue + '</a>');
|
|
||||||
var $input = $(paramTemplate);
|
|
||||||
|
|
||||||
paramCountAtLink++;
|
|
||||||
|
|
||||||
$paramLink.appendTo(elem);
|
|
||||||
$input.appendTo(elem);
|
|
||||||
|
|
||||||
$input.blur(_.partial(inputBlur, index));
|
|
||||||
$input.keyup(inputKeyDown);
|
|
||||||
$input.keypress(_.partial(inputKeyPress, index));
|
|
||||||
$paramLink.click(_.partial(clickFuncParam, index));
|
|
||||||
|
|
||||||
if (funcDef.params[index].options) {
|
|
||||||
addTypeahead($input, index);
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
$('<span>)</span>').appendTo(elem);
|
|
||||||
|
|
||||||
$compile(elem.contents())($scope);
|
|
||||||
}
|
|
||||||
|
|
||||||
function ifJustAddedFocusFistParam() {
|
|
||||||
if ($scope.func.added) {
|
|
||||||
$scope.func.added = false;
|
|
||||||
setTimeout(function() {
|
|
||||||
elem.find('.graphite-func-param-link').first().click();
|
|
||||||
}, 10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function registerFuncControlsToggle() {
|
|
||||||
$funcLink.click(toggleFuncControls);
|
|
||||||
}
|
|
||||||
|
|
||||||
function registerFuncControlsActions() {
|
|
||||||
$funcControls.click(function(e) {
|
|
||||||
var $target = $(e.target);
|
|
||||||
if ($target.hasClass('fa-remove')) {
|
|
||||||
toggleFuncControls();
|
|
||||||
$scope.$apply(function() {
|
|
||||||
ctrl.removeFunction($scope.func);
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($target.hasClass('fa-arrow-left')) {
|
|
||||||
$scope.$apply(function() {
|
|
||||||
_.move($scope.target.functions, $scope.$index, $scope.$index - 1);
|
|
||||||
ctrl.targetChanged();
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($target.hasClass('fa-arrow-right')) {
|
|
||||||
$scope.$apply(function() {
|
|
||||||
_.move($scope.target.functions, $scope.$index, $scope.$index + 1);
|
|
||||||
ctrl.targetChanged();
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($target.hasClass('fa-question-circle')) {
|
|
||||||
var docSite = DOCS_FUNC_REF_URL;
|
|
||||||
window.open(docSite + '#' + funcDef.name.toLowerCase(),'_blank');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function relink() {
|
|
||||||
elem.children().remove();
|
|
||||||
|
|
||||||
addElementsAndCompile();
|
|
||||||
ifJustAddedFocusFistParam();
|
|
||||||
registerFuncControlsToggle();
|
|
||||||
registerFuncControlsActions();
|
|
||||||
}
|
|
||||||
|
|
||||||
relink();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
});
|
|
||||||
256
src/datasource-zabbix/metric-function-editor.directive.ts
Normal file
256
src/datasource-zabbix/metric-function-editor.directive.ts
Normal file
@@ -0,0 +1,256 @@
|
|||||||
|
import coreModule from 'grafana/app/core/core_module';
|
||||||
|
import _ from 'lodash';
|
||||||
|
import $ from 'jquery';
|
||||||
|
import { react2AngularDirective } from './react2angular';
|
||||||
|
import { FunctionEditor } from './components/FunctionEditor';
|
||||||
|
|
||||||
|
/** @ngInject */
|
||||||
|
export function zabbixFunctionEditor($compile, templateSrv) {
|
||||||
|
const funcSpanTemplate = `
|
||||||
|
<zbx-function-editor
|
||||||
|
func="func"
|
||||||
|
onRemove="ctrl.handleRemoveFunction"
|
||||||
|
onMoveLeft="ctrl.handleMoveLeft"
|
||||||
|
onMoveRight="ctrl.handleMoveRight"
|
||||||
|
/><span>(</span>
|
||||||
|
`;
|
||||||
|
const paramTemplate =
|
||||||
|
'<input type="text" style="display:none"' + ' class="input-small tight-form-func-param"></input>';
|
||||||
|
|
||||||
|
return {
|
||||||
|
restrict: 'A',
|
||||||
|
link: function postLink($scope, elem) {
|
||||||
|
const $funcLink = $(funcSpanTemplate);
|
||||||
|
const ctrl = $scope.ctrl;
|
||||||
|
const func = $scope.func;
|
||||||
|
let scheduledRelink = false;
|
||||||
|
let paramCountAtLink = 0;
|
||||||
|
let cancelBlur = null;
|
||||||
|
|
||||||
|
ctrl.handleRemoveFunction = func => {
|
||||||
|
ctrl.removeFunction(func);
|
||||||
|
};
|
||||||
|
|
||||||
|
ctrl.handleMoveLeft = func => {
|
||||||
|
ctrl.moveFunction(func, -1);
|
||||||
|
};
|
||||||
|
|
||||||
|
ctrl.handleMoveRight = func => {
|
||||||
|
ctrl.moveFunction(func, 1);
|
||||||
|
};
|
||||||
|
|
||||||
|
function clickFuncParam(this: any, paramIndex) {
|
||||||
|
/*jshint validthis:true */
|
||||||
|
|
||||||
|
const $link = $(this);
|
||||||
|
const $comma = $link.prev('.comma');
|
||||||
|
const $input = $link.next();
|
||||||
|
|
||||||
|
$input.val(func.params[paramIndex]);
|
||||||
|
|
||||||
|
$comma.removeClass('query-part__last');
|
||||||
|
$link.hide();
|
||||||
|
$input.show();
|
||||||
|
$input.focus();
|
||||||
|
$input.select();
|
||||||
|
|
||||||
|
const typeahead = $input.data('typeahead');
|
||||||
|
if (typeahead) {
|
||||||
|
$input.val('');
|
||||||
|
typeahead.lookup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function scheduledRelinkIfNeeded() {
|
||||||
|
if (paramCountAtLink === func.params.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!scheduledRelink) {
|
||||||
|
scheduledRelink = true;
|
||||||
|
setTimeout(() => {
|
||||||
|
relink();
|
||||||
|
scheduledRelink = false;
|
||||||
|
}, 200);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function paramDef(index) {
|
||||||
|
if (index < func.def.params.length) {
|
||||||
|
return func.def.params[index];
|
||||||
|
}
|
||||||
|
if ((_.last(func.def.params) as any).multiple) {
|
||||||
|
return _.assign({}, _.last(func.def.params), { optional: true });
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
function switchToLink(inputElem, paramIndex) {
|
||||||
|
/*jshint validthis:true */
|
||||||
|
const $input = $(inputElem);
|
||||||
|
|
||||||
|
clearTimeout(cancelBlur);
|
||||||
|
cancelBlur = null;
|
||||||
|
|
||||||
|
const $link = $input.prev();
|
||||||
|
const $comma = $link.prev('.comma');
|
||||||
|
const newValue = $input.val();
|
||||||
|
|
||||||
|
// remove optional empty params
|
||||||
|
if (newValue !== '' || paramDef(paramIndex).optional) {
|
||||||
|
func.updateParam(newValue, paramIndex);
|
||||||
|
$link.html(newValue ? templateSrv.highlightVariablesAsHtml(newValue) : ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
scheduledRelinkIfNeeded();
|
||||||
|
|
||||||
|
$scope.$apply(() => {
|
||||||
|
ctrl.targetChanged();
|
||||||
|
});
|
||||||
|
|
||||||
|
if ($link.hasClass('query-part__last') && newValue === '') {
|
||||||
|
$comma.addClass('query-part__last');
|
||||||
|
} else {
|
||||||
|
$link.removeClass('query-part__last');
|
||||||
|
}
|
||||||
|
|
||||||
|
$input.hide();
|
||||||
|
$link.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
// this = input element
|
||||||
|
function inputBlur(this: any, paramIndex) {
|
||||||
|
/*jshint validthis:true */
|
||||||
|
const inputElem = this;
|
||||||
|
// happens long before the click event on the typeahead options
|
||||||
|
// need to have long delay because the blur
|
||||||
|
cancelBlur = setTimeout(() => {
|
||||||
|
switchToLink(inputElem, paramIndex);
|
||||||
|
}, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
function inputKeyPress(this: any, paramIndex, e) {
|
||||||
|
/*jshint validthis:true */
|
||||||
|
if (e.which === 13) {
|
||||||
|
$(this).blur();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function inputKeyDown(this: any) {
|
||||||
|
/*jshint validthis:true */
|
||||||
|
this.style.width = (3 + this.value.length) * 8 + 'px';
|
||||||
|
}
|
||||||
|
|
||||||
|
function addTypeahead($input, paramIndex) {
|
||||||
|
$input.attr('data-provide', 'typeahead');
|
||||||
|
|
||||||
|
let options = paramDef(paramIndex).options;
|
||||||
|
if (paramDef(paramIndex).type === 'int' || paramDef(paramIndex).type === 'float') {
|
||||||
|
options = _.map(options, val => {
|
||||||
|
return val.toString();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$input.typeahead({
|
||||||
|
source: options,
|
||||||
|
minLength: 0,
|
||||||
|
items: 20,
|
||||||
|
updater: value => {
|
||||||
|
$input.val(value);
|
||||||
|
switchToLink($input[0], paramIndex);
|
||||||
|
return value;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const typeahead = $input.data('typeahead');
|
||||||
|
typeahead.lookup = function() {
|
||||||
|
this.query = this.$element.val() || '';
|
||||||
|
return this.process(this.source);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function addElementsAndCompile() {
|
||||||
|
$funcLink.appendTo(elem);
|
||||||
|
|
||||||
|
const defParams: any = _.clone(func.def.params);
|
||||||
|
const lastParam: any = _.last(func.def.params);
|
||||||
|
|
||||||
|
while (func.params.length >= defParams.length && lastParam && lastParam.multiple) {
|
||||||
|
defParams.push(_.assign({}, lastParam, { optional: true }));
|
||||||
|
}
|
||||||
|
|
||||||
|
_.each(defParams, (param: any, index: number) => {
|
||||||
|
if (param.optional && func.params.length < index) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let paramValue = templateSrv.highlightVariablesAsHtml(func.params[index]);
|
||||||
|
const hasValue = paramValue !== null && paramValue !== undefined;
|
||||||
|
|
||||||
|
const last = index >= func.params.length - 1 && param.optional && !hasValue;
|
||||||
|
if (last && param.multiple) {
|
||||||
|
paramValue = '+';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index > 0) {
|
||||||
|
$('<span class="comma' + (last ? ' query-part__last' : '') + '">, </span>').appendTo(elem);
|
||||||
|
}
|
||||||
|
|
||||||
|
const $paramLink = $(
|
||||||
|
'<a ng-click="" class="graphite-func-param-link' +
|
||||||
|
(last ? ' query-part__last' : '') +
|
||||||
|
'">' +
|
||||||
|
(hasValue ? paramValue : ' ') +
|
||||||
|
'</a>'
|
||||||
|
);
|
||||||
|
const $input = $(paramTemplate);
|
||||||
|
$input.attr('placeholder', param.name);
|
||||||
|
|
||||||
|
paramCountAtLink++;
|
||||||
|
|
||||||
|
$paramLink.appendTo(elem);
|
||||||
|
$input.appendTo(elem);
|
||||||
|
|
||||||
|
$input.blur(_.partial(inputBlur, index));
|
||||||
|
$input.keyup(inputKeyDown);
|
||||||
|
$input.keypress(_.partial(inputKeyPress, index));
|
||||||
|
$paramLink.click(_.partial(clickFuncParam, index));
|
||||||
|
|
||||||
|
if (param.options) {
|
||||||
|
addTypeahead($input, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('<span>)</span>').appendTo(elem);
|
||||||
|
|
||||||
|
$compile(elem.contents())($scope);
|
||||||
|
}
|
||||||
|
|
||||||
|
function ifJustAddedFocusFirstParam() {
|
||||||
|
if ($scope.func.added) {
|
||||||
|
$scope.func.added = false;
|
||||||
|
setTimeout(() => {
|
||||||
|
elem
|
||||||
|
.find('.graphite-func-param-link')
|
||||||
|
.first()
|
||||||
|
.click();
|
||||||
|
}, 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function relink() {
|
||||||
|
elem.children().remove();
|
||||||
|
addElementsAndCompile();
|
||||||
|
ifJustAddedFocusFirstParam();
|
||||||
|
}
|
||||||
|
|
||||||
|
relink();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
coreModule.directive('zabbixFunctionEditor', zabbixFunctionEditor);
|
||||||
|
|
||||||
|
react2AngularDirective('zbxFunctionEditor', FunctionEditor, ['func', 'onRemove', 'onMoveLeft', 'onMoveRight']);
|
||||||
@@ -204,7 +204,9 @@
|
|||||||
<div class="gf-form-inline" ng-show="ctrl.target.mode == editorMode.METRICS || ctrl.target.mode == editorMode.ITEMID">
|
<div class="gf-form-inline" ng-show="ctrl.target.mode == editorMode.METRICS || ctrl.target.mode == editorMode.ITEMID">
|
||||||
<div class="gf-form">
|
<div class="gf-form">
|
||||||
<label class="gf-form-label query-keyword width-7">Functions</label>
|
<label class="gf-form-label query-keyword width-7">Functions</label>
|
||||||
<div ng-repeat="func in ctrl.target.functions" class="gf-form-label query-part" metric-function-editor></div>
|
</div>
|
||||||
|
<div ng-repeat="func in ctrl.target.functions" class="gf-form">
|
||||||
|
<span zabbix-function-editor class="gf-form-label query-part" ng-hide="func.hidden"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="gf-form dropdown" add-metric-function>
|
<div class="gf-form dropdown" add-metric-function>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -275,11 +275,15 @@ export class ZabbixQueryController extends QueryCtrl {
|
|||||||
this.targetChanged();
|
this.targetChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
moveFunction(func, offset) {
|
||||||
|
const index = this.target.functions.indexOf(func);
|
||||||
|
_.move(this.target.functions, index, index + offset);
|
||||||
|
this.targetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
moveAliasFuncLast() {
|
moveAliasFuncLast() {
|
||||||
var aliasFunc = _.find(this.target.functions, function(func) {
|
var aliasFunc = _.find(this.target.functions, func => {
|
||||||
return func.def.name === 'alias' ||
|
return func.def.category === 'Alias';
|
||||||
func.def.name === 'aliasByNode' ||
|
|
||||||
func.def.name === 'aliasByMetric';
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (aliasFunc) {
|
if (aliasFunc) {
|
||||||
|
|||||||
10
src/datasource-zabbix/react2angular.ts
Normal file
10
src/datasource-zabbix/react2angular.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import coreModule from 'grafana/app/core/core_module';
|
||||||
|
|
||||||
|
export function react2AngularDirective(name: string, component: any, options: any) {
|
||||||
|
coreModule.directive(name, [
|
||||||
|
'reactDirective',
|
||||||
|
reactDirective => {
|
||||||
|
return reactDirective(component, options);
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
}
|
||||||
@@ -28,7 +28,7 @@ module.exports = {
|
|||||||
externals: [
|
externals: [
|
||||||
// remove the line below if you don't want to use builtin versions
|
// remove the line below if you don't want to use builtin versions
|
||||||
'jquery', 'lodash', 'moment', 'angular',
|
'jquery', 'lodash', 'moment', 'angular',
|
||||||
'react', 'react-dom',
|
'react', 'react-dom', '@grafana/ui',
|
||||||
function (context, request, callback) {
|
function (context, request, callback) {
|
||||||
var prefix = 'grafana/';
|
var prefix = 'grafana/';
|
||||||
if (request.indexOf(prefix) === 0) {
|
if (request.indexOf(prefix) === 0) {
|
||||||
@@ -53,7 +53,7 @@ module.exports = {
|
|||||||
ExtractTextPluginDark,
|
ExtractTextPluginDark,
|
||||||
],
|
],
|
||||||
resolve: {
|
resolve: {
|
||||||
extensions: [".js", ".ts", ".tsx", ".html", ".scss"]
|
extensions: ['.js', '.es6', '.ts', '.tsx', '.html', '.scss']
|
||||||
},
|
},
|
||||||
module: {
|
module: {
|
||||||
rules: [
|
rules: [
|
||||||
|
|||||||
213
yarn.lock
213
yarn.lock
@@ -373,6 +373,11 @@ acorn-dynamic-import@^3.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
acorn "^5.0.0"
|
acorn "^5.0.0"
|
||||||
|
|
||||||
|
acorn-es7-plugin@^1.0.12:
|
||||||
|
version "1.1.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz#f2ee1f3228a90eead1245f9ab1922eb2e71d336b"
|
||||||
|
integrity sha1-8u4fMiipDurRJF+asZIusucdM2s=
|
||||||
|
|
||||||
acorn-globals@^4.0.0, acorn-globals@^4.1.0:
|
acorn-globals@^4.0.0, acorn-globals@^4.1.0:
|
||||||
version "4.1.0"
|
version "4.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538"
|
resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538"
|
||||||
@@ -555,6 +560,11 @@ array-equal@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
|
resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
|
||||||
integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
|
integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
|
||||||
|
|
||||||
|
array-filter@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83"
|
||||||
|
integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=
|
||||||
|
|
||||||
array-find-index@^1.0.1:
|
array-find-index@^1.0.1:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
|
resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
|
||||||
@@ -1623,6 +1633,11 @@ cache-base@^1.0.1:
|
|||||||
union-value "^1.0.0"
|
union-value "^1.0.0"
|
||||||
unset-value "^1.0.0"
|
unset-value "^1.0.0"
|
||||||
|
|
||||||
|
call-signature@0.0.2:
|
||||||
|
version "0.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/call-signature/-/call-signature-0.0.2.tgz#a84abc825a55ef4cb2b028bd74e205a65b9a4996"
|
||||||
|
integrity sha1-qEq8glpV70yysCi9dOIFpluaSZY=
|
||||||
|
|
||||||
callsites@^2.0.0:
|
callsites@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
|
resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
|
||||||
@@ -1922,6 +1937,11 @@ commander@^2.12.1:
|
|||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
|
||||||
integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
|
integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
|
||||||
|
|
||||||
|
commander@^2.9.0:
|
||||||
|
version "2.20.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
|
||||||
|
integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
|
||||||
|
|
||||||
commander@~2.13.0:
|
commander@~2.13.0:
|
||||||
version "2.13.0"
|
version "2.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
|
||||||
@@ -2039,6 +2059,11 @@ core-js@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
|
resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
|
||||||
integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=
|
integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=
|
||||||
|
|
||||||
|
core-js@^2.0.0:
|
||||||
|
version "2.6.9"
|
||||||
|
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2"
|
||||||
|
integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==
|
||||||
|
|
||||||
core-js@^2.4.0, core-js@^2.5.0:
|
core-js@^2.4.0, core-js@^2.5.0:
|
||||||
version "2.5.7"
|
version "2.5.7"
|
||||||
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
|
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
|
||||||
@@ -2366,6 +2391,11 @@ detect-newline@^2.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
|
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
|
||||||
integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
|
integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
|
||||||
|
|
||||||
|
diff-match-patch@^1.0.0:
|
||||||
|
version "1.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.4.tgz#6ac4b55237463761c4daf0dc603eb869124744b1"
|
||||||
|
integrity sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg==
|
||||||
|
|
||||||
diff@^3.2.0:
|
diff@^3.2.0:
|
||||||
version "3.5.0"
|
version "3.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
|
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
|
||||||
@@ -2450,6 +2480,11 @@ duplexify@^3.4.2, duplexify@^3.6.0:
|
|||||||
readable-stream "^2.0.0"
|
readable-stream "^2.0.0"
|
||||||
stream-shift "^1.0.0"
|
stream-shift "^1.0.0"
|
||||||
|
|
||||||
|
eastasianwidth@^0.2.0:
|
||||||
|
version "0.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
|
||||||
|
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
|
||||||
|
|
||||||
ecc-jsbn@~0.1.1:
|
ecc-jsbn@~0.1.1:
|
||||||
version "0.1.2"
|
version "0.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
|
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
|
||||||
@@ -2481,6 +2516,22 @@ emojis-list@^2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
|
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
|
||||||
integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k=
|
integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k=
|
||||||
|
|
||||||
|
empower-core@^1.2.0:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-1.2.0.tgz#ce3fb2484d5187fa29c23fba8344b0b2fdf5601c"
|
||||||
|
integrity sha512-g6+K6Geyc1o6FdXs9HwrXleCFan7d66G5xSCfSF7x1mJDCes6t0om9lFQG3zOrzh3Bkb/45N0cZ5Gqsf7YrzGQ==
|
||||||
|
dependencies:
|
||||||
|
call-signature "0.0.2"
|
||||||
|
core-js "^2.0.0"
|
||||||
|
|
||||||
|
empower@^1.3.1:
|
||||||
|
version "1.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/empower/-/empower-1.3.1.tgz#768979cbbb36d71d8f5edaab663deacb9dab916c"
|
||||||
|
integrity sha512-uB6/ViBaawOO/uujFADTK3SqdYlxYNn+N4usK9MRKZ4Hbn/1QSy8k2PezxCA2/+JGbF8vd/eOfghZ90oOSDZCA==
|
||||||
|
dependencies:
|
||||||
|
core-js "^2.0.0"
|
||||||
|
empower-core "^1.2.0"
|
||||||
|
|
||||||
encoding@^0.1.11:
|
encoding@^0.1.11:
|
||||||
version "0.1.12"
|
version "0.1.12"
|
||||||
resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
|
resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
|
||||||
@@ -2601,6 +2652,13 @@ esprima@^4.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
|
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
|
||||||
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
|
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
|
||||||
|
|
||||||
|
espurify@^1.6.0:
|
||||||
|
version "1.8.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/espurify/-/espurify-1.8.1.tgz#5746c6c1ab42d302de10bd1d5bf7f0e8c0515056"
|
||||||
|
integrity sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg==
|
||||||
|
dependencies:
|
||||||
|
core-js "^2.0.0"
|
||||||
|
|
||||||
esrecurse@^4.1.0:
|
esrecurse@^4.1.0:
|
||||||
version "4.2.1"
|
version "4.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
|
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
|
||||||
@@ -5532,6 +5590,11 @@ object-copy@^0.1.0:
|
|||||||
define-property "^0.2.5"
|
define-property "^0.2.5"
|
||||||
kind-of "^3.0.3"
|
kind-of "^3.0.3"
|
||||||
|
|
||||||
|
object-keys@^1.0.0:
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
|
||||||
|
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
|
||||||
|
|
||||||
object-keys@^1.0.12:
|
object-keys@^1.0.12:
|
||||||
version "1.0.12"
|
version "1.0.12"
|
||||||
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2"
|
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2"
|
||||||
@@ -6038,6 +6101,105 @@ postcss@^6.0.1, postcss@^6.0.23:
|
|||||||
source-map "^0.6.1"
|
source-map "^0.6.1"
|
||||||
supports-color "^5.4.0"
|
supports-color "^5.4.0"
|
||||||
|
|
||||||
|
power-assert-context-formatter@^1.0.7:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/power-assert-context-formatter/-/power-assert-context-formatter-1.2.0.tgz#8fbe72692288ec5a7203cdf215c8b838a6061d2a"
|
||||||
|
integrity sha512-HLNEW8Bin+BFCpk/zbyKwkEu9W8/zThIStxGo7weYcFkKgMuGCHUJhvJeBGXDZf0Qm2xis4pbnnciGZiX0EpSg==
|
||||||
|
dependencies:
|
||||||
|
core-js "^2.0.0"
|
||||||
|
power-assert-context-traversal "^1.2.0"
|
||||||
|
|
||||||
|
power-assert-context-reducer-ast@^1.0.7:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/power-assert-context-reducer-ast/-/power-assert-context-reducer-ast-1.2.0.tgz#c7ca1c9e39a6fb717f7ac5fe9e76e192bf525df3"
|
||||||
|
integrity sha512-EgOxmZ/Lb7tw4EwSKX7ZnfC0P/qRZFEG28dx/690qvhmOJ6hgThYFm5TUWANDLK5NiNKlPBi5WekVGd2+5wPrw==
|
||||||
|
dependencies:
|
||||||
|
acorn "^5.0.0"
|
||||||
|
acorn-es7-plugin "^1.0.12"
|
||||||
|
core-js "^2.0.0"
|
||||||
|
espurify "^1.6.0"
|
||||||
|
estraverse "^4.2.0"
|
||||||
|
|
||||||
|
power-assert-context-traversal@^1.2.0:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/power-assert-context-traversal/-/power-assert-context-traversal-1.2.0.tgz#f6e71454baf640de5c1c9c270349f5c9ab0b2e94"
|
||||||
|
integrity sha512-NFoHU6g2umNajiP2l4qb0BRWD773Aw9uWdWYH9EQsVwIZnog5bd2YYLFCVvaxWpwNzWeEfZIon2xtyc63026pQ==
|
||||||
|
dependencies:
|
||||||
|
core-js "^2.0.0"
|
||||||
|
estraverse "^4.1.0"
|
||||||
|
|
||||||
|
power-assert-formatter@^1.4.1:
|
||||||
|
version "1.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/power-assert-formatter/-/power-assert-formatter-1.4.1.tgz#5dc125ed50a3dfb1dda26c19347f3bf58ec2884a"
|
||||||
|
integrity sha1-XcEl7VCj37HdomwZNH879Y7CiEo=
|
||||||
|
dependencies:
|
||||||
|
core-js "^2.0.0"
|
||||||
|
power-assert-context-formatter "^1.0.7"
|
||||||
|
power-assert-context-reducer-ast "^1.0.7"
|
||||||
|
power-assert-renderer-assertion "^1.0.7"
|
||||||
|
power-assert-renderer-comparison "^1.0.7"
|
||||||
|
power-assert-renderer-diagram "^1.0.7"
|
||||||
|
power-assert-renderer-file "^1.0.7"
|
||||||
|
|
||||||
|
power-assert-renderer-assertion@^1.0.7:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/power-assert-renderer-assertion/-/power-assert-renderer-assertion-1.2.0.tgz#3db6ffcda106b37bc1e06432ad0d748a682b147a"
|
||||||
|
integrity sha512-3F7Q1ZLmV2ZCQv7aV7NJLNK9G7QsostrhOU7U0RhEQS/0vhEqrRg2jEJl1jtUL4ZyL2dXUlaaqrmPv5r9kRvIg==
|
||||||
|
dependencies:
|
||||||
|
power-assert-renderer-base "^1.1.1"
|
||||||
|
power-assert-util-string-width "^1.2.0"
|
||||||
|
|
||||||
|
power-assert-renderer-base@^1.1.1:
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/power-assert-renderer-base/-/power-assert-renderer-base-1.1.1.tgz#96a650c6fd05ee1bc1f66b54ad61442c8b3f63eb"
|
||||||
|
integrity sha1-lqZQxv0F7hvB9mtUrWFELIs/Y+s=
|
||||||
|
|
||||||
|
power-assert-renderer-comparison@^1.0.7:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/power-assert-renderer-comparison/-/power-assert-renderer-comparison-1.2.0.tgz#e4f88113225a69be8aa586ead05aef99462c0495"
|
||||||
|
integrity sha512-7c3RKPDBKK4E3JqdPtYRE9cM8AyX4LC4yfTvvTYyx8zSqmT5kJnXwzR0yWQLOavACllZfwrAGQzFiXPc5sWa+g==
|
||||||
|
dependencies:
|
||||||
|
core-js "^2.0.0"
|
||||||
|
diff-match-patch "^1.0.0"
|
||||||
|
power-assert-renderer-base "^1.1.1"
|
||||||
|
stringifier "^1.3.0"
|
||||||
|
type-name "^2.0.1"
|
||||||
|
|
||||||
|
power-assert-renderer-diagram@^1.0.7:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/power-assert-renderer-diagram/-/power-assert-renderer-diagram-1.2.0.tgz#37f66e8542e5677c5b58e6d72b01c0d9a30e2219"
|
||||||
|
integrity sha512-JZ6PC+DJPQqfU6dwSmpcoD7gNnb/5U77bU5KgNwPPa+i1Pxiz6UuDeM3EUBlhZ1HvH9tMjI60anqVyi5l2oNdg==
|
||||||
|
dependencies:
|
||||||
|
core-js "^2.0.0"
|
||||||
|
power-assert-renderer-base "^1.1.1"
|
||||||
|
power-assert-util-string-width "^1.2.0"
|
||||||
|
stringifier "^1.3.0"
|
||||||
|
|
||||||
|
power-assert-renderer-file@^1.0.7:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/power-assert-renderer-file/-/power-assert-renderer-file-1.2.0.tgz#3f4bebd9e1455d75cf2ac541e7bb515a87d4ce4b"
|
||||||
|
integrity sha512-/oaVrRbeOtGoyyd7e4IdLP/jIIUFJdqJtsYzP9/88R39CMnfF/S/rUc8ZQalENfUfQ/wQHu+XZYRMaCEZmEesg==
|
||||||
|
dependencies:
|
||||||
|
power-assert-renderer-base "^1.1.1"
|
||||||
|
|
||||||
|
power-assert-util-string-width@^1.2.0:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/power-assert-util-string-width/-/power-assert-util-string-width-1.2.0.tgz#6e06d5e3581bb876c5d377c53109fffa95bd91a0"
|
||||||
|
integrity sha512-lX90G0igAW0iyORTILZ/QjZWsa1MZ6VVY3L0K86e2eKun3S4LKPH4xZIl8fdeMYLfOjkaszbNSzf1uugLeAm2A==
|
||||||
|
dependencies:
|
||||||
|
eastasianwidth "^0.2.0"
|
||||||
|
|
||||||
|
power-assert@^1.2.0:
|
||||||
|
version "1.6.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/power-assert/-/power-assert-1.6.1.tgz#b28cbc02ae808afd1431d0cd5093a39ac5a5b1fe"
|
||||||
|
integrity sha512-VWkkZV6Y+W8qLX/PtJu2Ur2jDPIs0a5vbP0TpKeybNcIXmT4vcKoVkyTp5lnQvTpY/DxacAZ4RZisHRHLJcAZQ==
|
||||||
|
dependencies:
|
||||||
|
define-properties "^1.1.2"
|
||||||
|
empower "^1.3.1"
|
||||||
|
power-assert-formatter "^1.4.1"
|
||||||
|
universal-deep-strict-equal "^1.2.1"
|
||||||
|
xtend "^4.0.0"
|
||||||
|
|
||||||
prelude-ls@~1.1.2:
|
prelude-ls@~1.1.2:
|
||||||
version "1.1.2"
|
version "1.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
|
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
|
||||||
@@ -6584,6 +6746,16 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
path-parse "^1.0.5"
|
path-parse "^1.0.5"
|
||||||
|
|
||||||
|
restructured@0.0.11:
|
||||||
|
version "0.0.11"
|
||||||
|
resolved "https://registry.yarnpkg.com/restructured/-/restructured-0.0.11.tgz#f914f6b6f358b8e45d6d8ee268926cf1a783f710"
|
||||||
|
integrity sha1-+RT2tvNYuORdbY7iaJJs8aeD9xA=
|
||||||
|
dependencies:
|
||||||
|
commander "^2.9.0"
|
||||||
|
lodash "^4.0.0"
|
||||||
|
power-assert "^1.2.0"
|
||||||
|
unist-util-map "^1.0.2"
|
||||||
|
|
||||||
ret@~0.1.10:
|
ret@~0.1.10:
|
||||||
version "0.1.15"
|
version "0.1.15"
|
||||||
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
|
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
|
||||||
@@ -6616,6 +6788,12 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
|
|||||||
hash-base "^3.0.0"
|
hash-base "^3.0.0"
|
||||||
inherits "^2.0.1"
|
inherits "^2.0.1"
|
||||||
|
|
||||||
|
"rst2html@github:thoward/rst2html#990cb89":
|
||||||
|
version "1.0.4"
|
||||||
|
resolved "https://codeload.github.com/thoward/rst2html/tar.gz/990cb89f2a300cdd9151790be377c4c0840df809"
|
||||||
|
dependencies:
|
||||||
|
restructured "0.0.11"
|
||||||
|
|
||||||
rsvp@^3.3.3:
|
rsvp@^3.3.3:
|
||||||
version "3.6.2"
|
version "3.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a"
|
resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a"
|
||||||
@@ -7107,6 +7285,15 @@ string_decoder@~0.10.x:
|
|||||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
|
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
|
||||||
integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
|
integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
|
||||||
|
|
||||||
|
stringifier@^1.3.0:
|
||||||
|
version "1.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/stringifier/-/stringifier-1.4.0.tgz#d704581567f4526265d00ed8ecb354a02c3fec28"
|
||||||
|
integrity sha512-cNsMOqqrcbLcHTXEVmkw9y0fwDwkdgtZwlfyolzpQDoAE1xdNGhQhxBUfiDvvZIKl1hnUEgMv66nHwtMz3OjPw==
|
||||||
|
dependencies:
|
||||||
|
core-js "^2.0.0"
|
||||||
|
traverse "^0.6.6"
|
||||||
|
type-name "^2.0.1"
|
||||||
|
|
||||||
stringmap@~0.2.2:
|
stringmap@~0.2.2:
|
||||||
version "0.2.2"
|
version "0.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/stringmap/-/stringmap-0.2.2.tgz#556c137b258f942b8776f5b2ef582aa069d7d1b1"
|
resolved "https://registry.yarnpkg.com/stringmap/-/stringmap-0.2.2.tgz#556c137b258f942b8776f5b2ef582aa069d7d1b1"
|
||||||
@@ -7357,6 +7544,11 @@ tr46@^1.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
punycode "^2.1.0"
|
punycode "^2.1.0"
|
||||||
|
|
||||||
|
traverse@^0.6.6:
|
||||||
|
version "0.6.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137"
|
||||||
|
integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=
|
||||||
|
|
||||||
trim-newlines@^1.0.0:
|
trim-newlines@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
|
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
|
||||||
@@ -7459,6 +7651,11 @@ type-check@~0.3.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
prelude-ls "~1.1.2"
|
prelude-ls "~1.1.2"
|
||||||
|
|
||||||
|
type-name@^2.0.1:
|
||||||
|
version "2.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/type-name/-/type-name-2.0.2.tgz#efe7d4123d8ac52afff7f40c7e4dec5266008fb4"
|
||||||
|
integrity sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=
|
||||||
|
|
||||||
typed-styles@^0.0.7:
|
typed-styles@^0.0.7:
|
||||||
version "0.0.7"
|
version "0.0.7"
|
||||||
resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9"
|
resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9"
|
||||||
@@ -7571,6 +7768,22 @@ unique-slug@^2.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
imurmurhash "^0.1.4"
|
imurmurhash "^0.1.4"
|
||||||
|
|
||||||
|
unist-util-map@^1.0.2:
|
||||||
|
version "1.0.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/unist-util-map/-/unist-util-map-1.0.5.tgz#701069b72e1d1cc02db265502a5e82b77c2eb8b7"
|
||||||
|
integrity sha512-dFil/AN6vqhnQWNCZk0GF/G3+Q5YwsB+PqjnzvpO2wzdRtUJ1E8PN+XRE/PRr/G3FzKjRTJU0haqE0Ekl+O3Ag==
|
||||||
|
dependencies:
|
||||||
|
object-assign "^4.0.1"
|
||||||
|
|
||||||
|
universal-deep-strict-equal@^1.2.1:
|
||||||
|
version "1.2.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/universal-deep-strict-equal/-/universal-deep-strict-equal-1.2.2.tgz#0da4ac2f73cff7924c81fa4de018ca562ca2b0a7"
|
||||||
|
integrity sha1-DaSsL3PP95JMgfpN4BjKViyisKc=
|
||||||
|
dependencies:
|
||||||
|
array-filter "^1.0.0"
|
||||||
|
indexof "0.0.1"
|
||||||
|
object-keys "^1.0.0"
|
||||||
|
|
||||||
unset-value@^1.0.0:
|
unset-value@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
|
resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
|
||||||
|
|||||||
Reference in New Issue
Block a user