diff --git a/console/package-lock.json b/console/package-lock.json index bf4b35089f1016..ea9d43e9dc7ea8 100644 --- a/console/package-lock.json +++ b/console/package-lock.json @@ -4155,9 +4155,9 @@ "dev": true }, "deep-diff": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", - "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=" + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.4.tgz", + "integrity": "sha1-qsXDmVIjar5fA3ojSQYLoBsArkg=" }, "deep-equal": { "version": "1.1.1", @@ -13819,11 +13819,11 @@ } }, "redux-logger": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", - "integrity": "sha1-91VZZvMJjzyIYExEnPC69XeCdL8=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.1.tgz", + "integrity": "sha1-rorkw8Ve0916oxUJ8IVsXTdRBXo=", "requires": { - "deep-diff": "^0.3.5" + "deep-diff": "0.3.4" } }, "redux-thunk": { diff --git a/console/package.json b/console/package.json index 149218df784907..722d1375fd7caf 100644 --- a/console/package.json +++ b/console/package.json @@ -96,7 +96,7 @@ "react-tabs": "^2.1.0", "react-toggle": "^4.0.2", "redux": "^4.0.0", - "redux-logger": "^3.0.6", + "redux-logger": "3.0.1", "redux-thunk": "^2.2.0", "sanitize-filename": "^1.6.1", "semver": "5.5.1", diff --git a/console/src/components/Services/Data/TableBrowseRows/FilterQuery.js b/console/src/components/Services/Data/TableBrowseRows/FilterQuery.js index b9a0d36c040426..778cd4d841fad4 100644 --- a/console/src/components/Services/Data/TableBrowseRows/FilterQuery.js +++ b/console/src/components/Services/Data/TableBrowseRows/FilterQuery.js @@ -5,6 +5,7 @@ derive everything through viewtable as much as possible. */ import PropTypes from 'prop-types'; +import { createHistory } from 'history'; import React, { Component } from 'react'; import { Operators } from '../constants'; @@ -25,6 +26,8 @@ import { setDefaultQuery, runQuery, setOffset } from './FilterActions'; import Button from '../../../Common/Button/Button'; import ReloadEnumValuesButton from '../Common/ReusableComponents/ReloadEnumValuesButton'; +const history = createHistory(); + const renderCols = (colName, tableSchema, onChange, usage, key) => { const columns = tableSchema.columns.map(c => c.column_name); return ( @@ -182,7 +185,67 @@ const renderSorts = (orderBy, tableSchema, dispatch) => { class FilterQuery extends Component { componentDidMount() { const dispatch = this.props.dispatch; - dispatch(setDefaultQuery(this.props.curQuery)); + let urlFilters = []; + if (typeof this.props.urlQuery.filter === 'string') { + urlFilters = [this.props.urlQuery.filter]; + } else if (Array.isArray(this.props.urlQuery.filter)) { + urlFilters = this.props.urlQuery.filter; + } + const where = { + $and: urlFilters.map(filter => { + const parts = filter.split(';'); + const col = parts[0]; + const op = parts[1]; + const value = parts[2]; + return { [col]: { [op]: value } }; + }), + }; + + let urlSorts = []; + if (typeof this.props.urlQuery.sort === 'string') { + urlSorts = [this.props.urlQuery.sort]; + } else if (Array.isArray(this.props.urlQuery.sort)) { + urlSorts = this.props.urlQuery.sort; + } + + const order_by = urlSorts.map(sort => { + const parts = sort.split(';'); + const column = parts[0]; + const type = parts[1]; + const nulls = 'last'; + return { column, type, nulls }; + }); + + dispatch(setDefaultQuery({ where, order_by })); + dispatch(runQuery(this.props.tableSchema)); + } + + setParams(query = { filters: [], sorts: [] }) { + const searchParams = new URLSearchParams(); + query.filters.forEach(filter => searchParams.append('filter', filter)); + query.sorts.forEach(sort => searchParams.append('sort', sort)); + return searchParams.toString(); + } + + setUrlParams(whereAnd, orderBy) { + const sorts = orderBy + .filter(order => order.column) + .map(order => `${order.column};${order.type}`); + const filters = whereAnd + .filter( + where => Object.keys(where).length === 1 && Object.keys(where)[0] !== '' + ) + .map(where => { + const col = Object.keys(where)[0]; + const op = Object.keys(where[col])[0]; + const value = where[col][op]; + return `${col};${op};${value}`; + }); + const url = this.setParams({ filters, sorts }); + history.push({ + pathname: history.getCurrentLocation().pathname, + search: `?${url}`, + }); } render() { @@ -195,22 +258,19 @@ class FilterQuery extends Component { onSubmit={e => { e.preventDefault(); dispatch(setOffset(0)); + this.setUrlParams(whereAnd, orderBy); dispatch(runQuery(tableSchema)); }} >
Filter {renderWheres(whereAnd, tableSchema, dispatch)}
Sort {renderSorts(orderBy, tableSchema, dispatch)} diff --git a/console/src/components/Services/Data/TableBrowseRows/ViewRows.js b/console/src/components/Services/Data/TableBrowseRows/ViewRows.js index 053ba9100d12a7..559e85b2da2994 100644 --- a/console/src/components/Services/Data/TableBrowseRows/ViewRows.js +++ b/console/src/components/Services/Data/TableBrowseRows/ViewRows.js @@ -70,6 +70,7 @@ const ViewRows = ({ updateInvocationFunction, triggeredRow, triggeredFunction, + location, readOnlyMode, }) => { const styles = require('../../../Common/TableCommon/Table.scss'); @@ -637,6 +638,7 @@ const ViewRows = ({ count={count} tableName={curTableName} offset={offset} + urlQuery={location.query} /> ); } diff --git a/console/src/components/Services/Data/TableBrowseRows/ViewTable.js b/console/src/components/Services/Data/TableBrowseRows/ViewTable.js index 05a10daac91af4..66c7d096260777 100644 --- a/console/src/components/Services/Data/TableBrowseRows/ViewTable.js +++ b/console/src/components/Services/Data/TableBrowseRows/ViewTable.js @@ -159,6 +159,7 @@ class ViewTable extends Component { manualTriggers = [], triggeredRow, triggeredFunction, + location, } = this.props; // check if table exists @@ -202,6 +203,7 @@ class ViewTable extends Component { updateInvocationFunction={this.updateInvocationFunction.bind(this)} triggeredRow={triggeredRow} triggeredFunction={triggeredFunction} + location={location} readOnlyMode={readOnlyMode} /> );