Commit a258d2a4 authored by Matěj Lang's avatar Matěj Lang
Browse files

Rename DatasetService file, some prettier updates.

parent 81f6e506
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -22,7 +22,7 @@ For the easiest access to Antarstick without hassle, just open [antarstick.herok
### Run Antarstick using local server, with full dataset
### Run Antarstick using local server, with full dataset
- Download the full dataset [here](http://decibel.fi.muni.cz/antarstick/). (One full year at one location has over 5 GB, so make sure you have enough space.)
- Download the full dataset [here](http://decibel.fi.muni.cz/antarstick/). (One full year at one location has over 5 GB, so make sure you have enough space.)
- Extract the `antarstick-data` folder NEXT TO `antarstic-js` repository.
- Extract the `antarstick-data` folder NEXT TO `antarstic-js` repository.
- Go to `antarstick-js/src/services/DatasetService.js` and set the URL variable to `http://localhost:3000/`.
- Go to `antarstick-js/src/services/dataset-service.js` and set the URL variable to `http://localhost:3000/`.
- Have Python installed or install it [here](https://www.python.org/)
- Have Python installed or install it [here](https://www.python.org/)
- Using `pip`, the Python packaging manager, install `flask` and `flask_cors`.
- Using `pip`, the Python packaging manager, install `flask` and `flask_cors`.
- Run `npm run database_monolith_lake_2011` or `npm run database_keller_stream_2011`, depending on a location you want to inspect.
- Run `npm run database_monolith_lake_2011` or `npm run database_keller_stream_2011`, depending on a location you want to inspect.
+15 −16
Original line number Original line Diff line number Diff line
@@ -19,7 +19,7 @@ import VueTimepicker from 'vue2-timepicker'
import 'vue2-timepicker/dist/VueTimepicker.css'
import 'vue2-timepicker/dist/VueTimepicker.css'
import VueDatepicker from 'vue2-datepicker'
import VueDatepicker from 'vue2-datepicker'
import 'vue2-datepicker/index.css'
import 'vue2-datepicker/index.css'
import DatasetService from '@/services/DatasetService'
import DatasetService from '@/services/dataset-service'
import CheckIcon from 'icons/Check'
import CheckIcon from 'icons/Check'


export default {
export default {
@@ -27,17 +27,17 @@ export default {
  components: {
  components: {
    VueTimepicker,
    VueTimepicker,
    VueDatepicker,
    VueDatepicker,
    CheckIcon
    CheckIcon,
  },
  },
  props: {
  props: {
    cameraID: {
    cameraID: {
      type: String,
      type: String,
      required: true
      required: true,
    },
    },
    imageName: {
    imageName: {
      type: String,
      type: String,
      required: true
      required: true,
    }
    },
  },
  },
  data() {
  data() {
    return {
    return {
@@ -45,15 +45,15 @@ export default {
      time: {
      time: {
        HH: '00',
        HH: '00',
        mm: '00',
        mm: '00',
        ss: '00'
        ss: '00',
      },
      },
      date: '2000-01-01'
      date: '2000-01-01',
    }
    }
  },
  },
  computed: {
  computed: {
    imageDateTime() {
    imageDateTime() {
      return this.$store.getters.imageDateTime(this.cameraID, this.imageName)
      return this.$store.getters.imageDateTime(this.cameraID, this.imageName)
    }
    },
  },
  },
  methods: {
  methods: {
    toString(value) {
    toString(value) {
@@ -116,7 +116,7 @@ export default {
        this.$store.dispatch('setImageDateTime', {
        this.$store.dispatch('setImageDateTime', {
          cameraID: camID,
          cameraID: camID,
          imageName,
          imageName,
          dateTimeString: newImageDateTimeString
          dateTimeString: newImageDateTimeString,
        })
        })
      }
      }
    },
    },
@@ -161,7 +161,7 @@ export default {
                  cameraID,
                  cameraID,
                  imageName,
                  imageName,
                  recipCameraID,
                  recipCameraID,
                  closestRecipImageName
                  closestRecipImageName,
                })
                })
            }
            }
          }
          }
@@ -204,14 +204,13 @@ export default {
      const imageOrder = {}
      const imageOrder = {}
      const imageLookup = {}
      const imageLookup = {}
      for (const cameraID of this.$store.getters.cameraIDs) {
      for (const cameraID of this.$store.getters.cameraIDs) {
        const chronology = this.$store.getters.getCameraImagesChronology(
        const chronology =
          cameraID
          this.$store.getters.getCameraImagesChronology(cameraID)
        )
        imageOrder[cameraID] = chronology.order
        imageOrder[cameraID] = chronology.order
        imageLookup[cameraID] = chronology.lookup
        imageLookup[cameraID] = chronology.lookup
      }
      }
      return [imageOrder, imageLookup]
      return [imageOrder, imageLookup]
    }
    },
  },
  },
  watch: {
  watch: {
    cameraID() {
    cameraID() {
@@ -219,11 +218,11 @@ export default {
    },
    },
    imageName() {
    imageName() {
      this.onReadActiveImage()
      this.onReadActiveImage()
    }
    },
  },
  },
  mounted() {
  mounted() {
    this.onReadActiveImage()
    this.onReadActiveImage()
  }
  },
}
}
</script>
</script>


+4 −4
Original line number Original line Diff line number Diff line
@@ -8,8 +8,8 @@ const apiClient = axios.create({
  baseURL: BASE_URL,
  baseURL: BASE_URL,
  headers: {
  headers: {
    Accept: 'application/json',
    Accept: 'application/json',
    'Content-Type': 'application/json'
    'Content-Type': 'application/json',
  }
  },
})
})


let useMultipost = false
let useMultipost = false
@@ -55,7 +55,7 @@ export default {
  setTimeSpan(minDateTime, maxDateTime) {
  setTimeSpan(minDateTime, maxDateTime) {
    return Promise.all([
    return Promise.all([
      this.xpost('/db/metadata/start', minDateTime),
      this.xpost('/db/metadata/start', minDateTime),
      this.xpost('/db/metadata/end', maxDateTime)
      this.xpost('/db/metadata/end', maxDateTime),
    ])
    ])
  },
  },
  setReciprocalImage(
  setReciprocalImage(
@@ -197,5 +197,5 @@ export default {
  },
  },
  loadImage(cameraID, imageName) {
  loadImage(cameraID, imageName) {
    return this.xget(this.getImagePath(cameraID, imageName))
    return this.xget(this.getImagePath(cameraID, imageName))
  }
  },
}
}
+33 −34
Original line number Original line Diff line number Diff line
import DatasetService from '@/services/DatasetService'
import DatasetService from '@/services/dataset-service'
import SunCalc from 'suncalc'
import SunCalc from 'suncalc'
import gradientBackground from './gradient-background'
import gradientBackground from './gradient-background'


@@ -7,7 +7,7 @@ const _sendPostRequest = (state, commit, webCmd, isCommit = false) => {
    return
    return
  }
  }
  commit('SET_SERVER_PENDING_CHANGES', !isCommit)
  commit('SET_SERVER_PENDING_CHANGES', !isCommit)
  return webCmd().catch(err => {
  return webCmd().catch((err) => {
    console.log('POST failed: ' + err)
    console.log('POST failed: ' + err)
  })
  })
}
}
@@ -61,7 +61,7 @@ export default {
          sunset: times.sunset,
          sunset: times.sunset,
          civilDusk: times.dusk,
          civilDusk: times.dusk,
          nauticalDusk: times.nauticalDusk,
          nauticalDusk: times.nauticalDusk,
          astronomicalDusk: times.night
          astronomicalDusk: times.night,
        })
        })
        currentDate = addDay(currentDate)
        currentDate = addDay(currentDate)
      }
      }
@@ -70,7 +70,7 @@ export default {
    }
    }


    return DatasetService.getMetadata()
    return DatasetService.getMetadata()
      .then(response => {
      .then((response) => {
        const data = response.data
        const data = response.data
        const sticks = data.sticks
        const sticks = data.sticks
        // Add GUI status for each stick: 'minimized', 'compact', 'full'
        // Add GUI status for each stick: 'minimized', 'compact', 'full'
@@ -81,7 +81,7 @@ export default {
        commit('ADD_STICKS', sticks)
        commit('ADD_STICKS', sticks)
        dispatch('setFilter', {
        dispatch('setFilter', {
          filterKind: 'maxSnowHeight',
          filterKind: 'maxSnowHeight',
          value: getters.maxStickLengthCm
          value: getters.maxStickLengthCm,
        })
        })


        // Add GUI status for each camera: 'minimized', 'full'
        // Add GUI status for each camera: 'minimized', 'full'
@@ -91,7 +91,7 @@ export default {
        commit('ADD_CAMERAS', data.cameras)
        commit('ADD_CAMERAS', data.cameras)
        commit('SET_TIMESPAN', {
        commit('SET_TIMESPAN', {
          start: new Date(data.start),
          start: new Date(data.start),
          end: new Date(data.end)
          end: new Date(data.end),
        })
        })
        commit('SET_MAX_SNOW_HEIGHT', data.maxSnowHeight)
        commit('SET_MAX_SNOW_HEIGHT', data.maxSnowHeight)
        commit('SET_LOCATION', data.location)
        commit('SET_LOCATION', data.location)
@@ -106,13 +106,13 @@ export default {
        )
        )
        commit('SET_SUN_IMAGE', Object.freeze(sunImage))
        commit('SET_SUN_IMAGE', Object.freeze(sunImage))
      })
      })
      .catch(err => {
      .catch((err) => {
        console.error('There was a problem loading metadata.')
        console.error('There was a problem loading metadata.')
        throw err
        throw err
      })
      })
  },
  },
  loadDataByCamera({ commit, dispatch }, cameraID) {
  loadDataByCamera({ commit, dispatch }, cameraID) {
    return DatasetService.getDataByCamera(cameraID).then(response => {
    return DatasetService.getDataByCamera(cameraID).then((response) => {
      const data = response.data
      const data = response.data
      if ('id' in data) {
      if ('id' in data) {
        delete data.id
        delete data.id
@@ -139,7 +139,7 @@ export default {
    }
    }
    const chronology = {
    const chronology = {
      order: orderedImageNames,
      order: orderedImageNames,
      lookup: lookup
      lookup: lookup,
    }
    }
    commit('SET_IMAGE_CHRONOLOGY', { cameraID, chronology })
    commit('SET_IMAGE_CHRONOLOGY', { cameraID, chronology })
  },
  },
@@ -157,7 +157,7 @@ export default {
        cameraID,
        cameraID,
        imageName,
        imageName,
        stickID,
        stickID,
        average: -1
        average: -1,
      })
      })
      return
      return
    }
    }
@@ -192,7 +192,7 @@ export default {
      cameraID,
      cameraID,
      imageName,
      imageName,
      stickID,
      stickID,
      average
      average,
    })
    })
  },
  },


@@ -203,7 +203,7 @@ export default {
    commit('SET_IMAGE_DATE_TIME', {
    commit('SET_IMAGE_DATE_TIME', {
      cameraID,
      cameraID,
      imageName,
      imageName,
      dateTimeString
      dateTimeString,
    })
    })
  },
  },
  setTimeSpan({ state, commit }, { minDateTime, maxDateTime }) {
  setTimeSpan({ state, commit }, { minDateTime, maxDateTime }) {
@@ -211,7 +211,7 @@ export default {
    _sendPostRequest(state, commit, webCmd)
    _sendPostRequest(state, commit, webCmd)
    commit('SET_TIMESPAN', {
    commit('SET_TIMESPAN', {
      start: new Date(minDateTime),
      start: new Date(minDateTime),
      end: new Date(maxDateTime)
      end: new Date(maxDateTime),
    })
    })
  },
  },
  setReciprocalImage(
  setReciprocalImage(
@@ -230,7 +230,7 @@ export default {
      cameraID,
      cameraID,
      imageName,
      imageName,
      recipCameraID,
      recipCameraID,
      closestRecipImageName
      closestRecipImageName,
    })
    })
  },
  },
  setStickSnowHeight(
  setStickSnowHeight(
@@ -251,7 +251,7 @@ export default {
      cameraID,
      cameraID,
      imageName,
      imageName,
      stickID,
      stickID,
      snowHeight
      snowHeight,
    })
    })
    const closeImageNames = getters.closeImageNames(
    const closeImageNames = getters.closeImageNames(
      cameraID,
      cameraID,
@@ -275,7 +275,7 @@ export default {
      cameraID,
      cameraID,
      imageName,
      imageName,
      stickID,
      stickID,
      point
      point,
    })
    })
  },
  },
  setStickBottom(
  setStickBottom(
@@ -291,7 +291,7 @@ export default {
      cameraID,
      cameraID,
      imageName,
      imageName,
      stickID,
      stickID,
      point
      point,
    })
    })
  },
  },
  setFlagImageApprovedByUser(
  setFlagImageApprovedByUser(
@@ -304,7 +304,7 @@ export default {
    commit('SET_FLAG_IMAGE_APPROVED_BY_USER', {
    commit('SET_FLAG_IMAGE_APPROVED_BY_USER', {
      cameraID,
      cameraID,
      imageName,
      imageName,
      flagState
      flagState,
    })
    })
  },
  },
  setFlagImageDiscardedByUser(
  setFlagImageDiscardedByUser(
@@ -318,7 +318,7 @@ export default {
      cameraID,
      cameraID,
      imageName,
      imageName,
      flagState,
      flagState,
      webCmd
      webCmd,
    })
    })
    const closeImageNames = getters.closeImageNames(
    const closeImageNames = getters.closeImageNames(
      cameraID,
      cameraID,
@@ -343,7 +343,7 @@ export default {
    commit('SET_FLAG_IMAGE_USED_FOR_TRAINING', {
    commit('SET_FLAG_IMAGE_USED_FOR_TRAINING', {
      cameraID,
      cameraID,
      imageName,
      imageName,
      flagState
      flagState,
    })
    })
  },
  },
  setFlagStickCorrectedByUser(
  setFlagStickCorrectedByUser(
@@ -362,7 +362,7 @@ export default {
      cameraID,
      cameraID,
      imageName,
      imageName,
      stickID,
      stickID,
      flagState
      flagState,
    })
    })
  },
  },
  setFlagStickVisible(
  setFlagStickVisible(
@@ -381,7 +381,7 @@ export default {
      cameraID,
      cameraID,
      imageName,
      imageName,
      stickID,
      stickID,
      flagState
      flagState,
    })
    })


    const closeImageNames = getters.closeImageNames(
    const closeImageNames = getters.closeImageNames(
@@ -411,20 +411,19 @@ export default {
      imageNames[cameraID] = imageName
      imageNames[cameraID] = imageName
      for (const cam in getters.chartData(cameraID)[imageName]
      for (const cam in getters.chartData(cameraID)[imageName]
        .reciprocalImageName) {
        .reciprocalImageName) {
        imageNames[cam] = getters.chartData(cameraID)[
        imageNames[cam] =
          imageName
          getters.chartData(cameraID)[imageName].reciprocalImageName[cam]
        ].reciprocalImageName[cam]
      }
      }
      commit('SET_ACTIVE_POINT', {
      commit('SET_ACTIVE_POINT', {
        stickID,
        stickID,
        cameraID,
        cameraID,
        imageNames
        imageNames,
      })
      })
    } else {
    } else {
      throw {
      throw {
        name: 'TypeError',
        name: 'TypeError',
        message:
        message:
          'stickID: StickID is not a valid stick. || cameraID: CameraID is not a valid camera.'
          'stickID: StickID is not a valid stick. || cameraID: CameraID is not a valid camera.',
      }
      }
    }
    }
  },
  },
@@ -434,7 +433,7 @@ export default {
    } else {
    } else {
      throw {
      throw {
        name: 'TypeError',
        name: 'TypeError',
        message: 'setShowDaysGradient: showDaysGradient must be a boolean.'
        message: 'setShowDaysGradient: showDaysGradient must be a boolean.',
      }
      }
    }
    }
  },
  },
@@ -444,7 +443,7 @@ export default {
    } else {
    } else {
      throw {
      throw {
        name: 'TypeError',
        name: 'TypeError',
        message: 'setShowImageDialog: showImageDialog must be a boolean.'
        message: 'setShowImageDialog: showImageDialog must be a boolean.',
      }
      }
    }
    }
  },
  },
@@ -454,7 +453,7 @@ export default {
    } else {
    } else {
      throw {
      throw {
        name: 'TypeError',
        name: 'TypeError',
        message: 'setShowFilters: showFilters must be a boolean.'
        message: 'setShowFilters: showFilters must be a boolean.',
      }
      }
    }
    }
  },
  },
@@ -464,7 +463,7 @@ export default {
    } else {
    } else {
      throw {
      throw {
        name: 'TypeError',
        name: 'TypeError',
        message: 'setShowLegend: showLegend must be a boolean.'
        message: 'setShowLegend: showLegend must be a boolean.',
      }
      }
    }
    }
  },
  },
@@ -474,7 +473,7 @@ export default {
    } else {
    } else {
      throw {
      throw {
        name: 'TypeError',
        name: 'TypeError',
        message: 'setShowHelpDialog: showHelpDialog must be a boolean.'
        message: 'setShowHelpDialog: showHelpDialog must be a boolean.',
      }
      }
    }
    }
  },
  },
@@ -492,10 +491,10 @@ export default {
  },
  },
  checkForPendingChanges({ commit }) {
  checkForPendingChanges({ commit }) {
    DatasetService.multipostEnd().then(() => {
    DatasetService.multipostEnd().then(() => {
      DatasetService.checkForPendingChanges().then(response => {
      DatasetService.checkForPendingChanges().then((response) => {
        const value = response.data
        const value = response.data
        commit('SET_PENDING_CHANGES', { value })
        commit('SET_PENDING_CHANGES', { value })
      })
      })
    })
    })
  }
  },
}
}
+50 −50
Original line number Original line Diff line number Diff line
import DatasetService from '@/services/DatasetService'
import DatasetService from '@/services/dataset-service'


export default {
export default {
  stickIDs: state => {
  stickIDs: (state) => {
    return Object.keys(state.sticks)
    return Object.keys(state.sticks)
  },
  },
  cameraIDs: state => {
  cameraIDs: (state) => {
    return Object.keys(state.cameras)
    return Object.keys(state.cameras)
  },
  },
  activeStick: state => {
  activeStick: (state) => {
    return state.activePoint.stickID
    return state.activePoint.stickID
  },
  },
  activeCamera: state => {
  activeCamera: (state) => {
    return state.activePoint.cameraID
    return state.activePoint.cameraID
  },
  },
  activeImageName: state => cameraID => {
  activeImageName: (state) => (cameraID) => {
    if (state.activePoint.imageNames) {
    if (state.activePoint.imageNames) {
      return state.activePoint.imageNames[cameraID]
      return state.activePoint.imageNames[cameraID]
    }
    }
    return null
    return null
  },
  },
  // Return set of cameras that can see the given stick
  // Return set of cameras that can see the given stick
  cameraByStick: state => stickID => {
  cameraByStick: (state) => (stickID) => {
    if (state.sticks[stickID] === undefined) {
    if (state.sticks[stickID] === undefined) {
      return []
      return []
    }
    }
    return Object.keys(state.sticks[stickID].labels)
    return Object.keys(state.sticks[stickID].labels)
  },
  },
  primaryCamera: state => stickID => {
  primaryCamera: (state) => (stickID) => {
    return state.sticks[stickID].primaryCamera
    return state.sticks[stickID].primaryCamera
  },
  },
  stickViewLabel: state => (stickID, cameraID) => {
  stickViewLabel: (state) => (stickID, cameraID) => {
    if (!stickID || !cameraID) {
    if (!stickID || !cameraID) {
      return null
      return null
    }
    }
    return state.sticks[stickID].labels[cameraID]
    return state.sticks[stickID].labels[cameraID]
  },
  },
  stickLengthCm: state => stickID => {
  stickLengthCm: (state) => (stickID) => {
    return state.sticks[stickID].lengthCm
    return state.sticks[stickID].lengthCm
  },
  },
  maxStickLengthCm: (state, getters) => {
  maxStickLengthCm: (state, getters) => {
@@ -51,55 +51,55 @@ export default {
    }
    }
    return result
    return result
  },
  },
  stickStatusGUI: state => stickID => {
  stickStatusGUI: (state) => (stickID) => {
    return state.sticks[stickID].statusGUI
    return state.sticks[stickID].statusGUI
  },
  },
  cameraStatusGUI: state => cameraID => {
  cameraStatusGUI: (state) => (cameraID) => {
    return state.cameras[cameraID].statusGUI
    return state.cameras[cameraID].statusGUI
  },
  },
  showDaysGradient: state => {
  showDaysGradient: (state) => {
    return state.controls.showDaysGradient
    return state.controls.showDaysGradient
  },
  },
  showImageDialog: state => {
  showImageDialog: (state) => {
    return state.controls.showImageDialog
    return state.controls.showImageDialog
  },
  },
  showFilters: state => {
  showFilters: (state) => {
    return state.controls.showFilters
    return state.controls.showFilters
  },
  },
  showLegend: state => {
  showLegend: (state) => {
    return state.controls.showLegend
    return state.controls.showLegend
  },
  },
  showHelpDialog: state => {
  showHelpDialog: (state) => {
    return state.controls.showHelpDialog
    return state.controls.showHelpDialog
  },
  },
  timespanStart: state => {
  timespanStart: (state) => {
    return state.timespan.start
    return state.timespan.start
  },
  },
  timespanEnd: state => {
  timespanEnd: (state) => {
    return state.timespan.end
    return state.timespan.end
  },
  },
  maxSnowHeight: state => {
  maxSnowHeight: (state) => {
    return state.maxSnowHeight
    return state.maxSnowHeight
  },
  },
  zoomState: state => {
  zoomState: (state) => {
    return state.zoomState
    return state.zoomState
  },
  },
  chartData: state => cameraID => {
  chartData: (state) => (cameraID) => {
    return state.data[cameraID]
    return state.data[cameraID]
  },
  },
  sunImage: state => {
  sunImage: (state) => {
    return state.sunImage
    return state.sunImage
  },
  },
  sticksByImageName: state => (cameraID, imageName) => {
  sticksByImageName: (state) => (cameraID, imageName) => {
    return state.data[cameraID][imageName].sticks
    return state.data[cameraID][imageName].sticks
  },
  },
  imageURL: () => (cameraID, imageName) => {
  imageURL: () => (cameraID, imageName) => {
    return DatasetService.getImageURL(cameraID, imageName)
    return DatasetService.getImageURL(cameraID, imageName)
  },
  },
  imageDateTime: state => (cameraID, imageName) => {
  imageDateTime: (state) => (cameraID, imageName) => {
    return state.data[cameraID][imageName].dateTime
    return state.data[cameraID][imageName].dateTime
  },
  },
  sticksNotVisible: state => (cameraID, imageName) => {
  sticksNotVisible: (state) => (cameraID, imageName) => {
    const info = state.data[cameraID][imageName]
    const info = state.data[cameraID][imageName]
    var result = []
    var result = []
    for (const key in info.sticks) {
    for (const key in info.sticks) {
@@ -109,7 +109,7 @@ export default {
    }
    }
    return result
    return result
  },
  },
  sticksVisible: state => (cameraID, imageName) => {
  sticksVisible: (state) => (cameraID, imageName) => {
    const info = state.data[cameraID][imageName]
    const info = state.data[cameraID][imageName]
    var result = []
    var result = []
    for (const key in info.sticks) {
    for (const key in info.sticks) {
@@ -119,34 +119,34 @@ export default {
    }
    }
    return result
    return result
  },
  },
  imageConditions: state => (cameraID, imageName) => {
  imageConditions: (state) => (cameraID, imageName) => {
    const info = state.data[cameraID][imageName]
    const info = state.data[cameraID][imageName]
    return {
    return {
      processedState: info.processedState,
      processedState: info.processedState,
      weatherConditions: info.weatherConditions,
      weatherConditions: info.weatherConditions,
      isDay: info.isDay
      isDay: info.isDay,
    }
    }
  },
  },
  snowHeight: state => (cameraID, stickID, imageName) => {
  snowHeight: (state) => (cameraID, stickID, imageName) => {
    return state.data[cameraID][imageName].sticks[stickID].snowHeight
    return state.data[cameraID][imageName].sticks[stickID].snowHeight
  },
  },
  stickVisible: state => (cameraID, stickID, imageName) => {
  stickVisible: (state) => (cameraID, stickID, imageName) => {
    return state.data[cameraID][imageName].sticks[stickID].visible
    return state.data[cameraID][imageName].sticks[stickID].visible
  },
  },
  flagImageApprovedByUser: state => (cameraID, imageName) => {
  flagImageApprovedByUser: (state) => (cameraID, imageName) => {
    return state.data[cameraID][imageName].approvedByUser
    return state.data[cameraID][imageName].approvedByUser
  },
  },
  flagImageDiscardedByUser: state => (cameraID, imageName) => {
  flagImageDiscardedByUser: (state) => (cameraID, imageName) => {
    return state.data[cameraID][imageName].discardedByUser
    return state.data[cameraID][imageName].discardedByUser
  },
  },
  flagImageUsedForTraining: state => (cameraID, imageName) => {
  flagImageUsedForTraining: (state) => (cameraID, imageName) => {
    return state.data[cameraID][imageName].usedForTraining
    return state.data[cameraID][imageName].usedForTraining
  },
  },
  flagStickCorrectedByUser: state => (cameraID, imageName, stickID) => {
  flagStickCorrectedByUser: (state) => (cameraID, imageName, stickID) => {
    return state.data[cameraID][imageName].sticks[stickID].correctedByUser
    return state.data[cameraID][imageName].sticks[stickID].correctedByUser
  },
  },


  previousImageName: state => (cameraID, imageName) => {
  previousImageName: (state) => (cameraID, imageName) => {
    // Get closest previous image from the input image.
    // Get closest previous image from the input image.
    // Useful when implementing keyboard navigation between images.
    // Useful when implementing keyboard navigation between images.
    var prevImage = null
    var prevImage = null
@@ -163,7 +163,7 @@ export default {
    }
    }
    return prevImage
    return prevImage
  },
  },
  nextImageName: state => (cameraID, imageName) => {
  nextImageName: (state) => (cameraID, imageName) => {
    // Get closest next image from the input image.
    // Get closest next image from the input image.
    // Useful when implementing keyboard navigation between images.
    // Useful when implementing keyboard navigation between images.
    var nextImage = null
    var nextImage = null
@@ -180,7 +180,7 @@ export default {
    }
    }
    return nextImage
    return nextImage
  },
  },
  closeImageNames: state => (cameraID, imageName, timeWindow) => {
  closeImageNames: (state) => (cameraID, imageName, timeWindow) => {
    // Get close imageNames from the input imageName, including the input imageName.
    // Get close imageNames from the input imageName, including the input imageName.
    // The whole searched area is 2 * timeWindow, with the input imageName in the middle.
    // The whole searched area is 2 * timeWindow, with the input imageName in the middle.


@@ -221,13 +221,13 @@ export default {
    return result
    return result
  },
  },


  hasUncommitedChanges: state => {
  hasUncommitedChanges: (state) => {
    return state.server.hasPendingChanges
    return state.server.hasPendingChanges
  },
  },
  filters: state => {
  filters: (state) => {
    return state.filters
    return state.filters
  },
  },
  isFilteredOut: state => (imageProps, stickID) => {
  isFilteredOut: (state) => (imageProps, stickID) => {
    const filters = state.filters
    const filters = state.filters
    if (
    if (
      filters.imageProcessed != 2 &&
      filters.imageProcessed != 2 &&
@@ -292,20 +292,20 @@ export default {


    return false
    return false
  },
  },
  getCameraImagesChronology: state => cameraID => {
  getCameraImagesChronology: (state) => (cameraID) => {
    return state.chronology[cameraID]
    return state.chronology[cameraID]
  },
  },
  getSnowHeightAverageTimeWindow: state => {
  getSnowHeightAverageTimeWindow: (state) => {
    // In hours
    // In hours
    return state.snowHeightAverageTimeWindow
    return state.snowHeightAverageTimeWindow
  },
  },
  getSnowHightAverage: state => (cameraID, imageName, stickID) => {
  getSnowHightAverage: (state) => (cameraID, imageName, stickID) => {
    // In hours
    // In hours
    return state.data[cameraID][imageName].sticks[stickID].snowHeightAverage
    return state.data[cameraID][imageName].sticks[stickID].snowHeightAverage
  },
  },


  // --- Stick statistics ---
  // --- Stick statistics ---
  statsManuallyEdited: state => (cameraID, stickID) => {
  statsManuallyEdited: (state) => (cameraID, stickID) => {
    let result = 0
    let result = 0
    if (!state.chronology[cameraID]) {
    if (!state.chronology[cameraID]) {
      return result
      return result
@@ -319,7 +319,7 @@ export default {
    }
    }
    return result
    return result
  },
  },
  statsDiscarded: state => (cameraID, stickID) => {
  statsDiscarded: (state) => (cameraID, stickID) => {
    let result = 0
    let result = 0
    if (!state.chronology[cameraID]) {
    if (!state.chronology[cameraID]) {
      return result
      return result
@@ -333,7 +333,7 @@ export default {
    }
    }
    return result
    return result
  },
  },
  statsNotFound: state => (cameraID, stickID) => {
  statsNotFound: (state) => (cameraID, stickID) => {
    let result = 0
    let result = 0
    if (!state.chronology[cameraID]) {
    if (!state.chronology[cameraID]) {
      return result
      return result
@@ -352,7 +352,7 @@ export default {
    }
    }
    return result
    return result
  },
  },
  statsNoSnow: state => cameraID => {
  statsNoSnow: (state) => (cameraID) => {
    let result = 0
    let result = 0
    if (!state.chronology[cameraID]) {
    if (!state.chronology[cameraID]) {
      return result
      return result
@@ -365,11 +365,11 @@ export default {
    }
    }
    return result
    return result
  },
  },
  statsAllPoints: state => cameraID => {
  statsAllPoints: (state) => (cameraID) => {
    if (!state.chronology[cameraID]) {
    if (!state.chronology[cameraID]) {
      return 0
      return 0
    }
    }
    return state.chronology[cameraID].order.length
    return state.chronology[cameraID].order.length
  }
  },
  // ---
  // ---
}
}