diff --git a/caravel/assets/javascripts/SqlLab/components/TableElement.jsx b/caravel/assets/javascripts/SqlLab/components/TableElement.jsx
index abc84a8fcc34b..70c2a73cc876d 100644
--- a/caravel/assets/javascripts/SqlLab/components/TableElement.jsx
+++ b/caravel/assets/javascripts/SqlLab/components/TableElement.jsx
@@ -1,11 +1,23 @@
import React from 'react';
-import { ButtonGroup } from 'react-bootstrap';
+import { ButtonGroup, Well } from 'react-bootstrap';
import Link from './Link';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import * as Actions from '../actions';
import shortid from 'shortid';
-import ModalTrigger from '../../components/ModalTrigger.jsx';
+import ModalTrigger from '../../components/ModalTrigger';
+import CopyToClipboard from '../../components/CopyToClipboard';
+
+const propTypes = {
+ table: React.PropTypes.object,
+ queryEditor: React.PropTypes.object,
+ actions: React.PropTypes.object,
+};
+
+const defaultProps = {
+ table: null,
+ actions: {},
+};
class TableElement extends React.Component {
setSelectStar() {
@@ -40,40 +52,85 @@ class TableElement extends React.Component {
collapseTable(e) {
e.preventDefault();
- this.props.actions.collapseTable.bind(this, this.props.table)();
+ this.props.actions.collapseTable(this.props.table);
}
expandTable(e) {
e.preventDefault();
- this.props.actions.expandTable.bind(this, this.props.table)();
+ this.props.actions.expandTable(this.props.table);
+ }
+
+ removeTable() {
+ this.props.actions.removeTable(this.props.table);
}
render() {
+ const table = this.props.table;
let metadata = null;
let buttonToggle;
- if (this.props.table.expanded) {
+
+ let header;
+ if (table.partitions) {
+ let partitionQuery;
+ let partitionClipBoard;
+ if (table.partitions.partitionQuery) {
+ partitionQuery = table.partitions.partitionQuery;
+ const tt = 'Copy partition query to clipboard';
+ partitionClipBoard = (
+
}
+ />
+ );
+ }
+ let latest = [];
+ for (const k in table.partitions.latest) {
+ latest.push(`${k}=${table.partitions.latest[k]}`);
+ }
+ latest = latest.join('/');
+ header = (
+
+
+
+ latest partition: {latest}
+ {partitionClipBoard}
+
+
+ );
+ }
+ if (table.expanded) {
buttonToggle = (
{ this.collapseTable(e); }}
>
- {this.props.table.name}
+ {table.name}
);
metadata = (
- {this.props.table.columns.map((col) => (
-
-
- {col.name}
-
-
- {col.type}
-
-
- ))}
-
+ {header}
+
+ {table.columns.map((col) => {
+ let name = col.name;
+ if (col.indexed) {
+ name =
{col.name};
+ }
+ return (
+
+
+ {name}
+
+
+ {col.type}
+
+
);
+ })}
+
+
);
} else {
@@ -82,34 +139,34 @@ class TableElement extends React.Component {
href="#"
onClick={(e) => { this.expandTable(e); }}
>
- {this.props.table.name}
+ {table.name}
);
}
let keyLink;
- if (this.props.table.indexes && this.props.table.indexes.length > 0) {
+ if (table.indexes && table.indexes.length > 0) {
keyLink = (
- Keys for table {this.props.table.name}
+ Keys for table {table.name}
}
modalBody={
-
{JSON.stringify(this.props.table.indexes, null, 4)}
+
{JSON.stringify(table.indexes, null, 4)}
}
triggerNode={
}
/>
);
}
return (
-
+
{buttonToggle}
@@ -131,26 +188,22 @@ class TableElement extends React.Component {
/>
- {metadata}
+
+ {metadata}
+
);
}
}
-TableElement.propTypes = {
- table: React.PropTypes.object,
- queryEditor: React.PropTypes.object,
- actions: React.PropTypes.object,
-};
-TableElement.defaultProps = {
- table: null,
-};
+TableElement.propTypes = propTypes;
+TableElement.defaultProps = defaultProps;
function mapDispatchToProps(dispatch) {
return {
@@ -158,3 +211,4 @@ function mapDispatchToProps(dispatch) {
};
}
export default connect(null, mapDispatchToProps)(TableElement);
+export { TableElement };
diff --git a/caravel/assets/javascripts/SqlLab/main.css b/caravel/assets/javascripts/SqlLab/main.css
index c42c73283b2de..4ef7876394832 100644
--- a/caravel/assets/javascripts/SqlLab/main.css
+++ b/caravel/assets/javascripts/SqlLab/main.css
@@ -232,3 +232,9 @@ div.tablePopover:hover {
.SouthPane .tab-content {
padding-top: 10px;
}
+
+.TableElement .well {
+ margin-top: 5px;
+ margin-bottom: 5px;
+ padding: 5px 10px;
+}
diff --git a/caravel/assets/javascripts/SqlLab/reducers.js b/caravel/assets/javascripts/SqlLab/reducers.js
index ff1dabd9e92a0..4f768c63ac287 100644
--- a/caravel/assets/javascripts/SqlLab/reducers.js
+++ b/caravel/assets/javascripts/SqlLab/reducers.js
@@ -72,8 +72,23 @@ export const sqlLabReducer = function (state, action) {
[actions.RESET_STATE]() {
return Object.assign({}, initialState);
},
- [actions.ADD_TABLE]() {
- return addToArr(state, 'tables', action.table);
+ [actions.MERGE_TABLE]() {
+ const at = Object.assign({}, action.table);
+ let existingTable;
+ state.tables.forEach((t) => {
+ if (
+ t.dbId === at.dbId &&
+ t.queryEditorId === at.queryEditorId &&
+ t.schema === at.schema &&
+ t.name === at.name) {
+ existingTable = t;
+ }
+ });
+ if (existingTable) {
+ return alterInArr(state, 'tables', existingTable, at);
+ }
+ at.id = shortid.generate();
+ return addToArr(state, 'tables', at);
},
[actions.EXPAND_TABLE]() {
return alterInArr(state, 'tables', action.table, { expanded: true });
diff --git a/caravel/assets/javascripts/components/CopyToClipboard.jsx b/caravel/assets/javascripts/components/CopyToClipboard.jsx
index 5330f8de7a1f2..5b149fe78f919 100644
--- a/caravel/assets/javascripts/components/CopyToClipboard.jsx
+++ b/caravel/assets/javascripts/components/CopyToClipboard.jsx
@@ -76,9 +76,11 @@ export default class CopyToClipboard extends React.Component {
return (
{this.props.shouldShowText &&
- {this.props.text}
+
+ {this.props.text}
+
+
}
-