diff --git a/src/components/Map.vue b/src/components/Map.vue
index 8ecc40044..1d457778a 100644
--- a/src/components/Map.vue
+++ b/src/components/Map.vue
@@ -143,7 +143,13 @@
-
+ [],
devicesEnabled: false,
sliderEnabled: false,
+ timeFilterMode: 'slider',
sliderStartTimestamp: 0,
sliderEndTimestamp: 0,
minDataTimestamp: 0,
diff --git a/src/components/MapsNavigation.vue b/src/components/MapsNavigation.vue
index c0473c459..7fd1e3895 100644
--- a/src/components/MapsNavigation.vue
+++ b/src/components/MapsNavigation.vue
@@ -51,6 +51,15 @@
+
+
+
+
@@ -77,8 +86,10 @@ import {
NcFormBoxButton,
NcFormBoxSwitch,
NcLoadingIcon,
+ NcRadioGroup,
+ NcRadioGroupButton,
} from '@nextcloud/vue'
-import { reactive, ref } from 'vue'
+import { computed, reactive, ref } from 'vue'
import IconCog from 'vue-material-design-icons/CogOutline.vue'
import IconOpenInApp from 'vue-material-design-icons/OpenInApp.vue'
import IconPlus from 'vue-material-design-icons/Plus.vue'
@@ -97,10 +108,12 @@ const emit = defineEmits<{
'toggle-trackme': [enabled: boolean]
'register-geo-link': []
'toggle-slider': [enabled: boolean]
+ 'change-time-filter-mode': [mode: string]
}>()
const optionValues = reactive(optionsController.optionValues)
const settingsOpen = ref(false)
+const timeFilterMode = computed(() => optionValues.timeFilterMode === 'calendar' ? 'calendar' : 'slider')
/**
* @param checked whether the position should be tracked
@@ -119,6 +132,15 @@ function onDisplaySliderChange(checked: boolean): void {
optionsController.saveOptionValues({ displaySlider: optionValues.displaySlider })
emit('toggle-slider', checked)
}
+
+/**
+ * @param mode 'slider' or 'calendar'
+ */
+function onTimeFilterModeChange(mode: string): void {
+ optionValues.timeFilterMode = mode
+ optionsController.saveOptionValues({ timeFilterMode: mode })
+ emit('change-time-filter-mode', mode)
+}
diff --git a/src/views/App.vue b/src/views/App.vue
index ce0661f02..2a45104d5 100644
--- a/src/views/App.vue
+++ b/src/views/App.vue
@@ -13,6 +13,7 @@
:show-settings="!token"
@toggle-trackme="onToggleTrackme"
@toggle-slider="onToggleSlider"
+ @change-time-filter-mode="timeFilterMode = $event"
@register-geo-link="onRegisterGeoLink">
0) {
+ maxTimestamps.push(this.maxPhotoTimestamp)
+ }
+ if (this.favoritesDates.length > 0) {
+ maxTimestamps.push(this.maxFavoriteTimestamp)
+ }
+ if (this.trackDates.length > 0) {
+ maxTimestamps.push(this.maxTrackTimestamp)
+ }
+ if (this.maxDevicesTimestamp !== null) {
+ maxTimestamps.push(this.maxDevicesTimestamp)
+ }
+ return maxTimestamps.length > 0
+ ? Math.max(...maxTimestamps)
+ : moment().unix()
},
photoDates() {
return this.photos.filter(p => { return p.dateTaken !== null }).map(p => p.dateTaken)
@@ -446,6 +471,17 @@ export default {
return min
}, moment().unix() + 100)
},
+ maxDevicesTimestamp() {
+ return this.devices.reduce((max, device) => {
+ if (device.enabled && device.historyEnabled && device.points?.length > 0) {
+ const lastTimestamp = device.points[device.points.length - 1].timestamp
+ if (lastTimestamp) {
+ max = max === null ? lastTimestamp : Math.max(max, lastTimestamp)
+ }
+ }
+ return max
+ }, null)
+ },
// displayed data
displayedTracks() {
return this.sliderEnabled