Skip to content

Commit 14a3e3b

Browse files
authored
Time selection in filters, no = and ≠ operators for datetimes (radiantearth#569)
1 parent d0424e9 commit 14a3e3b

19 files changed

+90
-43
lines changed

src/components/DatePickerMixin.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,14 @@ export default {
55
DatePicker: () => import('vue2-datepicker')
66
},
77
data() {
8+
const dateFormat = 'YYYY-MM-DD';
9+
const timeFormat = 'HH:mm:ss';
810
return {
911
datepickerLang: null,
10-
datepickerFormat: 'YYYY-MM-DD'
12+
dateFormat,
13+
timeFormat,
14+
dateTimeFormat: `${dateFormat} ${timeFormat}`,
15+
twelveHourClock: false
1116
};
1217
},
1318
computed: {
@@ -27,8 +32,10 @@ export default {
2732
else {
2833
this.datepickerLang = options.locale;
2934
}
30-
this.datepickerFormat = options.format;
35+
this.dateFormat = options.dateFormat;
36+
this.timeFormat = options.timeFormat;
37+
this.dateTimeFormat = options.dateTimeFormat;
3138
}
3239
}
3340
}
34-
};
41+
};

src/components/QueryableInput.vue

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,7 @@
1919

2020
<date-picker
2121
v-if="queryable.isTemporal"
22-
type="date"
2322
class="value"
24-
:lang="datepickerLang"
25-
:format="datepickerFormat"
2623
:value="value.value"
2724
@input="updateValue($event)"
2825
v-bind="validation"
@@ -110,7 +107,14 @@ export default {
110107
},
111108
computed: {
112109
validation() {
113-
if (this.queryable.isText && !this.queryable.isTemporal) {
110+
if (this.queryable.isTemporal) {
111+
return {
112+
type: this.queryable.isDateTime ? 'datetime' : 'date',
113+
lang: this.datepickerLang,
114+
format: this.queryable.isDateTime ? this.dateTimeFormat : this.dateFormat
115+
};
116+
}
117+
else if (this.queryable.isText) {
114118
return {
115119
type: 'text',
116120
minlength: this.schema.minLength,

src/components/SearchFilter.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121

2222
<b-form-group v-if="canFilterExtents" class="filter-datetime" :label="$t('search.temporalExtent')" :label-for="ids.datetime" :description="$t('search.dateDescription')">
2323
<date-picker
24-
range :id="ids.datetime" :lang="datepickerLang" :format="datepickerFormat"
25-
v-model="datetime" input-class="form-control mx-input"
24+
range type="datetime" v-model="datetime" input-class="form-control mx-input"
25+
:id="ids.datetime" :lang="datepickerLang" :format="dateTimeFormat"
2626
/>
2727
</b-form-group>
2828

@@ -133,7 +133,6 @@ import Cql from '../models/cql2/cql';
133133
import Queryable from '../models/cql2/queryable';
134134
import CqlValue from '../models/cql2/value';
135135
import CqlLogicalOperator from '../models/cql2/operators/logical';
136-
import { CqlEqual } from '../models/cql2/operators/comparison';
137136
import { stacRequest } from '../store/utils';
138137
139138
function getQueryDefaults() {
@@ -490,9 +489,10 @@ export default {
490489
this.filters.splice(queryableIndex, 1);
491490
},
492491
additionalFieldSelected(queryable) {
492+
const operators = queryable.getOperators(this.cql);
493493
this.filters.push({
494494
value: CqlValue.create(queryable.defaultValue),
495-
operator: CqlEqual,
495+
operator: operators[0],
496496
queryable
497497
});
498498
},

src/locales/de-CH/datepicker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
const format = 'DD.MM.YYYY';
1+
const dateFormat = 'DD.MM.YYYY';
2+
const timeFormat = 'H:mm:ss';
3+
const dateTimeFormat = `${dateFormat} ${timeFormat}`;
24
const locale = import('vue2-datepicker/locale/de');
3-
export default {format, locale};
5+
export default {dateFormat, timeFormat, dateTimeFormat, locale};

src/locales/de/datepicker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
const format = 'D.M.YYYY';
1+
const dateFormat = 'D.M.YYYY';
2+
const timeFormat = 'H:mm:ss';
3+
const dateTimeFormat = `${dateFormat} ${timeFormat}`;
24
const locale = import('vue2-datepicker/locale/de');
3-
export default {format, locale};
5+
export default {dateFormat, timeFormat, dateTimeFormat, locale};

src/locales/en-GB/datepicker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
const format = 'DD/MM/YYYY';
1+
const dateFormat = 'DD/MM/YYYY';
2+
const timeFormat = 'hh:mm:ss a';
3+
const dateTimeFormat = `${dateFormat} ${timeFormat}`;
24
const locale = import('vue2-datepicker/locale/en');
35
locale.formatLocale.firstDayOfWeek = 1;
4-
export default {format, locale};
6+
export default {dateFormat, timeFormat, dateTimeFormat, locale};

src/locales/en-US/datepicker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
const format = 'M/D/YYYY';
1+
const dateFormat = 'M/D/YYYY';
2+
const timeFormat = 'hh:mm:ss a';
3+
const dateTimeFormat = `${dateFormat} ${timeFormat}`;
24
const locale = import('vue2-datepicker/locale/en');
35
locale.formatLocale.firstDayOfWeek = 0;
4-
export default {format, locale};
6+
export default {dateFormat, timeFormat, dateTimeFormat, locale};

src/locales/en/datepicker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// 1. Specify output format
2-
const format = 'YYYY-MM-DD';
2+
const dateFormat = 'YYYY-MM-DD';
3+
const timeFormat = 'HH:mm:ss';
4+
const dateTimeFormat = `${dateFormat} ${timeFormat}`;
35

46
// 2A. Either re-use settings and phrases from vue2-datepicker (and customize them)...
57
const locale = import('vue2-datepicker/locale/en');
@@ -51,4 +53,4 @@ const locale = {
5153
}
5254
*/
5355

54-
export default {format, locale};
56+
export default {dateFormat, timeFormat, dateTimeFormat, locale};

src/locales/es/datepicker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
const format = 'DD/MM/YYYY';
1+
const dateFormat = 'DD/MM/YYYY';
2+
const timeFormat = 'H:mm:ss';
3+
const dateTimeFormat = `${dateFormat} ${timeFormat}`;
24
const locale = import('vue2-datepicker/locale/es');
3-
export default {format, locale};
5+
export default {dateFormat, timeFormat, dateTimeFormat, locale};

src/locales/fr-CA/datepicker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
const format = 'YYYY-MM-DD';
1+
const dateFormat = 'YYYY-MM-DD';
2+
const timeFormat = 'H:mm:ss';
3+
const dateTimeFormat = `${dateFormat} ${timeFormat}`;
24
const locale = import('vue2-datepicker/locale/fr');
3-
export default {format, locale};
5+
export default {dateFormat, timeFormat, dateTimeFormat, locale};

src/locales/fr-CH/datepicker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
const format = 'DD.MM.YYYY';
1+
const dateFormat = 'DD.MM.YYYY';
2+
const timeFormat = 'H:mm:ss';
3+
const dateTimeFormat = `${dateFormat} ${timeFormat}`;
24
const locale = import('vue2-datepicker/locale/fr');
3-
export default {format, locale};
5+
export default {dateFormat, timeFormat, dateTimeFormat, locale};

src/locales/fr/datepicker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
const format = 'DD/MM/YYYY';
1+
const dateFormat = 'DD/MM/YYYY';
2+
const timeFormat = 'H:mm:ss';
3+
const dateTimeFormat = `${dateFormat} ${timeFormat}`;
24
const locale = import('vue2-datepicker/locale/fr');
3-
export default {format, locale};
5+
export default {dateFormat, timeFormat, dateTimeFormat, locale};

src/locales/it-CH/datepicker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
const format = 'DD.MM.YYYY';
1+
const dateFormat = 'DD.MM.YYYY';
2+
const timeFormat = 'H:mm:ss';
3+
const dateTimeFormat = `${dateFormat} ${timeFormat}`;
24
const locale = import('vue2-datepicker/locale/it');
3-
export default {format, locale};
5+
export default {dateFormat, timeFormat, dateTimeFormat, locale};

src/locales/it/datepicker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
const format = 'DD/MM/YYYY';
1+
const dateFormat = 'DD/MM/YYYY';
2+
const timeFormat = 'H:mm:ss';
3+
const dateTimeFormat = `${dateFormat} ${timeFormat}`;
24
const locale = import('vue2-datepicker/locale/it');
3-
export default {format, locale};
5+
export default {dateFormat, timeFormat, dateTimeFormat, locale};

src/locales/ja/datepicker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
const format = 'YYYY/MM/DD';
1+
const dateFormat = 'YYYY/MM/DD';
2+
const timeFormat = 'H:mm:ss';
3+
const dateTimeFormat = `${dateFormat} ${timeFormat}`;
24
const locale = import('vue2-datepicker/locale/ja');
3-
export default {format, locale};
5+
export default {dateFormat, timeFormat, dateTimeFormat, locale};

src/locales/pt-BR/datepicker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
const format = 'DD/MM/YYYY';
1+
const dateFormat = 'DD/MM/YYYY';
2+
const timeFormat = 'H:mm:ss';
3+
const dateTimeFormat = `${dateFormat} ${timeFormat}`;
24
const locale = import('vue2-datepicker/locale/pt-br');
3-
export default {format, locale};
5+
export default {dateFormat, timeFormat, dateTimeFormat, locale};

src/locales/pt/datepicker.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
const format = 'DD/MM/YYYY';
1+
const dateFormat = 'DD/MM/YYYY';
22
const locale = import('vue2-datepicker/locale/pt');
3-
export default {format, locale};
3+
export default {dateFormat, timeFormat, dateTimeFormat, locale};

src/locales/ro/datepicker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
const format = 'DD/MM/YYYY';
1+
const dateFormat = 'DD/MM/YYYY';
2+
const timeFormat = 'H:mm:ss';
3+
const dateTimeFormat = `${dateFormat} ${timeFormat}`;
24
const locale = import('vue2-datepicker/locale/ro');
3-
export default {format, locale};
5+
export default {dateFormat, timeFormat, dateTimeFormat, locale};

src/models/cql2/queryable.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,15 @@ export default class Queryable {
9696
}
9797

9898
getOperators(cql) {
99-
let ops = [CqlEqual, CqlNotEqual];
99+
let ops = [];
100+
if (!this.isDateTime) {
101+
// Although it is supported, comparing specific instances in time doesn't give predictable results.
102+
// For example 2020-01-01T00:00:00Z is not equal to 2020-01-01T00:00:00.001Z and you don't know the granularity
103+
// of the datetimes in the database. In the end you usually don't get what you are looking for.
104+
// This may work better for dates only, so we only remove equality operators for dates with times.
105+
ops.push(CqlEqual);
106+
ops.push(CqlNotEqual);
107+
}
100108
if (this.isNumeric || this.isTemporal) {
101109
ops.push(CqlLessThan);
102110
ops.push(CqlLessThanEqual);
@@ -117,4 +125,4 @@ export default class Queryable {
117125
return { property: this.id };
118126
}
119127

120-
}
128+
}

0 commit comments

Comments
 (0)