Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Time Series Metric Visualizations #9725

Merged
merged 131 commits into from
Mar 2, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
131 commits
Select commit Hold shift + click to select a range
f9d527e
Initial import
simianhacker Dec 21, 2016
c5e936f
Merge branch 'master' of github.com:elastic/kibana into metrics
simianhacker Dec 21, 2016
0d0f4c6
updating the editor width to match the new specs
simianhacker Jan 2, 2017
2fb42d0
Merge branch 'master' of github.com:elastic/kibana into metrics
simianhacker Jan 2, 2017
63a736a
Adding tribe node support
simianhacker Jan 2, 2017
6ede79b
Adding tests for server libs
simianhacker Jan 2, 2017
1cb2860
removing bluebird
simianhacker Jan 2, 2017
4efe0ec
removing extra cruft
simianhacker Jan 4, 2017
33f4d53
Fixing the font sizes
simianhacker Jan 4, 2017
51ff9f8
Fixed the updating code
simianhacker Jan 4, 2017
2ba0463
Adding brushing
simianhacker Jan 4, 2017
09b6ada
Fixing linting issues
simianhacker Jan 4, 2017
985ec1c
Adding global filters
simianhacker Jan 4, 2017
bd87e89
Adding missing packages
simianhacker Jan 5, 2017
5ce7d85
Default gauge style to half circle
simianhacker Jan 5, 2017
0b72290
Fixing the markdown css bug
simianhacker Jan 5, 2017
a6e91ba
Adding tests for the get_vis_data api
simianhacker Jan 12, 2017
5ee12ac
Adding time offset
simianhacker Jan 12, 2017
ee52e34
Adding time offset to each type
simianhacker Jan 12, 2017
16b7469
fixing bugs from time offset
simianhacker Jan 13, 2017
1e64c7c
adding index pattern option to series
simianhacker Jan 17, 2017
b4ce642
Merge branch 'master' of github.com:elastic/kibana into metrics
simianhacker Jan 17, 2017
b5ff6c6
Adding index pattern overrides
simianhacker Jan 18, 2017
6641c8e
Adding index pattern overrides
simianhacker Jan 18, 2017
b7822ec
Fixing tests
simianhacker Jan 18, 2017
74dc57f
Fixing brushing in the vis editor
simianhacker Jan 18, 2017
95e58b0
Changing the label
simianhacker Jan 18, 2017
5d2bf42
Change the behavior of selecting a pipeline agg when only one exists.
simianhacker Jan 18, 2017
f1ff198
Refactoring series a bit
simianhacker Jan 18, 2017
23821b5
Changing series options to just options
simianhacker Jan 18, 2017
efd39d9
Making sure we honor the toaster container height
simianhacker Jan 18, 2017
23f6bc7
Adding first tests
simianhacker Jan 19, 2017
940a096
renaming vis_config to panel_config
simianhacker Jan 19, 2017
1d0f9aa
renaming vis_config to panel_config
simianhacker Jan 19, 2017
a2add21
Adding more tests
simianhacker Jan 19, 2017
c1af796
adding more tests
simianhacker Jan 23, 2017
bd05f9b
removing api subdirectory
simianhacker Jan 23, 2017
47969cd
refactoring get_vis_data (breaking it up and removing unused imports)
simianhacker Jan 23, 2017
426b275
reorganizing the visualization directory
simianhacker Jan 23, 2017
b1d1adb
Re-organizing directory layouts and moving things to more logical places
simianhacker Jan 23, 2017
a991c38
Refactoring React compontents to use ES6 syntax and adding propTypes …
simianhacker Jan 25, 2017
551eba6
Adding serial differencing
simianhacker Jan 25, 2017
3960535
Refactored gauge to use 2 components instead of 4
simianhacker Jan 25, 2017
ed1550c
Finishing react refactor on visualizations. Consolidated legned funti…
simianhacker Jan 25, 2017
4111b38
Refactoring series config and removing a bunch of duplicate code
simianhacker Jan 25, 2017
ff5c79d
fixing series config name
simianhacker Jan 25, 2017
61ac01a
Fixing numbers and strings (doesnt matter which it is); Fixing classname
simianhacker Jan 25, 2017
76ff363
Changing the way the dark theme works
simianhacker Jan 25, 2017
95235d6
Adding new vis into list for test
simianhacker Jan 26, 2017
525c59a
Adding empty bucket check
simianhacker Jan 26, 2017
94cc787
Fixing the index patterns in the aggs
simianhacker Jan 26, 2017
347493f
Fixing typo
simianhacker Jan 26, 2017
abf0f14
Refactoring vis_data
simianhacker Jan 31, 2017
bc2aadc
Fixing std_metric
simianhacker Jan 31, 2017
6d5bb61
Fixing refresh-hack
simianhacker Jan 31, 2017
60a3fd0
Adding tests for get_splits, get_last_metric, map_bucket
simianhacker Jan 31, 2017
5fbd364
Fixing the error handing
simianhacker Jan 31, 2017
9d558e3
removing restrictions
simianhacker Feb 1, 2017
e7deeba
Sometimes values are strings or numbers... it doesn't matter
simianhacker Feb 1, 2017
1c3a3ea
Adding new color options for splits
simianhacker Feb 1, 2017
cf4d4cf
Fixing colors
simianhacker Feb 1, 2017
c859926
fixing size
simianhacker Feb 1, 2017
50ff3e8
Adding support for fitlers agg
simianhacker Feb 2, 2017
19cae0f
Fixing tests
simianhacker Feb 2, 2017
2e4f8bc
Fixing splits for filters
simianhacker Feb 2, 2017
9a392d3
Fixing Top N to work better with fitlers
simianhacker Feb 2, 2017
bc1e53d
Adding annotation editor
simianhacker Feb 3, 2017
ea15490
Merge branch 'master' of github.com:elastic/kibana into metrics
simianhacker Feb 3, 2017
c9e3bcb
initial work for annotations
simianhacker Feb 4, 2017
5483ed1
Finalizing annotations
simianhacker Feb 6, 2017
8eff937
Fixing label
simianhacker Feb 6, 2017
277b2c9
making it expandable
simianhacker Feb 6, 2017
ba55260
Merge branch 'master' of github.com:elastic/kibana into metrics
simianhacker Feb 6, 2017
b437f72
Fixing hacks fixed by #10175
simianhacker Feb 6, 2017
d8fd02f
Fixing bars to use the same stacking options as lines
simianhacker Feb 7, 2017
ab40b04
Merge branch 'master' of github.com:elastic/kibana into metrics
simianhacker Feb 13, 2017
c1f76b9
Getting rid of align by colons
simianhacker Feb 13, 2017
af2fdb8
removing unused depends
simianhacker Feb 13, 2017
6a8ae4c
removing unused depends
simianhacker Feb 13, 2017
ac3796c
Changing to readable lodash function
simianhacker Feb 13, 2017
1e39f32
Adding missing parens
simianhacker Feb 13, 2017
38cd134
refactoring custom color picker
simianhacker Feb 13, 2017
9eaa455
Removing string refs and converting uncontrolled components
simianhacker Feb 13, 2017
e375c8f
Fixing the controlled components where value maybe null; converting e…
simianhacker Feb 14, 2017
84e8445
refactoring styles from components
simianhacker Feb 14, 2017
a610601
fixing the refresh behavoir borked by fullEditor
simianhacker Feb 14, 2017
f81191d
Adding the executor service
simianhacker Feb 14, 2017
041c7a1
Fixing the test directories
simianhacker Feb 14, 2017
6eb03d4
fixing save
simianhacker Feb 15, 2017
d6ed86f
Adding filter ratios
simianhacker Feb 18, 2017
a099f3a
Fixing controlled components
simianhacker Feb 21, 2017
f031893
Trying to fix the weird typing
simianhacker Feb 21, 2017
fdd4357
Fixing offset bug with days
simianhacker Feb 21, 2017
cf7a3f9
Adding percentile rank
simianhacker Feb 22, 2017
9849833
Fixing yaxis updates; fixing percentile rank layout; adding steps to …
simianhacker Feb 22, 2017
ddf863e
removing unused depends
simianhacker Feb 22, 2017
e413425
Fixed a bug with the index patterns updating; fixed bug with charts r…
simianhacker Feb 22, 2017
8321f8c
Fixing tests
simianhacker Feb 22, 2017
c1f3649
Commenting out React tests because the ENV must have change and they …
simianhacker Feb 23, 2017
bae79c1
Moving bucket transform
simianhacker Feb 27, 2017
8e0b003
moving calculate auto
simianhacker Feb 27, 2017
cd7d9a0
Moving calculate_indices
simianhacker Feb 27, 2017
61af862
moving extended_stats_types && get_agg_value
simianhacker Feb 27, 2017
399cdaf
moving get_buckets_path
simianhacker Feb 27, 2017
9aab685
moving get_sibling_agg_value
simianhacker Feb 27, 2017
61c5a6c
moving parse_settings
simianhacker Feb 27, 2017
43a3551
moving series_agg
simianhacker Feb 27, 2017
ea0d37f
Moving unit_to_seconds
simianhacker Feb 27, 2017
6037c13
Fixing tests
simianhacker Feb 27, 2017
93bfc89
Fixing per PR
simianhacker Feb 27, 2017
4631611
Renaming vars to make it more clear what's happening
simianhacker Feb 27, 2017
4151596
Changing the way testible functions are exported
simianhacker Feb 27, 2017
a32fa6e
fixing tests
simianhacker Feb 27, 2017
6038305
removing unused imports; fixing typos; fixing package name
simianhacker Feb 27, 2017
2c5e356
Name has to match the plugin path
simianhacker Feb 27, 2017
ddd90db
Fixing typos; removing unused imports
simianhacker Feb 27, 2017
c47a407
fixing tests
simianhacker Feb 27, 2017
a2aef22
Merge branch 'master' of github.com:elastic/kibana into metrics
simianhacker Feb 27, 2017
140093c
Merge branch 'metrics' of https://github.com/simianhacker/kibana
ppisljar Feb 28, 2017
6bbe6ef
rearanging and removing unused imports
ppisljar Feb 28, 2017
dcb44fe
Fixing a bug with unque names for radio buttons on the same form
simianhacker Feb 28, 2017
e65528c
Fixing filter ratio to use a metric instead of just count
simianhacker Feb 28, 2017
766005d
fixing a bug with the new filter ratios
simianhacker Feb 28, 2017
e497a36
Merge pull request #8 from ppisljar/metrics-folders-and-unused
simianhacker Mar 1, 2017
4eba511
Fixing the file path from the #8
simianhacker Mar 1, 2017
92765f7
Merge branch 'master' of github.com:elastic/kibana into metrics
simianhacker Mar 1, 2017
1629ed3
Fixing renderComplete trigger; Fixing embedded mode; Changing names f…
simianhacker Mar 2, 2017
ebfad5c
Fixing name
simianhacker Mar 2, 2017
0d69732
Fixing docs
simianhacker Mar 2, 2017
111128b
Fixing a typo for the field select for terms splits
simianhacker Mar 2, 2017
7b930cf
Fixing tests
simianhacker Mar 2, 2017
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/timelion.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
Timelion is a time series data visualizer that enables you to combine totally
independent data sources within a single visualization. It's driven by a simple
expression language you use to retrieve time series data, perform calculations
to tease out the answers to complex questions, and visualize the results.
to tease out the answers to complex questions, and visualize the results.

For example, Timelion enables you to easily get the answers to questions like:

Expand All @@ -32,7 +32,7 @@ Timelion expression as a Kibana dashboard panel. You can then add it to
a dashboard like any other visualization.

TIP: You can also create time series visualizations right from the Visualize
app--just select the Timeseries visualization type and enter a Timelion
app--just select the Timelion visualization type and enter a Timelion
expression in the expression field.


Expand Down
2 changes: 1 addition & 1 deletion docs/visualize.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ instructions.
<<tagcloud-chart,Tag cloud>>:: Display words as a cloud in which the size of the word correspond to its importance
<<tilemap,Tile map>>:: Associate the results of an aggregation with geographic
locations.
Timeseries:: Compute and combine data from multiple time series
Timelion:: Compute and combine data from multiple time series
data sets.

. Specify a search query to retrieve the data for your visualization:
Expand Down
14 changes: 14 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@
"brace": "0.5.1",
"bunyan": "1.7.1",
"check-hash": "1.0.1",
"color": "1.0.3",
"commander": "2.8.1",
"css-loader": "0.17.0",
"d3": "3.5.6",
Expand Down Expand Up @@ -187,12 +188,14 @@
"classnames": "2.2.5",
"del": "1.2.1",
"elasticdump": "2.1.1",
"enzyme": "2.7.0",
"eslint": "3.11.1",
"eslint-plugin-babel": "4.0.0",
"eslint-plugin-mocha": "4.7.0",
"event-stream": "3.3.2",
"expect.js": "0.3.1",
"faker": "1.1.0",
"flot-charts": "^0.8.3",
"grunt": "1.0.1",
"grunt-aws-s3": "0.14.5",
"grunt-babel": "6.0.0",
Expand All @@ -212,6 +215,7 @@
"image-diff": "1.6.0",
"intern": "3.2.3",
"istanbul-instrumenter-loader": "0.1.3",
"jsdom": "9.9.1",
"karma": "1.2.0",
"karma-chrome-launcher": "0.2.0",
"karma-coverage": "0.5.1",
Expand All @@ -232,15 +236,25 @@
"npm": "3.10.10",
"portscanner": "1.0.0",
"proxyquire": "1.7.10",
"pui-react-overlay-trigger": "^7.0.0",
"pui-react-tooltip": "^7.0.0",
"react": "15.2.0",
"react-ace": "3.7.0",
"react-addons-test-utils": "15.2.0",
"react-anything-sortable": "^1.6.1",
"react-color": "^2.2.7",
"react-dom": "15.2.0",
"react-markdown": "^2.4.2",
"react-redux": "4.4.5",
"react-router": "2.0.0",
"react-router-redux": "4.0.4",
"react-select": "^1.0.0-rc.1",
"react-sortable": "^1.1.0",
"reactcss": "^1.0.7",
"redux": "3.0.0",
"redux-thunk": "0.1.0",
"sass-loader": "4.0.0",
"simianhacker-react-resize-aware": "^1.0.11",
"simple-git": "1.37.0",
"sinon": "1.17.2",
"source-map": "0.5.6",
Expand Down
31 changes: 31 additions & 0 deletions src/core_plugins/metrics/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import fieldsRoutes from './server/routes/fields';
import visDataRoutes from './server/routes/vis';

export default function (kibana) {
return new kibana.Plugin({
require: ['kibana','elasticsearch'],

uiExports: {
visTypes: [
'plugins/metrics/kbn_vis_types'
]
},

config(Joi) {
return Joi.object({
enabled: Joi.boolean().default(true),
chartResolution: Joi.number().default(150),
minimumBucketSize: Joi.number().default(10)
}).default();
},


init(server, options) {
const { status } = server.plugins.elasticsearch;
fieldsRoutes(server);
visDataRoutes(server);
}


});
}
6 changes: 6 additions & 0 deletions src/core_plugins/metrics/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"author": "Chris Cowan<[email protected]>",
"name": "metrics",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change to Time Series Visual Builder (?)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Name has to match the plugin path.

"version": "kibana"
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// import React from 'react';
// import { expect } from 'chai';
// import { shallow } from 'enzyme';
// import sinon from 'sinon';
// import AddDeleteButtons from '../add_delete_buttons';
// import Tooltip from '../tooltip';

// describe('<AddDeleteButtons />', () => {
Copy link
Contributor

@kimjoar kimjoar Mar 3, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both giving LGTMs and merging while tests are commented out? -1 from me. I'm hoping there is an issue created already to fix this? If we can't get tests to run we have to either fix them or delete them.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Oh, saw the comment in the backport. I still think this should have been fixed first though. Broken windows and all that.)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with your sentiment but we (team) wanted to get this commit in this week so it would be available via snapshots for Elastic{ON} and allow more time for people to use it before 5.4 ships. Luckily this is "soft"ware and we can work towards getting Enzyme working again. It broke when the Babel upgrade occurred; had this been merged before that upgrade it would hve been addressed by that team. The issue I have with keeping PR's like this separate for too long is you keep having to chase master as they change things; the PR keeps getting bigger and never seems to finish. With this merged we can now focus on creating smaller more manageable PR's to fix anything that needs addressed between now and code freeze.


// it('calls onAdd={handleAdd}', () => {
// const handleAdd = sinon.spy();
// const wrapper = shallow(
// <AddDeleteButtons onAdd={handleAdd} />
// );
// wrapper.find('a').at(0).simulate('click');
// expect(handleAdd.calledOnce).to.equal(true);
// });

// it('calls onDelete={handleDelete}', () => {
// const handleDelete = sinon.spy();
// const wrapper = shallow(
// <AddDeleteButtons onDelete={handleDelete} />
// );
// wrapper.find('a').at(1).simulate('click');
// expect(handleDelete.calledOnce).to.equal(true);
// });

// it('calls onClone={handleClone}', () => {
// const handleClone = sinon.spy();
// const wrapper = shallow(
// <AddDeleteButtons onClone={handleClone} />
// );
// wrapper.find('a').at(0).simulate('click');
// expect(handleClone.calledOnce).to.equal(true);
// });

// it('disableDelete={true}', () => {
// const wrapper = shallow(
// <AddDeleteButtons disableDelete={true} />
// );
// expect(wrapper.find({ text: 'Delete' })).to.have.length(0);
// });

// it('disableAdd={true}', () => {
// const wrapper = shallow(
// <AddDeleteButtons disableAdd={true} />
// );
// expect(wrapper.find({ text: 'Add' })).to.have.length(0);
// });

// it('should not display clone by default', () => {
// const wrapper = shallow(
// <AddDeleteButtons />
// );
// expect(wrapper.find({ text: 'Clone' })).to.have.length(0);
// });

// it('should not display clone when disableAdd={true}', () => {
// const fn = sinon.spy();
// const wrapper = shallow(
// <AddDeleteButtons onClone={fn} disableAdd={true} />
// );
// expect(wrapper.find({ text: 'Clone' })).to.have.length(0);
// });

// });

33 changes: 33 additions & 0 deletions src/core_plugins/metrics/public/components/__tests__/yes_no.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// import React from 'react';
// import { expect } from 'chai';
// import { shallow } from 'enzyme';
// import sinon from 'sinon';
// import YesNo from '../yes_no';

// describe('<YesNo />', () => {

// it('call onChange={handleChange} on yes', () => {
// const handleChange = sinon.spy();
// const wrapper = shallow(
// <YesNo name="test" onChange={handleChange} />
// );
// wrapper.find('input').first().simulate('change');
// expect(handleChange.calledOnce).to.equal(true);
// expect(handleChange.firstCall.args[0]).to.eql({
// test: 1
// });
// });

// it('call onChange={handleChange} on no', () => {
// const handleChange = sinon.spy();
// const wrapper = shallow(
// <YesNo name="test" onChange={handleChange} />
// );
// wrapper.find('input').last().simulate('change');
// expect(handleChange.calledOnce).to.equal(true);
// expect(handleChange.firstCall.args[0]).to.eql({
// test: 0
// });
// });

// });
58 changes: 58 additions & 0 deletions src/core_plugins/metrics/public/components/add_delete_buttons.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import React, { Component, PropTypes } from 'react';
import Tooltip from './tooltip';

function AddDeleteButtons(props) {
const createDelete = () => {
if (props.disableDelete) {
return null;
}
return (
<Tooltip text="Delete">
<a className="thor__button-outlined-danger sm" onClick={ props.onDelete }>
<i className="fa fa-trash-o"></i>
</a>
</Tooltip>
);
};
const createAdd = () => {
if (props.disableAdd) {
return null;
}
return (
<Tooltip text="Add">
<a className="thor__button-outlined-default sm" onClick={ props.onAdd }>
<i className="fa fa-plus"></i>
</a>
</Tooltip>
);
};
const deleteBtn = createDelete();
const addBtn = createAdd();
let clone;
if (props.onClone && !props.disableAdd) {
clone = (
<Tooltip text="Clone">
<a className="thor__button-outlined-default sm" onClick={ props.onClone }>
<i className="fa fa-files-o"></i>
</a>
</Tooltip>
);
}
return (
<div className="add_delete__buttons">
{ clone }
{ addBtn }
{ deleteBtn }
</div>
);
}

AddDeleteButtons.propTypes = {
disableAdd: PropTypes.bool,
disableDelete: PropTypes.bool,
onClone: PropTypes.func,
onAdd: PropTypes.func,
onDelete: PropTypes.func
};

export default AddDeleteButtons;
51 changes: 51 additions & 0 deletions src/core_plugins/metrics/public/components/aggs/agg.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import React, { PropTypes } from 'react';
import StdAgg from './std_agg';
import aggToComponent from '../lib/agg_to_component';
import { sortable } from 'react-anything-sortable';

function Agg(props) {
const { model } = props;
let Component = aggToComponent[model.type];
if (!Component) {
Component = StdAgg;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure what this is. Component is not used?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's used on line 19

}
const style = Object.assign({ cursor: 'default' }, props.style);
return (
<div
className={props.className}
style={style}
onMouseDown={props.onMouseDown}
onTouchStart={props.onTouchStart}>
<Component
fields={props.fields}
disableDelete={props.disableDelete}
model={props.model}
onAdd={props.onAdd}
onChange={props.onChange}
onDelete={props.onDelete}
panel={props.panel}
series={props.series}
siblings={props.siblings}/>
</div>
);

}

Agg.propTypes = {
disableDelete: PropTypes.bool,
fields: PropTypes.object,
model: PropTypes.object,
onAdd: PropTypes.func,
onChange: PropTypes.func,
onDelete: PropTypes.func,
onMouseDown: PropTypes.func,
onSortableItemMount: PropTypes.func,
onSortableItemReadyToMove: PropTypes.func,
onTouchStart: PropTypes.func,
panel: PropTypes.object,
series: PropTypes.object,
siblings: PropTypes.array,
sortData: PropTypes.string,
};

export default sortable(Agg);
53 changes: 53 additions & 0 deletions src/core_plugins/metrics/public/components/aggs/agg_row.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import React, { PropTypes } from 'react';
import _ from 'lodash';
import AddDeleteButtons from '../add_delete_buttons';
import Tooltip from '../tooltip';

function AggRow(props) {
let iconClassName = 'fa fa-eye-slash';
let iconRowClassName = 'vis_editor__agg_row-icon';
const last = _.last(props.siblings);
if (last.id === props.model.id) {
iconClassName = 'fa fa-eye';
iconRowClassName += ' last';
}

let dragHandle;
if (!props.disableDelete) {
dragHandle = (
<div>
<Tooltip text="Sort">
<div className="vis_editor__agg_sort thor__button-outlined-default sm">
<i className="fa fa-sort"></i>
</div>
</Tooltip>
</div>
);
}

return (
<div className="vis_editor__agg_row">
<div className="vis_editor__agg_row-item">
<div className={iconRowClassName}>
<i className={iconClassName}></i>
</div>
{props.children}
{ dragHandle }
<AddDeleteButtons
onAdd={props.onAdd}
onDelete={props.onDelete}
disableDelete={props.disableDelete}/>
</div>
</div>
);
}

AggRow.propTypes = {
disableDelete: PropTypes.bool,
model: PropTypes.object,
onAdd: PropTypes.func,
onDelete: PropTypes.func,
siblings: PropTypes.array,
};

export default AggRow;
Loading