Skip to content

Commit 2c0b805

Browse files
committed
feat: relative date filter
1 parent 35fc746 commit 2c0b805

File tree

3 files changed

+77
-13
lines changed

3 files changed

+77
-13
lines changed

src/components/BrowserFilter/BrowserFilter.react.js

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import Label from 'components/Label/Label.react';
1717
import Position from 'lib/Position';
1818
import React from 'react';
1919
import styles from 'components/BrowserFilter/BrowserFilter.scss';
20+
import Checkbox from 'components/Checkbox/Checkbox.react';
2021
import { List, Map } from 'immutable';
2122

2223
const POPOVER_CONTENT_ID = 'browserFilterPopover';
@@ -32,6 +33,7 @@ export default class BrowserFilter extends React.Component {
3233
confirmName: false,
3334
name: '',
3435
blacklistedFilters: Filters.BLACKLISTED_FILTERS.concat(props.blacklistedFilters),
36+
relativeDates: false,
3537
};
3638
this.toggle = this.toggle.bind(this);
3739
this.wrapRef = React.createRef();
@@ -114,7 +116,7 @@ export default class BrowserFilter extends React.Component {
114116
}
115117
return filter;
116118
});
117-
this.props.onSaveFilter(formatted, this.state.name);
119+
this.props.onSaveFilter(formatted, this.state.name, this.state.relativeDates);
118120
this.toggle();
119121
}
120122

@@ -137,6 +139,8 @@ export default class BrowserFilter extends React.Component {
137139
this.state.blacklistedFilters,
138140
this.state.filters
139141
);
142+
143+
const hasDateState = this.state.filters.some(filter => filter.get('compareTo')?.__type === 'Date');
140144
popover = (
141145
<Popover
142146
fixed={true}
@@ -180,17 +184,32 @@ export default class BrowserFilter extends React.Component {
180184
)}
181185
/>
182186
{this.state.confirmName && (
183-
<Field
184-
label={<Label text="Filter view name" />}
185-
input={
186-
<TextInput
187-
placeholder="Give it a good name..."
188-
value={this.state.name}
189-
onChange={name => this.setState({ name })}
190-
/>
191-
}
192-
/>
187+
<>
188+
<Field
189+
label={<Label text="Filter view name" />}
190+
input={
191+
<TextInput
192+
placeholder="Give it a good name..."
193+
value={this.state.name}
194+
onChange={name => this.setState({ name })}
195+
/>
196+
}
197+
/>
198+
{hasDateState &&
199+
<Field
200+
label={<Label text="Relative dates" />}
201+
input={
202+
<Checkbox
203+
checked={this.state.relativeDates}
204+
onChange={checked => this.setState({ relativeDates: checked })}
205+
className={styles.checkbox}
206+
/>
207+
}
208+
/>
209+
}
210+
</>
193211
)}
212+
194213
{this.state.confirmName && (
195214
<div className={styles.footer}>
196215
<Button

src/dashboard/Data/Browser/Browser.react.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,8 +1053,26 @@ class Browser extends DashboardView {
10531053
}
10541054
}
10551055

1056-
saveFilters(filters, name) {
1057-
const _filters = JSON.stringify(filters.toJSON());
1056+
saveFilters(filters, name, relativeDate) {
1057+
const jsonFilters = filters.toJSON();
1058+
if (relativeDate) {
1059+
for (let i = 0; i < jsonFilters.length; i++) {
1060+
const filter = jsonFilters[i];
1061+
const compareTo = filter.get('compareTo');
1062+
if (compareTo.__type === 'Date') {
1063+
compareTo.__type = 'RelativeDate';
1064+
const now = new Date();
1065+
const date = new Date(compareTo.iso);
1066+
const diff = now.getTime() - date.getTime();
1067+
compareTo.value = Math.floor(diff / 1000);
1068+
delete compareTo.iso;
1069+
filter.set('compareTo', compareTo);
1070+
jsonFilters[i] = filter;
1071+
}
1072+
}
1073+
}
1074+
1075+
const _filters = JSON.stringify(jsonFilters);
10581076
const preferences = ClassPreferences.getPreferences(
10591077
this.context.applicationId,
10601078
this.props.params.className
@@ -1070,6 +1088,7 @@ class Browser extends DashboardView {
10701088
this.context.applicationId,
10711089
this.props.params.className
10721090
);
1091+
10731092
super.forceUpdate();
10741093
}
10751094

src/lib/generatePath.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,32 @@
11
const MOUNT_PATH = window.PARSE_DASHBOARD_PATH;
22

33
export default function generatePath(currentApp, path, prependMountPath = false) {
4+
5+
const urlObj = new URL(path, window.location.origin);
6+
const params = new URLSearchParams(urlObj.search);
7+
8+
const filters = JSON.parse(params.get('filters'))
9+
10+
if (filters) {
11+
for (let i = 0; i < filters.length; i++) {
12+
const filter = filters[i];
13+
if (filter.compareTo?.__type === 'RelativeDate') {
14+
const date = new Date();
15+
date.setTime(date.getTime() + filter.compareTo.value * 1000);
16+
filter.compareTo = {
17+
__type: 'Date',
18+
iso: date.toISOString(),
19+
}
20+
filters[i] = filter;
21+
}
22+
}
23+
24+
params.set('filters', JSON.stringify(filters));
25+
urlObj.search = params.toString();
26+
27+
path = urlObj.toString().split(window.location.origin)[1].substring(1);
28+
}
29+
430
if (prependMountPath && MOUNT_PATH) {
531
return `${MOUNT_PATH}apps/${currentApp.slug}/${path}`;
632
}

0 commit comments

Comments
 (0)