'`, this)\n }\n },\n\n methods: {\n activate () {\n // Update coordinates and dimensions of menu\n // and its activator\n this.updateDimensions()\n // Start the transition\n requestAnimationFrame(this.startTransition)\n },\n deactivate () {\n this.runDelay('close')\n },\n genActivatorListeners () {\n const listeners = Activatable.options.methods.genActivatorListeners.call(this)\n\n if (this.openOnFocus) {\n listeners.focus = (e: Event) => {\n this.getActivator(e)\n this.runDelay('open')\n }\n listeners.blur = (e: Event) => {\n this.getActivator(e)\n this.runDelay('close')\n }\n }\n\n listeners.keydown = (e: KeyboardEvent) => {\n if (e.keyCode === keyCodes.esc) {\n this.getActivator(e)\n this.runDelay('close')\n }\n }\n\n return listeners\n },\n genActivatorAttributes () {\n return {\n 'aria-haspopup': true,\n 'aria-expanded': String(this.isActive),\n }\n },\n genTransition () {\n const content = this.genContent()\n\n if (!this.computedTransition) return content\n\n return this.$createElement('transition', {\n props: {\n name: this.computedTransition,\n },\n }, [content])\n },\n genContent () {\n return this.$createElement(\n 'div',\n this.setBackgroundColor(this.color, {\n staticClass: 'v-tooltip__content',\n class: {\n [this.contentClass]: true,\n menuable__content__active: this.isActive,\n 'v-tooltip__content--fixed': this.activatorFixed,\n },\n style: this.styles,\n attrs: this.getScopeIdAttrs(),\n directives: [{\n name: 'show',\n value: this.isContentActive,\n }],\n ref: 'content',\n }),\n this.getContentSlot()\n )\n },\n },\n\n render (h): VNode {\n return h(this.tag, {\n staticClass: 'v-tooltip',\n class: this.classes,\n }, [\n this.showLazyContent(() => [this.genTransition()]),\n this.genActivator(),\n ])\n },\n})\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SoMessage.vue?vue&type=style&index=0&id=34af7440&prod&scoped=true&lang=css\"","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-row',{staticStyle:{\"margin\":\"0 1rem\",\"margin-bottom\":\"3rem\"},attrs:{\"align\":\"center\"}},_vm._l((_vm.moduleTypes),function(type){return _c('v-col',{key:type.name,attrs:{\"sm\":\"2\",\"md\":\"4\"},on:{\"click\":function($event){return _vm.selectType(type.value)}}},[_c('v-container',{staticClass:\"type-border\"},[_c('v-icon',{staticStyle:{\"width\":\"100%\",\"margin\":\"0 auto\"},attrs:{\"color\":\"accent\",\"size\":\"100\"}},[_vm._v(_vm._s(type.icon))]),_c('h4',{staticClass:\"text-center\"},[_vm._v(_vm._s(type.name))])],1)],1)}),1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n \r\n {{\r\n type.icon\r\n }}\r\n {{ type.name }}
\r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModuleTypeSelector.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModuleTypeSelector.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ModuleTypeSelector.vue?vue&type=template&id=02d7c60f\"\nimport script from \"./ModuleTypeSelector.vue?vue&type=script&lang=js\"\nexport * from \"./ModuleTypeSelector.vue?vue&type=script&lang=js\"\nimport style0 from \"./ModuleTypeSelector.vue?vue&type=style&index=0&id=02d7c60f&prod&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PaletteChip.vue?vue&type=style&index=0&id=eafb1158&prod&scoped=true&lang=css\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TextCard.vue?vue&type=style&index=0&id=0ae86f3d&prod&lang=css\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModIFrame.vue?vue&type=style&index=0&id=beba0a9a&prod&lang=css\"","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"message\",attrs:{\"color\":\"warning\"}},[_c('span',[_vm._v(_vm._s(_vm.message))])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n {{ message }}\r\n
\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SoMessage.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SoMessage.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./SoMessage.vue?vue&type=template&id=34af7440&scoped=true\"\nimport script from \"./SoMessage.vue?vue&type=script&lang=js\"\nexport * from \"./SoMessage.vue?vue&type=script&lang=js\"\nimport style0 from \"./SoMessage.vue?vue&type=style&index=0&id=34af7440&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"34af7440\",\n null\n \n)\n\nexport default component.exports","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RawTable.vue?vue&type=style&index=0&id=48be7634&prod&scoped=true&lang=css\"","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-card',{style:('width: 100% !important; height: 100% !important; max-height: 100%; overflow-y: scroll; overflow: hidden;' +\n (_vm.soMetaBackgroundColorCard\n ? 'background-color: ' + _vm.soMetaBackgroundColorCard\n : ''))},[_c('v-toolbar',{staticStyle:{\"background\":\"transparent\"},attrs:{\"dense\":\"\",\"flat\":\"\"}},[_c('v-toolbar-title',{style:(_vm.soMetaTextColorTitle ? 'color: ' + _vm.soMetaTextColorTitle : '')},[_vm._v(_vm._s(_vm.module ? _vm.module.title : \"Google Maps\"))]),_c('v-spacer'),(_vm.module != undefined)?_c('div',{staticStyle:{\"width\":\"120px\"}},[_c('timed-progress',{attrs:{\"time\":30},on:{\"event-update\":_vm.updateMarkers}})],1):_vm._e()],1),_c('GmapMap',{ref:\"gmapRef\",staticStyle:{\"width\":\"100%\",\"height\":\"85% !important\"},attrs:{\"center\":_vm.mapCenter,\"clickable\":true,\"map-type-id\":_vm.googleMapsViewType},on:{\"click\":_vm.openSetPos,\"dragend\":_vm.dragEnd,\"zoom_changed\":_vm.zoomLevelChange,\"center_changed\":_vm.centerChange,\"maptypeid_changed\":_vm.mapTypeChange},scopedSlots:_vm._u([{key:\"visible\",fn:function(){return [_c('div',{staticClass:\"search-box\",style:(`\n background: ${_vm.searchHidden ? 'none' : '#ffffff90'};\n border-radius: 10px;\n right: 60px;\n top: 70px;\n max-width: 100%;\n min-height: 104px;\n height: auto;\n position: absolute;\n z-index: 999999;\n `)},[_c('v-btn',{staticStyle:{\"position\":\"absolute\",\"right\":\"-45px\",\"top\":\"calc(50% - 22.5px)\"},attrs:{\"fab\":\"\",\"small\":\"\",\"color\":\"primary\"},on:{\"click\":function($event){_vm.searchHidden = !_vm.searchHidden}}},[_c('v-icon',[_vm._v(\"mdi-magnify\")])],1),_c('v-container',{style:(`${\n _vm.searchHidden\n ? 'width: 0px; height: 0px'\n : 'width: 100%; height: 100%'\n }`)},[_c('v-autocomplete',{staticClass:\"pl-2\",staticStyle:{\"overflow\":\"hidden\"},attrs:{\"items\":_vm.tags,\"chips\":\"\",\"item-text\":\"name\",\"return-object\":\"\",\"multiple\":\"\",\"light\":\"\",\"placeholder\":_vm.$t('tag.filter'),\"label\":_vm.$t('tag.filter')},on:{\"change\":_vm.fitToBounds},scopedSlots:_vm._u([{key:\"selection\",fn:function(data){return [_c('v-chip',_vm._b({staticStyle:{\"color\":\"white\"},attrs:{\"input-value\":data.selected,\"color\":\"#2e4250\",\"close\":\"\"},on:{\"click\":data.select,\"click:close\":function($event){return _vm.removeFilterNode(data.item)}}},'v-chip',data.attrs,false),[_vm._v(_vm._s(data.item.name))])]}}]),model:{value:(_vm.filterNodes),callback:function ($$v) {_vm.filterNodes=$$v},expression:\"filterNodes\"}})],1)],1)]},proxy:true}])},[_c('GmapInfoWindow',{attrs:{\"options\":_vm.infoOptions,\"position\":_vm.infoWindowPos,\"opened\":_vm.infoWindowOpen},on:{\"closeclick\":_vm.closeInfoWindow}},[_c('v-container',{attrs:{\"fluid\":\"\"}},[(_vm.setPosForm)?_c('v-card',{staticClass:\"text-left\",attrs:{\"flat\":\"\"}},[_c('v-card-title',[_vm._v(_vm._s(_vm.$t(\"map.setPosFormTitle\")))]),_c('v-divider'),_c('v-card-text',[_c('v-autocomplete',{attrs:{\"autocomplete\":\"off\",\"loading\":_vm.status.loading,\"label\":_vm.$t('alarm.fields.tag'),\"items\":_vm.tags,\"required\":\"\",\"item-text\":\"name\",\"item-value\":\"deveui\",\"prepend-icon\":\"mdi-cellphone-link\"},model:{value:(_vm.deveui),callback:function ($$v) {_vm.deveui=$$v},expression:\"deveui\"}}),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"text\":\"\"},on:{\"click\":function($event){return _vm.submitPos()}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.save\"))+\" \")])],1)],1):_c('v-card',{staticClass:\"text-left\",attrs:{\"flat\":\"\"}},[_c('v-card-title',[_vm._v(_vm._s(_vm.currTag.name))]),_c('v-divider'),_c('v-card-text',[_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t(\"tag.fields.deveui\"))+\": \"),_c('span',{staticClass:\"subtitle-1\"},[_vm._v(_vm._s(_vm.currTag.deveui))])]),_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t(\"tag.fields.profile\"))+\": \"),_c('span',{staticClass:\"subtitle-1\"},[_vm._v(_vm._s(_vm.currTag.profile))])]),_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t(\"tag.fields.name\"))+\": \"),_c('span',{staticClass:\"subtitle-1\"},[_vm._v(_vm._s(_vm.currTag.name))])]),_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t(\"tag.fields.appKey\"))+\": \"),_c('span',{staticClass:\"subtitle-1\"},[_vm._v(_vm._s(_vm.currTag.appKey))])]),(_vm.address == '')?_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t(\"tag.fields.latAndLng\"))+\": \"),_c('span',{staticClass:\"subtitle-1\"},[_vm._v(\" \"+_vm._s(_vm.currTag.latitude + \" - \" + _vm.currTag.longitude)+\" \")])]):_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t(\"common.address\"))+\": \"),_c('span',{staticClass:\"subtitle-1\"},[_vm._v(\" \"+_vm._s(_vm.address)+\" \")])]),_c('v-divider'),_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t(\"tagdata.latestvalue\"))+\": \"),_c('span',{staticClass:\"subtitle-1\"},[_vm._v(\" \"+_vm._s(_vm.tdata !== null ? _vm.tdata.value : \"N/A\")+\" \")])]),_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t(\"tagdata.fields.key\"))+\": \"),_c('span',{staticClass:\"subtitle-1\"},[_vm._v(\" \"+_vm._s(_vm.tdata !== null ? _vm.tdata.key : \"N/A\")+\" \")])]),_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t(\"common.timestamp\"))+\": \"),_c('span',{staticClass:\"subtitle-1\"},[_vm._v(\" \"+_vm._s(_vm.tdata !== null ? _vm.humanDate(_vm.tdata.createdAt) : \"N/A\")+\" \")])])],1),_c('v-card-text',{staticClass:\"ma-0 pa-0\"},[(\n _vm.currTag.installationImage && this.SO_API_BASE_URL != undefined\n )?_c('v-img',{attrs:{\"src\":this.SO_API_BASE_URL +\n '/api/image/' +\n _vm.currTag.installationImage}}):_vm._e(),(_vm.mode == 1)?_c('v-btn',{attrs:{\"color\":\"error\",\"text\":\"\"},on:{\"click\":function($event){_vm.confirmDelete = true}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.delete\"))+\" \")]):_vm._e()],1)],1)],1)],1),_c('GmapCluster',{attrs:{\"max-zoom\":15}},_vm._l((_vm.computedTags),function(m){return _c('GmapMarker',{key:m.deveui,attrs:{\"label\":{ text: m.name, color: 'rgb(254, 254, 254)' },\"position\":{\n lat: m.latitude !== null ? m.latitude : 0.0,\n lng: m.longitude !== null ? m.longitude : 0.0,\n },\"clickable\":true,\"draggable\":false,\"icon\":_vm.markerIcon(m.deveui)},on:{\"click\":function($event){_vm.toggleInfoWindow(m);\n _vm.center = {\n lat: m.latitude !== undefined ? m.latitude : 0.0,\n lng: m.longitude !== undefined ? m.longitude : 0.0,\n };},\"dragend\":function($event){return _vm.updateTagPos(m)},\"position_changed\":function($event){return _vm.updatePos($event)}}})}),1)],1),_c('delete-dialog',{attrs:{\"dialog\":_vm.confirmDelete},on:{\"confirm-delete\":_vm.removePosition,\"cancel-dialog\":function($event){_vm.confirmDelete = false}}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n {{ module ? module.title : \"Google Maps\" }}\n \n \n \n
\n \n\n \n \n \n \n mdi-magnify\n \n \n \n \n {{ data.item.name }}\n \n \n \n
\n \n \n \n \n {{ $t(\"map.setPosFormTitle\") }}\n \n \n \n \n {{ $t(\"common.save\") }}\n \n \n \n\n \n {{ currTag.name }}\n \n \n \n {{ $t(\"tag.fields.deveui\") }}:\n {{ currTag.deveui }}\n
\n \n {{ $t(\"tag.fields.profile\") }}:\n {{ currTag.profile }}\n
\n\n \n {{ $t(\"tag.fields.name\") }}:\n {{ currTag.name }}\n
\n\n \n {{ $t(\"tag.fields.appKey\") }}:\n {{ currTag.appKey }}\n
\n\n \n {{ $t(\"tag.fields.latAndLng\") }}:\n \n {{ currTag.latitude + \" - \" + currTag.longitude }}\n \n
\n \n {{ $t(\"common.address\") }}:\n \n {{ address }}\n \n
\n\n \n \n {{ $t(\"tagdata.latestvalue\") }}:\n \n {{ tdata !== null ? tdata.value : \"N/A\" }}\n \n
\n \n {{ $t(\"tagdata.fields.key\") }}:\n \n {{ tdata !== null ? tdata.key : \"N/A\" }}\n \n
\n \n {{ $t(\"common.timestamp\") }}:\n \n {{ tdata !== null ? humanDate(tdata.createdAt) : \"N/A\" }}\n \n
\n \n\n \n \n \n {{ $t(\"common.delete\") }}\n \n \n \n \n \n\n \n \n \n \n \n \n\n\n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??ref--13-1!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagMap.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??ref--13-1!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagMap.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./TagMap.vue?vue&type=template&id=27376b9e\"\nimport script from \"./TagMap.vue?vue&type=script&lang=js\"\nexport * from \"./TagMap.vue?vue&type=script&lang=js\"\nimport style0 from \"./TagMap.vue?vue&type=style&index=0&id=27376b9e&prod&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-card',{staticClass:\"align-center justify-center text-center\",style:('width: 100% !important; height: 100% !important; max-height: 100%; overflow-y: scroll; overflow: hidden;' +\n (_vm.soMetaBackgroundColorCard\n ? 'background-color: ' + _vm.soMetaBackgroundColorCard\n : '')),attrs:{\"no-gutter\":\"\"}},[_c('v-toolbar',{staticStyle:{\"background\":\"transparent\"},attrs:{\"dense\":\"\",\"flat\":\"\"}},[_c('v-toolbar-title',{style:(_vm.soMetaTextColorTitle ? 'color: ' + _vm.soMetaTextColorTitle : '')},[_vm._v(_vm._s(_vm.$t(\"weather.title\") + \" - \" + (_vm.module.tag === null ? \"\" : _vm.module.tag.name)))])],1),_c('v-data-table',{staticClass:\"overflow-y-auto\",staticStyle:{\"max-height\":\"500px\",\"background\":\"transparent\"},attrs:{\"headers\":_vm.headers,\"items\":_vm.weather,\"loading\":_vm.loading,\"hide-default-footer\":\"\",\"dense\":\"\",\"disable-pagination\":\"\"},scopedSlots:_vm._u([{key:`item.wIcon`,fn:function({ item }){return [_c('v-icon',{attrs:{\"color\":\"primary\"}},[_vm._v(_vm._s(item.wIcon))])]}}],null,true)})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n {{\n $t(\"weather.title\") +\n \" - \" +\n (module.tag === null ? \"\" : module.tag.name)\n }}\n \n\n \n \n {{ item.wIcon }}\n \n \n \n\n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModSMHI.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModSMHI.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ModSMHI.vue?vue&type=template&id=471833b5\"\nimport script from \"./ModSMHI.vue?vue&type=script&lang=js\"\nexport * from \"./ModSMHI.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticStyle:{\"height\":\"100%\",\"width\":\"100%\"}},[(_vm.CModuleType.TEXT === _vm.localItem.type)?_c('TextCard',{attrs:{\"label\":_vm.localItem.title,\"value\":_vm.localItem.content,\"module\":_vm.localItem,\"loading\":false}}):_vm._e(),(\n _vm.CModuleType.MULTICHART === _vm.localItem.type ||\n _vm.CModuleType.CHART === _vm.localItem.type\n )?_c('Multichart',{attrs:{\"module\":_vm.localItem,\"timerTick\":_vm.timerTick}}):_vm._e(),(_vm.CModuleType.MAP === _vm.localItem.type)?_c('TagMap',{attrs:{\"module\":_vm.localItem,\"mode\":_vm.mode}}):_vm._e(),(_vm.CModuleType.GAUGE === _vm.localItem.type)?_c('Gauge',{attrs:{\"module\":_vm.localItem,\"timerTick\":_vm.timerTick}}):_vm._e(),(_vm.CModuleType.IMAGE === _vm.localItem.type)?_c('ModImage',{attrs:{\"module\":_vm.localItem}}):_vm._e(),(_vm.CModuleType.IMAGEMAP === _vm.localItem.type)?_c('ModImageMap',{attrs:{\"mode\":_vm.mode,\"module\":_vm.localItem,\"timerTick\":_vm.timerTick}}):_vm._e(),(_vm.CModuleType.IFRAME === _vm.localItem.type)?_c('ModIFrame',{attrs:{\"src\":_vm.localItem.content,\"module\":_vm.localItem}}):_vm._e(),(_vm.CModuleType.SINGLE == _vm.localItem.type)?_c('ModuleSingle',{attrs:{\"module\":_vm.localItem,\"timerTick\":_vm.timerTick}}):_vm._e(),(_vm.CModuleType.FUNCTIONBUTTON == _vm.localItem.type)?_c('ModFunctionButton',{attrs:{\"module\":_vm.localItem}}):_vm._e(),(_vm.CModuleType.WEATHER === _vm.localItem.type)?_c('ModSMHI',{attrs:{\"module\":_vm.localItem,\"timerTick\":_vm.timerTick}}):_vm._e(),(_vm.CModuleType.RAWTABLE === _vm.localItem.type)?_c('RawTable',{attrs:{\"module\":_vm.localItem,\"timerTick\":_vm.timerTick}}):_vm._e(),(_vm.CModuleType.INFOCARD === _vm.localItem.type)?_c('InfoCard',{attrs:{\"module\":_vm.localItem,\"timerTick\":_vm.timerTick}}):_vm._e(),(_vm.CModuleType.TRENDCHART === _vm.localItem.type)?_c('TrendChart',{attrs:{\"settingsEnabled\":true,\"tag\":_vm.localItem.tag,\"module\":_vm.localItem,\"timerTick\":_vm.timerTick}}):_vm._e(),(_vm.CModuleType.SENSOROVERVIEW === _vm.localItem.type)?_c('SensorOverviewList',{attrs:{\"settingsEnabled\":true,\"tag\":_vm.localItem.tag,\"module\":_vm.localItem,\"timerTick\":_vm.timerTick}}):_vm._e(),(_vm.CModuleType.TILTCHART === _vm.localItem.type)?_c('TiltChart',{attrs:{\"module\":_vm.localItem,\"timerTick\":_vm.timerTick,\"settingsEnabled\":true}}):_vm._e(),(_vm.mode == _vm.MType.EDIT)?_c('ModuleCopy',{attrs:{\"module\":_vm.localItem},on:{\"update\":_vm.updateEvent}}):_vm._e(),(_vm.mode == _vm.MType.EDIT)?_c('ModuleEdit',{attrs:{\"module\":_vm.localItem},on:{\"update-event\":_vm.updateEvent}}):_vm._e(),(_vm.CModuleType.FILLINDICATOR === _vm.localItem.type)?_c('FillIndicator',{attrs:{\"module\":_vm.localItem,\"timerTick\":_vm.timerTick}}):_vm._e(),(_vm.CModuleType.CONTROLSLIDERS === _vm.localItem.type)?_c('ControlSliders',{attrs:{\"module\":_vm.localItem}}):_vm._e(),(_vm.CModuleType.CAMONLINE === _vm.localItem.type)?_c('cam-online-module',{attrs:{\"module\":_vm.localItem}}):_vm._e()],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-card',{staticClass:\"align-center justify-center text-center\",style:('width: 100% !important; box-sizing: border-box; max-height: 100% !important; overflow: hidden;' +\n (_vm.fakeData ? 'height: 500px;' : 'height: 100% !important;') +\n (_vm.soMetaBackgroundColorCard\n ? 'background-color: ' + _vm.soMetaBackgroundColorCard + ';'\n : '')),attrs:{\"no-gutter\":\"\"}},[_c('v-toolbar',{staticStyle:{\"background\":\"transparent\"},attrs:{\"dense\":\"\",\"flat\":\"\"}},[_c('v-toolbar-title',{style:(_vm.soMetaTextColorTitle ? 'color: ' + _vm.soMetaTextColorTitle : '')},[_vm._v(_vm._s(_vm.module.title))])],1),_c('v-container',{staticStyle:{\"max-width\":\"100% !important\",\"margin\":\"0 auto\",\"height\":\"100%\"},attrs:{\"fill-height\":\"\",\"align\":\"center\",\"justify\":\"center\"}},[_c('v-row',{staticStyle:{\"max-width\":\"100% !important\",\"margin\":\"0\",\"max-height\":\"100%\",\"height\":\"100%\"},attrs:{\"align\":\"center\",\"justify\":\"center\"}},[(_vm.imageAvailable && _vm.SO_API_BASE_URL != undefined)?_c('v-img',{attrs:{\"contain\":\"\",\"max-height\":\"100%\",\"src\":_vm.SO_API_BASE_URL + '/api/image/' + _vm.computedPath}}):_vm._e()],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n {{ module.title }}\n \n \n \n \n \n \n \n\n\n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModImage.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModImage.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ModImage.vue?vue&type=template&id=6fe987a0\"\nimport script from \"./ModImage.vue?vue&type=script&lang=js\"\nexport * from \"./ModImage.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"overlay\",staticStyle:{\"right\":\"0px\",\"bottom\":\"0px\",\"position\":\"absolute\"}},[_c('v-dialog',{attrs:{\"fullscreen\":\"\",\"hide-overlay\":\"\",\"transition\":\"dialog-top-transition\",\"persistent\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function({ on }){return [_c('v-btn',_vm._g({staticClass:\"dashboard-floaty\",attrs:{\"color\":\"primary\",\"fab\":\"\",\"small\":\"\"}},on),[_c('v-icon',[_vm._v(\"mdi-pencil\")])],1)]}}]),model:{value:(_vm.dialog),callback:function ($$v) {_vm.dialog=$$v},expression:\"dialog\"}},[_c('v-toolbar',{attrs:{\"dark\":\"\",\"color\":\"primary\"}},[_c('v-btn',{attrs:{\"icon\":\"\",\"dark\":\"\"},on:{\"click\":_vm.close}},[_c('v-icon',[_vm._v(\"mdi-close\")])],1),_c('v-toolbar-title',[_vm._v(_vm._s(_vm.$t(\"module.edit\")))]),_c('v-spacer')],1),_c('v-card',[(_vm.typeSelected)?_c('v-container',{attrs:{\"fluid\":\"\"}},[_c('v-row',[_c('v-col',{attrs:{\"cols\":\"12\",\"sm\":\"0\",\"md\":\"6\"}},[(\n _vm.type != _vm.ModuleTypes.MAP &&\n _vm.styleMetas &&\n Object.keys(_vm.form).length > 0\n )?_c('ModulePreview',{attrs:{\"type\":_vm.type,\"title\":_vm.form.title,\"content\":_vm.form.content,\"deveui\":_vm.form.deveui,\"meta\":_vm.form.metas,\"tagKey\":_vm.form.tagKey}}):_vm._e(),(_vm.form.metas && _vm.hasStyle)?_c('style-picker-module',{attrs:{\"type\":_vm.type,\"metas\":_vm.form.metas},on:{\"update\":_vm.updateStyleMeta}}):_vm._e()],1),_c('v-col',{attrs:{\"cols\":\"12\",\"sm\":\"12\",\"md\":_vm.hasStyle || _vm.type == _vm.ModuleTypes.CONTROLSLIDERS ? 6 : 12}},[_c('module-form',{attrs:{\"headline\":_vm.$t('module.edit'),\"edit\":true,\"type\":_vm.type,\"module\":_vm.module,\"styleMetas\":_vm.styleMetas},on:{\"update-form\":_vm.updateFrom,\"close-dialog-event\":_vm.close,\"update-event\":(val) => _vm.$emit('update-event', val)}})],1)],1),(_vm.type == _vm.ModuleTypes.CONTROLSLIDERS)?_c('v-row',[_c('v-col',[_c('control-slider-picker',{attrs:{\"metas\":_vm.module.meta},on:{\"update\":_vm.setMeta}})],1)],1):_vm._e()],1):_c('v-col',{attrs:{\"sm\":\"12\",\"md\":\"12\",\"align\":\"center\"}},[_c('ModuleTypeSelector',{on:{\"update\":_vm.selectType}})],1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n \r\n \r\n mdi-pencil\r\n \r\n \r\n\r\n \r\n \r\n mdi-close\r\n \r\n {{ $t(\"module.edit\") }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n 0\r\n \"\r\n :type=\"type\"\r\n :title=\"form.title\"\r\n :content=\"form.content\"\r\n :deveui=\"form.deveui\"\r\n :meta=\"form.metas\"\r\n :tagKey=\"form.tagKey\"\r\n />\r\n \r\n \r\n\r\n \r\n $emit('update-event', val)\"\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModuleEdit.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModuleEdit.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ModuleEdit.vue?vue&type=template&id=2546bfc2&scoped=true\"\nimport script from \"./ModuleEdit.vue?vue&type=script&lang=js\"\nexport * from \"./ModuleEdit.vue?vue&type=script&lang=js\"\nimport style0 from \"./ModuleEdit.vue?vue&type=style&index=0&id=2546bfc2&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2546bfc2\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"overlay\",staticStyle:{\"right\":\"0px\",\"bottom\":\"0px\",\"position\":\"absolute\"}},[_c('v-tooltip',{attrs:{\"bottom\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function({ on }){return [_c('v-btn',_vm._g({class:_vm.module.h <= 3\n ? 'dashboard-floaty-copy-slim'\n : 'dashboard-floaty-copy',attrs:{\"fab\":\"\",\"small\":\"\",\"color\":\"accent\",\"disabled\":_vm.disabled},on:{\"click\":function($event){$event.stopPropagation();return _vm.copyModuleEvent.apply(null, arguments)}}},on),[_c('v-icon',[_vm._v(\"mdi-content-copy\")])],1)]}}])},[_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"dashboard.copy.tooltip\")))])])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n \r\n \r\n mdi-content-copy\r\n \r\n \r\n {{ $t(\"dashboard.copy.tooltip\") }}\r\n \r\n
\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModuleCopy.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModuleCopy.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ModuleCopy.vue?vue&type=template&id=0c61ecf7\"\nimport script from \"./ModuleCopy.vue?vue&type=script&lang=js\"\nexport * from \"./ModuleCopy.vue?vue&type=script&lang=js\"\nimport style0 from \"./ModuleCopy.vue?vue&type=style&index=0&id=0c61ecf7&prod&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n
\r\n\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Module.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Module.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./Module.vue?vue&type=template&id=6108a8c0\"\nimport script from \"./Module.vue?vue&type=script&lang=js\"\nexport * from \"./Module.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InfoCard.vue?vue&type=style&index=0&id=c83b437e&prod&lang=css\"","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-container',{staticStyle:{\"padding\":\"0\",\"height\":\"100%\"},attrs:{\"fluid\":\"\"}},[_c('v-card',{style:('height: 100%; overflow: hidden; z-index: 0;' +\n (_vm.soMetaBackgroundColorCard\n ? 'background-color: ' + _vm.soMetaBackgroundColorCard\n : ''))},[_c('v-row',{attrs:{\"no-gutters\":\"\"}},[_c('v-toolbar',{style:('background: transparent;' +\n (_vm.soMetaTextColorTitle ? 'color: ' + _vm.soMetaTextColorTitle : '')),attrs:{\"dense\":\"\",\"flat\":\"\"}},[_c('v-toolbar-items',{staticClass:\"text-left\",staticStyle:{\"flex-direction\":\"column\"}},[_c('v-toolbar-title',[_vm._v(_vm._s(_vm.module.title))]),_c('v-spacer'),(!_vm.fakeData && _vm.loaded)?_c('span',{staticStyle:{\"width\":\"100%\",\"font-size\":\"0.8rem\"}},[_vm._v(_vm._s(_vm.humanDate(this.dataValue.createdAt)))]):_vm._e()],1)],1)],1),_c('v-row',{staticStyle:{\"max-height\":\"80%\",\"height\":\"80%\",\"width\":\"100%\",\"max-width\":\"100%\",\"margin\":\"0\"}},[(_vm.loaded)?_c('e-chart',{staticClass:\"px-2\",style:('z-index: 1;' +\n (_vm.fakeData\n ? 'width: 100%; height: 250px; overflow: hidden'\n : _vm.gauge180\n ? 'width: 100%; height: 160%; overflow: hidden'\n : 'width: 100%; height: 100%; overflow: hidden')),attrs:{\"option\":_vm.opts,\"autoresize\":true,\"theme\":this.darkmode ? 'sensoronlinedark' : 'macarons'}}):_vm._e()],1),_c('v-row',{staticStyle:{\"padding-bottom\":\"1rem\"},attrs:{\"no-gutters\":\"\"}})],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n \r\n \r\n \r\n {{ module.title }}\r\n \r\n {{ humanDate(this.dataValue.createdAt) }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Gauge.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Gauge.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./Gauge.vue?vue&type=template&id=f0205b42\"\nimport script from \"./Gauge.vue?vue&type=script&lang=js\"\nexport * from \"./Gauge.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModuleEdit.vue?vue&type=style&index=0&id=2546bfc2&prod&scoped=true&lang=css\"","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-card',{staticClass:\"pb-2\",style:('width: 100% !important; height: 100%; max-height: 100% !important; overflow: hidden;' +\n (_vm.soMetaBackgroundColorCard\n ? 'background-color: ' + _vm.soMetaBackgroundColorCard + ';'\n : ''))},[_c('v-toolbar',{staticStyle:{\"background\":\"transparent\"},attrs:{\"dense\":\"\",\"flat\":\"\"}},[_c('v-toolbar-title',{style:(_vm.soMetaTextColorTitle ? 'color: ' + _vm.soMetaTextColorTitle : '')},[_vm._v(_vm._s(_vm.module.title))])],1),_c('v-card-text',{staticClass:\"preserve-spacing\"},[_vm._v(_vm._s(_vm.module.content))]),(_vm.location != null)?_c('v-card-text',{staticClass:\"pt-1 pb-1\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"tag.fields.location\") + \": \" + _vm.location)+\" \")]):_vm._e(),(_vm.lat != null && _vm.long != null)?_c('v-card-text',{staticClass:\"pt-1 pb-1\"},[_vm._v(\" \"+_vm._s(\"Lat: \" + _vm.lat.toFixed(2) + \" \" + \"Long: \" + _vm.long.toFixed(2))+\" \"),_c('v-btn',{staticClass:\"mx-2\",attrs:{\"x-small\":\"\",\"fab\":\"\",\"color\":\"blue\",\"target\":\"_blank\",\"href\":_vm.mapLink}},[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\" mdi-map \")])],1)],1):_vm._e(),(_vm.latestData != null)?_c('v-card-text',{staticClass:\"pt-1 pb-1\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"tagdata.latestactivity\") + \": \" + _vm.humanDate(_vm.latestData, \"yyyy-MM-dd HH:mm:ss\")))]):_vm._e(),(_vm.vdd != null)?_c('v-card-text',{staticClass:\"pt-1 pb-1\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"tag.fields.battery\") + \": \" + parseFloat(_vm.vdd).toFixed(2) + \"V\"))]):_vm._e(),(_vm.rssi != null)?_c('v-card-text',{staticClass:\"pt-1 pb-1\"},[_vm._v(\" RSSI: \"+_vm._s(_vm.rssi))]):_vm._e(),_vm._l((_vm.data),function(item){return _c('v-card-text',{key:item.key,staticClass:\"pt-1 pb-1\"},[_vm._v(\" \"+_vm._s(item.key + \": \" + parseFloat(item.value).toFixed(2))+\" \")])})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n {{ module.title }}\n \n\n {{ module.content }}\n\n \n {{ $t(\"tag.fields.location\") + \": \" + location }}\n \n\n \n {{ \"Lat: \" + lat.toFixed(2) + \" \" + \"Long: \" + long.toFixed(2) }}\n \n mdi-map \n \n\n \n {{\n $t(\"tagdata.latestactivity\") +\n \": \" +\n humanDate(latestData, \"yyyy-MM-dd HH:mm:ss\")\n }}\n\n \n {{\n $t(\"tag.fields.battery\") + \": \" + parseFloat(vdd).toFixed(2) + \"V\"\n }}\n\n \n RSSI: {{ rssi }}\n\n \n {{ item.key + \": \" + parseFloat(item.value).toFixed(2) }}\n \n \n\n\n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InfoCard.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InfoCard.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./InfoCard.vue?vue&type=template&id=c83b437e\"\nimport script from \"./InfoCard.vue?vue&type=script&lang=js\"\nexport * from \"./InfoCard.vue?vue&type=script&lang=js\"\nimport style0 from \"./InfoCard.vue?vue&type=style&index=0&id=c83b437e&prod&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModuleSingle.vue?vue&type=style&index=0&id=af4a593a&prod&scoped=true&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagMap.vue?vue&type=style&index=0&id=27376b9e&prod&lang=css\"","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-card',{style:('height: 100%; overflow: hidden;' +\n (_vm.soMetaBackgroundColorCard\n ? 'background-color: ' + _vm.soMetaBackgroundColorCard\n : ''))},[_c('ChartControl',{attrs:{\"enabled\":_vm.settingsEnabled,\"loading\":_vm.loading,\"module\":_vm.module,\"titleTextColor\":_vm.soMetaTextColorTitle},on:{\"update-ranges\":_vm.newData}}),_c('v-row',{staticStyle:{\"height\":\"75%\"},attrs:{\"no-gutters\":\"\"}},[(_vm.opts.series.length > 0)?_c('e-chart',{style:(_vm.fakeData ? 'width: 100%; height: 300px' : 'width: 100%; height: 100%'),attrs:{\"option\":_vm.opts,\"autoresize\":true,\"theme\":this.darkmode ? 'sensoronlinedark' : 'macarons'}}):_vm._e()],1),_c('v-row',{staticStyle:{\"height\":\"5%\"},attrs:{\"no-gutters\":\"\"}},[(_vm.resolution)?_c('span',{staticStyle:{\"text-align\":\"center\",\"color\":\"#999\",\"width\":\"100%\"}},[_vm._v(\" \"+_vm._s(_vm.displayResolution)+\" \")]):_vm._e()])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n \n 0\"\n :option=\"opts\"\n :style=\"\n fakeData ? 'width: 100%; height: 300px' : 'width: 100%; height: 100%'\n \"\n :autoresize=\"true\"\n :theme=\"this.darkmode ? 'sensoronlinedark' : 'macarons'\"\n />\n \n \n \n {{ displayResolution }}\n \n \n \n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TrendChart.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TrendChart.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./TrendChart.vue?vue&type=template&id=9a530f0c\"\nimport script from \"./TrendChart.vue?vue&type=script&lang=js\"\nexport * from \"./TrendChart.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-card',{staticClass:\"align-center justify-center text-center hide-scrollbar\",style:('width: 100% !important; height: 100% !important; max-height: 100%; overflow-y: scroll; overflow: hidden;' +\n (_vm.soMetaBackgroundColorCard\n ? 'background-color: ' + _vm.soMetaBackgroundColorCard\n : '')),attrs:{\"no-gutter\":\"\"}},[_c('v-toolbar',{staticStyle:{\"background\":\"transparent\"},attrs:{\"dense\":\"\",\"flat\":\"\"}},[_c('v-toolbar-title',{style:(_vm.soMetaTextColorTitle ? 'color: ' + _vm.soMetaTextColorTitle : '')},[_vm._v(_vm._s(_vm.$t(\"tagdata.name\") + \" - \" + _vm.module.tag.name))]),_c('v-spacer'),_c('v-text-field',{attrs:{\"append-icon\":\"search\",\"label\":\"Search\",\"single-line\":\"\",\"hide-details\":\"\"},model:{value:(_vm.search),callback:function ($$v) {_vm.search=$$v},expression:\"search\"}})],1),_c('v-data-table',{staticClass:\"weathertable hide-scrollbar\",staticStyle:{\"background\":\"transparent\"},attrs:{\"headers\":_vm.headers,\"items\":_vm.items,\"loading\":_vm.loading,\"dense\":\"\",\"search\":_vm.search,\"items-per-page\":15},scopedSlots:_vm._u([{key:\"createdAt\",fn:function({ item }){return [_vm._v(\" \"+_vm._s(_vm.humanDate(item.createdAt))+\" \")]}}])})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n {{ $t(\"tagdata.name\") + \" - \" + module.tag.name }}\n \n \n \n\n \n \n {{ humanDate(item.createdAt) }}\n \n \n \n\n\n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RawTable.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RawTable.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./RawTable.vue?vue&type=template&id=48be7634&scoped=true\"\nimport script from \"./RawTable.vue?vue&type=script&lang=js\"\nexport * from \"./RawTable.vue?vue&type=script&lang=js\"\nimport style0 from \"./RawTable.vue?vue&type=style&index=0&id=48be7634&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"48be7634\",\n null\n \n)\n\nexport default component.exports","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModulePreview.vue?vue&type=style&index=0&id=10384bfb&prod&lang=css\"","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-card',{staticStyle:{\"width\":\"100% !important\",\"height\":\"100%\",\"overflow\":\"hidden\"}},[_c('v-row',{style:('height: 100%; margin: 0px' + (_vm.fakeData ? ';min-height: 300px' : ''))},[_c('v-toolbar',{staticClass:\"justify-center\",attrs:{\"dense\":\"\",\"flat\":\"\"}},[_c('v-toolbar-title',[_vm._v(_vm._s(_vm.module.title))])],1),_c('v-container',{staticClass:\"pa-0 ma-0 align-center justify-center fill-height\"},[_vm._l((_vm.sensorSliders),function(slider,i){return _c('v-row',{key:i,staticClass:\"pa-0 ma-0 justify-center loopad\"},[_c('v-row',{staticClass:\"justify-center\",staticStyle:{\"width\":\"100%\"}},[_c('v-label',[_vm._v(_vm._s(`${slider.tagName ? slider.tagName : slider.tag} - ${ slider.tagKey ? slider.tagKey : slider.key }`))])],1),_c('v-row',{staticClass:\"ml-5 mr-2 justify-center\",staticStyle:{\"width\":\"100%\"}},[_c('v-slider',{attrs:{\"persistent-hint\":\"\",\"thumb-label\":\"\",\"hint\":slider.hint,\"min\":slider.min,\"max\":slider.max},scopedSlots:_vm._u([{key:\"append\",fn:function(){return [_c('v-text-field',{staticClass:\"mt-0 pt-0\",staticStyle:{\"width\":\"45px\"},attrs:{\"hide-details\":\"\",\"single-line\":\"\",\"type\":\"number\",\"min\":slider.min,\"max\":slider.max},model:{value:(slider.value),callback:function ($$v) {_vm.$set(slider, \"value\", $$v)},expression:\"slider.value\"}})]},proxy:true}],null,true),model:{value:(slider.value),callback:function ($$v) {_vm.$set(slider, \"value\", $$v)},expression:\"slider.value\"}})],1)],1)}),_c('v-card-actions',{staticClass:\"mt-0 pt-0 mb-3\",staticStyle:{\"max-width\":\"100%\",\"width\":\"100%\"}},[_c('v-spacer'),_c('v-btn',{staticClass:\"mb-5\",staticStyle:{\"margin\":\"0 auto\",\"min-width\":\"10vh\"},attrs:{\"color\":\"warning\"},on:{\"click\":function($event){return _vm.resetValues()}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.reset\"))+\" \")]),_c('v-spacer'),_c('v-btn',{staticClass:\"mb-5\",staticStyle:{\"margin\":\"0 auto\",\"min-width\":\"10vh\"},attrs:{\"color\":\"primary\",\"disabled\":_vm.buttonDisabled},on:{\"click\":function($event){_vm.dialog = true}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.save\"))+\" \")]),_c('v-spacer')],1)],2)],1),_c('v-dialog',{attrs:{\"max-width\":\"400px\"},model:{value:(_vm.dialog),callback:function ($$v) {_vm.dialog=$$v},expression:\"dialog\"}},[_c('v-card',[_c('v-card-title',[_c('span',{staticClass:\"headline\"},[_vm._v(_vm._s(_vm.$t(\"common.save\")))])]),_c('v-card-text',[_vm._v(\" \"+_vm._s(_vm.$t(\"common.verify\"))+\" \")]),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"text\":\"\"},on:{\"click\":function($event){_vm.dialog = false}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.no\"))+\" \")]),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"text\":\"\"},on:{\"click\":function($event){return _vm.saveValues()}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.yes\"))+\" \")])],1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n \r\n {{ module.title }}\r\n \r\n \r\n \r\n \r\n {{\r\n `${slider.tagName ? slider.tagName : slider.tag} - ${\r\n slider.tagKey ? slider.tagKey : slider.key\r\n }`\r\n }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ $t(\"common.reset\") }}\r\n \r\n \r\n \r\n {{ $t(\"common.save\") }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ $t(\"common.save\") }}\r\n \r\n \r\n {{ $t(\"common.verify\") }}\r\n \r\n \r\n \r\n \r\n {{ $t(\"common.no\") }}\r\n \r\n \r\n {{ $t(\"common.yes\") }}\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ControlSliders.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ControlSliders.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ControlSliders.vue?vue&type=template&id=3712794f\"\nimport script from \"./ControlSliders.vue?vue&type=script&lang=js\"\nexport * from \"./ControlSliders.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-row',{attrs:{\"justify\":\"center\"}},[_c('v-dialog',{attrs:{\"persistent\":\"\",\"max-width\":\"400px\"},model:{value:(_vm.dialog),callback:function ($$v) {_vm.dialog=$$v},expression:\"dialog\"}},[_c('v-card',[_c('v-card-title',[_c('span',{staticClass:\"headline\"},[_vm._v(_vm._s(_vm.$t(\"common.delete\")))])]),_c('v-card-text',[_vm._v(\" \"+_vm._s(_vm.$t(\"common.verify\"))+\" \")]),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"text\":\"\"},on:{\"click\":function($event){return _vm.cancel()}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.cancel\"))+\" \")]),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"text\":\"\"},on:{\"click\":function($event){return _vm.confirmDelete()}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.delete\"))+\" \")])],1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n \n \n {{ $t(\"common.delete\") }}\n \n \n {{ $t(\"common.verify\") }}\n \n \n \n \n {{ $t(\"common.cancel\") }}\n \n \n {{ $t(\"common.delete\") }}\n \n \n \n \n \n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DeleteDialog.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DeleteDialog.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./DeleteDialog.vue?vue&type=template&id=1b4ede6c\"\nimport script from \"./DeleteDialog.vue?vue&type=script&lang=js\"\nexport * from \"./DeleteDialog.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-progress-linear',{attrs:{\"color\":\"blue\",\"height\":\"10\",\"value\":_vm.progressValue,\"striped\":\"\"}})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TimedProgress.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TimedProgress.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./TimedProgress.vue?vue&type=template&id=6a8ddb2e\"\nimport script from \"./TimedProgress.vue?vue&type=script&lang=js\"\nexport * from \"./TimedProgress.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModuleTypeSelector.vue?vue&type=style&index=0&id=02d7c60f&prod&lang=css\"","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _markerClustererPlus = require('marker-clusterer-plus');\n\nvar _markerClustererPlus2 = _interopRequireDefault(_markerClustererPlus);\n\nvar _mapElementFactory = require('./mapElementFactory.js');\n\nvar _mapElementFactory2 = _interopRequireDefault(_mapElementFactory);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } /**\n * @class Cluster\n * @prop $clusterObject -- Exposes the marker clusterer to\n descendent Marker classes. Override this if you area\n extending the class\n \n List of properties from\n https://github.com/googlemaps/v3-utility-library/blob/master/markerclustererplus/src/markerclusterer.js\n **/\n\n\nvar props = {\n maxZoom: {\n type: Number,\n twoWay: false\n },\n batchSizeIE: {\n type: Number,\n twoWay: false\n },\n calculator: {\n type: Function,\n twoWay: false\n },\n enableRetinaIcons: {\n type: Boolean,\n twoWay: false\n },\n gridSize: {\n type: Number,\n twoWay: false\n },\n ignoreHidden: {\n type: Boolean,\n twoWay: false\n },\n imageExtension: {\n type: String,\n twoWay: false\n },\n imagePath: {\n type: String,\n twoWay: false\n },\n imageSizes: {\n type: Array,\n twoWay: false\n },\n minimumClusterSize: {\n type: Number,\n twoWay: false\n },\n styles: {\n type: Array,\n twoWay: false\n },\n zoomOnClick: {\n type: Boolean,\n twoWay: false\n }\n};\n\nvar events = ['click', 'rightclick', 'dblclick', 'drag', 'dragstart', 'dragend', 'mouseup', 'mousedown', 'mouseover', 'mouseout'];\n\nexports.default = (0, _mapElementFactory2.default)({\n mappedProps: props,\n events: events,\n name: 'cluster',\n ctr: function ctr() {\n if (typeof _markerClustererPlus2.default === 'undefined') {\n /* eslint-disable no-console */\n console.error('MarkerClusterer is not installed! require() it or include it from https://cdnjs.cloudflare.com/ajax/libs/js-marker-clusterer/1.0.0/markerclusterer.js');\n throw new Error('MarkerClusterer is not installed! require() it or include it from https://cdnjs.cloudflare.com/ajax/libs/js-marker-clusterer/1.0.0/markerclusterer.js');\n }\n return _markerClustererPlus2.default;\n },\n ctrArgs: function ctrArgs(_ref) {\n var map = _ref.map,\n otherOptions = _objectWithoutProperties(_ref, ['map']);\n\n return [map, [], otherOptions];\n },\n\n render: function render(h) {\n //
\n return h('div', this.$slots.default);\n },\n afterCreate: function afterCreate(inst) {\n var reinsertMarkers = function () {\n var oldMarkers = inst.getMarkers();\n inst.clearMarkers();\n inst.addMarkers(oldMarkers);\n };\n\n for (var prop in props) {\n if (props[prop].twoWay) {\n this.$on(prop.toLowerCase() + '_changed', reinsertMarkers);\n }\n }\n },\n updated: function updated() {\n if (this.$clusterObject) {\n this.$clusterObject.repaint();\n }\n },\n beforeDestroy: function beforeDestroy() {\n var _this = this;\n\n /* Performance optimization when destroying a large number of markers */\n this.$children.forEach(function (marker) {\n if (marker.$clusterObject === _this.$clusterObject) {\n marker.$clusterObject = null;\n }\n });\n\n if (this.$clusterObject) {\n this.$clusterObject.clearMarkers();\n }\n }\n});","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-card',{style:('width: 100% !important; height: 100% !important; overflow: hidden' +\n _vm.backgroundColor)},[(!_vm.multiSensor)?_c('v-row',{style:(`${\n !_vm.horizontalTitle ? 'display: grid; align-items: start;' : ''\n } height: 100%; margin: 0; `)},[_c('v-col',{staticClass:\"d-flex justify-content-left\",style:(`${\n _vm.horizontalTitle\n ? 'height: 100%; align-items: center;'\n : 'align-content: top; align-items: top;'\n } ${_vm.textColor} ${_vm.titleBackground};`)},[_c('div',[_c('v-row',{attrs:{\"no-gutters\":\"\"}},[_c('span',{class:_vm.fontStyle.title.weight + ' text-left',style:(`width: 100%; font-size: ${_vm.fontStyle.title.size}rem`)},[_vm._v(\" \"+_vm._s(_vm.module.name === null ? \"\" : _vm.module.title)+\" \")])]),_c('v-row',{attrs:{\"no-gutters\":\"\"}},[_c('span',{class:_vm.fontStyle.title.weight + ' text-left',style:(`width: 100%; font-size: ${\n _vm.fontStyle.title.size * 0.2 + 0.6\n }rem`),attrs:{\"v-if\":!_vm.multiSensor}},[_vm._v(_vm._s(_vm.singleSeries[0] ? _vm.humanDate(_vm.singleSeries[0].createdAt) : \"N/A\"))])])],1)]),_c('v-col',{staticClass:\"d-flex align-center justify-center flex-wrap\",style:(`\n padding: 0;\n ${_vm.horizontalTitle ? 'height: 100%;' : ''}`),attrs:{\"cols\":_vm.horizontalTitle ? 6 : 12}},[_c('div',[_c('v-row',{attrs:{\"no-gutters\":\"\"}},[_c('span',{class:`text-center\n ${_vm.fontStyle.value.weight}`,style:('width: 100%;' +\n _vm.textColor +\n ';font-size: ' +\n _vm.fontStyle.value.size +\n 'rem')},[_vm._v(\" \"+_vm._s(_vm.singleSeries[0] ? _vm.getValue( _vm.singleSeries[0].tagDeveui, _vm.singleSeries[0].key, _vm.singleSeries[0].value ) : \"N/A\")+\" \"),(_vm.metaHasKey(_vm.module.meta, _vm.MetaEnum.ICON))?_c('v-icon',{style:(_vm.textColor),attrs:{\"medium\":_vm.horizontalTitle,\"large\":!_vm.horizontalTitle}},[_vm._v(_vm._s(_vm.getMeta(_vm.module.meta, _vm.MetaEnum.ICON).value))]):_vm._e(),(!_vm.metaHasKey(_vm.module.meta, _vm.MetaEnum.HIDETRENDICON))?_c('v-icon',{attrs:{\"medium\":_vm.horizontalTitle,\"large\":!_vm.horizontalTitle && _vm.fontStyle.value.size < 2.8,\"x-large\":!_vm.horizontalTitle && _vm.fontStyle.value.size > 2.8,\"size\":\"\",\"color\":_vm.singleSeries[0] && _vm.singleSeries[1]\n ? _vm.getTrendColor(\n _vm.singleSeries[0].value,\n _vm.singleSeries[1].value\n )\n : _vm.getTrendColor(null, null)}},[_vm._v(_vm._s(_vm.singleSeries[0] && _vm.singleSeries[1] ? _vm.getTrendIcon(_vm.singleSeries[0].value, _vm.singleSeries[1].value) : _vm.getTrendIcon(null, null)))]):_vm._e()],1)]),_c('v-row',{attrs:{\"no-gutters\":\"\",\"align\":\"start\"}},[(!_vm.metaHasKey(_vm.module.meta, _vm.MetaEnum.SINGLEHIDENODEINFO))?_c('span',{staticClass:\"text-center\",style:('width: 100%;' +\n _vm.textColor +\n ';font-size: ' +\n (_vm.fontStyle.value.size * 0.2 + 0.5) +\n 'rem')},[_vm._v(\" \"+_vm._s(`${_vm.singleSeries[0] ? _vm.singleSeries[0].tag.name : \"N/A\"} - ${ _vm.singleSeries[0] ? _vm.singleSeries[0].label ? _vm.singleSeries[0].label : \"N/A\" : \"N/A\" }`)+\" \")]):_vm._e()])],1),(_vm.hasSparkline)?_c('div',{staticClass:\"d-block mt-2\",staticStyle:{\"width\":\"100%\"}},[_c('sparkline',{attrs:{\"sparkline-data\":_vm.singleSeries.map((it) => ({\n value: it.value,\n })),\"color\":_vm.sparkLineColor,\"label-color\":_vm.sparkLineLabelColor}})],1):_vm._e()])],1):_c('div',{staticClass:\"py-0 d-flex flex-column\",staticStyle:{\"height\":\"100%\"}},[_c('div',[_c('v-col',{style:(`height: 48px; ${_vm.textColor} ${_vm.titleBackground}`),attrs:{\"no-gutters\":\"\",\"align\":\"start\"}},[_c('span',{class:_vm.fontStyle.title.weight + ' text-left',style:(`width: 100%; font-size: ${_vm.fontStyle.title.size}rem`)},[_vm._v(\" \"+_vm._s(_vm.module.name === null ? \"\" : _vm.module.title)+\" \")])])],1),(_vm.data.length > 0)?_c('div',_vm._l((_vm.data),function(item,index){return _c('div',{key:index,staticStyle:{\"height\":\"100%\",\"max-width\":\"100%\",\"padding\":\"0 12px\"}},[_c('v-row',{staticStyle:{\"height\":\"100%\"}},[_c('v-col',{staticClass:\"pa-1 d-flex justify-center flex-column\",attrs:{\"no-gutters\":\"\"}},[_c('span',{staticClass:\"text-left pl-2\",style:('width: 100%;' +\n _vm.textColor +\n ';font-size: ' +\n (_vm.fontStyle.value.size * 0.2 + 0.7) +\n 'rem')},[_vm._v(\" \"+_vm._s(!_vm.metaHasKey(_vm.module.meta, _vm.MetaEnum.SINGLEHIDENODEINFO) ? `${item[0].tag.name} - ${item[0].label}` : `${item[0].label}`)+\" \")]),_c('span',{staticClass:\"text-left pl-2\",class:_vm.fontStyle.title.weight + ' text-left',style:(`width: 100%; font-size: ${\n _vm.fontStyle.title.size * 0.2 + 0.6\n }rem`)},[_vm._v(_vm._s(_vm.humanDate(item[0].createdAt)))])]),_c('v-col',{staticClass:\"pa-1 d-flex justify-center flex-column\",attrs:{\"no-gutters\":\"\"}},[_c('span',{class:`text-center\n ${_vm.fontStyle.value.weight}`,style:('width: 100%;' +\n _vm.textColor +\n ';font-size: ' +\n _vm.fontStyle.value.size +\n 'rem')},[_vm._v(\" \"+_vm._s(_vm.getValue(item[0].tagDeveui, item[0].key, item[0].value))+\" \"),(_vm.metaHasKey(_vm.module.meta, _vm.MetaEnum.ICON))?_c('v-icon',{style:(_vm.textColor),attrs:{\"medium\":_vm.horizontalTitle}},[_vm._v(_vm._s(_vm.getMeta(_vm.module.meta, _vm.MetaEnum.ICON).value))]):_vm._e(),(!_vm.metaHasKey(_vm.module.meta, _vm.MetaEnum.HIDETRENDICON))?_c('v-icon',{attrs:{\"large\":_vm.fontStyle.value.size < 2.8,\"x-large\":_vm.fontStyle.value.size > 2.8,\"size\":\"\",\"color\":_vm.getTrendColor(\n item[0].value,\n item[1] ? item[1].value : item[0].value\n )}},[_vm._v(_vm._s(_vm.getTrendIcon( item[0].value, item[1] ? item[1].value : item[0].value )))]):_vm._e()],1)]),(_vm.hasSparkline)?_c('div',{staticClass:\"d-block mt-2\",staticStyle:{\"width\":\"100%\"}},[_c('sparkline',{attrs:{\"sparkline-data\":item.map((it) => ({\n value: it.value,\n })),\"color\":_vm.sparkLineColor,\"label-color\":_vm.sparkLineLabelColor}})],1):_vm._e()],1),(index < _vm.data.length - 1)?_c('v-divider'):_vm._e()],1)}),0):_vm._e()])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n \n \n \n \n {{ module.name === null ? \"\" : module.title }}\n \n \n \n {{\n singleSeries[0] ? humanDate(singleSeries[0].createdAt) : \"N/A\"\n }}\n \n
\n \n \n \n \n \n {{\n singleSeries[0]\n ? getValue(\n singleSeries[0].tagDeveui,\n singleSeries[0].key,\n singleSeries[0].value\n )\n : \"N/A\"\n }}\n\n {{ getMeta(module.meta, MetaEnum.ICON).value }}\n 2.8\"\n size=\"\"\n :color=\"\n singleSeries[0] && singleSeries[1]\n ? getTrendColor(\n singleSeries[0].value,\n singleSeries[1].value\n )\n : getTrendColor(null, null)\n \"\n v-if=\"!metaHasKey(module.meta, MetaEnum.HIDETRENDICON)\"\n >{{\n singleSeries[0] && singleSeries[1]\n ? getTrendIcon(singleSeries[0].value, singleSeries[1].value)\n : getTrendIcon(null, null)\n }}\n \n \n \n \n {{\n `${singleSeries[0] ? singleSeries[0].tag.name : \"N/A\"} - ${\n singleSeries[0]\n ? singleSeries[0].label\n ? singleSeries[0].label\n : \"N/A\"\n : \"N/A\"\n }`\n }}\n \n \n
\n\n \n ({\n value: it.value,\n }))\n \"\n :color=\"sparkLineColor\"\n :label-color=\"sparkLineLabelColor\"\n />\n
\n \n \n \n \n
\n \n \n {{ module.name === null ? \"\" : module.title }}\n \n \n
\n
0\">\n
\n
\n \n \n {{\n !metaHasKey(module.meta, MetaEnum.SINGLEHIDENODEINFO)\n ? `${item[0].tag.name} - ${item[0].label}`\n : `${item[0].label}`\n }}\n \n {{ humanDate(item[0].createdAt) }}\n \n \n \n {{ getValue(item[0].tagDeveui, item[0].key, item[0].value) }}\n\n {{ getMeta(module.meta, MetaEnum.ICON).value }}\n 2.8\"\n size=\"\"\n :color=\"\n getTrendColor(\n item[0].value,\n item[1] ? item[1].value : item[0].value\n )\n \"\n v-if=\"!metaHasKey(module.meta, MetaEnum.HIDETRENDICON)\"\n >{{\n getTrendIcon(\n item[0].value,\n item[1] ? item[1].value : item[0].value\n )\n }}\n \n \n \n ({\n value: it.value,\n }))\n \"\n :color=\"sparkLineColor\"\n :label-color=\"sparkLineLabelColor\"\n />\n
\n \n
\n
\n
\n
\n \n\n\n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModuleSingle.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModuleSingle.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ModuleSingle.vue?vue&type=template&id=af4a593a&scoped=true\"\nimport script from \"./ModuleSingle.vue?vue&type=script&lang=js\"\nexport * from \"./ModuleSingle.vue?vue&type=script&lang=js\"\nimport style0 from \"./ModuleSingle.vue?vue&type=style&index=0&id=af4a593a&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"af4a593a\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-card',{style:('width: 100% !important; height: 100%; overflow: hidden;' +\n (_vm.soMetaBackgroundColorCard\n ? 'background-color: ' + _vm.soMetaBackgroundColorCard\n : ''))},[_c('v-row',{staticStyle:{\"height\":\"100%\",\"margin\":\"0px\"}},[(!_vm.titleHidden)?_c('v-toolbar',{style:(_vm.titleColor ? _vm.titleColor : 'background: transparent;'),attrs:{\"dense\":\"\",\"flat\":\"\"}},[_c('v-toolbar-title',{style:(_vm.soMetaTextColorTitle ? 'color: ' + _vm.soMetaTextColorTitle : '')},[_vm._v(_vm._s(_vm.module.title))])],1):_vm._e(),_c('v-container',{staticClass:\"pa-0 ma-0 align-center justify-center\"},[_c('v-row',{staticClass:\"pa-0 ma-0 justify-center\",staticStyle:{\"height\":\"100%\"}},[(!_vm.infoHidden)?_c('v-card-text',{staticClass:\"pa-2\"},[_vm._v(_vm._s(_vm.getDescription + (_vm.targetName === null ? \"N/A\" : _vm.targetName)))]):_vm._e(),(_vm.functionType != _vm.types.ONOFFSWITCH)?_c('v-card-actions',{class:!_vm.infoHidden ? 'pt-0 mt-0' : ''},[_c('v-btn',{class:!_vm.infoHidden ? 'mb-5' : '',staticStyle:{\"margin\":\"0 auto\",\"min-width\":\"10vh\"},attrs:{\"color\":\"primary\",\"disabled\":_vm.buttonDisabled},on:{\"click\":function($event){return _vm.buttonClick()}}},[_vm._v(\" \"+_vm._s(_vm.buttonLabel && 30 > _vm.buttonLabel.length ? _vm.buttonLabel : _vm.functionType == _vm.types.VALUEINPUT ? _vm.$t(\"common.create\") : _vm.$t(\"common.run\"))+\" \")])],1):_c('v-card-actions',{class:!_vm.infoHidden ? 'pt-0 mt-0 pb-5' : 'pb-2'},[_c('v-row',{staticClass:\"pa-0 my-0 justify-center\",staticStyle:{\"overflow\":\"hidden\"}},[_c('v-btn',{staticStyle:{\"min-width\":\"8vh\"},attrs:{\"color\":\"success\",\"disabled\":_vm.buttonDisabled || _vm.currentValue == 1},on:{\"click\":function($event){return _vm.buttonOnoff(1)}}},[_vm._v(\" \"+_vm._s(_vm.buttonLabel && _vm.buttonLabel.on != null ? _vm.buttonLabel.on : _vm.$t(\"common.on\"))+\" \")]),_c('div',{staticClass:\"px-1 py-5\"}),_c('v-btn',{staticStyle:{\"min-width\":\"8vh\"},attrs:{\"color\":\"error\",\"disabled\":_vm.buttonDisabled || _vm.currentValue == 0},on:{\"click\":function($event){return _vm.buttonOnoff(0)}}},[_vm._v(\" \"+_vm._s(_vm.buttonLabel && _vm.buttonLabel.off != null ? _vm.buttonLabel.off : _vm.$t(\"common.off\"))+\" \")]),_c('div',{staticClass:\"px-1\"})],1)],1)],1)],1),_c('v-dialog',{attrs:{\"max-width\":\"400px\"},model:{value:(_vm.dialog),callback:function ($$v) {_vm.dialog=$$v},expression:\"dialog\"}},[_c('v-card',[_c('v-card-title',[_c('span',{staticClass:\"headline\"},[_vm._v(_vm._s(_vm.$t(\"common.run\")))])]),_c('v-card-text',[_vm._v(\" \"+_vm._s(_vm.$t(\"common.verify\"))+\" \")]),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"text\":\"\"},on:{\"click\":function($event){_vm.dialog = false}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.no\"))+\" \")]),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"text\":\"\"},on:{\"click\":function($event){return _vm.submit()}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.yes\"))+\" \")])],1)],1)],1),_c('v-dialog',{attrs:{\"max-width\":\"400px\"},model:{value:(_vm.valueDialog),callback:function ($$v) {_vm.valueDialog=$$v},expression:\"valueDialog\"}},[_c('v-card',[_c('v-card-title',[_c('span',{staticClass:\"headline\"},[_vm._v(_vm._s(_vm.$t(\"module.functionButtonTypes.input\")))])]),_c('v-text-field',{staticClass:\"mx-5 mt-3\",attrs:{\"label\":_vm.$t('common.newValue'),\"mx-5\":\"\",\"outlined\":\"\"},model:{value:(_vm.inputValue),callback:function ($$v) {_vm.inputValue=$$v},expression:\"inputValue\"}}),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"text\":\"\"},on:{\"click\":function($event){_vm.valueDialog = false}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.cancel\"))+\" \")]),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"text\":\"\"},on:{\"click\":function($event){return _vm.submit()}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.submit\"))+\" \")])],1)],1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n \r\n {{ module.title }}\r\n \r\n \r\n \r\n {{\r\n getDescription + (targetName === null ? \"N/A\" : targetName)\r\n }}\r\n \r\n \r\n {{\r\n buttonLabel && 30 > buttonLabel.length\r\n ? buttonLabel\r\n : functionType == types.VALUEINPUT\r\n ? $t(\"common.create\")\r\n : $t(\"common.run\")\r\n }}\r\n \r\n \r\n \r\n \r\n \r\n {{\r\n buttonLabel && buttonLabel.on != null\r\n ? buttonLabel.on\r\n : $t(\"common.on\")\r\n }}\r\n \r\n \r\n \r\n {{\r\n buttonLabel && buttonLabel.off != null\r\n ? buttonLabel.off\r\n : $t(\"common.off\")\r\n }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ $t(\"common.run\") }}\r\n \r\n \r\n {{ $t(\"common.verify\") }}\r\n \r\n \r\n \r\n \r\n {{ $t(\"common.no\") }}\r\n \r\n \r\n {{ $t(\"common.yes\") }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{\r\n $t(\"module.functionButtonTypes.input\")\r\n }}\r\n \r\n \r\n \r\n \r\n \r\n {{ $t(\"common.cancel\") }}\r\n \r\n \r\n {{ $t(\"common.submit\") }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModFunctionButton.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModFunctionButton.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ModFunctionButton.vue?vue&type=template&id=8d1a6bf2\"\nimport script from \"./ModFunctionButton.vue?vue&type=script&lang=js\"\nexport * from \"./ModFunctionButton.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-card',{style:('height: 100%; overflow: hidden;' +\n (_vm.soMetaBackgroundColorCard\n ? 'background-color: ' + _vm.soMetaBackgroundColorCard\n : ''))},[_c('ChartControl',{attrs:{\"enabled\":_vm.settingsEnabled,\"loading\":_vm.loading,\"module\":_vm.module,\"titleTextColor\":_vm.soMetaTextColorTitle},on:{\"update-ranges\":_vm.newData}}),_c('v-row',{style:(_vm.fakeData != false ? 'height: 300px' : 'height: 90%'),attrs:{\"no-gutters\":\"\"}},[(_vm.opts.series.length > 0)?_c('e-chart',{staticStyle:{\"width\":\"100%\",\"max-width\":\"100%\",\"min-height\":\"100%\",\"max-height\":\"100%\"},attrs:{\"option\":_vm.opts,\"autoresize\":true,\"theme\":this.darkmode ? 'sensoronlinedark' : 'macarons'}}):_vm._e()],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n \r\n 0\"\r\n :option=\"opts\"\r\n style=\"width: 100%; max-width: 100%; min-height: 100%; max-height: 100%\"\r\n :autoresize=\"true\"\r\n :theme=\"this.darkmode ? 'sensoronlinedark' : 'macarons'\"\r\n />\r\n \r\n \r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Multichart.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Multichart.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./Multichart.vue?vue&type=template&id=e6028a9a\"\nimport script from \"./Multichart.vue?vue&type=script&lang=js\"\nexport * from \"./Multichart.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","/**\n * @name MarkerClustererPlus for Google Maps V3\n * @version 2.1.2 [May 28, 2014]\n * @author Gary Little\n * @fileoverview\n * The library creates and manages per-zoom-level clusters for large amounts of markers.\n * \n * This is an enhanced V3 implementation of the\n * V2 MarkerClusterer by Xiaoxi Wu. It is based on the\n * V3 MarkerClusterer port by Luke Mahe. MarkerClustererPlus was created by Gary Little.\n *
\n * v2.0 release: MarkerClustererPlus v2.0 is backward compatible with MarkerClusterer v1.0. It\n * adds support for the ignoreHidden
, title
, batchSizeIE
,\n * and calculator
properties as well as support for four more events. It also allows\n * greater control over the styling of the text that appears on the cluster marker. The\n * documentation has been significantly improved and the overall code has been simplified and\n * polished. Very large numbers of markers can now be managed without causing Javascript timeout\n * errors on Internet Explorer. Note that the name of the clusterclick
event has been\n * deprecated. The new name is click
, so please change your application code now.\n */\n\n/**\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * @name ClusterIconStyle\n * @class This class represents the object for values in the styles
array passed\n * to the {@link MarkerClusterer} constructor. The element in this array that is used to\n * style the cluster icon is determined by calling the calculator
function.\n *\n * @property {string} url The URL of the cluster icon image file. Required.\n * @property {number} height The display height (in pixels) of the cluster icon. Required.\n * @property {number} width The display width (in pixels) of the cluster icon. Required.\n * @property {Array} [anchorText] The position (in pixels) from the center of the cluster icon to\n * where the text label is to be centered and drawn. The format is [yoffset, xoffset]
\n * where yoffset
increases as you go down from center and xoffset
\n * increases to the right of center. The default is [0, 0]
.\n * @property {Array} [anchorIcon] The anchor position (in pixels) of the cluster icon. This is the\n * spot on the cluster icon that is to be aligned with the cluster position. The format is\n * [yoffset, xoffset]
where yoffset
increases as you go down and\n * xoffset
increases to the right of the top-left corner of the icon. The default\n * anchor position is the center of the cluster icon.\n * @property {string} [textColor=\"black\"] The color of the label text shown on the\n * cluster icon.\n * @property {number} [textSize=11] The size (in pixels) of the label text shown on the\n * cluster icon.\n * @property {string} [textDecoration=\"none\"] The value of the CSS text-decoration
\n * property for the label text shown on the cluster icon.\n * @property {string} [fontWeight=\"bold\"] The value of the CSS font-weight
\n * property for the label text shown on the cluster icon.\n * @property {string} [fontStyle=\"normal\"] The value of the CSS font-style
\n * property for the label text shown on the cluster icon.\n * @property {string} [fontFamily=\"Arial,sans-serif\"] The value of the CSS font-family
\n * property for the label text shown on the cluster icon.\n * @property {string} [backgroundPosition=\"0 0\"] The position of the cluster icon image\n * within the image defined by url
. The format is \"xpos ypos\"
\n * (the same format as for the CSS background-position
property). You must set\n * this property appropriately when the image defined by url
represents a sprite\n * containing multiple images. Note that the position must be specified in px units.\n */\n/**\n * @name ClusterIconInfo\n * @class This class is an object containing general information about a cluster icon. This is\n * the object that a calculator
function returns.\n *\n * @property {string} text The text of the label to be shown on the cluster icon.\n * @property {number} index The index plus 1 of the element in the styles
\n * array to be used to style the cluster icon.\n * @property {string} title The tooltip to display when the mouse moves over the cluster icon.\n * If this value is undefined
or \"\"
, title
is set to the\n * value of the title
property passed to the MarkerClusterer.\n */\n/**\n * A cluster icon.\n *\n * @constructor\n * @extends google.maps.OverlayView\n * @param {Cluster} cluster The cluster with which the icon is to be associated.\n * @param {Array} [styles] An array of {@link ClusterIconStyle} defining the cluster icons\n * to use for various cluster sizes.\n * @private\n */\nfunction ClusterIcon(cluster, styles) {\n cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView);\n\n this.cluster_ = cluster;\n this.className_ = cluster.getMarkerClusterer().getClusterClass();\n this.styles_ = styles;\n this.center_ = null;\n this.div_ = null;\n this.sums_ = null;\n this.visible_ = false;\n\n this.setMap(cluster.getMap()); // Note: this causes onAdd to be called\n}\n\n\n/**\n * Adds the icon to the DOM.\n */\nClusterIcon.prototype.onAdd = function () {\n var cClusterIcon = this;\n var cMouseDownInCluster;\n var cDraggingMapByCluster;\n\n this.div_ = document.createElement(\"div\");\n this.div_.className = this.className_;\n if (this.visible_) {\n this.show();\n }\n\n this.getPanes().overlayMouseTarget.appendChild(this.div_);\n\n // Fix for Issue 157\n this.boundsChangedListener_ = google.maps.event.addListener(this.getMap(), \"bounds_changed\", function () {\n cDraggingMapByCluster = cMouseDownInCluster;\n });\n\n google.maps.event.addDomListener(this.div_, \"mousedown\", function () {\n cMouseDownInCluster = true;\n cDraggingMapByCluster = false;\n });\n\n google.maps.event.addDomListener(this.div_, \"click\", function (e) {\n cMouseDownInCluster = false;\n if (!cDraggingMapByCluster) {\n var theBounds;\n var mz;\n var mc = cClusterIcon.cluster_.getMarkerClusterer();\n /**\n * This event is fired when a cluster marker is clicked.\n * @name MarkerClusterer#click\n * @param {Cluster} c The cluster that was clicked.\n * @event\n */\n google.maps.event.trigger(mc, \"click\", cClusterIcon.cluster_);\n google.maps.event.trigger(mc, \"clusterclick\", cClusterIcon.cluster_); // deprecated name\n\n // The default click handler follows. Disable it by setting\n // the zoomOnClick property to false.\n if (mc.getZoomOnClick()) {\n // Zoom into the cluster.\n mz = mc.getMaxZoom();\n theBounds = cClusterIcon.cluster_.getBounds();\n mc.getMap().fitBounds(theBounds);\n // There is a fix for Issue 170 here:\n setTimeout(function () {\n mc.getMap().fitBounds(theBounds);\n // Don't zoom beyond the max zoom level\n if (mz !== null && (mc.getMap().getZoom() > mz)) {\n mc.getMap().setZoom(mz + 1);\n }\n }, 100);\n }\n\n // Prevent event propagation to the map:\n e.cancelBubble = true;\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n }\n });\n\n google.maps.event.addDomListener(this.div_, \"mouseover\", function () {\n var mc = cClusterIcon.cluster_.getMarkerClusterer();\n /**\n * This event is fired when the mouse moves over a cluster marker.\n * @name MarkerClusterer#mouseover\n * @param {Cluster} c The cluster that the mouse moved over.\n * @event\n */\n google.maps.event.trigger(mc, \"mouseover\", cClusterIcon.cluster_);\n });\n\n google.maps.event.addDomListener(this.div_, \"mouseout\", function () {\n var mc = cClusterIcon.cluster_.getMarkerClusterer();\n /**\n * This event is fired when the mouse moves out of a cluster marker.\n * @name MarkerClusterer#mouseout\n * @param {Cluster} c The cluster that the mouse moved out of.\n * @event\n */\n google.maps.event.trigger(mc, \"mouseout\", cClusterIcon.cluster_);\n });\n};\n\n\n/**\n * Removes the icon from the DOM.\n */\nClusterIcon.prototype.onRemove = function () {\n if (this.div_ && this.div_.parentNode) {\n this.hide();\n google.maps.event.removeListener(this.boundsChangedListener_);\n google.maps.event.clearInstanceListeners(this.div_);\n this.div_.parentNode.removeChild(this.div_);\n this.div_ = null;\n }\n};\n\n\n/**\n * Draws the icon.\n */\nClusterIcon.prototype.draw = function () {\n if (this.visible_) {\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.top = pos.y + \"px\";\n this.div_.style.left = pos.x + \"px\";\n }\n};\n\n\n/**\n * Hides the icon.\n */\nClusterIcon.prototype.hide = function () {\n if (this.div_) {\n this.div_.style.display = \"none\";\n }\n this.visible_ = false;\n};\n\n\n/**\n * Positions and shows the icon.\n */\nClusterIcon.prototype.show = function () {\n if (this.div_) {\n var img = \"\";\n // NOTE: values must be specified in px units\n var bp = this.backgroundPosition_.split(\" \");\n var spriteH = parseInt(bp[0].replace(/^\\s+|\\s+$/g, \"\"), 10);\n var spriteV = parseInt(bp[1].replace(/^\\s+|\\s+$/g, \"\"), 10);\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.cssText = this.createCss(pos);\n img = \"
\";\n this.div_.innerHTML = img + \"
\" + this.sums_.text + \"
\";\n if (typeof this.sums_.title === \"undefined\" || this.sums_.title === \"\") {\n this.div_.title = this.cluster_.getMarkerClusterer().getTitle();\n } else {\n this.div_.title = this.sums_.title;\n }\n this.div_.style.display = \"\";\n }\n this.visible_ = true;\n};\n\n\n/**\n * Sets the icon styles to the appropriate element in the styles array.\n *\n * @param {ClusterIconInfo} sums The icon label text and styles index.\n */\nClusterIcon.prototype.useStyle = function (sums) {\n this.sums_ = sums;\n var index = Math.max(0, sums.index - 1);\n index = Math.min(this.styles_.length - 1, index);\n var style = this.styles_[index];\n this.url_ = style.url;\n this.height_ = style.height;\n this.width_ = style.width;\n this.anchorText_ = style.anchorText || [0, 0];\n this.anchorIcon_ = style.anchorIcon || [parseInt(this.height_ / 2, 10), parseInt(this.width_ / 2, 10)];\n this.textColor_ = style.textColor || \"black\";\n this.textSize_ = style.textSize || 11;\n this.textDecoration_ = style.textDecoration || \"none\";\n this.fontWeight_ = style.fontWeight || \"bold\";\n this.fontStyle_ = style.fontStyle || \"normal\";\n this.fontFamily_ = style.fontFamily || \"Arial,sans-serif\";\n this.backgroundPosition_ = style.backgroundPosition || \"0 0\";\n};\n\n\n/**\n * Sets the position at which to center the icon.\n *\n * @param {google.maps.LatLng} center The latlng to set as the center.\n */\nClusterIcon.prototype.setCenter = function (center) {\n this.center_ = center;\n};\n\n\n/**\n * Creates the cssText style parameter based on the position of the icon.\n *\n * @param {google.maps.Point} pos The position of the icon.\n * @return {string} The CSS style text.\n */\nClusterIcon.prototype.createCss = function (pos) {\n var style = [];\n style.push(\"cursor: pointer;\");\n style.push(\"position: absolute; top: \" + pos.y + \"px; left: \" + pos.x + \"px;\");\n style.push(\"width: \" + this.width_ + \"px; height: \" + this.height_ + \"px;\");\n return style.join(\"\");\n};\n\n\n/**\n * Returns the position at which to place the DIV depending on the latlng.\n *\n * @param {google.maps.LatLng} latlng The position in latlng.\n * @return {google.maps.Point} The position in pixels.\n */\nClusterIcon.prototype.getPosFromLatLng_ = function (latlng) {\n var pos = this.getProjection().fromLatLngToDivPixel(latlng);\n pos.x -= this.anchorIcon_[1];\n pos.y -= this.anchorIcon_[0];\n pos.x = parseInt(pos.x, 10);\n pos.y = parseInt(pos.y, 10);\n return pos;\n};\n\n\n/**\n * Creates a single cluster that manages a group of proximate markers.\n * Used internally, do not call this constructor directly.\n * @constructor\n * @param {MarkerClusterer} mc The MarkerClusterer
object with which this\n * cluster is associated.\n */\nfunction Cluster(mc) {\n this.markerClusterer_ = mc;\n this.map_ = mc.getMap();\n this.gridSize_ = mc.getGridSize();\n this.minClusterSize_ = mc.getMinimumClusterSize();\n this.averageCenter_ = mc.getAverageCenter();\n this.markers_ = [];\n this.center_ = null;\n this.bounds_ = null;\n this.clusterIcon_ = new ClusterIcon(this, mc.getStyles());\n}\n\n\n/**\n * Returns the number of markers managed by the cluster. You can call this from\n * a click
, mouseover
, or mouseout
event handler\n * for the MarkerClusterer
object.\n *\n * @return {number} The number of markers in the cluster.\n */\nCluster.prototype.getSize = function () {\n return this.markers_.length;\n};\n\n\n/**\n * Returns the array of markers managed by the cluster. You can call this from\n * a click
, mouseover
, or mouseout
event handler\n * for the MarkerClusterer
object.\n *\n * @return {Array} The array of markers in the cluster.\n */\nCluster.prototype.getMarkers = function () {\n return this.markers_;\n};\n\n\n/**\n * Returns the center of the cluster. You can call this from\n * a click
, mouseover
, or mouseout
event handler\n * for the MarkerClusterer
object.\n *\n * @return {google.maps.LatLng} The center of the cluster.\n */\nCluster.prototype.getCenter = function () {\n return this.center_;\n};\n\n\n/**\n * Returns the map with which the cluster is associated.\n *\n * @return {google.maps.Map} The map.\n * @ignore\n */\nCluster.prototype.getMap = function () {\n return this.map_;\n};\n\n\n/**\n * Returns the MarkerClusterer
object with which the cluster is associated.\n *\n * @return {MarkerClusterer} The associated marker clusterer.\n * @ignore\n */\nCluster.prototype.getMarkerClusterer = function () {\n return this.markerClusterer_;\n};\n\n\n/**\n * Returns the bounds of the cluster.\n *\n * @return {google.maps.LatLngBounds} the cluster bounds.\n * @ignore\n */\nCluster.prototype.getBounds = function () {\n var i;\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\n var markers = this.getMarkers();\n for (i = 0; i < markers.length; i++) {\n bounds.extend(markers[i].getPosition());\n }\n return bounds;\n};\n\n\n/**\n * Removes the cluster from the map.\n *\n * @ignore\n */\nCluster.prototype.remove = function () {\n this.clusterIcon_.setMap(null);\n this.markers_ = [];\n delete this.markers_;\n};\n\n\n/**\n * Adds a marker to the cluster.\n *\n * @param {google.maps.Marker} marker The marker to be added.\n * @return {boolean} True if the marker was added.\n * @ignore\n */\nCluster.prototype.addMarker = function (marker) {\n var i;\n var mCount;\n var mz;\n\n if (this.isMarkerAlreadyAdded_(marker)) {\n return false;\n }\n\n if (!this.center_) {\n this.center_ = marker.getPosition();\n this.calculateBounds_();\n } else {\n if (this.averageCenter_) {\n var l = this.markers_.length + 1;\n var lat = (this.center_.lat() * (l - 1) + marker.getPosition().lat()) / l;\n var lng = (this.center_.lng() * (l - 1) + marker.getPosition().lng()) / l;\n this.center_ = new google.maps.LatLng(lat, lng);\n this.calculateBounds_();\n }\n }\n\n marker.isAdded = true;\n this.markers_.push(marker);\n\n mCount = this.markers_.length;\n mz = this.markerClusterer_.getMaxZoom();\n if (mz !== null && this.map_.getZoom() > mz) {\n // Zoomed in past max zoom, so show the marker.\n if (marker.getMap() !== this.map_) {\n marker.setMap(this.map_);\n }\n } else if (mCount < this.minClusterSize_) {\n // Min cluster size not reached so show the marker.\n if (marker.getMap() !== this.map_) {\n marker.setMap(this.map_);\n }\n } else if (mCount === this.minClusterSize_) {\n // Hide the markers that were showing.\n for (i = 0; i < mCount; i++) {\n this.markers_[i].setMap(null);\n }\n } else {\n marker.setMap(null);\n }\n\n this.updateIcon_();\n return true;\n};\n\n\n/**\n * Determines if a marker lies within the cluster's bounds.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @return {boolean} True if the marker lies in the bounds.\n * @ignore\n */\nCluster.prototype.isMarkerInClusterBounds = function (marker) {\n return this.bounds_.contains(marker.getPosition());\n};\n\n\n/**\n * Calculates the extended bounds of the cluster with the grid.\n */\nCluster.prototype.calculateBounds_ = function () {\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\n this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds);\n};\n\n\n/**\n * Updates the cluster icon.\n */\nCluster.prototype.updateIcon_ = function () {\n var mCount = this.markers_.length;\n var mz = this.markerClusterer_.getMaxZoom();\n\n if (mz !== null && this.map_.getZoom() > mz) {\n this.clusterIcon_.hide();\n return;\n }\n\n if (mCount < this.minClusterSize_) {\n // Min cluster size not yet reached.\n this.clusterIcon_.hide();\n return;\n }\n\n var numStyles = this.markerClusterer_.getStyles().length;\n var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles);\n this.clusterIcon_.setCenter(this.center_);\n this.clusterIcon_.useStyle(sums);\n this.clusterIcon_.show();\n};\n\n\n/**\n * Determines if a marker has already been added to the cluster.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @return {boolean} True if the marker has already been added.\n */\nCluster.prototype.isMarkerAlreadyAdded_ = function (marker) {\n var i;\n if (this.markers_.indexOf) {\n return this.markers_.indexOf(marker) !== -1;\n } else {\n for (i = 0; i < this.markers_.length; i++) {\n if (marker === this.markers_[i]) {\n return true;\n }\n }\n }\n return false;\n};\n\n\n/**\n * @name MarkerClustererOptions\n * @class This class represents the optional parameter passed to\n * the {@link MarkerClusterer} constructor.\n * @property {number} [gridSize=60] The grid size of a cluster in pixels. The grid is a square.\n * @property {number} [maxZoom=null] The maximum zoom level at which clustering is enabled or\n * null
if clustering is to be enabled at all zoom levels.\n * @property {boolean} [zoomOnClick=true] Whether to zoom the map when a cluster marker is\n * clicked. You may want to set this to false
if you have installed a handler\n * for the click
event and it deals with zooming on its own.\n * @property {boolean} [averageCenter=false] Whether the position of a cluster marker should be\n * the average position of all markers in the cluster. If set to false
, the\n * cluster marker is positioned at the location of the first marker added to the cluster.\n * @property {number} [minimumClusterSize=2] The minimum number of markers needed in a cluster\n * before the markers are hidden and a cluster marker appears.\n * @property {boolean} [ignoreHidden=false] Whether to ignore hidden markers in clusters. You\n * may want to set this to true
to ensure that hidden markers are not included\n * in the marker count that appears on a cluster marker (this count is the value of the\n * text
property of the result returned by the default calculator
).\n * If set to true
and you change the visibility of a marker being clustered, be\n * sure to also call MarkerClusterer.repaint()
.\n * @property {string} [title=\"\"] The tooltip to display when the mouse moves over a cluster\n * marker. (Alternatively, you can use a custom calculator
function to specify a\n * different tooltip for each cluster marker.)\n * @property {function} [calculator=MarkerClusterer.CALCULATOR] The function used to determine\n * the text to be displayed on a cluster marker and the index indicating which style to use\n * for the cluster marker. The input parameters for the function are (1) the array of markers\n * represented by a cluster marker and (2) the number of cluster icon styles. It returns a\n * {@link ClusterIconInfo} object. The default calculator
returns a\n * text
property which is the number of markers in the cluster and an\n * index
property which is one higher than the lowest integer such that\n * 10^i
exceeds the number of markers in the cluster, or the size of the styles\n * array, whichever is less. The styles
array element used has an index of\n * index
minus 1. For example, the default calculator
returns a\n * text
value of \"125\"
and an index
of 3
\n * for a cluster icon representing 125 markers so the element used in the styles
\n * array is 2
. A calculator
may also return a title
\n * property that contains the text of the tooltip to be used for the cluster marker. If\n * title
is not defined, the tooltip is set to the value of the title
\n * property for the MarkerClusterer.\n * @property {string} [clusterClass=\"cluster\"] The name of the CSS class defining general styles\n * for the cluster markers. Use this class to define CSS styles that are not set up by the code\n * that processes the styles
array.\n * @property {Array} [styles] An array of {@link ClusterIconStyle} elements defining the styles\n * of the cluster markers to be used. The element to be used to style a given cluster marker\n * is determined by the function defined by the calculator
property.\n * The default is an array of {@link ClusterIconStyle} elements whose properties are derived\n * from the values for imagePath
, imageExtension
, and\n * imageSizes
.\n * @property {boolean} [enableRetinaIcons=false] Whether to allow the use of cluster icons that\n * have sizes that are some multiple (typically double) of their actual display size. Icons such\n * as these look better when viewed on high-resolution monitors such as Apple's Retina displays.\n * Note: if this property is true
, sprites cannot be used as cluster icons.\n * @property {number} [batchSize=MarkerClusterer.BATCH_SIZE] Set this property to the\n * number of markers to be processed in a single batch when using a browser other than\n * Internet Explorer (for Internet Explorer, use the batchSizeIE property instead).\n * @property {number} [batchSizeIE=MarkerClusterer.BATCH_SIZE_IE] When Internet Explorer is\n * being used, markers are processed in several batches with a small delay inserted between\n * each batch in an attempt to avoid Javascript timeout errors. Set this property to the\n * number of markers to be processed in a single batch; select as high a number as you can\n * without causing a timeout error in the browser. This number might need to be as low as 100\n * if 15,000 markers are being managed, for example.\n * @property {string} [imagePath=MarkerClusterer.IMAGE_PATH]\n * The full URL of the root name of the group of image files to use for cluster icons.\n * The complete file name is of the form imagePath
n.imageExtension
\n * where n is the image file number (1, 2, etc.).\n * @property {string} [imageExtension=MarkerClusterer.IMAGE_EXTENSION]\n * The extension name for the cluster icon image files (e.g., \"png\"
or\n * \"jpg\"
).\n * @property {Array} [imageSizes=MarkerClusterer.IMAGE_SIZES]\n * An array of numbers containing the widths of the group of\n * imagePath
n.imageExtension
image files.\n * (The images are assumed to be square.)\n */\n/**\n * Creates a MarkerClusterer object with the options specified in {@link MarkerClustererOptions}.\n * @constructor\n * @extends google.maps.OverlayView\n * @param {google.maps.Map} map The Google map to attach to.\n * @param {Array.} [opt_markers] The markers to be added to the cluster.\n * @param {MarkerClustererOptions} [opt_options] The optional parameters.\n */\nfunction MarkerClusterer(map, opt_markers, opt_options) {\n // MarkerClusterer implements google.maps.OverlayView interface. We use the\n // extend function to extend MarkerClusterer with google.maps.OverlayView\n // because it might not always be available when the code is defined so we\n // look for it at the last possible moment. If it doesn't exist now then\n // there is no point going ahead :)\n this.extend(MarkerClusterer, google.maps.OverlayView);\n\n opt_markers = opt_markers || [];\n opt_options = opt_options || {};\n\n this.markers_ = [];\n this.clusters_ = [];\n this.listeners_ = [];\n this.activeMap_ = null;\n this.ready_ = false;\n\n this.gridSize_ = opt_options.gridSize || 60;\n this.minClusterSize_ = opt_options.minimumClusterSize || 2;\n this.maxZoom_ = opt_options.maxZoom || null;\n this.styles_ = opt_options.styles || [];\n this.title_ = opt_options.title || \"\";\n this.zoomOnClick_ = true;\n if (opt_options.zoomOnClick !== undefined) {\n this.zoomOnClick_ = opt_options.zoomOnClick;\n }\n this.averageCenter_ = false;\n if (opt_options.averageCenter !== undefined) {\n this.averageCenter_ = opt_options.averageCenter;\n }\n this.ignoreHidden_ = false;\n if (opt_options.ignoreHidden !== undefined) {\n this.ignoreHidden_ = opt_options.ignoreHidden;\n }\n this.enableRetinaIcons_ = false;\n if (opt_options.enableRetinaIcons !== undefined) {\n this.enableRetinaIcons_ = opt_options.enableRetinaIcons;\n }\n this.imagePath_ = opt_options.imagePath || MarkerClusterer.IMAGE_PATH;\n this.imageExtension_ = opt_options.imageExtension || MarkerClusterer.IMAGE_EXTENSION;\n this.imageSizes_ = opt_options.imageSizes || MarkerClusterer.IMAGE_SIZES;\n this.calculator_ = opt_options.calculator || MarkerClusterer.CALCULATOR;\n this.batchSize_ = opt_options.batchSize || MarkerClusterer.BATCH_SIZE;\n this.batchSizeIE_ = opt_options.batchSizeIE || MarkerClusterer.BATCH_SIZE_IE;\n this.clusterClass_ = opt_options.clusterClass || \"cluster\";\n\n if (navigator.userAgent.toLowerCase().indexOf(\"msie\") !== -1) {\n // Try to avoid IE timeout when processing a huge number of markers:\n this.batchSize_ = this.batchSizeIE_;\n }\n\n this.setupStyles_();\n\n this.addMarkers(opt_markers, true);\n this.setMap(map); // Note: this causes onAdd to be called\n}\n\n\n/**\n * Implementation of the onAdd interface method.\n * @ignore\n */\nMarkerClusterer.prototype.onAdd = function () {\n var cMarkerClusterer = this;\n\n this.activeMap_ = this.getMap();\n this.ready_ = true;\n\n this.repaint();\n\n // Add the map event listeners\n this.listeners_ = [\n google.maps.event.addListener(this.getMap(), \"zoom_changed\", function () {\n cMarkerClusterer.resetViewport_(false);\n // Workaround for this Google bug: when map is at level 0 and \"-\" of\n // zoom slider is clicked, a \"zoom_changed\" event is fired even though\n // the map doesn't zoom out any further. In this situation, no \"idle\"\n // event is triggered so the cluster markers that have been removed\n // do not get redrawn. Same goes for a zoom in at maxZoom.\n if (this.getZoom() === (this.get(\"minZoom\") || 0) || this.getZoom() === this.get(\"maxZoom\")) {\n google.maps.event.trigger(this, \"idle\");\n }\n }),\n google.maps.event.addListener(this.getMap(), \"idle\", function () {\n cMarkerClusterer.redraw_();\n })\n ];\n};\n\n\n/**\n * Implementation of the onRemove interface method.\n * Removes map event listeners and all cluster icons from the DOM.\n * All managed markers are also put back on the map.\n * @ignore\n */\nMarkerClusterer.prototype.onRemove = function () {\n var i;\n\n // Put all the managed markers back on the map:\n for (i = 0; i < this.markers_.length; i++) {\n if (this.markers_[i].getMap() !== this.activeMap_) {\n this.markers_[i].setMap(this.activeMap_);\n }\n }\n\n // Remove all clusters:\n for (i = 0; i < this.clusters_.length; i++) {\n this.clusters_[i].remove();\n }\n this.clusters_ = [];\n\n // Remove map event listeners:\n for (i = 0; i < this.listeners_.length; i++) {\n google.maps.event.removeListener(this.listeners_[i]);\n }\n this.listeners_ = [];\n\n this.activeMap_ = null;\n this.ready_ = false;\n};\n\n\n/**\n * Implementation of the draw interface method.\n * @ignore\n */\nMarkerClusterer.prototype.draw = function () {};\n\n\n/**\n * Sets up the styles object.\n */\nMarkerClusterer.prototype.setupStyles_ = function () {\n var i, size;\n if (this.styles_.length > 0) {\n return;\n }\n\n for (i = 0; i < this.imageSizes_.length; i++) {\n size = this.imageSizes_[i];\n this.styles_.push({\n url: this.imagePath_ + (i + 1) + \".\" + this.imageExtension_,\n height: size,\n width: size\n });\n }\n};\n\n\n/**\n * Fits the map to the bounds of the markers managed by the clusterer.\n */\nMarkerClusterer.prototype.fitMapToMarkers = function () {\n var i;\n var markers = this.getMarkers();\n var bounds = new google.maps.LatLngBounds();\n for (i = 0; i < markers.length; i++) {\n bounds.extend(markers[i].getPosition());\n }\n\n this.getMap().fitBounds(bounds);\n};\n\n\n/**\n * Returns the value of the gridSize
property.\n *\n * @return {number} The grid size.\n */\nMarkerClusterer.prototype.getGridSize = function () {\n return this.gridSize_;\n};\n\n\n/**\n * Sets the value of the gridSize
property.\n *\n * @param {number} gridSize The grid size.\n */\nMarkerClusterer.prototype.setGridSize = function (gridSize) {\n this.gridSize_ = gridSize;\n};\n\n\n/**\n * Returns the value of the minimumClusterSize
property.\n *\n * @return {number} The minimum cluster size.\n */\nMarkerClusterer.prototype.getMinimumClusterSize = function () {\n return this.minClusterSize_;\n};\n\n/**\n * Sets the value of the minimumClusterSize
property.\n *\n * @param {number} minimumClusterSize The minimum cluster size.\n */\nMarkerClusterer.prototype.setMinimumClusterSize = function (minimumClusterSize) {\n this.minClusterSize_ = minimumClusterSize;\n};\n\n\n/**\n * Returns the value of the maxZoom
property.\n *\n * @return {number} The maximum zoom level.\n */\nMarkerClusterer.prototype.getMaxZoom = function () {\n return this.maxZoom_;\n};\n\n\n/**\n * Sets the value of the maxZoom
property.\n *\n * @param {number} maxZoom The maximum zoom level.\n */\nMarkerClusterer.prototype.setMaxZoom = function (maxZoom) {\n this.maxZoom_ = maxZoom;\n};\n\n\n/**\n * Returns the value of the styles
property.\n *\n * @return {Array} The array of styles defining the cluster markers to be used.\n */\nMarkerClusterer.prototype.getStyles = function () {\n return this.styles_;\n};\n\n\n/**\n * Sets the value of the styles
property.\n *\n * @param {Array.} styles The array of styles to use.\n */\nMarkerClusterer.prototype.setStyles = function (styles) {\n this.styles_ = styles;\n};\n\n\n/**\n * Returns the value of the title
property.\n *\n * @return {string} The content of the title text.\n */\nMarkerClusterer.prototype.getTitle = function () {\n return this.title_;\n};\n\n\n/**\n * Sets the value of the title
property.\n *\n * @param {string} title The value of the title property.\n */\nMarkerClusterer.prototype.setTitle = function (title) {\n this.title_ = title;\n};\n\n\n/**\n * Returns the value of the zoomOnClick
property.\n *\n * @return {boolean} True if zoomOnClick property is set.\n */\nMarkerClusterer.prototype.getZoomOnClick = function () {\n return this.zoomOnClick_;\n};\n\n\n/**\n * Sets the value of the zoomOnClick
property.\n *\n * @param {boolean} zoomOnClick The value of the zoomOnClick property.\n */\nMarkerClusterer.prototype.setZoomOnClick = function (zoomOnClick) {\n this.zoomOnClick_ = zoomOnClick;\n};\n\n\n/**\n * Returns the value of the averageCenter
property.\n *\n * @return {boolean} True if averageCenter property is set.\n */\nMarkerClusterer.prototype.getAverageCenter = function () {\n return this.averageCenter_;\n};\n\n\n/**\n * Sets the value of the averageCenter
property.\n *\n * @param {boolean} averageCenter The value of the averageCenter property.\n */\nMarkerClusterer.prototype.setAverageCenter = function (averageCenter) {\n this.averageCenter_ = averageCenter;\n};\n\n\n/**\n * Returns the value of the ignoreHidden
property.\n *\n * @return {boolean} True if ignoreHidden property is set.\n */\nMarkerClusterer.prototype.getIgnoreHidden = function () {\n return this.ignoreHidden_;\n};\n\n\n/**\n * Sets the value of the ignoreHidden
property.\n *\n * @param {boolean} ignoreHidden The value of the ignoreHidden property.\n */\nMarkerClusterer.prototype.setIgnoreHidden = function (ignoreHidden) {\n this.ignoreHidden_ = ignoreHidden;\n};\n\n\n/**\n * Returns the value of the enableRetinaIcons
property.\n *\n * @return {boolean} True if enableRetinaIcons property is set.\n */\nMarkerClusterer.prototype.getEnableRetinaIcons = function () {\n return this.enableRetinaIcons_;\n};\n\n\n/**\n * Sets the value of the enableRetinaIcons
property.\n *\n * @param {boolean} enableRetinaIcons The value of the enableRetinaIcons property.\n */\nMarkerClusterer.prototype.setEnableRetinaIcons = function (enableRetinaIcons) {\n this.enableRetinaIcons_ = enableRetinaIcons;\n};\n\n\n/**\n * Returns the value of the imageExtension
property.\n *\n * @return {string} The value of the imageExtension property.\n */\nMarkerClusterer.prototype.getImageExtension = function () {\n return this.imageExtension_;\n};\n\n\n/**\n * Sets the value of the imageExtension
property.\n *\n * @param {string} imageExtension The value of the imageExtension property.\n */\nMarkerClusterer.prototype.setImageExtension = function (imageExtension) {\n this.imageExtension_ = imageExtension;\n};\n\n\n/**\n * Returns the value of the imagePath
property.\n *\n * @return {string} The value of the imagePath property.\n */\nMarkerClusterer.prototype.getImagePath = function () {\n return this.imagePath_;\n};\n\n\n/**\n * Sets the value of the imagePath
property.\n *\n * @param {string} imagePath The value of the imagePath property.\n */\nMarkerClusterer.prototype.setImagePath = function (imagePath) {\n this.imagePath_ = imagePath;\n};\n\n\n/**\n * Returns the value of the imageSizes
property.\n *\n * @return {Array} The value of the imageSizes property.\n */\nMarkerClusterer.prototype.getImageSizes = function () {\n return this.imageSizes_;\n};\n\n\n/**\n * Sets the value of the imageSizes
property.\n *\n * @param {Array} imageSizes The value of the imageSizes property.\n */\nMarkerClusterer.prototype.setImageSizes = function (imageSizes) {\n this.imageSizes_ = imageSizes;\n};\n\n\n/**\n * Returns the value of the calculator
property.\n *\n * @return {function} the value of the calculator property.\n */\nMarkerClusterer.prototype.getCalculator = function () {\n return this.calculator_;\n};\n\n\n/**\n * Sets the value of the calculator
property.\n *\n * @param {function(Array., number)} calculator The value\n * of the calculator property.\n */\nMarkerClusterer.prototype.setCalculator = function (calculator) {\n this.calculator_ = calculator;\n};\n\n\n/**\n * Returns the value of the batchSizeIE
property.\n *\n * @return {number} the value of the batchSizeIE property.\n */\nMarkerClusterer.prototype.getBatchSizeIE = function () {\n return this.batchSizeIE_;\n};\n\n\n/**\n * Sets the value of the batchSizeIE
property.\n *\n * @param {number} batchSizeIE The value of the batchSizeIE property.\n */\nMarkerClusterer.prototype.setBatchSizeIE = function (batchSizeIE) {\n this.batchSizeIE_ = batchSizeIE;\n};\n\n\n/**\n * Returns the value of the clusterClass
property.\n *\n * @return {string} the value of the clusterClass property.\n */\nMarkerClusterer.prototype.getClusterClass = function () {\n return this.clusterClass_;\n};\n\n\n/**\n * Sets the value of the clusterClass
property.\n *\n * @param {string} clusterClass The value of the clusterClass property.\n */\nMarkerClusterer.prototype.setClusterClass = function (clusterClass) {\n this.clusterClass_ = clusterClass;\n};\n\n\n/**\n * Returns the array of markers managed by the clusterer.\n *\n * @return {Array} The array of markers managed by the clusterer.\n */\nMarkerClusterer.prototype.getMarkers = function () {\n return this.markers_;\n};\n\n\n/**\n * Returns the number of markers managed by the clusterer.\n *\n * @return {number} The number of markers.\n */\nMarkerClusterer.prototype.getTotalMarkers = function () {\n return this.markers_.length;\n};\n\n\n/**\n * Returns the current array of clusters formed by the clusterer.\n *\n * @return {Array} The array of clusters formed by the clusterer.\n */\nMarkerClusterer.prototype.getClusters = function () {\n return this.clusters_;\n};\n\n\n/**\n * Returns the number of clusters formed by the clusterer.\n *\n * @return {number} The number of clusters formed by the clusterer.\n */\nMarkerClusterer.prototype.getTotalClusters = function () {\n return this.clusters_.length;\n};\n\n\n/**\n * Adds a marker to the clusterer. The clusters are redrawn unless\n * opt_nodraw
is set to true
.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @param {boolean} [opt_nodraw] Set to true
to prevent redrawing.\n */\nMarkerClusterer.prototype.addMarker = function (marker, opt_nodraw) {\n this.pushMarkerTo_(marker);\n if (!opt_nodraw) {\n this.redraw_();\n }\n};\n\n\n/**\n * Adds an array of markers to the clusterer. The clusters are redrawn unless\n * opt_nodraw
is set to true
.\n *\n * @param {Array.} markers The markers to add.\n * @param {boolean} [opt_nodraw] Set to true
to prevent redrawing.\n */\nMarkerClusterer.prototype.addMarkers = function (markers, opt_nodraw) {\n var key;\n for (key in markers) {\n if (markers.hasOwnProperty(key)) {\n this.pushMarkerTo_(markers[key]);\n }\n } \n if (!opt_nodraw) {\n this.redraw_();\n }\n};\n\n\n/**\n * Pushes a marker to the clusterer.\n *\n * @param {google.maps.Marker} marker The marker to add.\n */\nMarkerClusterer.prototype.pushMarkerTo_ = function (marker) {\n // If the marker is draggable add a listener so we can update the clusters on the dragend:\n if (marker.getDraggable()) {\n var cMarkerClusterer = this;\n google.maps.event.addListener(marker, \"dragend\", function () {\n if (cMarkerClusterer.ready_) {\n this.isAdded = false;\n cMarkerClusterer.repaint();\n }\n });\n }\n marker.isAdded = false;\n this.markers_.push(marker);\n};\n\n\n/**\n * Removes a marker from the cluster. The clusters are redrawn unless\n * opt_nodraw
is set to true
. Returns true
if the\n * marker was removed from the clusterer.\n *\n * @param {google.maps.Marker} marker The marker to remove.\n * @param {boolean} [opt_nodraw] Set to true
to prevent redrawing.\n * @return {boolean} True if the marker was removed from the clusterer.\n */\nMarkerClusterer.prototype.removeMarker = function (marker, opt_nodraw) {\n var removed = this.removeMarker_(marker);\n\n if (!opt_nodraw && removed) {\n this.repaint();\n }\n\n return removed;\n};\n\n\n/**\n * Removes an array of markers from the cluster. The clusters are redrawn unless\n * opt_nodraw
is set to true
. Returns true
if markers\n * were removed from the clusterer.\n *\n * @param {Array.} markers The markers to remove.\n * @param {boolean} [opt_nodraw] Set to true
to prevent redrawing.\n * @return {boolean} True if markers were removed from the clusterer.\n */\nMarkerClusterer.prototype.removeMarkers = function (markers, opt_nodraw) {\n var i, r;\n var removed = false;\n\n for (i = 0; i < markers.length; i++) {\n r = this.removeMarker_(markers[i]);\n removed = removed || r;\n }\n\n if (!opt_nodraw && removed) {\n this.repaint();\n }\n\n return removed;\n};\n\n\n/**\n * Removes a marker and returns true if removed, false if not.\n *\n * @param {google.maps.Marker} marker The marker to remove\n * @return {boolean} Whether the marker was removed or not\n */\nMarkerClusterer.prototype.removeMarker_ = function (marker) {\n var i;\n var index = -1;\n if (this.markers_.indexOf) {\n index = this.markers_.indexOf(marker);\n } else {\n for (i = 0; i < this.markers_.length; i++) {\n if (marker === this.markers_[i]) {\n index = i;\n break;\n }\n }\n }\n\n if (index === -1) {\n // Marker is not in our list of markers, so do nothing:\n return false;\n }\n\n marker.setMap(null);\n this.markers_.splice(index, 1); // Remove the marker from the list of managed markers\n return true;\n};\n\n\n/**\n * Removes all clusters and markers from the map and also removes all markers\n * managed by the clusterer.\n */\nMarkerClusterer.prototype.clearMarkers = function () {\n this.resetViewport_(true);\n this.markers_ = [];\n};\n\n\n/**\n * Recalculates and redraws all the marker clusters from scratch.\n * Call this after changing any properties.\n */\nMarkerClusterer.prototype.repaint = function () {\n var oldClusters = this.clusters_.slice();\n this.clusters_ = [];\n this.resetViewport_(false);\n this.redraw_();\n\n // Remove the old clusters.\n // Do it in a timeout to prevent blinking effect.\n setTimeout(function () {\n var i;\n for (i = 0; i < oldClusters.length; i++) {\n oldClusters[i].remove();\n }\n }, 0);\n};\n\n\n/**\n * Returns the current bounds extended by the grid size.\n *\n * @param {google.maps.LatLngBounds} bounds The bounds to extend.\n * @return {google.maps.LatLngBounds} The extended bounds.\n * @ignore\n */\nMarkerClusterer.prototype.getExtendedBounds = function (bounds) {\n var projection = this.getProjection();\n\n // Turn the bounds into latlng.\n var tr = new google.maps.LatLng(bounds.getNorthEast().lat(),\n bounds.getNorthEast().lng());\n var bl = new google.maps.LatLng(bounds.getSouthWest().lat(),\n bounds.getSouthWest().lng());\n\n // Convert the points to pixels and the extend out by the grid size.\n var trPix = projection.fromLatLngToDivPixel(tr);\n trPix.x += this.gridSize_;\n trPix.y -= this.gridSize_;\n\n var blPix = projection.fromLatLngToDivPixel(bl);\n blPix.x -= this.gridSize_;\n blPix.y += this.gridSize_;\n\n // Convert the pixel points back to LatLng\n var ne = projection.fromDivPixelToLatLng(trPix);\n var sw = projection.fromDivPixelToLatLng(blPix);\n\n // Extend the bounds to contain the new bounds.\n bounds.extend(ne);\n bounds.extend(sw);\n\n return bounds;\n};\n\n\n/**\n * Redraws all the clusters.\n */\nMarkerClusterer.prototype.redraw_ = function () {\n this.createClusters_(0);\n};\n\n\n/**\n * Removes all clusters from the map. The markers are also removed from the map\n * if opt_hide
is set to true
.\n *\n * @param {boolean} [opt_hide] Set to true
to also remove the markers\n * from the map.\n */\nMarkerClusterer.prototype.resetViewport_ = function (opt_hide) {\n var i, marker;\n // Remove all the clusters\n for (i = 0; i < this.clusters_.length; i++) {\n this.clusters_[i].remove();\n }\n this.clusters_ = [];\n\n // Reset the markers to not be added and to be removed from the map.\n for (i = 0; i < this.markers_.length; i++) {\n marker = this.markers_[i];\n marker.isAdded = false;\n if (opt_hide) {\n marker.setMap(null);\n }\n }\n};\n\n\n/**\n * Calculates the distance between two latlng locations in km.\n *\n * @param {google.maps.LatLng} p1 The first lat lng point.\n * @param {google.maps.LatLng} p2 The second lat lng point.\n * @return {number} The distance between the two points in km.\n * @see http://www.movable-type.co.uk/scripts/latlong.html\n*/\nMarkerClusterer.prototype.distanceBetweenPoints_ = function (p1, p2) {\n var R = 6371; // Radius of the Earth in km\n var dLat = (p2.lat() - p1.lat()) * Math.PI / 180;\n var dLon = (p2.lng() - p1.lng()) * Math.PI / 180;\n var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) *\n Math.sin(dLon / 2) * Math.sin(dLon / 2);\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n var d = R * c;\n return d;\n};\n\n\n/**\n * Determines if a marker is contained in a bounds.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @param {google.maps.LatLngBounds} bounds The bounds to check against.\n * @return {boolean} True if the marker is in the bounds.\n */\nMarkerClusterer.prototype.isMarkerInBounds_ = function (marker, bounds) {\n return bounds.contains(marker.getPosition());\n};\n\n\n/**\n * Adds a marker to a cluster, or creates a new cluster.\n *\n * @param {google.maps.Marker} marker The marker to add.\n */\nMarkerClusterer.prototype.addToClosestCluster_ = function (marker) {\n var i, d, cluster, center;\n var distance = 40000; // Some large number\n var clusterToAddTo = null;\n for (i = 0; i < this.clusters_.length; i++) {\n cluster = this.clusters_[i];\n center = cluster.getCenter();\n if (center) {\n d = this.distanceBetweenPoints_(center, marker.getPosition());\n if (d < distance) {\n distance = d;\n clusterToAddTo = cluster;\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\n clusterToAddTo.addMarker(marker);\n } else {\n cluster = new Cluster(this);\n cluster.addMarker(marker);\n this.clusters_.push(cluster);\n }\n};\n\n\n/**\n * Creates the clusters. This is done in batches to avoid timeout errors\n * in some browsers when there is a huge number of markers.\n *\n * @param {number} iFirst The index of the first marker in the batch of\n * markers to be added to clusters.\n */\nMarkerClusterer.prototype.createClusters_ = function (iFirst) {\n var i, marker;\n var mapBounds;\n var cMarkerClusterer = this;\n if (!this.ready_) {\n return;\n }\n\n // Cancel previous batch processing if we're working on the first batch:\n if (iFirst === 0) {\n /**\n * This event is fired when the MarkerClusterer
begins\n * clustering markers.\n * @name MarkerClusterer#clusteringbegin\n * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, \"clusteringbegin\", this);\n\n if (typeof this.timerRefStatic !== \"undefined\") {\n clearTimeout(this.timerRefStatic);\n delete this.timerRefStatic;\n }\n }\n\n // Get our current map view bounds.\n // Create a new bounds object so we don't affect the map.\n //\n // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug:\n if (this.getMap().getZoom() > 3) {\n mapBounds = new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(),\n this.getMap().getBounds().getNorthEast());\n } else {\n mapBounds = new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472, -178.48388434375), new google.maps.LatLng(-85.08136444384544, 178.00048865625));\n }\n var bounds = this.getExtendedBounds(mapBounds);\n\n var iLast = Math.min(iFirst + this.batchSize_, this.markers_.length);\n\n for (i = iFirst; i < iLast; i++) {\n marker = this.markers_[i];\n if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) {\n if (!this.ignoreHidden_ || (this.ignoreHidden_ && marker.getVisible())) {\n this.addToClosestCluster_(marker);\n }\n }\n }\n\n if (iLast < this.markers_.length) {\n this.timerRefStatic = setTimeout(function () {\n cMarkerClusterer.createClusters_(iLast);\n }, 0);\n } else {\n delete this.timerRefStatic;\n\n /**\n * This event is fired when the MarkerClusterer
stops\n * clustering markers.\n * @name MarkerClusterer#clusteringend\n * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, \"clusteringend\", this);\n }\n};\n\n\n/**\n * Extends an object's prototype by another's.\n *\n * @param {Object} obj1 The object to be extended.\n * @param {Object} obj2 The object to extend with.\n * @return {Object} The new extended object.\n * @ignore\n */\nMarkerClusterer.prototype.extend = function (obj1, obj2) {\n return (function (object) {\n var property;\n for (property in object.prototype) {\n this.prototype[property] = object.prototype[property];\n }\n return this;\n }).apply(obj1, [obj2]);\n};\n\n\n/**\n * The default function for determining the label text and style\n * for a cluster icon.\n *\n * @param {Array.} markers The array of markers represented by the cluster.\n * @param {number} numStyles The number of marker styles available.\n * @return {ClusterIconInfo} The information resource for the cluster.\n * @constant\n * @ignore\n */\nMarkerClusterer.CALCULATOR = function (markers, numStyles) {\n var index = 0;\n var title = \"\";\n var count = markers.length.toString();\n\n var dv = count;\n while (dv !== 0) {\n dv = parseInt(dv / 10, 10);\n index++;\n }\n\n index = Math.min(index, numStyles);\n return {\n text: count,\n index: index,\n title: title\n };\n};\n\n\n/**\n * The number of markers to process in one batch.\n *\n * @type {number}\n * @constant\n */\nMarkerClusterer.BATCH_SIZE = 2000;\n\n\n/**\n * The number of markers to process in one batch (IE only).\n *\n * @type {number}\n * @constant\n */\nMarkerClusterer.BATCH_SIZE_IE = 500;\n\n\n/**\n * The default root name for the marker cluster images.\n *\n * @type {string}\n * @constant\n */\nMarkerClusterer.IMAGE_PATH = \"https://raw.githubusercontent.com/googlemaps/v3-utility-library/master/markerclustererplus/images/m\";\n\n\n/**\n * The default extension name for the marker cluster images.\n *\n * @type {string}\n * @constant\n */\nMarkerClusterer.IMAGE_EXTENSION = \"png\";\n\n\n/**\n * The default array of sizes for the marker cluster images.\n *\n * @type {Array.}\n * @constant\n */\nMarkerClusterer.IMAGE_SIZES = [53, 56, 66, 78, 90];\n\nmodule.exports = MarkerClusterer\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-row',{attrs:{\"no-gutters\":\"\"}},[_c('v-toolbar',{style:('background: transparent;' +\n (_vm.titleTextColor ? 'color: ' + _vm.titleTextColor : '')),attrs:{\"loading\":_vm.loading,\"dense\":\"\",\"flat\":\"\"}},[_c('v-toolbar-title',[_vm._v(_vm._s(_vm.module.title))]),_c('v-spacer'),_c('v-toolbar-items',[_c('v-dialog',{attrs:{\"presistent\":\"\",\"max-width\":\"570\"},scopedSlots:_vm._u([{key:\"activator\",fn:function({ on }){return [_c('v-btn',_vm._g({attrs:{\"icon\":\"\",\"loading\":_vm.loading}},on),[_c('v-icon',{attrs:{\"color\":\"primary\"}},[_vm._v(\"mdi-calendar-clock\")])],1)]}}]),model:{value:(_vm.chartDialog),callback:function ($$v) {_vm.chartDialog=$$v},expression:\"chartDialog\"}},[_c('v-card',[_c('v-card-title',[_c('span',{staticClass:\"headline\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.settings\"))+\" \")])]),_c('v-card-text',[_c('v-container',[_c('DatePicker',{attrs:{\"module\":_vm.module},on:{\"update-range\":(val) => (_vm.ranges = val)}})],1)],1),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"primary\",\"text\":\"\",\"disabled\":_vm.loading},on:{\"click\":function($event){return _vm.saveMetrics()}}},[_vm._v(_vm._s(_vm.$t(\"common.show\")))])],1)],1)],1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n {{ module.title }}\n \n \n \n \n \n mdi-calendar-clock\n \n \n\n \n \n \n {{ $t(\"common.settings\") }}\n \n \n\n \n \n (ranges = val)\"\n />\n \n \n\n \n \n\n {{ $t(\"common.show\") }}\n \n \n \n \n \n \n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChartControl.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChartControl.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ChartControl.vue?vue&type=template&id=3cd64326\"\nimport script from \"./ChartControl.vue?vue&type=script&lang=js\"\nexport * from \"./ChartControl.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-card',{staticClass:\"hide-scrollbar\",style:('width: 100% !important; height: 100% !important; max-height: 100%; overflow-y: scroll; overflow: hidden;' +\n (_vm.soMetaBackgroundColorCard\n ? 'background-color: ' + _vm.soMetaBackgroundColorCard\n : '')),attrs:{\"no-gutter\":\"\"}},[_c('v-toolbar',{staticStyle:{\"background\":\"transparent\"},attrs:{\"dense\":\"\",\"flat\":\"\"}},[_c('v-toolbar-title',{style:(_vm.soMetaTextColorTitle ? 'color: ' + _vm.soMetaTextColorTitle : '')},[_vm._v(_vm._s(_vm.module.title))])],1),_c('v-data-table',{staticClass:\"elevation-1\",staticStyle:{\"overflow-y\":\"auto\",\"padding-bottom\":\"3rem\",\"background\":\"transparent\"},attrs:{\"headers\":_vm.headers,\"items\":_vm.tags,\"items-per-page\":10,\"single-expand\":true,\"item-key\":\"deveui\",\"dense\":\"\"},on:{\"click:row\":(row, slot) => _vm.getCurrents(slot)},scopedSlots:_vm._u([{key:`item.active`,fn:function({ item }){return [_c('v-icon',{attrs:{\"dark\":\"\",\"color\":_vm.getIconColor(_vm.hasRecentData(item))}},[_vm._v(_vm._s(_vm.hasRecentData(item)))])]}},{key:`item.battery`,fn:function({ item }){return [_vm._v(\" \"+_vm._s(_vm.batteryLevel(item))+\" \")]}},{key:`item.rssi`,fn:function({ item }){return [_vm._v(\" \"+_vm._s(_vm.getRSSI(item))+\" \")]}},{key:`item.alarm`,fn:function({ item }){return [_c('v-icon',{attrs:{\"dark\":\"\",\"color\":_vm.alarmActive(item)}},[_vm._v(\"timer\")])]}},{key:`item.createdAt`,fn:function({ item }){return [_vm._v(\" \"+_vm._s(_vm.lastDataTime(item))+\" \")]}},{key:\"expanded-item\",fn:function(){return [_c('td',{staticClass:\"px-0\",attrs:{\"colspan\":_vm.headers.length + 1}},[_c('v-data-table',{attrs:{\"headers\":[\n {},\n { text: _vm.$t('tagdata.fields.key'), value: 'label' },\n { text: _vm.$t('tag.fields.latestValue'), value: 'value' },\n ],\"items\":_vm.currents,\"item-key\":\"key\",\"hide-default-footer\":\"\",\"disable-sort\":\"\",\"dense\":\"\",\"disable-pagination\":\"\"},on:{\"click:row\":_vm.clickedRow}})],1)]},proxy:true}],null,true)}),_c('v-dialog',{attrs:{\"fullscreen\":\"\",\"hide-overlay\":\"\",\"transition\":\"dialog-bottom-transition\"},model:{value:(_vm.dialog),callback:function ($$v) {_vm.dialog=$$v},expression:\"dialog\"}},[_c('TagHistoryDialog',{attrs:{\"dialogTrigger\":_vm.dialogTrigger,\"dialog\":_vm.dialog},on:{\"dialog-toggle\":function($event){_vm.dialog = !_vm.dialog}}})],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-card',[_c('v-toolbar',{attrs:{\"dark\":\"\",\"color\":\"primary\"}},[_c('v-btn',{attrs:{\"icon\":\"\",\"dark\":\"\"},on:{\"click\":function($event){return _vm.$emit('dialog-toggle')}}},[_c('v-icon',[_vm._v(\"mdi-close\")])],1),_c('v-toolbar-title',[_vm._v(_vm._s(_vm.dialogTrigger.tag.name + \" - \" + _vm.dialogTrigger.key))]),_c('v-spacer')],1),_c('v-container',[_c('v-data-table',{attrs:{\"items\":_vm.items,\"loading\":_vm.loading,\"headers\":_vm.headers,\"items-per-page\":25,\"sort-by\":\"createdAt\",\"sort-desc\":true,\"dense\":\"\"},scopedSlots:_vm._u([{key:`item.createdAt`,fn:function({ item }){return [_vm._v(\" \"+_vm._s(_vm.humanDate(item.createdAt, \"yyyy-MM-dd HH:mm:ss\"))+\" \")]}}],null,true)})],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n \n mdi-close\n \n\n {{\n dialogTrigger.tag.name + \" - \" + dialogTrigger.key\n }}\n\n \n \n\n \n \n \n {{ humanDate(item.createdAt, \"yyyy-MM-dd HH:mm:ss\") }}\n \n \n \n \n\n\n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagHistoryDialog.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagHistoryDialog.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./TagHistoryDialog.vue?vue&type=template&id=471460e6\"\nimport script from \"./TagHistoryDialog.vue?vue&type=script&lang=js\"\nexport * from \"./TagHistoryDialog.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n \n \n {{ module.title }}\n \n\n getCurrents(slot)\"\n >\n \n {{\n hasRecentData(item)\n }}\n \n \n {{ batteryLevel(item) }}\n \n \n {{ getRSSI(item) }}\n \n \n timer\n \n \n {{ lastDataTime(item) }}\n \n \n \n \n \n | \n \n \n\n \n \n \n \n\n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SensorOverviewList.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SensorOverviewList.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./SensorOverviewList.vue?vue&type=template&id=90f4f2f2\"\nimport script from \"./SensorOverviewList.vue?vue&type=script&lang=js\"\nexport * from \"./SensorOverviewList.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-card',{attrs:{\"flat\":\"\"}},[_c('v-card-text',[_c('v-row',[_c('v-col',{staticClass:\"text-center\",attrs:{\"cols\":\"12\",\"sm\":\"12\",\"md\":\"12\"}},[_c('v-color-picker',{staticStyle:{\"margin\":\"0 auto\"},model:{value:(_vm.content),callback:function ($$v) {_vm.content=$$v},expression:\"content\"}}),_c('v-btn',{staticClass:\"mx-2\",staticStyle:{\"margin\":\"0 auto\"},attrs:{\"color\":\"accent\"},on:{\"click\":_vm.saveColor}},[_vm._v(_vm._s(_vm.$t(\"common.saveColor\")))])],1),_c('v-col',{attrs:{\"cols\":\"12\",\"sm\":\"12\",\"md\":\"12\"}},[(_vm.isInType(_vm.type, [_vm.ModuleTypes.GAUGE]))?_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t(\"common.alarmColorPrecedence\"))+\" \")]):_vm._e(),_c('v-container',_vm._l((_vm.lmetas),function(c,i){return _c('palette-chip',{key:i,staticClass:\"ma-2\",attrs:{\"color\":c.content,\"metas\":_vm.metas,\"type\":_vm.type,\"meta\":c,\"localMeta\":_vm.lmetas,\"fieldNames\":_vm.fieldNames,\"colorFields\":_vm.colorFields,\"hasModuleStyle\":_vm.hasModuleStyle},on:{\"update\":(m) => _vm.updateMeta(i, m),\"remove\":function($event){return _vm.removeFromPalette(i)}}})}),1)],1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"palette-chip\",style:(`background-color:${_vm.color}`)},[_c('v-row',{staticStyle:{\"justify-content\":\"flex-end\"}},[(!_vm.cardMode)?_c('v-col',{attrs:{\"cols\":\"12\",\"xs\":\"10\",\"md\":\"10\"}},[(_vm.isInType(_vm.type, [_vm.ModuleTypes.CHART, _vm.ModuleTypes.MULTICHART]))?_c('v-autocomplete',{staticClass:\"ps-2\",attrs:{\"label\":_vm.color,\"autocomplete\":\"off\",\"dark\":false,\"items\":_vm.fieldNames,\"item-text\":\"name\",\"return-object\":\"\"},on:{\"change\":_vm.constructMeta},model:{value:(_vm.fieldName),callback:function ($$v) {_vm.fieldName=$$v},expression:\"fieldName\"}}):_vm._e(),(_vm.isInType(_vm.type, [_vm.ModuleTypes.GAUGE, _vm.ModuleTypes.FILLINDICATOR]))?_c('v-slider',{attrs:{\"max\":\"100\",\"min\":\"0\",\"step\":\"1\",\"color\":\"accent\",\"thumb-label\":true,\"thumb-size\":\"xs\",\"messages\":_vm.color},on:{\"change\":_vm.constructMeta},model:{value:(_vm.range),callback:function ($$v) {_vm.range=$$v},expression:\"range\"}}):_vm._e(),(_vm.isInType(_vm.type, [_vm.ModuleTypes.TEXT, _vm.ModuleTypes.SINGLE]))?_c('v-autocomplete',{staticClass:\"ps-2\",attrs:{\"label\":_vm.color,\"autocomplete\":\"off\",\"dark\":false,\"items\":_vm.fieldNames,\"item-text\":\"name\",\"item-value\":\"value\",\"return-object\":\"\"},on:{\"change\":_vm.constructMeta},model:{value:(_vm.fieldName),callback:function ($$v) {_vm.fieldName=$$v},expression:\"fieldName\"}}):_vm._e()],1):_c('v-col',{attrs:{\"cols\":\"12\",\"xs\":\"10\",\"md\":\"10\"}},[_c('v-autocomplete',{staticClass:\"ps-2\",attrs:{\"label\":_vm.color,\"autocomplete\":\"off\",\"dark\":false,\"items\":_vm.colorFields,\"item-text\":\"name\",\"item-value\":\"value\"},on:{\"change\":_vm.constructColorMeta},model:{value:(_vm.fieldName),callback:function ($$v) {_vm.fieldName=$$v},expression:\"fieldName\"}}),_c('v-slider',{attrs:{\"max\":\"100\",\"min\":\"0\",\"step\":\"5\",\"color\":\"accent\",\"thumb-label\":true,\"thumb-size\":\"xs\",\"messages\":_vm.$t('module.meta.opacity')},on:{\"change\":_vm.constructColorMeta},scopedSlots:_vm._u([{key:\"thumb-label\",fn:function({ value }){return [_vm._v(\" \"+_vm._s(value.toString() + \"%\")+\" \")]}}]),model:{value:(_vm.range),callback:function ($$v) {_vm.range=$$v},expression:\"range\"}})],1),_c('v-col',{staticStyle:{\"margin\":\"0\",\"padding\":\"0\"},attrs:{\"cols\":\"12\",\"xs\":\"2\",\"md\":\"2\"}},[(_vm.colorFields.length > 0)?_c('v-tooltip',{attrs:{\"bottom\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function({ on }){return [_c('v-icon',_vm._g({staticStyle:{\"margin\":\"1rem auto\"},attrs:{\"color\":\"accent\"},on:{\"click\":function($event){return _vm.switchMode()}}},on),[_vm._v(\"mdi-format-color-fill\")])]}}],null,false,2291111962)},[_c('span',[_vm._v(\" \"+_vm._s(_vm.cardMode ? _vm.$t(\"module.meta.paletteToModuleMode\") : _vm.$t(\"module.meta.paletteToCardMode\"))+\" \")])]):_vm._e(),_c('v-tooltip',{attrs:{\"bottom\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function({ on }){return [_c('v-icon',_vm._g({staticStyle:{\"margin\":\"1rem auto\"},attrs:{\"color\":\"accent\"},on:{\"click\":function($event){return _vm.$emit('remove')}}},on),[_vm._v(\"mdi-delete\")])]}}])},[_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"common.delete\"))+\" \")])])],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ value.toString() + \"%\" }}\r\n \r\n \r\n \r\n \r\n 0\">\r\n \r\n mdi-format-color-fill\r\n \r\n \r\n {{\r\n cardMode\r\n ? $t(\"module.meta.paletteToModuleMode\")\r\n : $t(\"module.meta.paletteToCardMode\")\r\n }}\r\n \r\n \r\n \r\n \r\n mdi-delete\r\n \r\n \r\n {{ $t(\"common.delete\") }}\r\n \r\n \r\n \r\n \r\n
\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PaletteChip.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PaletteChip.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./PaletteChip.vue?vue&type=template&id=eafb1158&scoped=true\"\nimport script from \"./PaletteChip.vue?vue&type=script&lang=js\"\nexport * from \"./PaletteChip.vue?vue&type=script&lang=js\"\nimport style0 from \"./PaletteChip.vue?vue&type=style&index=0&id=eafb1158&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"eafb1158\",\n null\n \n)\n\nexport default component.exports","\r\n \r\n \r\n \r\n \r\n \r\n {{ $t(\"common.saveColor\") }}\r\n \r\n \r\n \r\n {{ $t(\"common.alarmColorPrecedence\") }}\r\n
\r\n \r\n updateMeta(i, m)\"\r\n v-on:remove=\"removeFromPalette(i)\"\r\n :hasModuleStyle=\"hasModuleStyle\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./StylePickerModule.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./StylePickerModule.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./StylePickerModule.vue?vue&type=template&id=02fbba32\"\nimport script from \"./StylePickerModule.vue?vue&type=script&lang=js\"\nexport * from \"./StylePickerModule.vue?vue&type=script&lang=js\"\nimport style0 from \"./StylePickerModule.vue?vue&type=style&index=0&id=02fbba32&prod&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-card',{staticClass:\"justify-center\",style:('width: 100% !important; box-sizing: border-box; display: flex; flex-flow: column; overflow: hidden; max-height: 100% !important; overflow-y: scroll; overflow: hidden;' +\n (_vm.fakeData ? 'height: 500px;' : 'height: 100% !important;') +\n (_vm.soMetaBackgroundColorCard\n ? 'background-color: ' + _vm.soMetaBackgroundColorCard + ';'\n : '')),attrs:{\"no-gutter\":\"\"}},[_c('v-toolbar',{staticStyle:{\"background\":\"transparent\"},attrs:{\"dense\":\"\",\"flat\":\"\"}},[_c('v-toolbar-title',{style:(_vm.soMetaTextColorTitle ? 'color: ' + _vm.soMetaTextColorTitle : '')},[_vm._v(_vm._s(_vm.module.title))])],1),_c('v-dialog',{attrs:{\"max-width\":\"500px\"},model:{value:(_vm.addDialog),callback:function ($$v) {_vm.addDialog=$$v},expression:\"addDialog\"}},[_c('v-card',[_c('v-card-title',[_vm._v(\" \"+_vm._s(_vm.$t(\"imageMap.chooseTag\"))+\" \")]),_c('v-card-text',[_c('v-autocomplete',{attrs:{\"autocomplete\":\"off\",\"loading\":_vm.status.loading,\"label\":_vm.$t('module.fields.types'),\"items\":[\n { name: _vm.$t('module.mapMarkers.node'), value: 0 },\n { name: _vm.$t('module.mapMarkers.sensor'), value: 1 },\n ],\"item-text\":\"name\",\"item-value\":\"value\",\"prepend-icon\":\"mdi-map-marker\"},model:{value:(_vm.type),callback:function ($$v) {_vm.type=$$v},expression:\"type\"}}),_c('v-divider'),_c('v-autocomplete',{attrs:{\"autocomplete\":\"off\",\"loading\":_vm.status.loading,\"label\":_vm.$t('module.meta.keys.deveui'),\"items\":_vm.tags,\"item-text\":\"name\",\"item-value\":\"deveui\",\"prepend-icon\":\"mdi-cellphone-link\",\"clearable\":\"\"},model:{value:(_vm.deveui),callback:function ($$v) {_vm.deveui=$$v},expression:\"deveui\"}}),(_vm.type == 1)?_c('div',[(_vm.type == 1)?_c('v-autocomplete',{attrs:{\"autocomplete\":\"off\",\"loading\":_vm.status.loading,\"label\":_vm.$t('module.meta.keys.tagkey'),\"items\":_vm.keys,\"item-text\":\"label\",\"item-value\":\"key\",\"prepend-icon\":\"mdi-key\",\"clearable\":\"\"},model:{value:(_vm.tagKey),callback:function ($$v) {_vm.tagKey=$$v},expression:\"tagKey\"}}):_vm._e(),(_vm.type == 1)?_c('v-text-field',{attrs:{\"label\":_vm.$t('module.meta.keys.sufix'),\"prepend-icon\":\"mdi-temperature-celsius\",\"clearable\":\"\"},model:{value:(_vm.valueSuffix),callback:function ($$v) {_vm.valueSuffix=$$v},expression:\"valueSuffix\"}}):_vm._e(),(_vm.type == 1)?_c('v-text-field',{attrs:{\"label\":_vm.$t('module.meta.keys.font_size'),\"prepend-icon\":\"mdi-format-size\"},model:{value:(_vm.fontSize),callback:function ($$v) {_vm.fontSize=$$v},expression:\"fontSize\"}}):_vm._e(),_c('v-card-text',{staticClass:\"subtitle-1 mt-0 pt-0\",attrs:{\"align\":\"center\"}},[_vm._v(_vm._s(_vm.$t(\"module.meta.styles.text.textcolor\")))]),(_vm.type == 1)?_c('v-color-picker',{staticStyle:{\"margin\":\"0 auto\"},model:{value:(_vm.textColor),callback:function ($$v) {_vm.textColor=$$v},expression:\"textColor\"}}):_vm._e()],1):_vm._e()],1),_c('v-card-actions',[_c('v-btn',{attrs:{\"color\":\"primary\",\"text\":\"\"},on:{\"click\":_vm.submitDialog}},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.save\"))+\" \")])],1)],1)],1),_c('v-container',{staticClass:\"pt-0\",staticStyle:{\"height\":\"100%\",\"max-height\":\"100% !important\",\"max-width\":\"100% !important\",\"box-sizing\":\"border-box\",\"flex-grow\":\"1\",\"overflow\":\"hidden\"},attrs:{\"align\":\"center\",\"justify\":\"center\"}},[_c('l-map',{ref:\"map\",staticStyle:{\"height\":\"100%\",\"width\":\"100%\",\"max-height\":\"100%\",\"z-index\":\"4\"},attrs:{\"min-zoom\":_vm.minZoom,\"max-zoom\":_vm.maxZoom,\"zoom\":_vm.curZoom,\"crs\":_vm.crs},on:{\"click\":_vm.handleClick,\"update:zoom\":_vm.zoomUpdated,\"ready\":_vm.updateLayout}},[(_vm.imageUrl)?_c('l-image-overlay',{ref:\"iOverlay\",staticStyle:{\"z-index\":\"3\"},attrs:{\"url\":_vm.imageUrl,\"bounds\":_vm.bounds}}):_vm._e(),_vm._l((_vm.nodeItems),function(item,i){return _c('l-marker',{key:item.tag.deveui + i,attrs:{\"lat-lng\":item.latlng,\"icon\":_vm.icon}},[_c('l-popup',[_c('SoContent',{attrs:{\"mode\":_vm.mode,\"data\":item},on:{\"remove-marker\":_vm.removeNodeMarker}})],1),_c('l-tooltip',{attrs:{\"options\":{ permanent: true, reactive: true }}},[_vm._v(\" \"+_vm._s(item.tag.name)+\" \")])],1)}),_vm._l((_vm.keyItems),function(item,i){return _c('l-marker',{key:i,attrs:{\"lat-lng\":item.latlng,\"icon\":_vm.emptyIcon}},[_c('l-icon',{attrs:{\"iconUrl\":\"\",\"shadowUrl\":\"\"}},[_c('v-card-text',{staticClass:\"text-no-wrap align-center justify-center text-center ma-0 pa-0\",style:(item.style)},[_vm._v(_vm._s(item.data))])],1),_c('l-popup',[_vm._v(\" \"+_vm._s(item.deveui + \" - \" + item.key)+\" \"),(_vm.mode == 1)?_c('v-btn',{attrs:{\"color\":\"error\",\"text\":\"\"},on:{\"click\":function($event){return _vm.removeKeyMarker(item)}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.delete\"))+\" \")]):_vm._e()],1)],1)})],2)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { setOptions, popup, DomEvent } from 'leaflet';\n\nvar capitalizeFirstLetter = function (string) {\n if (!string || typeof string.charAt !== 'function') {\n return string;\n }\n return string.charAt(0).toUpperCase() + string.slice(1);\n};\n\nvar propsBinder = function (vueElement, leafletElement, props, options) {\n var loop = function ( key ) {\n var setMethodName = 'set' + capitalizeFirstLetter(key);\n var deepValue =\n props[key].type === Object ||\n props[key].type === Array ||\n Array.isArray(props[key].type);\n if (props[key].custom && vueElement[setMethodName]) {\n vueElement.$watch(\n key,\n function (newVal, oldVal) {\n vueElement[setMethodName](newVal, oldVal);\n },\n {\n deep: deepValue,\n }\n );\n } else if (setMethodName === 'setOptions') {\n vueElement.$watch(\n key,\n function (newVal, oldVal) {\n setOptions(leafletElement, newVal);\n },\n {\n deep: deepValue,\n }\n );\n } else if (leafletElement[setMethodName]) {\n vueElement.$watch(\n key,\n function (newVal, oldVal) {\n leafletElement[setMethodName](newVal);\n },\n {\n deep: deepValue,\n }\n );\n }\n };\n\n for (var key in props) loop( key );\n};\n\nvar collectionCleaner = function (options) {\n var result = {};\n for (var key in options) {\n var value = options[key];\n if (value !== null && value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n};\n\nvar optionsMerger = function (props, instance) {\n var options =\n instance.options && instance.options.constructor === Object\n ? instance.options\n : {};\n props = props && props.constructor === Object ? props : {};\n var result = collectionCleaner(options);\n props = collectionCleaner(props);\n var defaultProps = instance.$options.props;\n for (var key in props) {\n var def = defaultProps[key]\n ? defaultProps[key].default\n : Symbol('unique');\n if (result[key] && def !== props[key]) {\n console.warn(\n (key + \" props is overriding the value passed in the options props\")\n );\n result[key] = props[key];\n } else if (!result[key]) {\n result[key] = props[key];\n }\n }\n return result;\n};\n\nvar findRealParent = function (firstVueParent) {\n var found = false;\n while (firstVueParent && !found) {\n if (firstVueParent.mapObject === undefined) {\n firstVueParent = firstVueParent.$parent;\n } else {\n found = true;\n }\n }\n return firstVueParent;\n};\n\nvar Popper = {\n props: {\n content: {\n type: String,\n default: null,\n custom: true\n }\n },\n mounted: function mounted () {\n this.popperOptions = {};\n },\n methods: {\n setContent: function setContent (newVal) {\n if (this.mapObject && newVal !== null && newVal !== undefined) {\n this.mapObject.setContent(newVal);\n }\n }\n },\n render: function render (h) {\n if (this.$slots.default) {\n return h('div', this.$slots.default);\n }\n return null;\n }\n};\n\nvar Options = {\n props: {\n options: {\n type: Object,\n default: function () { return ({}); }\n }\n }\n};\n\n/**\n * Display a popup on the map\n */\nvar script = {\n name: 'LPopup',\n mixins: [Popper, Options],\n props: {\n latLng: {\n type: [Object, Array],\n default: function () { return []; },\n },\n },\n mounted: function mounted() {\n var this$1 = this;\n\n var options = optionsMerger(this.popperOptions, this);\n this.mapObject = popup(options);\n if (this.latLng !== undefined) {\n this.mapObject.setLatLng(this.latLng);\n }\n DomEvent.on(this.mapObject, this.$listeners);\n propsBinder(this, this.mapObject, this.$options.props);\n this.mapObject.setContent(this.content || this.$el);\n this.parentContainer = findRealParent(this.$parent);\n this.parentContainer.mapObject.bindPopup(this.mapObject);\n this.$nextTick(function () {\n /**\n * Triggers when the component is ready\n * @type {object}\n * @property {object} mapObject - reference to leaflet map object\n */\n this$1.$emit('ready', this$1.mapObject);\n });\n },\n beforeDestroy: function beforeDestroy() {\n if (this.parentContainer) {\n if (this.parentContainer.unbindPopup) {\n this.parentContainer.unbindPopup();\n } else if (\n this.parentContainer.mapObject &&\n this.parentContainer.mapObject.unbindPopup\n ) {\n this.parentContainer.mapObject.unbindPopup();\n }\n }\n },\n};\n\nfunction normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier /* server only */, shadowMode, createInjector, createInjectorSSR, createInjectorShadow) {\r\n if (typeof shadowMode !== 'boolean') {\r\n createInjectorSSR = createInjector;\r\n createInjector = shadowMode;\r\n shadowMode = false;\r\n }\r\n // Vue.extend constructor export interop.\r\n var options = typeof script === 'function' ? script.options : script;\r\n // render functions\r\n if (template && template.render) {\r\n options.render = template.render;\r\n options.staticRenderFns = template.staticRenderFns;\r\n options._compiled = true;\r\n // functional template\r\n if (isFunctionalTemplate) {\r\n options.functional = true;\r\n }\r\n }\r\n // scopedId\r\n if (scopeId) {\r\n options._scopeId = scopeId;\r\n }\r\n var hook;\r\n if (moduleIdentifier) {\r\n // server build\r\n hook = function (context) {\r\n // 2.3 injection\r\n context =\r\n context || // cached call\r\n (this.$vnode && this.$vnode.ssrContext) || // stateful\r\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext); // functional\r\n // 2.2 with runInNewContext: true\r\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\r\n context = __VUE_SSR_CONTEXT__;\r\n }\r\n // inject component styles\r\n if (style) {\r\n style.call(this, createInjectorSSR(context));\r\n }\r\n // register component module identifier for async chunk inference\r\n if (context && context._registeredComponents) {\r\n context._registeredComponents.add(moduleIdentifier);\r\n }\r\n };\r\n // used by ssr in case component is cached and beforeCreate\r\n // never gets called\r\n options._ssrRegister = hook;\r\n }\r\n else if (style) {\r\n hook = shadowMode\r\n ? function (context) {\r\n style.call(this, createInjectorShadow(context, this.$root.$options.shadowRoot));\r\n }\r\n : function (context) {\r\n style.call(this, createInjector(context));\r\n };\r\n }\r\n if (hook) {\r\n if (options.functional) {\r\n // register for functional component in vue file\r\n var originalRender = options.render;\r\n options.render = function renderWithStyleInjection(h, context) {\r\n hook.call(context);\r\n return originalRender(h, context);\r\n };\r\n }\r\n else {\r\n // inject component registration as beforeCreate hook\r\n var existing = options.beforeCreate;\r\n options.beforeCreate = existing ? [].concat(existing, hook) : [hook];\r\n }\r\n }\r\n return script;\r\n}\n\nvar isOldIE = typeof navigator !== 'undefined' &&\r\n /msie [6-9]\\\\b/.test(navigator.userAgent.toLowerCase());\n\n/* script */\nvar __vue_script__ = script;\n\n/* template */\n\n /* style */\n var __vue_inject_styles__ = undefined;\n /* scoped */\n var __vue_scope_id__ = undefined;\n /* module identifier */\n var __vue_module_identifier__ = undefined;\n /* functional template */\n var __vue_is_functional_template__ = undefined;\n /* style inject */\n \n /* style inject SSR */\n \n /* style inject shadow dom */\n \n\n \n var __vue_component__ = normalizeComponent(\n {},\n __vue_inject_styles__,\n __vue_script__,\n __vue_scope_id__,\n __vue_is_functional_template__,\n __vue_module_identifier__,\n false,\n undefined,\n undefined,\n undefined\n );\n\nexport default __vue_component__;\n","import { setOptions, DomEvent, divIcon, icon } from 'leaflet';\n\nvar capitalizeFirstLetter = function (string) {\n if (!string || typeof string.charAt !== 'function') {\n return string;\n }\n return string.charAt(0).toUpperCase() + string.slice(1);\n};\n\nvar propsBinder = function (vueElement, leafletElement, props, options) {\n var loop = function ( key ) {\n var setMethodName = 'set' + capitalizeFirstLetter(key);\n var deepValue =\n props[key].type === Object ||\n props[key].type === Array ||\n Array.isArray(props[key].type);\n if (props[key].custom && vueElement[setMethodName]) {\n vueElement.$watch(\n key,\n function (newVal, oldVal) {\n vueElement[setMethodName](newVal, oldVal);\n },\n {\n deep: deepValue,\n }\n );\n } else if (setMethodName === 'setOptions') {\n vueElement.$watch(\n key,\n function (newVal, oldVal) {\n setOptions(leafletElement, newVal);\n },\n {\n deep: deepValue,\n }\n );\n } else if (leafletElement[setMethodName]) {\n vueElement.$watch(\n key,\n function (newVal, oldVal) {\n leafletElement[setMethodName](newVal);\n },\n {\n deep: deepValue,\n }\n );\n }\n };\n\n for (var key in props) loop( key );\n};\n\nvar collectionCleaner = function (options) {\n var result = {};\n for (var key in options) {\n var value = options[key];\n if (value !== null && value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n};\n\nvar optionsMerger = function (props, instance) {\n var options =\n instance.options && instance.options.constructor === Object\n ? instance.options\n : {};\n props = props && props.constructor === Object ? props : {};\n var result = collectionCleaner(options);\n props = collectionCleaner(props);\n var defaultProps = instance.$options.props;\n for (var key in props) {\n var def = defaultProps[key]\n ? defaultProps[key].default\n : Symbol('unique');\n if (result[key] && def !== props[key]) {\n console.warn(\n (key + \" props is overriding the value passed in the options props\")\n );\n result[key] = props[key];\n } else if (!result[key]) {\n result[key] = props[key];\n }\n }\n return result;\n};\n\nvar findRealParent = function (firstVueParent) {\n var found = false;\n while (firstVueParent && !found) {\n if (firstVueParent.mapObject === undefined) {\n firstVueParent = firstVueParent.$parent;\n } else {\n found = true;\n }\n }\n return firstVueParent;\n};\n\n//\n\n/**\n * Easy and reactive way to configure the icon of a marker\n */\nvar script = {\n name: 'LIcon',\n props: {\n iconUrl: {\n type: String,\n custom: true,\n default: null,\n },\n iconRetinaUrl: {\n type: String,\n custom: true,\n default: null,\n },\n iconSize: {\n type: [Object, Array],\n custom: true,\n default: null,\n },\n iconAnchor: {\n type: [Object, Array],\n custom: true,\n default: null,\n },\n popupAnchor: {\n type: [Object, Array],\n custom: true,\n default: function () { return [0, 0]; },\n },\n tooltipAnchor: {\n type: [Object, Array],\n custom: true,\n default: function () { return [0, 0]; },\n },\n shadowUrl: {\n type: String,\n custom: true,\n default: null,\n },\n shadowRetinaUrl: {\n type: String,\n custom: true,\n default: null,\n },\n shadowSize: {\n type: [Object, Array],\n custom: true,\n default: null,\n },\n shadowAnchor: {\n type: [Object, Array],\n custom: true,\n default: null,\n },\n bgPos: {\n type: [Object, Array],\n custom: true,\n default: function () { return [0, 0]; },\n },\n className: {\n type: String,\n custom: true,\n default: '',\n },\n options: {\n type: Object,\n custom: true,\n default: function () { return ({}); },\n },\n },\n\n data: function data() {\n return {\n parentContainer: null,\n observer: null,\n recreationNeeded: false,\n swapHtmlNeeded: false,\n };\n },\n\n mounted: function mounted() {\n var this$1 = this;\n\n this.parentContainer = findRealParent(this.$parent);\n\n propsBinder(this, this.$parent.mapObject, this.$options.props);\n\n this.observer = new MutationObserver(function () {\n this$1.scheduleHtmlSwap();\n });\n this.observer.observe(this.$el, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true,\n });\n this.scheduleCreateIcon();\n },\n\n beforeDestroy: function beforeDestroy() {\n if (this.parentContainer.mapObject) {\n this.parentContainer.mapObject.setIcon(this.parentContainer.$props.icon);\n }\n\n this.observer.disconnect();\n },\n\n methods: {\n scheduleCreateIcon: function scheduleCreateIcon() {\n this.recreationNeeded = true;\n\n this.$nextTick(this.createIcon);\n },\n\n scheduleHtmlSwap: function scheduleHtmlSwap() {\n this.htmlSwapNeeded = true;\n\n this.$nextTick(this.createIcon);\n },\n\n createIcon: function createIcon() {\n // If only html of a divIcon changed, we can just replace the DOM without the need of recreating the whole icon\n if (\n this.htmlSwapNeeded &&\n !this.recreationNeeded &&\n this.iconObject &&\n this.parentContainer.mapObject.getElement()\n ) {\n this.parentContainer.mapObject.getElement().innerHTML = this.$el.innerHTML;\n\n this.htmlSwapNeeded = false;\n return;\n }\n\n if (!this.recreationNeeded) {\n return;\n }\n\n if (this.iconObject) {\n DomEvent.off(this.iconObject, this.$listeners);\n }\n\n var options = optionsMerger(\n {\n iconUrl: this.iconUrl,\n iconRetinaUrl: this.iconRetinaUrl,\n iconSize: this.iconSize,\n iconAnchor: this.iconAnchor,\n popupAnchor: this.popupAnchor,\n tooltipAnchor: this.tooltipAnchor,\n shadowUrl: this.shadowUrl,\n shadowRetinaUrl: this.shadowRetinaUrl,\n shadowSize: this.shadowSize,\n shadowAnchor: this.shadowAnchor,\n bgPos: this.bgPos,\n className: this.className,\n html: this.$el.innerHTML || this.html,\n },\n this\n );\n\n if (options.html) {\n this.iconObject = divIcon(options);\n } else {\n this.iconObject = icon(options);\n }\n\n DomEvent.on(this.iconObject, this.$listeners);\n\n this.parentContainer.mapObject.setIcon(this.iconObject);\n\n this.recreationNeeded = false;\n this.htmlSwapNeeded = false;\n },\n\n setIconUrl: function setIconUrl() {\n this.scheduleCreateIcon();\n },\n setIconRetinaUrl: function setIconRetinaUrl() {\n this.scheduleCreateIcon();\n },\n setIconSize: function setIconSize() {\n this.scheduleCreateIcon();\n },\n setIconAnchor: function setIconAnchor() {\n this.scheduleCreateIcon();\n },\n setPopupAnchor: function setPopupAnchor() {\n this.scheduleCreateIcon();\n },\n setTooltipAnchor: function setTooltipAnchor() {\n this.scheduleCreateIcon();\n },\n setShadowUrl: function setShadowUrl() {\n this.scheduleCreateIcon();\n },\n setShadowRetinaUrl: function setShadowRetinaUrl() {\n this.scheduleCreateIcon();\n },\n setShadowAnchor: function setShadowAnchor() {\n this.scheduleCreateIcon();\n },\n setBgPos: function setBgPos() {\n this.scheduleCreateIcon();\n },\n setClassName: function setClassName() {\n this.scheduleCreateIcon();\n },\n setHtml: function setHtml() {\n this.scheduleCreateIcon();\n },\n },\n\n render: function render() {\n return null;\n },\n};\n\nfunction normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier /* server only */, shadowMode, createInjector, createInjectorSSR, createInjectorShadow) {\r\n if (typeof shadowMode !== 'boolean') {\r\n createInjectorSSR = createInjector;\r\n createInjector = shadowMode;\r\n shadowMode = false;\r\n }\r\n // Vue.extend constructor export interop.\r\n var options = typeof script === 'function' ? script.options : script;\r\n // render functions\r\n if (template && template.render) {\r\n options.render = template.render;\r\n options.staticRenderFns = template.staticRenderFns;\r\n options._compiled = true;\r\n // functional template\r\n if (isFunctionalTemplate) {\r\n options.functional = true;\r\n }\r\n }\r\n // scopedId\r\n if (scopeId) {\r\n options._scopeId = scopeId;\r\n }\r\n var hook;\r\n if (moduleIdentifier) {\r\n // server build\r\n hook = function (context) {\r\n // 2.3 injection\r\n context =\r\n context || // cached call\r\n (this.$vnode && this.$vnode.ssrContext) || // stateful\r\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext); // functional\r\n // 2.2 with runInNewContext: true\r\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\r\n context = __VUE_SSR_CONTEXT__;\r\n }\r\n // inject component styles\r\n if (style) {\r\n style.call(this, createInjectorSSR(context));\r\n }\r\n // register component module identifier for async chunk inference\r\n if (context && context._registeredComponents) {\r\n context._registeredComponents.add(moduleIdentifier);\r\n }\r\n };\r\n // used by ssr in case component is cached and beforeCreate\r\n // never gets called\r\n options._ssrRegister = hook;\r\n }\r\n else if (style) {\r\n hook = shadowMode\r\n ? function (context) {\r\n style.call(this, createInjectorShadow(context, this.$root.$options.shadowRoot));\r\n }\r\n : function (context) {\r\n style.call(this, createInjector(context));\r\n };\r\n }\r\n if (hook) {\r\n if (options.functional) {\r\n // register for functional component in vue file\r\n var originalRender = options.render;\r\n options.render = function renderWithStyleInjection(h, context) {\r\n hook.call(context);\r\n return originalRender(h, context);\r\n };\r\n }\r\n else {\r\n // inject component registration as beforeCreate hook\r\n var existing = options.beforeCreate;\r\n options.beforeCreate = existing ? [].concat(existing, hook) : [hook];\r\n }\r\n }\r\n return script;\r\n}\n\nvar isOldIE = typeof navigator !== 'undefined' &&\r\n /msie [6-9]\\\\b/.test(navigator.userAgent.toLowerCase());\n\n/* script */\nvar __vue_script__ = script;\n\n/* template */\nvar __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_vm._t(\"default\")],2)};\nvar __vue_staticRenderFns__ = [];\n\n /* style */\n var __vue_inject_styles__ = undefined;\n /* scoped */\n var __vue_scope_id__ = undefined;\n /* module identifier */\n var __vue_module_identifier__ = undefined;\n /* functional template */\n var __vue_is_functional_template__ = false;\n /* style inject */\n \n /* style inject SSR */\n \n /* style inject shadow dom */\n \n\n \n var __vue_component__ = normalizeComponent(\n { render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },\n __vue_inject_styles__,\n __vue_script__,\n __vue_scope_id__,\n __vue_is_functional_template__,\n __vue_module_identifier__,\n false,\n undefined,\n undefined,\n undefined\n );\n\nexport default __vue_component__;\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t(\"tag.fields.name\"))+\": \"),_c('span',{staticClass:\"subtitle-1\"},[_vm._v(_vm._s(_vm.data.tag.name))])]),_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t(\"tag.fields.deveui\"))+\": \"),_c('span',{staticClass:\"subtitle-1\"},[_vm._v(_vm._s(_vm.data.tag.deveui))])]),_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t(\"tag.fields.profile\"))+\": \"),_c('span',{staticClass:\"subtitle-1\"},[_vm._v(_vm._s(_vm.data.tag.profile))])]),_c('v-divider'),_vm._l((_vm.data.data),function(v){return _c('h3',{key:v.tagDataId},[_vm._v(\" \"+_vm._s(v.key)+\": \"+_vm._s(v.value)+\" \")])}),(_vm.data.tag.installationImage && _vm.SO_API_BASE_URL != undefined)?_c('v-img',{attrs:{\"src\":_vm.SO_API_BASE_URL + '/api/image/' + _vm.data.tag.installationImage}}):_vm._e(),(_vm.mode == _vm.DashboardMode.EDIT)?_c('v-btn',{attrs:{\"color\":\"error\",\"text\":\"\"},on:{\"click\":function($event){return _vm.$emit('remove-marker', _vm.data)}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"common.delete\"))+\" \")]):_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n
\n {{ $t(\"tag.fields.name\") }}:\n {{ data.tag.name }}\n
\n\n \n {{ $t(\"tag.fields.deveui\") }}:\n {{ data.tag.deveui }}\n
\n \n {{ $t(\"tag.fields.profile\") }}:\n {{ data.tag.profile }}\n
\n\n \n\n \n {{ v.key }}: {{ v.value }}\n
\n\n \n\n \n {{ $t(\"common.delete\") }}\n \n \n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SoContent.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SoContent.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./SoContent.vue?vue&type=template&id=6719c1d8\"\nimport script from \"./SoContent.vue?vue&type=script&lang=js\"\nexport * from \"./SoContent.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n \n \n {{ module.title }}\n \n \n \n \n {{ $t(\"imageMap.chooseTag\") }}\n \n \n \n \n \n \n \n \n\n \n\n {{\n $t(\"module.meta.styles.text.textcolor\")\n }}\n \n
\n \n\n \n \n {{ $t(\"common.save\") }}\n \n \n \n \n\n \n \n \n \n \n \n \n \n {{ item.tag.name }}\n \n \n\n \n \n {{ item.data }}\n \n \n {{ item.deveui + \" - \" + item.key }}\n \n {{ $t(\"common.delete\") }}\n \n \n \n \n \n \n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModImageMap.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModImageMap.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ModImageMap.vue?vue&type=template&id=40c833bd\"\nimport script from \"./ModImageMap.vue?vue&type=script&lang=js\"\nexport * from \"./ModImageMap.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports"],"sourceRoot":""}