Rob's fixes for app results page
diff --git a/public/components/AppResults.jsx b/public/components/AppResults.jsx
index 4a04dbb..16fcea3 100644
--- a/public/components/AppResults.jsx
+++ b/public/components/AppResults.jsx
@@ -14,125 +14,163 @@
// limitations under the License.
import React, { Component, PropTypes } from 'react';
-import Iframe from 'react-iframe';
import axios from 'axios';
import Counts from './visualizations/Counts';
-//import GraphMetrics from './visualizations/GraphMetrics';
import SankeyPlot from './visualizations/SankeyPlot';
-//import sankeyhtml from './visualizations/sankeyhtml';
const DISTILL_URL = require('../../secrets/senssoftconfig').default.distill_url;
-// import DISTILL_URL from './././secrets/secret.py';
-
class AppResults extends Component {
- constructor(props) {
-
- //let initialResults =
-
+ constructor(props) {
super(props);
- this.props.app.results.allTargets = this.getInitialAppResults().allTargets;//initialResults.allTargets;
+
this.state = {
result : 'counts',
metric : '',
- minpathlength : 1,
- maxpathlength : 8,
- starttime : 'now-15m',
+ minpathlength : 2,
+ maxpathlength : 10,
+ starttime : 'now-15d',
endtime : 'now',
- //educationlevels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
- //gender : 0,
ab : false,
graphAb : false,
includedTargetQuery : '',
- //allTargets : [],//[{"target": "document", "pathLength": 1}, {"target": "Window", "pathLength": 1}],
};
-
-
- // this.state = {
- // allTargets : initialResults.allTargets,
- // }
-
- // this.props.app.results.counts = initialResults.counts;
- // this.props.app.results.sankey = initialResults.sankey;
- // this.props.app.results.allTargets = initialResults.allTargets;
- //this.props.app.results.allTargets = parseForAllTargets(response.data.histogram);
-
}
componentDidMount() {
+ this.getInitialAppResults();
$('.ui.radio.checkbox').checkbox({
- onChange : () => {
- let metric = $('input[name=metric]:checked').val();
- this.setState({ metric : metric });
+ onChange: () => {
+ this.updateResultParameters({ metric: $('input[name=metric]:checked').val() });
console.log("metric updated");
},
});
- $('.ui.field').checkbox({
- onChange : () => {
+ $('.ui.field input').on('change', () => {
+ const minpathlength = $('input[name=min-path-length]').val();
+ const maxpathlength = $('input[name=max-path-length]').val();
+ const starttime = $('input[name=start-time]').val();
+ const endtime = $('input[name=end-time]').val();
+
+ this.updateResultParameters({
+ minpathlength,
+ maxpathlength,
+ starttime,
+ endtime,
+ });
- this.setState({ minpathlength : $('input[name=min-path-length]').val()});
- this.setState({ maxpathlength : $('input[name=max-path-length]').val()});
- this.setState({ starttime : $('input[name=start-time]').val()});
- this.setState({ endtime : $('input[name=end-time]').val()});
-
- console.log("text field updated");
- },
+ console.log("text field updated");
});
-
- // $('.ui.education.checkbox').checkbox({
- // onChange : () => {
- // let educationlevels = [];
- // $('input[name=education]:checked').each((i, el) => {
- // educationlevels.push(+$(el).val());
- // });
- // this.setState({ educationlevels : educationlevels });
- // },
- // });
-
}
- render() {
+ updateResultParameters(stateChanges, query = '', depth = 1) {
+ const nextState = Object.assign({}, this.state, stateChanges);
- // console.log(DISTILL_URL);
- // console.log("hERERE");
+ let url = `${DISTILL_URL}?size=250&event=${nextState.metric}&`;
+ if (nextState.starttime) {
+ url += `from=${encodeURIComponent(nextState.starttime)}&`;
+ }
+ if (nextState.endtime) {
+ url += `to=${encodeURIComponent(nextState.endtime)}&`;
+ }
+ if (nextState.minpathlength) {
+ url += `minpathlength=${encodeURIComponent(nextState.minpathlength)}&`;
+ }
+ if (nextState.maxpathlength) {
+ url += `maxpathlength=${encodeURIComponent(nextState.maxpathlength)}&`;
+ }
+ if (query) {
+ url += `target_in=${query}&`;
+ }
- const { name, results } = this.props.app;
- let includedTargetQuery = defineIncludedTargets(this.props.app.results.allTargets);
+ this.setState(nextState);
- var url = DISTILL_URL+'?from='+this.state.starttime+'&to='+this.state.endtime+'&event='+this.state.metric+'&target_in='+includedTargetQuery;
- //var url = 'http://localhost:8090';
- axios.get(url)
- .then( (response) => {
- //console.log("response", response);
- //var sankeyhtml = response.data;
- console.log(url);
- console.log("RESPONSE DATA FROM DISTILL");
- console.log(response.data);
- //console.log("Filters: " + this.state.metric);
+ const requestHandler = (response) => {
+ console.log(url);
+ console.log("RESPONSE DATA FROM DISTILL");
+ console.log(response.data);
- this.props.app.results.counts = response.data.histogram;
- this.props.app.results.sankey = {
+ const allTargets = getAllTargets(response.data.histogram);
+
+ const includedTargetQuery = defineIncludedTargets(allTargets);
+ const excludedTargetQuery = defineExcludedTargets(allTargets);
+
+ return new Promise((resolve) => {
+ this.setState({ includedTargetQuery }, () => {
+ this.props.app.results.counts = response.data.histogram;
+ this.props.app.results.sankey = {
nodes : response.data.nodes,
links : response.data.links,
};
- })
- .catch( (error) => {
- console.log(error);
+ this.props.app.results.allTargets = allTargets;
+
+ this.forceUpdate();
+ resolve();
+ });
});
+ };
+ if (!query && depth) {
+ return axios.get(url)
+ .then(requestHandler)
+ .then(() => this.updateResultParameters({}, this.state.includedTargetQuery, depth - 1))
+ .catch((e) => {
+ console.error(e);
+ });
+ }
+ return axios.get(url)
+ .then(requestHandler)
+ .catch((e) => {
+ console.error(e);
+ });
+ }
+getInitialAppResults() {
+ const { endtime, includedTargetQuery, maxpathlength, minpathlength, starttime } = this.state;
+
+ let url = `${DISTILL_URL}?from=`;
+ url += `${encodeURIComponent(starttime)}&to=`;
+ url += `${encodeURIComponent(endtime)}&size=250&target_in=`;
+ url += `${encodeURIComponent(includedTargetQuery)}&`;
+ url += `minpathlength=${encodeURIComponent(minpathlength)}&`;
+ url += `maxpathlength=${encodeURIComponent(maxpathlength)}&`;
+ url += 'event=';
+
+ return axios.get(url)
+ .then((response) => {
+ console.log(url);
+ console.log("RESPONSE DATA FROM DISTILL, should be upon load, in apps.js");
+ console.log(response.data);
+
+ let allTargets = getAllTargets(response.data.histogram);
+
+ let excludedTargetQuery = defineExcludedTargets(allTargets);
+ let includedTargetQuery = defineIncludedTargets(allTargets);
+
+ this.props.app.results.counts = response.data.histogram;
+ this.props.app.results.sankey = {
+ nodes : response.data.nodes,
+ links : response.data.links,
+ };
+ this.props.app.results.allTargets = allTargets;
+
+ this.updateResultParameters({ includedTargetQuery }, includedTargetQuery);
+ })
+ .catch( (error) => {
+ console.log(error);
+ });
+ }
+
+ render() {
+ const { name, results } = this.props.app;
return(
-
<div className='ui padded grid' id='results-content'>
<div className='sixteen wide column ui large header center aligned'>
Log Analysis
- {//name
- }
</div>
<div className='ui padded grid'>
@@ -196,11 +234,11 @@
<div className='two fields'>
<div className='ui field'>
<label>Min</label>
- <input type="text" name="min-path-length" defaultValue="2"></input>
+ <input type="text" name="min-path-length" defaultValue={this.state.minpathlength} />
</div>
<div className='ui field'>
<label>Max</label>
- <input type="text" name="max-path-length" defaultValue="10"></input>
+ <input type="text" name="max-path-length" defaultValue={this.state.maxpathlength} />
</div>
</div>
</div>
@@ -211,15 +249,14 @@
<div className='two fields'>
<div className='ui field' id="start-time-div" >
<label>Start logs from:</label>
- <input type="text" name="start-time" defaultValue="now-15m"></input>
+ <input type="text" name="start-time" defaultValue={this.state.starttime}></input>
</div>
<div className='ui field' id="end-time-div">
<label>End logs at:</label>
- <input type="text" name="end-time" defaultValue="now"></input>
+ <input type="text" name="end-time" defaultValue={this.state.endtime}></input>
</div>
</div>
</div>
-
</div>
</div>
</div>
@@ -272,49 +309,8 @@
</div>
</div>
</div>
-
- );
+ );
}
-
-getInitialAppResults() {
-
- var url = DISTILL_URL+'?from=now-50d&to=now&size=250';
- //var url = 'http://localhost:8090/sankey/userale-js?from=now-25d&to=now-20d&size=25;
- axios.get(url)
- .then( (response) => {
- console.log(url);
- console.log("RESPONSE DATA FROM DISTILL, should be upon load, in apps.js");
- console.log(response.data);
-
- let counts = response.data.histogram;
- let sankey = {
- nodes : response.data.nodes,
- links : response.data.links,
- };
-
- let allTargets = getAllTargets(response.data.histogram);
-
- let excludedTargetQuery = defineExcludedTargets(allTargets);
- let includedTargetQuery = defineIncludedTargets(allTargets);
-
- this.props.app.results.allTargets = allTargets;
- return {
- counts: counts,
- sankey: sankey,
- allTargets: allTargets,
- includedTargetQuery: includedTargetQuery,
- };
- })
- .catch( (error) => {
- console.log(error);
- });
-
- return {counts: [], sankey: {}, allTargets: [], includedTargetQuery: ""};
-
-}
-
-
-
};
@@ -388,4 +384,4 @@
app : PropTypes.object,
};
-export default AppResults;
+export default AppResults;
\ No newline at end of file