Skip to content
Snippets Groups Projects
Commit 198d7bb0 authored by Atte Keinänen's avatar Atte Keinänen
Browse files

Hide is empty / not empty operators on dashboard date widget

parent 9da8d156
No related branches found
No related tags found
No related merge requests found
......@@ -3,7 +3,7 @@
import React, {Component, PropTypes} from "react";
import cx from "classnames";
import DatePicker, {OPERATORS} from "metabase/query_builder/components/filters/pickers/DatePicker.jsx";
import DatePicker, {DATE_OPERATORS} from "metabase/query_builder/components/filters/pickers/DatePicker.jsx";
import {generateTimeFilterValuesDescriptions} from "metabase/lib/query_time";
import type {OperatorName} from "metabase/query_builder/components/filters/pickers/DatePicker.jsx";
......@@ -31,13 +31,11 @@ const serializersByOperatorName: { [id: OperatorName]: (FieldFilter) => UrlEncod
"Before": getFilterValueSerializer((value) => `~${value}`),
"After": getFilterValueSerializer((value) => `${value}~`),
"On": getFilterValueSerializer((value) => `${value}`),
"Between": getFilterValueSerializer((from, to) => `${from}~${to}`),
"Is Empty": () => "is-empty",
"Not Empty": () => "not-empty"
"Between": getFilterValueSerializer((from, to) => `${from}~${to}`)
};
function getFilterOperator(filter) {
return OPERATORS.find((op) => op.test(filter));
return DATE_OPERATORS.find((op) => op.test(filter));
}
function filterToUrlEncoded(filter: FieldFilter): ?UrlEncoded {
const operator = getFilterOperator(filter)
......@@ -64,10 +62,6 @@ const deserializersWithTestRegex: [{ testRegex: RegExp, deserialize: Deserialize
// Unify BETWEEN -> between, IS_NULL -> is-null, NOT_NULL -> not-null throughout the codebase
// $FlowFixMe
{testRegex: /^([0-9-T:]+)~([0-9-T:]+)$/, deserialize: (matches) => ["BETWEEN", noopRef, matches[0], matches[1]]},
// $FlowFixMe
{testRegex: /is-empty/, deserialize: (matches) => ["IS_NULL", noopRef]},
// $FlowFixMe
{testRegex: /not-empty/, deserialize: (matches) => ["NOT_NULL", noopRef]},
];
function urlEncodedToFilter(urlEncoded: UrlEncoded): ?FieldFilter {
......@@ -140,6 +134,7 @@ export default class DateAllOptionsWidget extends Component<DefaultProps, Props,
<DatePicker
filter={this.state.filter}
onFilterChange={this.setFilter}
hideEmptinessOperators
/>
<div className="FilterPopover-footer p1">
<button
......
......@@ -140,7 +140,7 @@ export type Operator = {
test: (filter: FieldFilter) => boolean
}
export const OPERATORS: Operator[] = [
export const DATE_OPERATORS: Operator[] = [
{
name: "Previous",
init: (filter) => ["time-interval", getDateTimeField(filter[1]), -getIntervals(filter), getUnit(filter)],
......@@ -185,6 +185,10 @@ export const OPERATORS: Operator[] = [
test: ([op]) => mbqlEq(op, "between"),
widget: MultiDatePicker,
},
];
export const EMPTINESS_OPERATORS: Operator[] = [
{
name: "Is Empty",
init: (filter) => ["IS_NULL", getDateTimeField(filter[1])],
......@@ -197,38 +201,46 @@ export const OPERATORS: Operator[] = [
}
];
export const ALL_OPERATORS: Operator[] = DATE_OPERATORS.concat(EMPTINESS_OPERATORS);
type Props = {
filter: FieldFilter,
onFilterChange: (filter: FieldFilter) => void,
className: ?string
className: ?string,
hideEmptinessOperators: boolean, // Don't show is empty / not empty dialog
}
export default class DatePicker extends Component<*, Props, *> {
static propTypes = {
filter: PropTypes.array.isRequired,
onFilterChange: PropTypes.func.isRequired,
className: PropTypes.string
className: PropTypes.string,
hideEmptinessOperators: PropTypes.bool
};
componentWillMount() {
const operator = this._getOperator() || OPERATORS[0];
const operators = this.props.hideEmptinessOperators ? DATE_OPERATORS : ALL_OPERATORS;
const operator = this._getOperator(operators) || operators[0];
this.props.onFilterChange(operator.init(this.props.filter));
this.setState({operators})
}
_getOperator() {
return _.find(OPERATORS, (o) => o.test(this.props.filter));
_getOperator(operators: Operator[]) {
return _.find(operators, (o) => o.test(this.props.filter));
}
render() {
let { filter, onFilterChange, className} = this.props;
const operator = this._getOperator();
const operator = this._getOperator(this.state.operators);
const Widget = operator && operator.widget;
return (
<div className={cx("pt2", className)}>
<DateOperatorSelector
operator={operator && operator.name}
operators={OPERATORS}
operators={this.state.operators}
onOperatorChange={operator => onFilterChange(operator.init(filter))}
/>
{ Widget &&
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment