{"version":3,"sources":["webpack:///./node_modules/core-js/modules/es6.array.from.js","webpack:///./wwwroot/src/js/store/modules/field-record-system/zone-maps/index.js"],"names":["ctx","__webpack_require__","$export","toObject","call","isArrayIter","toLength","createProperty","getIterFn","S","F","iter","Array","from","arrayLike","length","result","step","iterator","O","C","this","aLen","arguments","mapfn","undefined","mapping","index","iterFn","next","done","value","defaultSettings","selectedImageIds","algorithm","minimumCorrelation","classLimit","outerClassLimit","zoneCount","shownImageId","orderId","buffer","useRedBorder","defineInitialDateRanges","currentYear","moment","year","years","map","x","i","concat","to","mergeDateRanges","dateRanges1","dateRanges2","newDateRanges","filter","a","some","b","Object","C_src_Solutions_WebApp_node_modules_babel_runtime_corejs2_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_13__","savedSettings","__webpack_exports__","namespaced","state","borderGeometry","cultivations","satelliteImages","ignoredImageCount","scheduledDateRanges","loadingDateRanges","loadedDateRanges","settings","ui","shownChannel","mapCountForOrder","getters","yearsWithCultivations","reduce","cultivation","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","harvestYears","Symbol","includes","push","err","return","nextDateRanges","rootState","rootGetters","fromDates","sort","localeCompare","toDates","minDate","maxDate","gaps","date","clone","start","isSameOrBefore","encompassingRange","find","isSame","isBetween","format","subtract","add","nextYearPast","nextYearFuture","mutations","_objectSpread","makeSetters","toggleImage","imageId","clear","addSatelliteImages","_ref","_state$satelliteImage","_state$loadedDateRang","dateRanges","images","seenIds","lookup","image","id","deduplicatedImages","array","recordingDate","substring","dataSource","apply","y","saveState","fieldId","cloneDeep","restoreState","assign","scheduleDateRanges","startLoadingDateRanges","actions","loadCultivationsForField","_ref2","commit","url","smarterGet","inputs","harvestYear","fieldRecordSystem","userSettings","expiry","sharedCache","onResult","cult","type","loadNextScheduledSatelliteImages","_ref3","dispatch","dateRange","smarterPost","response","loadSatelliteImages","_ref4","loadBorderGeometry","_ref5","geometry","loadPrerequisiteData","_loadPrerequisiteData","C_src_Solutions_WebApp_node_modules_babel_runtime_corejs2_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__","regeneratorRuntime","mark","_callee","_ref6","wrap","_context","prev","Promise","all","stop","_x","createZoneMap","_createZoneMap","_callee2","_ref7","quit","_state$settings","dto","_context2","C_src_Solutions_WebApp_node_modules_babel_runtime_corejs2_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__","selectedImages","_state$satelliteImage2","_x2","_x3","getMapCountForOrder","_ref8","count","resetMapCount","_ref9","save","_ref10"],"mappings":"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","file":"js/chunk-5720e901.0eb264d6.js","sourcesContent":["'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","// import Vue from 'vue'\r\n// import axios from 'axios'\r\nimport moment from 'moment'\r\nimport {cloneDeep} from 'lodash'\r\n\r\nimport {makeSetters} from '@helpers/vuex/mutations'\r\nimport {smarterGet, smarterPost} from '@helpers/vuex/data-loading'\r\n\r\nconst defaultSettings = () => ({\r\n selectedImageIds: [],\r\n algorithm: 'Old', // 'Old', 'AbsoluteTreatment', 'RelativeTreatment', 'OldExtended'\r\n minimumCorrelation: 0.36,\r\n classLimit: 0.5,\r\n outerClassLimit: 0.85,\r\n zoneCount: 5,\r\n shownImageId: null,\r\n orderId: null,\r\n buffer: 10,\r\n useRedBorder: true\r\n})\r\n\r\nconst defineInitialDateRanges = () => {\r\n const currentYear = moment().year()\r\n const years = Array.from({length: currentYear - 2015 + 1}).map((x, i) => currentYear - i)\r\n\r\n return years.map(year => ({\r\n from: `${year}-05-01`,\r\n to: `${year}-10-20`\r\n }))\r\n}\r\n\r\nconst mergeDateRanges = (dateRanges1, dateRanges2) => {\r\n const newDateRanges = dateRanges2.filter(a => !dateRanges1.some(b => a.from === b.from && a.to === b.to))\r\n\r\n return [...dateRanges1, ...newDateRanges]\r\n}\r\n\r\nconst savedSettings = {} // {[fieldId]: {satelliteImages, loadedDateRanges, ignoredImageCount, settings}}\r\n\r\nexport default {\r\n namespaced: true,\r\n state: {\r\n borderGeometry: null,\r\n cultivations: [],\r\n satelliteImages: [],\r\n ignoredImageCount: null,\r\n scheduledDateRanges: [],\r\n loadingDateRanges: [],\r\n loadedDateRanges: [],\r\n settings: defaultSettings(),\r\n ui: {\r\n shownChannel: 'ndvi',\r\n filter: null\r\n },\r\n mapCountForOrder: null\r\n },\r\n getters: {\r\n yearsWithCultivations (state) {\r\n return state.cultivations.reduce((years, cultivation) => {\r\n for (const year of cultivation.harvestYears) {\r\n if (!years.includes(year)) {\r\n years.push(year)\r\n }\r\n }\r\n return years\r\n }, [])\r\n },\r\n nextDateRanges (state, getters, rootState, rootGetters) {\r\n if (!state.loadedDateRanges.length) {\r\n return state.scheduledDateRanges\r\n }\r\n\r\n const fromDates = state.loadedDateRanges.map(x => x.from).sort((a, b) => a.localeCompare(b))\r\n const toDates = state.loadedDateRanges.map(x => x.to).sort((a, b) => a.localeCompare(b))\r\n\r\n const minDate = moment(fromDates[0])\r\n const maxDate = moment(toDates[toDates.length - 1])\r\n\r\n // TODO make less brute force\r\n const gaps = []\r\n let date = minDate.clone()\r\n let start = null\r\n while (date.isSameOrBefore(maxDate)) {\r\n const encompassingRange = state.loadedDateRanges.find(x => date.isSame(x.from, 'day') || date.isSame(x.to, 'day') || date.isBetween(x.from, x.to, 'days'))\r\n if (encompassingRange) {\r\n if (start) {\r\n gaps.push({from: start.format('YYYY-MM-DD'), to: date.clone().subtract(1, 'days').format('YYYY-MM-DD')})\r\n start = null\r\n date = moment(encompassingRange.to).clone()\r\n }\r\n } else if (!start) {\r\n start = date.clone()\r\n }\r\n\r\n date.add(1, 'days')\r\n }\r\n\r\n const nextYearPast = minDate.year() - 1\r\n const nextYearFuture = maxDate.year() + 1\r\n\r\n return mergeDateRanges([\r\n {from: `${nextYearPast}-05-01`, to: `${nextYearPast}-10-20`},\r\n ...gaps,\r\n {from: `${nextYearFuture}-05-01`, to: `${nextYearFuture}-10-20`}\r\n ], state.scheduledDateRanges)\r\n }\r\n },\r\n mutations: {\r\n ...makeSetters([\r\n 'borderGeometry',\r\n 'cultivations',\r\n 'ui.shownChannel',\r\n 'ui.filter',\r\n 'settings.minimumCorrelation',\r\n 'settings.shownImageId',\r\n 'settings.zoneCount',\r\n 'settings.classLimit',\r\n 'settings.outerClassLimit',\r\n 'settings.algorithm',\r\n 'settings.orderId',\r\n 'settings.buffer',\r\n 'settings.useRedBorder',\r\n 'mapCountForOrder'\r\n ]),\r\n toggleImage (state, imageId) {\r\n if (state.settings.selectedImageIds.includes(imageId)) {\r\n state.settings.selectedImageIds = state.settings.selectedImageIds.filter(x => x !== imageId)\r\n } else {\r\n state.settings.selectedImageIds.push(imageId)\r\n }\r\n },\r\n clear (state) {\r\n state.borderGeometry = null\r\n state.cultivations = []\r\n state.satelliteImages = []\r\n state.ignoredImageCount = null\r\n state.scheduledDateRanges = []\r\n state.loadedDateRanges = []\r\n state.settings = defaultSettings()\r\n },\r\n addSatelliteImages (state, {dateRanges, images, ignoredImageCount}) {\r\n // for image deduplication\r\n const seenIds = state.satelliteImages.reduce((lookup, image) => {\r\n lookup[image.id] = true\r\n return lookup\r\n }, {})\r\n\r\n const deduplicatedImages = images ? images.reduce((array, image) => {\r\n // for testing: fix dto format\r\n image.recordingDate = image.recordingDate.substring(0, 10)\r\n // for testing: create surrogate id for UI\r\n image.id = `${image.recordingDate}-${image.dataSource}`\r\n\r\n if (seenIds[image.id]) return array\r\n\r\n seenIds[image.id] = true\r\n array.push(image)\r\n return array\r\n }, []) : []\r\n\r\n state.satelliteImages.push(...deduplicatedImages)\r\n // keep rest of state consistent\r\n state.scheduledDateRanges = state.scheduledDateRanges.filter(x => !dateRanges.some(y => x.to === y.to && x.from === y.from))\r\n state.loadingDateRanges = state.loadingDateRanges.filter(x => !dateRanges.some(y => x.to === y.to && x.from === y.from))\r\n\r\n state.settings.selectedImageIds = state.settings.selectedImageIds.filter(id => state.satelliteImages.find(x => x.id === id))\r\n if (!state.satelliteImages.find(x => x.id === state.settings.shownImageId)) {\r\n state.settings.shownImageId = null\r\n }\r\n\r\n state.loadedDateRanges.push(...dateRanges)\r\n state.ignoredImageCount += ignoredImageCount\r\n },\r\n saveState (state, fieldId) {\r\n const {satelliteImages, scheduledDateRanges, loadedDateRanges, ignoredImageCount, settings} = state\r\n savedSettings[fieldId] = cloneDeep({\r\n satelliteImages,\r\n scheduledDateRanges,\r\n loadedDateRanges,\r\n ignoredImageCount,\r\n settings\r\n })\r\n },\r\n restoreState (state, fieldId) {\r\n if (savedSettings[fieldId]) {\r\n Object.assign(state, savedSettings[fieldId])\r\n }\r\n },\r\n scheduleDateRanges (state, dateRanges) {\r\n state.scheduledDateRanges = mergeDateRanges(state.scheduledDateRanges, dateRanges)\r\n },\r\n startLoadingDateRanges (state, dateRanges) {\r\n state.loadingDateRanges = mergeDateRanges(state.loadingDateRanges, dateRanges)\r\n }\r\n },\r\n actions: {\r\n loadCultivationsForField ({commit, rootState, rootGetters}) {\r\n const url = '/api/v2/frs/{harvestYear}/fields/{fieldId}/cultivations/all'\r\n\r\n return smarterGet(url, {\r\n id: 'frs.zoneMaps.getAllCultivationDataForField',\r\n inputs: {\r\n harvestYear: () => rootState.fieldRecordSystem.userSettings.harvestYear,\r\n fieldId: () => rootGetters['fieldRecordSystem/fieldId']\r\n },\r\n expiry: 60,\r\n sharedCache: true,\r\n onResult (cultivations) {\r\n commit('setCultivations', cultivations.filter(cult => cult.type === 'main'))\r\n }\r\n })\r\n },\r\n loadNextScheduledSatelliteImages ({state, commit, dispatch, rootGetters, rootState}) {\r\n const url = '/api/v2/field-info/fields/{fieldId}/available-imagery/{harvestYear}'\r\n\r\n const dateRange = state.scheduledDateRanges[0]\r\n\r\n if (!dateRange /* || !rootState.fieldRecordSystem || !rootState.fieldRecordSystem.zoneMaps */) return\r\n\r\n commit('startLoadingDateRanges', [dateRange])\r\n\r\n return smarterPost(url, [dateRange], {\r\n id: 'frs.zoneMaps.getSatelliteImagery',\r\n inputs: {\r\n dateRange: () => `${dateRange.from}>${dateRange.to}`,\r\n fieldId: () => rootGetters['fieldRecordSystem/fieldId'],\r\n harvestYear: () => rootState.fieldRecordSystem.userSettings.harvestYear\r\n },\r\n expiry: 60,\r\n sharedCache: true,\r\n onResult (response) {\r\n commit('addSatelliteImages', {dateRanges: [dateRange], ...response})\r\n dispatch('loadNextScheduledSatelliteImages')\r\n }\r\n })\r\n },\r\n loadSatelliteImages ({state, commit, dispatch}, dateRanges) {\r\n commit('scheduleDateRanges', dateRanges)\r\n\r\n if (!state.loadingDateRanges.length) {\r\n dispatch('loadNextScheduledSatelliteImages')\r\n }\r\n },\r\n loadBorderGeometry ({commit, rootState, rootGetters}) {\r\n return smarterGet('/api/v2/entities/fields/{fieldId}/geodata/{harvestYear}', {\r\n id: 'zoneMaps.borderGeometry',\r\n expiry: 0, // NOTE does not work properly with high expiration because store location is unloaded on module exit\r\n inputs: {\r\n harvestYear: () => rootState.fieldRecordSystem.userSettings.harvestYear,\r\n fieldId: () => rootGetters['fieldRecordSystem/fieldId']\r\n },\r\n onResult (geometry) {\r\n commit('setBorderGeometry', geometry)\r\n }\r\n })\r\n },\r\n async loadPrerequisiteData ({commit, dispatch, rootGetters}) {\r\n const fieldId = rootGetters['fieldRecordSystem/fieldId']\r\n commit('clear')\r\n\r\n await Promise.all([\r\n dispatch('loadCultivationsForField'),\r\n dispatch('loadBorderGeometry')\r\n ])\r\n\r\n if (savedSettings[fieldId]) {\r\n // NOTE when modifying the field geometry without fully reloading the page, the cache will be broken, currently there is no cache invalidation for this case\r\n commit('restoreState', fieldId)\r\n\r\n // NOTE no await on purpose, should not block\r\n dispatch('loadNextScheduledSatelliteImages')\r\n } else {\r\n const dateRanges = defineInitialDateRanges()\r\n // NOTE no await on purpose, should not block\r\n dispatch('loadSatelliteImages', dateRanges)\r\n }\r\n },\r\n async createZoneMap ({state, dispatch, rootGetters, rootState}, quit) {\r\n const fieldId = rootGetters['fieldRecordSystem/fieldId']\r\n const {harvestYear} = rootState.fieldRecordSystem.userSettings\r\n\r\n // NOTE to make this less awkward, useRedBorder should probably be moved out of settings\r\n const {useRedBorder, buffer, selectedImageIds, ...dto} = state.settings\r\n dto.buffer = useRedBorder ? buffer : null\r\n dto.selectedImages = selectedImageIds.map(id => {\r\n const {recordingDate, dataSource} = state.satelliteImages.find(x => x.id === id)\r\n return {recordingDate, dataSource}\r\n })\r\n\r\n await smarterPost(`/api/v2/field-info/fields/${fieldId}/zone-maps/${harvestYear}`, dto, {\r\n id: 'frs.zoneMaps.createZoneMap'\r\n })\r\n },\r\n getMapCountForOrder ({state, commit}) {\r\n commit('setMapCountForOrder', null)\r\n\r\n const url = '/api/v2/field-info/orders/{orderId}/map-count'\r\n\r\n return smarterGet(url, {\r\n id: 'frs.zoneMaps.getMapCountForOrder',\r\n inputs: {\r\n orderId: () => state.settings.orderId\r\n },\r\n expiry: 0,\r\n sharedCache: true,\r\n onResult (count) {\r\n commit('setMapCountForOrder', count)\r\n }\r\n })\r\n },\r\n resetMapCount ({commit}) {\r\n commit('setMapCountForOrder', null)\r\n },\r\n save ({commit, rootGetters}) {\r\n const fieldId = rootGetters['fieldRecordSystem/fieldId']\r\n commit('saveState', fieldId)\r\n }\r\n }\r\n}\r\n"],"sourceRoot":""}