From 007d44df38dba254154b3450aacec9dd253ccd95 Mon Sep 17 00:00:00 2001 From: Vignesh Joglekar Date: Fri, 21 May 2021 03:23:16 -0500 Subject: [PATCH] Second pass - mostly everything user-facing is done Still needs: - Tests - Potentially negating other filters - Potentially some code cleanup --- assets/js/dashboard/filters.js | 34 ++++-- assets/js/dashboard/stats/modals/filter.js | 124 +++++++++++++-------- 2 files changed, 100 insertions(+), 58 deletions(-) diff --git a/assets/js/dashboard/filters.js b/assets/js/dashboard/filters.js index ba88d006fb..44011bbf68 100644 --- a/assets/js/dashboard/filters.js +++ b/assets/js/dashboard/filters.js @@ -102,6 +102,9 @@ class Filters extends React.Component { }; filterText(key, value, query) { + const negated = value[0] == '!' && ['page', 'entry_page', 'exit_page'].includes(key) + value = negated ? value.slice(1) : value + if (key === "goal") { return Completed goal {value} } @@ -148,13 +151,13 @@ class Filters extends React.Component { return Country: {selectedCountry.properties.name} } if (key === "page") { - return Page: {value} + return Page{negated ? ' (not)' : ''}: {value} } if (key === "entry_page") { - return Entry Page: {value} + return Entry Page{negated ? ' (not)' : ''}: {value} } if (key === "exit_page") { - return Exit Page: {value} + return Exit Page{negated ? ' (not)' : ''}: {value} } } @@ -174,7 +177,13 @@ class Filters extends React.Component { return (
{this.filterText(key, value, query)} - this.removeFilter(key, history, query)}>✕ + + {!['goal', 'props'].includes(key) && + + + } + this.removeFilter(key, history, query)}>✕ +
) } @@ -182,7 +191,14 @@ class Filters extends React.Component { renderListFilter(history, [key, value], query) { return ( - {this.filterText(key, value, query)} this.removeFilter(key, history, query)}>✕ + {this.filterText(key, value, query)} + + {!['goal', 'props'].includes(key) && + + + } + this.removeFilter(key, history, query)}>✕ + ) } @@ -203,8 +219,8 @@ class Filters extends React.Component { return (
this.dropDownNode = node}>
- - + + Add Filter {this.appliedFilters.map((filter) => this.renderDropdownFilter(history, filter, query))} @@ -247,10 +263,10 @@ class Filters extends React.Component { const {viewport} = this.state; return ( -
+
{(this.appliedFilters.map((filter) => this.renderListFilter(history, filter, query)))} - + {viewport <= 768 ? "Filter" : "Add Filter"}
diff --git a/assets/js/dashboard/stats/modals/filter.js b/assets/js/dashboard/stats/modals/filter.js index 427e5f66eb..91382ac747 100644 --- a/assets/js/dashboard/stats/modals/filter.js +++ b/assets/js/dashboard/stats/modals/filter.js @@ -1,91 +1,117 @@ import React from "react"; -import { withRouter, Link } from 'react-router-dom' +import { withRouter, Redirect } from 'react-router-dom' import Modal from './modal' -import { parseQuery, formattedFilters } from '../../query' +import { parseQuery, formattedFilters, navigateToQuery } from '../../query' class FilterModal extends React.Component { constructor(props) { super(props) this.state = { query: parseQuery(props.location.search, props.site), - selectedFilter: this.props.match.params.field || "", + selectedFilter: "", + negated: false, updatedValue: "", - negated: false + filterSaved: false } this.editableGoals = Object.keys(this.state.query.filters).filter(filter => !['goal', 'props'].includes(filter)) } componentDidMount() { + this.setState({ selectedFilter: this.props.match.params.field }) + } + componentDidUpdate(prevProps, prevState) { + const { query, selectedFilter } = this.state + + if (prevState.selectedFilter !== selectedFilter) { + const negated = query.filters[selectedFilter] && query.filters[selectedFilter][0] == '!' && this.negationSupported(selectedFilter) + const updatedValue = negated ? query.filters[selectedFilter].slice(1) : (query.filters[selectedFilter] || "") + + this.setState({ updatedValue, negated }) + } + } + + negationSupported(filter) { + return ['page', 'entry_page', 'exit_page'].includes(filter) } renderBody() { const { selectedFilter, negated, updatedValue, query } = this.state; - const updatedQuery = new URLSearchParams(window.location.search) - const finalFilterValue = (['page', 'entry_page', 'exit_page'].includes(selectedFilter) && negated ? '!' : '') + updatedValue - const validQuery = this.editableGoals.includes(selectedFilter) && updatedValue - updatedQuery.set(selectedFilter, finalFilterValue) + const finalFilterValue = (this.negationSupported(selectedFilter) && negated ? '!' : '') + updatedValue + const finalizedQuery = new URLSearchParams(window.location.search) + const validFilter = this.editableGoals.includes(selectedFilter) && updatedValue + finalizedQuery.set(selectedFilter, finalFilterValue) return ( -

{query.filters[selectedFilter] ? 'Edit' : 'Add'} a Filter

+

{query.filters[selectedFilter] ? 'Edit' : 'Add'} Filter

-
- +
+
{ + if (validFilter) { + this.setState({ finalizedQuery }) + } + }}> + - {['page', 'entry_page', 'exit_page'].includes(selectedFilter) && -
-
+ } - {selectedFilter && - { this.setState({ updatedValue: e.target.value }) }} - /> - } + {selectedFilter && + { this.setState({ updatedValue: e.target.value }) }} + /> + } - - {query.filters[selectedFilter] ? 'Update' : 'Add'} Filter - + +
) } render() { + const { finalizedQuery } = this.state + + if (finalizedQuery) { + return + } + return ( { this.renderBody()}