Просмотр исходного кода

autofill space rather than force with/height values

ryan 6 лет назад
Родитель
Сommit
e2be194b46

+ 5 - 4
packages/grafana-ui/src/components/Table/TableInputCSV.story.tsx

@@ -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);

+ 2 - 4
packages/grafana-ui/src/components/Table/TableInputCSV.test.tsx

@@ -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);
           }}
         />
       )

+ 26 - 10
packages/grafana-ui/src/components/Table/TableInputCSV.tsx

@@ -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>
     );
   }
 }

+ 9 - 3
packages/grafana-ui/src/components/Table/_TableInputCSV.scss

@@ -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;
 }