Commit e2be194b by ryan

autofill space rather than force with/height values

parent 9134620c
......@@ -4,16 +4,17 @@ import { storiesOf } from '@storybook/react';
import TableInputCSV from './TableInputCSV';
import { action } from '@storybook/addon-actions';
import { TableData } from '../../types/data';
import { withCenteredStory } from '../../utils/storybook/withCenteredStory';
const TableInputStories = storiesOf('UI/Table/Input', module);
TableInputStories.addDecorator(withCenteredStory);
TableInputStories.add('default', () => {
return (
<div>
<div style={{ width: '90%', height: '90vh' }}>
<TableInputCSV
text="a,b,c\n1,2,3"
width={'90%'}
height={'90vh'}
text={'a,b,c\n1,2,3'}
onTableParsed={(table: TableData, text: string) => {
console.log('Table', table, text);
action('Table')(table, text);
......
......@@ -9,11 +9,9 @@ describe('TableInputCSV', () => {
const tree = renderer
.create(
<TableInputCSV
text="a,b,c\n1,2,3"
width={100}
height={100}
text={'a,b,c\n1,2,3'}
onTableParsed={(table: TableData, text: string) => {
console.log('Table:', table, 'from:', text);
// console.log('Table:', table, 'from:', text);
}}
/>
)
......
......@@ -2,11 +2,10 @@ import React from 'react';
import debounce from 'lodash/debounce';
import { ParseConfig, parseCSV, ParseDetails } from '../../utils/processTableData';
import { TableData } from '../../types/data';
import { AutoSizer } from 'react-virtualized';
interface Props {
config?: ParseConfig;
width: number | string;
height: number | string;
text: string;
onTableParsed: (table: TableData, text: string) => void;
}
......@@ -17,6 +16,9 @@ interface State {
details: ParseDetails;
}
/**
* Expects the container div to have size set and will fill it 100%
*/
class TableInputCSV extends React.PureComponent<Props, State> {
constructor(props: Props) {
super(props);
......@@ -54,24 +56,38 @@ class TableInputCSV extends React.PureComponent<Props, State> {
}
}
handleFooterClicked = (event: any) => {
console.log('Errors', this.state);
const message = this.state.details
.errors!.map(err => {
return err.message;
})
.join('\n');
alert('CSV Parsing Errors:\n' + message);
};
handleChange = (event: any) => {
this.setState({ text: event.target.value });
};
render() {
const { width, height } = this.props;
const { table, details } = this.state;
const hasErrors = details.errors && details.errors.length > 0;
const footerClassNames = hasErrors ? 'gf-table-input-csv-err' : '';
return (
<div className="gf-table-input-csv" style={{ width, height }}>
<textarea placeholder="Enter CSV here..." value={this.state.text} onChange={this.handleChange} />
<footer>
Rows:{table.rows.length}, Columns:{table.columns.length}
{hasErrors ? <i className="fa fa-exclamation-triangle" /> : <i className="fa fa-check-circle" />}
</footer>
</div>
<AutoSizer>
{({ height, width }) => (
<div className="gf-table-input-csv" style={{ width, height }}>
<textarea placeholder="Enter CSV here..." value={this.state.text} onChange={this.handleChange} />
<footer onClick={this.handleFooterClicked} className={footerClassNames}>
Rows:{table.rows.length}, Columns:{table.columns.length} &nbsp;
{hasErrors ? <i className="fa fa-exclamation-triangle" /> : <i className="fa fa-check-circle" />}
</footer>
</div>
)}
</AutoSizer>
);
}
}
......
......@@ -10,9 +10,15 @@
.gf-table-input-csv footer {
position: absolute;
bottom: 20px;
right: 20px;
bottom: 15px;
right: 15px;
border: 1px solid #222;
background: #ccc;
padding: 4px 10px;
padding: 1px 4px;
font-size: 80%;
cursor: pointer;
}
.gf-table-input-csv footer.gf-table-input-csv-err {
background: yellow;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment