Skip to content

Commit a2aee74

Browse files
committed
WIP breaking commit - add DatasetForm, DatasetTable, DatasetsTab, DeleteDataset
1 parent a4d6a65 commit a2aee74

File tree

8 files changed

+232
-1
lines changed

8 files changed

+232
-1
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import React from 'react';
2+
import PropTypes from 'prop-types';
3+
4+
5+
let DatasetForm = (props) => {
6+
const { fields: { datasetName, headerFile, tarFile },
7+
error, handleSubmit, submitting } = props;
8+
9+
const description = {
10+
fontStyle: 'italic',
11+
paddingBottom: '1em'
12+
};
13+
14+
return (
15+
<div>
16+
<Form onSubmit={handleSubmit} error={error}>
17+
<TextInput label="Dataset Name" {...datasetName} />
18+
<FileInput
19+
label="Header File"
20+
{...headerFile}
21+
data-tip
22+
data-for="headerfileTooltip"
23+
/>
24+
25+
<div style={description}>
26+
Format: comma-separated with columns "filename" (of a time series from the uploaded archive), "label" (class label or numerical value), and any metafeatures (numerical).
27+
</div>
28+
29+
<FileInput
30+
label="Data Tarball"
31+
{...tarFile}
32+
data-tip
33+
data-for="tarfileTooltip"
34+
/>
35+
<div style={description}>
36+
Format: zipfile or tarfile containing time series files, each of which is comma-separated with columns "time", "value", "error" (optional).
37+
</div>
38+
39+
<SubmitButton label="Upload Dataset" disabled={submitting} />
40+
</Form>
41+
42+
<CesiumTooltip
43+
id="headerfileTooltip"
44+
text={["filename,label", <br />, "ts1.dat,class_A", <br />, "..."]}
45+
/>
46+
<CesiumTooltip
47+
id="tarfileTooltip"
48+
text={[
49+
"Each file in tarball should be formatted as follows",
50+
<br />, "(column titles are optional)", <br />, <br />,
51+
"time,value,error", <br />,
52+
"125912.23,12.31604,0.279105", <br />,
53+
"..."]}
54+
/>
55+
56+
</div>
57+
);
58+
};
59+
DatasetForm.propTypes = {
60+
fields: PropTypes.object.isRequired,
61+
error: PropTypes.string,
62+
handleSubmit: PropTypes.func.isRequired,
63+
submitting: PropTypes.bool.isRequired
64+
};
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import React from 'react';
2+
import { connect } from 'react-redux';
3+
4+
import DatasetInfo from '../containers/DatasetInfo';
5+
import DeleteDataset from '../containers/DeleteDataset';
6+
7+
export let DatasetTable = props => (
8+
<table className="table">
9+
<thead>
10+
<tr>
11+
<th>Name</th><th>Uploaded</th><th>Actions</th>
12+
</tr>
13+
</thead>
14+
15+
{
16+
props.datasets.map((dataset, idx) => {
17+
const foldedContent = (
18+
<tr key={`dsinfo_${idx}`}>
19+
<td colSpan={6}>
20+
<DatasetInfo dataset={dataset} />
21+
</td>
22+
</tr>
23+
);
24+
25+
return (
26+
<FoldableRow key={`ds_${idx}`}>
27+
<tr key={dataset.id}>
28+
<td>{dataset.name}</td>
29+
<td>{reformatDatetime(dataset.created_at)}</td>
30+
<td><DeleteDataset ID={dataset.id} /></td>
31+
</tr>
32+
{foldedContent}
33+
</FoldableRow>
34+
);
35+
})
36+
}
37+
38+
</table>
39+
);
40+
DatasetTable.propTypes = {
41+
datasets: React.PropTypes.arrayOf(React.PropTypes.object)
42+
};
43+
44+
export default DatasetTable;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import React from 'react';
2+
import { connect } from "react-redux";
3+
import { reduxForm } from 'redux-form';
4+
5+
import { FormComponent, Form, TextInput, FileInput, SubmitButton } from '../Form/index';
6+
import DatasetForm from '../../containers/DatasetForm';
7+
import DatasetTable from '../../containers/DatasetTable';
8+
import Expand from '../Expand';
9+
10+
11+
const DatasetsTab = props => (
12+
<div className="datasetsTab">
13+
14+
<Expand label="Upload new dataset" id="newDatasetExpander">
15+
<DatasetForm selectedProject={props.selectedProject} />
16+
</Expand>
17+
18+
<DatasetTable selectedProject={props.selectedProject} />
19+
20+
</div>
21+
);
22+
DatasetsTab.propTypes = {
23+
selectedProject: React.PropTypes.object
24+
};
25+
26+
export default DatasetsTab;

static/js/components/Main.jsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
33
import { connect, Provider } from 'react-redux';
44
import ReactDOM from 'react-dom';
55
import ReactTabs from 'react-tabs';
6+
import PropTypes from 'prop-types';
67

78
import 'bootstrap-css';
89
import 'bootstrap';
@@ -11,12 +12,16 @@ import { Notifications } from 'baselayer/components/Notifications';
1112
import WebSocket from 'baselayer/components/WebSocket';
1213
import configureStore from '../configureStore';
1314
import * as Action from '../actions';
15+
import WebSocket from 'baselayer/components/WebSocket';
1416
import CesiumMessageHandler from '../CesiumMessageHandler';
15-
import { ProjectSelector, AddProject, ProjectTab } from './Projects';
17+
import AddProject from '../containers/AddProject';
18+
import ProjectSelector from '../containers/ProjectSelector';
19+
import ProjectTab from '../containers/ProjectTab';
1620
import DatasetsTab from './Datasets';
1721
import FeaturesTab from './Features';
1822
import ModelsTab from './Models';
1923
import PredictTab from './Predictions';
24+
import { Notifications } from 'baselayer/components/Notifications';
2025
import colorScheme from './colorscheme';
2126
import Progress from './Progress';
2227
import CesiumTooltip from './Tooltip';
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import reduxForm from 'redux-form';
2+
3+
import * as Validate from '../../validate';
4+
import * as Action from '../../actions';
5+
import DatasetForm from '../../containers/DatasetForm';
6+
7+
8+
const mapStateToProps = (state, ownProps) => (
9+
{
10+
initialValues: {
11+
...(ownProps.initialValues),
12+
projectID: ownProps.selectedProject.id
13+
}
14+
}
15+
);
16+
17+
const mapDispatchToProps = (dispatch, ownProps) => (
18+
{
19+
onSubmit: form => (
20+
dispatch(Action.uploadDataset(form))
21+
)
22+
}
23+
);
24+
25+
const validate = Validate.createValidator({
26+
datasetName: [Validate.required],
27+
tarFile: [Validate.oneFile],
28+
});
29+
30+
export default reduxForm({
31+
form: 'newDataset',
32+
fields: ['datasetName', 'headerFile', 'tarFile', 'projectID'],
33+
validate
34+
}, dsMapStateToProps, dsMapDispatchToProps)(DatasetForm);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { reduxForm } from 'redux-form';
2+
3+
import * as Validate from '../../validate';
4+
import * as Action from '../../actions';
5+
import DatasetForm from '../../components/DatasetForm';
6+
7+
8+
const mapStateToProps = (state, ownProps) => (
9+
{
10+
initialValues: {
11+
...(ownProps.initialValues),
12+
projectID: ownProps.selectedProject.id
13+
}
14+
}
15+
);
16+
17+
const mapDispatchToProps = (dispatch, ownProps) => (
18+
{
19+
onSubmit: form => (
20+
dispatch(Action.uploadDataset(form))
21+
)
22+
}
23+
);
24+
25+
const validate = Validate.createValidator({
26+
datasetName: [Validate.required],
27+
tarFile: [Validate.oneFile],
28+
});
29+
30+
export default reduxForm({
31+
form: 'newDataset',
32+
fields: ['datasetName', 'headerFile', 'tarFile', 'projectID'],
33+
validate
34+
}, mapStateToProps, mapDispatchToProps)(DatasetForm);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { connect } from 'react-redux';
2+
3+
import DatasetTable from '../../components/DatasetTable';
4+
5+
6+
const mapStateToProps = (state, ownProps) => (
7+
{
8+
datasets: state.datasets.filter(dataset => (
9+
dataset.project_id === ownProps.selectedProject.id
10+
))
11+
}
12+
);
13+
14+
export default connect(mapStateToProps)(DatasetTable);
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { connect } from "react-redux";
2+
3+
import * as Action from '../actions';
4+
5+
6+
const mapDispatchToProps = dispatch => (
7+
{ delete: id => dispatch(Action.deleteDataset(id)) }
8+
);
9+
10+
export default connect(null, mapDispatchToProps)(Delete);

0 commit comments

Comments
 (0)