platypush/platypush/backend/http/webapp/dist/static/js/app.b00986ef.js.map

1 line
147 KiB
Plaintext

{"version":3,"file":"static/js/app.b00986ef.js","mappings":"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ACA,KACA,KAED,gBAAiB,CAChB,KACA,KACA,KACA,MAED,mBAAoB,CACnB,KACA,KACA,KACA,KACA,MAED,wBAAyB,CACxB,KACA,KACA,KACA,MAED,uBAAwB,CACvB,KACA,KACA,KACA,KACA,MAED,mBAAoB,CACnB,KACA,KACA,KACA,MAED,mBAAoB,CACnB,MAED,gBAAiB,CAChB,KACA,MAED,mBAAoB,CACnB,KACA,MAED,4BAA6B,CAC5B,KACA,KACA,KACA,MAED,+BAAgC,CAC/B,KACA,KACA,KACA,MAED,gCAAiC,CAChC,KACA,KACA,KACA,MAED,8BAA+B,CAC9B,KACA,KACA,KACA,MAED,6BAA8B,CAC7B,KACA,KACA,KACA,MAED,sCAAuC,CACtC,KACA,KACA,KACA,MAED,8BAA+B,CAC9B,KACA,KACA,KACA,MAED,yBAA0B,CACzB,KACA,KACA,KACA,MAED,6BAA8B,CAC7B,KACA,KACA,KACA,MAED,kBAAmB,CAClB,KACA,KACA,KACA,MAED,cAAe,CACd,KACA,KACA,MAED,oBAAqB,CACpB,KACA,KACA,MAED,sBAAuB,CACtB,IACA,KAED,qBAAsB,CACrB,KACA,KACA,KACA,MAED,gBAAiB,CAChB,KACA,KACA,KACA,KACA,MAED,oBAAqB,CACpB,KACA,KACA,KACA,KACA,OAGF,SAASuN,EAAoBC,GAC5B,IAAIC,EAAoBC,EAAE1N,EAAKwN,GAC9B,OAAO/J,QAAQ2B,UAAUE,MAAK,WAC7B,IAAIzL,EAAI,IAAI8T,MAAM,uBAAyBH,EAAM,KAEjD,MADA3T,EAAEc,KAAO,mBACHd,KAIR,IAAI+T,EAAM5N,EAAIwN,GAAMpX,EAAKwX,EAAI,GAC7B,OAAOnK,QAAQC,IAAIkK,EAAIvK,MAAM,GAAGrD,IAAIyN,EAAoB5T,IAAIyL,MAAK,WAChE,OAAOmI,EAAoBrX,MAG7BmX,EAAoB1R,KAAO,WAAa,OAAO5B,OAAO4B,KAAKmE,IAC3DuN,EAAoBnX,GAAK,KACzByX,EAAOC,QAAUP,G,qBCrPjB,IAAIvN,EAAM,CACT,mBAAoB,CACnB,IACA,KAED,iBAA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","sources":["webpack://platypush/./src/bus.js","webpack://platypush/./src/App.vue","webpack://platypush/./src/components/Notifications.vue","webpack://platypush/./src/components/Notification.vue","webpack://platypush/./src/components/Notification.vue?deb2","webpack://platypush/./src/components/Notifications.vue?e79f","webpack://platypush/./src/Events.vue","webpack://platypush/./src/Events.vue?0562","webpack://platypush/./src/components/VoiceAssistant.vue","webpack://platypush/./src/components/VoiceAssistant.vue?e102","webpack://platypush/./src/components/Pushbullet.vue","webpack://platypush/./src/components/Pushbullet.vue?a5f8","webpack://platypush/./src/App.vue?7ccd","webpack://platypush/./src/views/Dashboard.vue","webpack://platypush/./src/components/widgets/Row.vue","webpack://platypush/./src/components/widgets/Row.vue?bc29","webpack://platypush/./src/components/widgets/Widget.vue","webpack://platypush/./src/components/widgets/Widget.vue?043c","webpack://platypush/./src/views/Dashboard.vue?040e","webpack://platypush/./src/views/NotFound.vue","webpack://platypush/./src/views/NotFound.vue?0aab","webpack://platypush/./src/views/Login.vue","webpack://platypush/./src/views/Login.vue?240b","webpack://platypush/./src/views/Register.vue","webpack://platypush/./src/views/Register.vue?157d","webpack://platypush/./src/views/Panel.vue","webpack://platypush/./src/components/Nav.vue","webpack://platypush/./src/components/Nav.vue?1f44","webpack://platypush/./src/views/Panel.vue?792f","webpack://platypush/./src/views/Plugin.vue","webpack://platypush/./src/views/Plugin.vue?41f6","webpack://platypush/./src/router/index.js","webpack://platypush/./src/main.js","webpack://platypush/./src/utils/Api.vue","webpack://platypush/./src/utils/Api.vue?331a","webpack://platypush/./src/utils/Cookies.vue","webpack://platypush/./src/utils/Cookies.vue?0832","webpack://platypush/./src/utils/DateTime.vue","webpack://platypush/./src/utils/DateTime.vue?3df3","webpack://platypush/./src/utils/Events.vue","webpack://platypush/./src/utils/Events.vue?ad6c","webpack://platypush/./src/utils/Notification.vue","webpack://platypush/./src/utils/Notification.vue?b668","webpack://platypush/./src/utils/Screen.vue","webpack://platypush/./src/utils/Screen.vue?714e","webpack://platypush/./src/utils/Types.vue","webpack://platypush/./src/utils/Types.vue?2b41","webpack://platypush/./src/Utils.vue","webpack://platypush/./src/Utils.vue?83c2","webpack://platypush/./src/components/Loading.vue","webpack://platypush/./src/components/Loading.vue?1ccf","webpack://platypush/./src/components/Modal.vue","webpack://platypush/./src/components/Modal.vue?db1b","webpack://platypush/./src/components/elements/Dropdown.vue","webpack://platypush/./src/components/elements/Dropdown.vue?e934","webpack://platypush/./src/components/elements/DropdownItem.vue","webpack://platypush/./src/components/elements/DropdownItem.vue?d591","webpack://platypush/./src/components/panels/Settings/Index.vue","webpack://platypush/./src/components/panels/Settings/Token.vue","webpack://platypush/./src/components/panels/Settings/Token.vue?4a12","webpack://platypush/./src/components/panels/Settings/Users.vue","webpack://platypush/./src/components/panels/Settings/Users.vue?407b","webpack://platypush/./src/components/panels/Settings/Index.vue?0df9","webpack://platypush/./src/components/panels|lazy|/^\\.\\/.*\\/Index$/|groupOptions: {}|namespace object","webpack://platypush/./src/components/widgets|lazy|/^\\.\\/.*\\/Index$/|groupOptions: {}|namespace object","webpack://platypush/webpack/bootstrap","webpack://platypush/webpack/runtime/chunk loaded","webpack://platypush/webpack/runtime/compat get default export","webpack://platypush/webpack/runtime/define property getters","webpack://platypush/webpack/runtime/ensure chunk","webpack://platypush/webpack/runtime/get javascript chunk filename","webpack://platypush/webpack/runtime/get mini-css chunk filename","webpack://platypush/webpack/runtime/global","webpack://platypush/webpack/runtime/hasOwnProperty shorthand","webpack://platypush/webpack/runtime/load script","webpack://platypush/webpack/runtime/make namespace object","webpack://platypush/webpack/runtime/publicPath","webpack://platypush/webpack/runtime/css loading","webpack://platypush/webpack/runtime/jsonp chunk loading","webpack://platypush/webpack/startup"],"sourcesContent":["import mitt from 'mitt';\n\nconst bus = mitt();\n\nexport { bus };\n","<template>\n <Events ref=\"events\" :ws-port=\"config['backend.http'].websocket_port\" v-if=\"hasWebsocket\" />\n <Notifications ref=\"notifications\" />\n <VoiceAssistant ref=\"voice-assistant\" v-if=\"hasAssistant\" />\n <Pushbullet ref=\"pushbullet\" v-if=\"hasPushbullet\" />\n\n <router-view />\n</template>\n\n<script>\nimport Notifications from \"@/components/Notifications\";\nimport Utils from \"@/Utils\";\nimport Events from \"@/Events\";\nimport VoiceAssistant from \"@/components/VoiceAssistant\";\nimport { bus } from \"@/bus\";\nimport Pushbullet from \"@/components/Pushbullet\";\n\nexport default {\n name: 'App',\n mixins: [Utils],\n components: {Pushbullet, Notifications, Events, VoiceAssistant},\n\n data() {\n return {\n config: {},\n userAuthenticated: false,\n }\n },\n\n computed: {\n hasWebsocket() {\n return this.userAuthenticated &&\n 'backend.http' in this.config\n },\n\n hasAssistant() {\n return this.hasWebsocket\n },\n\n hasPushbullet() {\n return this.hasWebsocket && (\n 'pushbullet' in this.config ||\n 'backend.pushbullet' in this.config\n )\n },\n },\n\n methods: {\n onNotification(notification) {\n this.$refs.notifications.create(notification)\n },\n\n async initConfig() {\n this.config = await this.request('config.get')\n this.userAuthenticated = true\n },\n },\n\n created() {\n this.initConfig()\n },\n\n mounted() {\n bus.on('notification-create', this.onNotification)\n },\n}\n</script>\n\n<!--suppress CssUnusedSymbol -->\n<style lang=\"scss\">\n$fa-font-path: \"~@fortawesome/fontawesome-free/webfonts\";\n@import \"~@fortawesome/fontawesome-free/scss/fontawesome\";\n@import \"~@fortawesome/fontawesome-free/scss/solid\"; // fas\n@import \"~@fortawesome/fontawesome-free/scss/regular\"; // far\n@import \"~@fortawesome/fontawesome-free/scss/brands\"; // fab\n\nhtml, body {\n width: 100%;\n height: 100%;\n margin: 0;\n overflow: auto;\n}\n\n#app {\n font-family: BlinkMacSystemFont,-apple-system,Avenir,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Verdana,Arial,sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n width: 100%;\n height: 100%;\n color: #2c3e50;\n}\n</style>\n","<template>\n <div class=\"notifications\">\n <Notification v-for=\"(notification, id, index) in notifications\"\n :key=\"index\"\n :id=\"id\"\n :text=\"notification.text\"\n :html=\"notification.html\"\n :title=\"notification.title\"\n :link=\"notification.link\"\n :image=\"notification.image\"\n :warning=\"notification.warning\"\n :error=\"notification.error\"\n @clicked=\"destroy\">\n </Notification>\n </div>\n</template>\n\n<script>\nimport Notification from \"@/components/Notification\";\n\nexport default {\n name: \"Notifications\",\n components: {Notification},\n props: {\n duration: {\n // Default notification duration in milliseconds\n type: Number,\n default: 10000,\n }\n },\n\n data: function() {\n return {\n index: 0,\n notifications: {},\n timeouts: {},\n };\n },\n\n methods: {\n create: function(args) {\n const id = this.index++;\n this.notifications[id] = args;\n\n if (args.duration == null) {\n args.duration = this.duration;\n }\n\n const duration = args.duration ? parseInt(args.duration) : 0;\n if (duration) {\n this.timeouts[id] = setTimeout(this.destroy.bind(null, id), duration);\n }\n },\n\n destroy: function(id) {\n delete this.notifications[id];\n delete this.timeouts[id];\n },\n },\n}\n</script>\n\n<style scoped>\n.notifications {\n position: fixed;\n bottom: 0;\n right: 0;\n width: 25em;\n z-index: 1000;\n}\n</style>","<template>\n <div class=\"notification fade-in\" :class=\"{warning: warning, error: error}\" @click=\"clicked\">\n <div class=\"title\" v-if=\"title\" v-text=\"title\"></div>\n <div class=\"body\">\n <div class=\"image col-3\" v-if=\"image || warning || error\">\n <div class=\"row\">\n <img :src=\"image.src\" v-if=\"image && image.src\" alt=\"\">\n <i :class=\"['fa', 'fa-' + image.icon]\" :style=\"image.color ? '--color: ' + image.color : ''\"\n v-else-if=\"image && image.icon\"></i>\n <i :class=\"image.iconClass\" :style=\"image.color ? '--color: ' + image.color : ''\"\n v-else-if=\"image && image.iconClass\"></i>\n <i class=\"fa fa-exclamation\" v-else-if=\"warning\"></i>\n <i class=\"fa fa-times\" v-else-if=\"error\"></i>\n </div>\n </div>\n <div class=\"text col-9\" v-if=\"text && !!image\" v-text=\"text\"></div>\n <div class=\"text col-9\" v-if=\"html && !!image\" v-html=\"html\"></div>\n <div class=\"text row horizontal-center\" v-if=\"text && !image\" v-text=\"text\"></div>\n <div class=\"text row horizontal-center\" v-if=\"html && !image\" v-html=\"html\"></div>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n name: \"Notification\",\n props: ['id','text','html','title','image','link','error','warning'],\n\n methods: {\n clicked() {\n if (this.link) {\n window.open(this.link, '_blank');\n }\n\n this.$emit('clicked', this.id);\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.notification {\n background: $notification-bg;\n border: $notification-border;\n border-radius: 1em;\n margin-bottom: 0.25em !important;\n margin-right: 0.1em;\n padding: 0.5em;\n cursor: pointer;\n\n &:hover {\n background: $notification-hover-bg;\n &.warning { background: $notification-warning-hover-bg; }\n &.error { background: $notification-error-hover-bg; }\n }\n\n &.warning {\n background: $notification-warning-bg;\n border: $notification-warning-border;\n .image { --color: $notification-warning-icon-color; }\n }\n\n &.error {\n background: $notification-error-bg;\n border: $notification-error-border;\n .image { --color: $notification-error-icon-color; }\n }\n\n .title {\n color: $notification-title-fg;\n font-size: 1.25em;\n font-weight: normal;\n margin: 0.25em 0;\n padding: 0;\n letter-spacing: 0.07em;\n }\n\n .body {\n @extend .vertical-center;\n height: 6em;\n overflow: hidden;\n padding-bottom: 0.1em;\n letter-spacing: 0.05em;\n }\n\n .image {\n height: 100%;\n text-align: center;\n --color: $notification-icon-color;\n\n .row {\n @extend .vertical-center;\n @extend .horizontal-center;\n width: 100%;\n height: 100%;\n\n .fa {\n font-size: 2.5em;\n color: var(--color);\n }\n\n img {\n width: 80%;\n height: 80%;\n }\n }\n }\n}\n</style>","import { render } from \"./Notification.vue?vue&type=template&id=7646705e&scoped=true\"\nimport script from \"./Notification.vue?vue&type=script&lang=js\"\nexport * from \"./Notification.vue?vue&type=script&lang=js\"\n\nimport \"./Notification.vue?vue&type=style&index=0&id=7646705e&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7646705e\"]])\n\nexport default __exports__","import { render } from \"./Notifications.vue?vue&type=template&id=6dc8bebc&scoped=true\"\nimport script from \"./Notifications.vue?vue&type=script&lang=js\"\nexport * from \"./Notifications.vue?vue&type=script&lang=js\"\n\nimport \"./Notifications.vue?vue&type=style&index=0&id=6dc8bebc&scoped=true&lang=css\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6dc8bebc\"]])\n\nexport default __exports__","<template>\n <div/>\n</template>\n\n<script>\nimport { bus } from \"@/bus\";\n\nexport default {\n name: \"Events\",\n props: {\n wsPort: {\n type: Number,\n default: 8009,\n }\n },\n\n data() {\n return {\n ws: null,\n initialized: false,\n pending: false,\n opened: false,\n timeout: null,\n reconnectMsecs: 30000,\n handlers: {},\n handlerNameToEventTypes: {},\n }\n },\n\n methods: {\n onWebsocketTimeout() {\n console.log('Websocket reconnection timed out, retrying')\n this.pending = false\n if (this.ws)\n this.ws.close()\n\n this.onClose()\n },\n\n onMessage(event) {\n const handlers = []\n event = event.data\n\n if (typeof event === 'string') {\n try {\n event = JSON.parse(event)\n } catch (e) {\n console.warn('Received invalid non-JSON event')\n console.warn(event)\n }\n }\n\n console.debug(event)\n if (event.type !== 'event') {\n // Discard non-event messages\n return\n }\n\n if (null in this.handlers) { // lgtm [js/implicit-operand-conversion]\n handlers.push(this.handlers[null]) // lgtm [js/implicit-operand-conversion]\n }\n\n if (event.args.type in this.handlers) {\n handlers.push(...Object.values(this.handlers[event.args.type]))\n }\n\n for (let handler of handlers) {\n if (!handler)\n continue\n\n if (handler instanceof Array)\n handler = handler[0]\n else if (handler instanceof Object && !(handler instanceof Function))\n handler = Object.values(handler)[0]\n\n handler(event.args)\n }\n },\n\n onOpen() {\n if (this.opened) {\n console.log(\"There's already an opened websocket connection, closing the newly opened one\")\n if (this.ws) {\n this.ws.onclose = () => {}\n this.ws.close()\n }\n }\n\n console.log('Websocket connection successful')\n this.opened = true\n\n if (this.pending) {\n this.pending = false\n }\n\n if (this.timeout) {\n clearTimeout(this.timeout)\n this.timeout = undefined\n }\n },\n\n onError(error) {\n console.error('Websocket error')\n console.error(error)\n },\n\n onClose(event) {\n if (event) {\n console.log('Websocket closed - code: ' + event.code + ' - reason: ' + event.reason)\n }\n\n this.opened = false\n\n if (!this.pending) {\n this.pending = true\n this.init()\n }\n },\n\n init() {\n try {\n const protocol = location.protocol === 'https:' ? 'wss' : 'ws'\n const url = `${protocol}://${location.hostname}:${this.wsPort}`\n this.ws = new WebSocket(url)\n } catch (err) {\n console.error('Websocket initialization error')\n console.error(err)\n return\n }\n\n this.pending = true\n this.timeout = setTimeout(this.onWebsocketTimeout, this.reconnectMsecs)\n this.ws.onmessage = this.onMessage\n this.ws.onopen = this.onOpen\n this.ws.onerror = this.onError\n this.ws.onclose = this.onClose\n this.initialized = true\n },\n\n subscribe(msg) {\n const handler = msg.handler\n const events = msg.events.length ? msg.events : [null]\n const handlerName = msg.handlerName\n\n for (const event of events) {\n if (!(event in this.handlers)) {\n this.handlers[event] = {}\n }\n\n if (!(handlerName in this.handlerNameToEventTypes)) {\n this.handlerNameToEventTypes[handlerName] = events\n }\n\n this.handlers[event][handlerName] = handler\n }\n\n return () => {\n this.unsubscribe(handlerName)\n }\n },\n\n unsubscribe(handlerName) {\n const events = this.handlerNameToEventTypes[handlerName]\n if (!events)\n return\n\n for (const event of events) {\n if (!this.handlers[event]?.[handlerName])\n continue\n\n delete this.handlers[event][handlerName]\n if (!Object.keys(this.handlers[event]).length)\n delete this.handlers[event]\n }\n\n delete this.handlerNameToEventTypes[handlerName]\n },\n },\n\n created() {\n bus.on('subscribe', this.subscribe)\n bus.on('unsubscribe', this.unsubscribe)\n this.init()\n },\n}\n</script>\n","import { render } from \"./Events.vue?vue&type=template&id=26b9b70f\"\nimport script from \"./Events.vue?vue&type=script&lang=js\"\nexport * from \"./Events.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <div class=\"assistant-modal\">\n <Modal ref=\"assistantModal\">\n <div class=\"icon\">\n <i class=\"fa fa-bell\" v-if=\"state.alerting\"></i>\n <i class=\"fa fa-volume-up\" v-else-if=\"state.responding\"></i>\n <i class=\"fa fa-comment-dots\" v-else-if=\"state.speechRecognized\"></i>\n <i class=\"fa fa-microphone\" v-else></i>\n </div>\n\n <div class=\"text\">\n <div class=\"listening\" v-if=\"state.listening\">\n <span>Assistant listening</span>\n </div>\n <div class=\"speech-recognized\" v-else-if=\"state.speechRecognized\">\n <span v-text=\"phrase\"></span>\n </div>\n <div class=\"responding\" v-else-if=\"state.responding\">\n <span v-text=\"responseText\"></span>\n </div>\n </div>\n </Modal>\n </div>\n</template>\n\n<script>\nimport Modal from \"@/components/Modal\";\nimport Utils from \"@/Utils\";\n\nexport default {\n name: \"VoiceAssistant\",\n components: {Modal},\n mixins: [Utils],\n\n data() {\n return {\n responseText: '',\n phrase: '',\n hideTimeout: undefined,\n\n state: {\n listening: false,\n speechRecognized: false,\n responding: false,\n alerting: false,\n },\n };\n },\n\n methods: {\n reset() {\n this.state.listening = false\n this.state.speechRecognized = false\n this.state.responding = false\n this.state.alerting = false\n this.phrase = ''\n this.responseText = ''\n },\n\n conversationStart() {\n this.reset()\n this.state.listening = true\n this.$refs.assistantModal.show()\n\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout)\n this.hideTimeout = undefined\n }\n },\n\n conversationEnd() {\n const self = this\n\n this.hideTimeout = setTimeout(() => {\n this.reset()\n self.$refs.assistantModal.close()\n self.hideTimeout = undefined\n }, 4000)\n },\n\n speechRecognized(event) {\n this.reset()\n this.state.speechRecognized = true\n this.phrase = event.phrase\n this.$refs.assistantModal.show()\n },\n\n response(event) {\n this.reset()\n this.state.responding = true\n this.responseText = event.response_text\n this.$refs.assistantModal.show()\n },\n\n alertOn() {\n this.reset()\n this.state.alerting = true\n this.$refs.assistantModal.show()\n },\n\n alertOff() {\n this.reset()\n this.state.alerting = false\n this.$refs.assistantModal.close()\n },\n\n registerHandlers() {\n this.subscribe(this.conversationStart, null, 'platypush.message.event.assistant.ConversationStartEvent')\n this.subscribe(this.alertOn, null, 'platypush.message.event.assistant.AlertStartedEvent')\n this.subscribe(this.alertOff, null, 'platypush.message.event.assistant.AlertEndEvent')\n this.subscribe(this.speechRecognized, null, 'platypush.message.event.assistant.SpeechRecognizedEvent')\n this.subscribe(this.response, null, 'platypush.message.event.assistant.ResponseEvent')\n this.subscribe(this.conversationEnd, null,\n 'platypush.message.event.assistant.ConversationEndEvent',\n 'platypush.message.event.assistant.NoResponseEvent',\n 'platypush.message.event.assistant.ConversationTimeoutEvent')\n },\n },\n\n mounted() {\n this.registerHandlers()\n },\n}\n</script>\n\n<style lang=\"scss\">\n$icon-color: #7e8;\n$icon-border: 1px solid #ccc;\n$icon-shadow: 2px 2px 2px #ccc;\n\n.assistant-modal {\n .modal {\n .body {\n width: 50vw;\n height: 50vh;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n text-align: center;\n\n .icon {\n font-size: 3em;\n color: $icon-color;\n box-shadow: $icon-shadow;\n border: $icon-border;\n border-radius: 3em;\n padding: 1em;\n }\n\n .text {\n margin-top: 2.5em;\n }\n }\n }\n}\n</style>\n","import { render } from \"./VoiceAssistant.vue?vue&type=template&id=3f009270\"\nimport script from \"./VoiceAssistant.vue?vue&type=script&lang=js\"\nexport * from \"./VoiceAssistant.vue?vue&type=script&lang=js\"\n\nimport \"./VoiceAssistant.vue?vue&type=style&index=0&id=3f009270&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <div />\n</template>\n\n<script>\nimport Utils from \"@/Utils\";\n\nexport default {\n name: \"Pushbullet\",\n mixins: [Utils],\n\n methods: {\n onMessage(event) {\n if (event.push_type === 'mirror') {\n this.notify({\n title: event.title,\n text: event.body,\n image: {\n src: event.icon ? 'data:image/png;base64, ' + event.icon : undefined,\n icon: event.icon ? undefined : 'bell',\n },\n });\n }\n },\n },\n\n mounted() {\n this.subscribe(this.onMessage, null, 'platypush.message.event.pushbullet.PushbulletEvent')\n },\n}\n</script>\n","import { render } from \"./Pushbullet.vue?vue&type=template&id=bf9869d4\"\nimport script from \"./Pushbullet.vue?vue&type=script&lang=js\"\nexport * from \"./Pushbullet.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./App.vue?vue&type=template&id=fb956550\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=fb956550&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <Loading v-if=\"loading\" />\n\n <div id=\"dashboard\" class=\"col-12\" :class=\"classes\" :style=\"style\">\n <Row v-for=\"(row, i) in rows\" :key=\"i\" :class=\"row.class\" :style=\"row.style\">\n <keep-alive v-for=\"(widget, j) in row.widgets\" :key=\"j\">\n <Widget :style=\"widget.style\" :class=\"widget.class\">\n <component :is=\"widget.component\" v-bind=\"getWidgetProps(widget)\" />\n </Widget>\n </keep-alive>\n </Row>\n </div>\n</template>\n\n<script>\nimport { defineAsyncComponent } from 'vue'\nimport Utils from '@/Utils'\nimport Loading from \"@/components/Loading\";\nimport Row from \"@/components/widgets/Row\";\nimport Widget from \"@/components/widgets/Widget\";\n\nexport default {\n name: 'Dashboard',\n mixins: [Utils],\n components: {Widget, Loading, Row},\n props: {\n // Refresh interval in seconds.\n refreshSeconds: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n data() {\n return {\n rows: [],\n loading: false,\n style: undefined,\n class: undefined,\n }\n },\n\n computed: {\n classes() {\n return this.class\n },\n },\n\n methods: {\n getWidgetProps(widget) {\n const props = {...widget.props}\n if (props.class)\n delete props.class\n\n return props\n },\n\n parseTemplate(name, tmpl) {\n const node = new DOMParser().parseFromString(tmpl, 'text/xml').childNodes[0]\n const self = this\n this.style = node.attributes.style?.nodeValue\n this.class = node.attributes.class?.nodeValue\n\n this.rows = [...node.getElementsByTagName('Row')].map((row) => {\n return {\n style: row.attributes.style?.nodeValue,\n class: row.attributes.class?.nodeValue,\n widgets: [...row.children].map((el) => {\n const component = defineAsyncComponent(\n () => import(`@/components/widgets/${el.nodeName}/Index`)\n )\n\n const style = el.attributes.style?.nodeValue\n const classes = el.attributes.class?.nodeValue\n const attrs = [...el.attributes].reduce((obj, node) => {\n if (node.nodeName !== 'style') {\n obj[node.nodeName] = node.nodeValue\n }\n\n return obj\n }, {\n content: el.innerHTML,\n })\n\n const widget = {\n component: component,\n style: style,\n class: classes,\n props: attrs || {},\n }\n\n self.$options.components[el.nodeName] = component\n return widget\n })\n }\n })\n\n this.loading = false\n },\n\n async refreshDashboard() {\n this.loading = true\n this.widgets = []\n const name = this.$route.params.name\n const template = (await this.request('config.get_dashboard', { name: name }))\n\n if (!template) {\n this.error(`Dashboard ${name} not found`)\n }\n\n this.parseTemplate(name, template)\n },\n },\n\n mounted() {\n this.refreshDashboard()\n if (this.refreshSeconds) {\n const self = this\n setInterval(() => {\n self.refreshDashboard()\n }, parseInt((this.refreshSeconds*1000).toFixed(0)))\n }\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"~lato-font/scss/public-api\";\n$lato-font-path: \"~lato-font/fonts\";\n\n@include lato-include-font('medium');\n\n#dashboard {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 1em 1em 0 1em;\n background: $dashboard-bg;\n background-size: cover;\n font-family: Lato, proxima-nova, Helvetica Neue, Arial, sans-serif;\n\n .blurred {\n filter: blur(0.075em);\n }\n}\n</style>\n\n<style>\nhtml {\n overflow: auto !important;\n}\n</style>\n","<template>\n <div class=\"row\" :class=\"classes\" :style=\"style\">\n <slot />\n </div>\n</template>\n\n<script>\nexport default {\n name: \"Row\",\n props: {\n // Class override\n class: {\n type: String,\n required: false,\n default: '',\n },\n\n // Style override\n style: {\n type: String,\n required: false,\n default: '',\n },\n },\n\n computed: {\n classes() {\n return this.class\n },\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.row {\n width: 100%;\n height: 49%;\n\n &:not(:last-child) {\n margin-bottom: 1%;\n }\n}\n</style>\n","import { render } from \"./Row.vue?vue&type=template&id=1b4663f2&scoped=true\"\nimport script from \"./Row.vue?vue&type=script&lang=js\"\nexport * from \"./Row.vue?vue&type=script&lang=js\"\n\nimport \"./Row.vue?vue&type=style&index=0&id=1b4663f2&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1b4663f2\"]])\n\nexport default __exports__","<template>\n <div :style=\"style\" :class=\"classes\">\n <slot />\n </div>\n</template>\n\n<script>\nexport default {\n name: \"Widget\",\n props: {\n // Widget style override\n style: {\n type: String,\n required: false,\n default: '',\n },\n\n // Widget class override\n class: {\n type: String,\n required: false,\n default: '',\n },\n },\n\n computed: {\n classes() {\n return (this.class?.length ? this.class.split(' ') : ['col-3']).concat(['widget', 'column'])\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.widget {\n height: calc(100% - 1em);\n background: $background-color;\n border-radius: 5px;\n display: flex;\n justify-content: center;\n align-content: center;\n position: relative;\n overflow: hidden;\n box-shadow: 0 3px 3px 0 rgba(0,0,0,0.16), 0 0 0 1px rgba(0,0,0,0.08);\n}\n</style>\n","import { render } from \"./Widget.vue?vue&type=template&id=5df52982&scoped=true\"\nimport script from \"./Widget.vue?vue&type=script&lang=js\"\nexport * from \"./Widget.vue?vue&type=script&lang=js\"\n\nimport \"./Widget.vue?vue&type=style&index=0&id=5df52982&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5df52982\"]])\n\nexport default __exports__","import { render } from \"./Dashboard.vue?vue&type=template&id=cefcfdfc&scoped=true\"\nimport script from \"./Dashboard.vue?vue&type=script&lang=js\"\nexport * from \"./Dashboard.vue?vue&type=script&lang=js\"\n\nimport \"./Dashboard.vue?vue&type=style&index=0&id=cefcfdfc&lang=scss&scoped=true\"\nimport \"./Dashboard.vue?vue&type=style&index=1&id=cefcfdfc&lang=css\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-cefcfdfc\"]])\n\nexport default __exports__","<template>\n <h1>Object not found</h1>\n</template>\n\n<script>\nexport default {\n name: \"NotFound\"\n}\n</script>\n\n","import { render } from \"./NotFound.vue?vue&type=template&id=49501f4d\"\nimport script from \"./NotFound.vue?vue&type=script&lang=js\"\nexport * from \"./NotFound.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <div class=\"login-container\">\n <form class=\"login\" method=\"POST\">\n <div class=\"description\">\n {{ _register ? 'Welcome' : 'Authenticate' }} to platypush\n </div>\n\n <div class=\"row\">\n <label>\n <input type=\"text\" name=\"username\" placeholder=\"Username\">\n </label>\n </div>\n\n <div class=\"row\">\n <label>\n <input type=\"password\" name=\"password\" placeholder=\"Password\">\n </label>\n </div>\n\n <div class=\"row\" v-if=\"_register\">\n <label>\n <input type=\"password\" name=\"confirm_password\" placeholder=\"Confirm password\">\n </label>\n </div>\n\n <div class=\"row pull-right\">\n <input type=\"submit\" class=\"btn btn-primary\" :value=\"_register ? 'Register' : 'Login'\">\n </div>\n\n <div class=\"row pull-right\">\n <label class=\"checkbox\">\n <input type=\"checkbox\" name=\"remember\">&nbsp;\n Keep me logged in on this device &nbsp;\n </label>\n </div>\n </form>\n </div>\n</template>\n\n<script>\nimport Utils from \"@/Utils\";\n\nexport default {\n name: \"Login\",\n mixins: [Utils],\n props: {\n // Set to true for a registration form, false for a login form\n register: {\n type: Boolean,\n required: false,\n default: false,\n },\n },\n\n computed: {\n _register() {\n return this.parseBoolean(this.register)\n },\n }\n}\n</script>\n\n<style lang=\"scss\">\nbody {\n width: 100vw;\n height: 100vh;\n margin: 0;\n}\n\n.login-container {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: $default-bg-6;\n}\n\n.description {\n margin-bottom: 2em;\n text-align: center;\n}\n\nform {\n display: flex;\n flex-direction: column;\n padding: 4em;\n border: $default-border-3;\n border-radius: 3em;\n box-shadow: 2px 2px 3px 3px $border-color-2;\n background: $background-color;\n\n .row {\n margin: 0.5em 0;\n }\n\n input[type=text],\n input[type=password] {\n width: 100%;\n }\n\n input[type=submit],\n input[type=password] {\n border-radius: 1em;\n }\n\n input[type=password] {\n padding: .25em .5em;\n }\n\n .checkbox {\n display: flex;\n font-size: 0.8em;\n }\n}\n\na {\n color: $default-link-fg;\n}\n</style>\n","import { render } from \"./Login.vue?vue&type=template&id=d32baf50\"\nimport script from \"./Login.vue?vue&type=script&lang=js\"\nexport * from \"./Login.vue?vue&type=script&lang=js\"\n\nimport \"./Login.vue?vue&type=style&index=0&id=d32baf50&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <Login :register=\"true\" />\n</template>\n\n<script>\nimport Login from \"@/views/Login\";\n\nexport default {\n name: \"Register\",\n mixins: [Login],\n components: {Login},\n props: {\n register: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n}\n</script>\n","import { render } from \"./Register.vue?vue&type=template&id=1244b238\"\nimport script from \"./Register.vue?vue&type=script&lang=js\"\nexport * from \"./Register.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <main>\n <Loading v-if=\"loading\" />\n <Nav :panels=\"components\" :selected-panel=\"selectedPanel\" :hostname=\"hostname\"\n @select=\"selectedPanel = $event\" v-else />\n\n <div class=\"canvas\" v-if=\"selectedPanel === 'settings'\">\n <div class=\"panel\">\n <Settings />\n </div>\n </div>\n\n <div class=\"canvas\" v-else>\n <div class=\"panel\" :class=\"{hidden: name !== selectedPanel}\" v-for=\"(panel, name) in components\" :key=\"name\">\n <component :is=\"panel.component\" :config=\"panel.config\" :plugin-name=\"name\" v-if=\"name === selectedPanel\" />\n </div>\n </div>\n </main>\n</template>\n\n<script>\nimport {defineAsyncComponent} from \"vue\";\nimport Utils from '@/Utils'\nimport Loading from \"@/components/Loading\";\nimport Nav from \"@/components/Nav\";\nimport Settings from \"@/components/panels/Settings/Index\";\n\nexport default {\n name: 'Panel',\n mixins: [Utils],\n components: {Settings, Nav, Loading},\n\n data() {\n return {\n loading: false,\n plugins: {},\n backends: {},\n procedures: {},\n components: {},\n hostname: undefined,\n selectedPanel: undefined,\n }\n },\n\n methods: {\n initSelectedPanel() {\n const match = this.$route.hash.match('#?([a-zA-Z0-9.]+)[?]?(.*)')\n if (!match)\n return\n\n const plugin = match[1]\n if (plugin?.length)\n this.selectedPanel = plugin\n },\n\n initPanels() {\n const self = this\n this.components = {}\n\n Object.entries(this.plugins).forEach(async ([name, plugin]) => {\n const componentName = name.split('.').map((token) => token[0].toUpperCase() + token.slice(1)).join('')\n let comp = null\n try {\n comp = await import(`@/components/panels/${componentName}/Index`)\n } catch (e) {\n return\n }\n\n const component = defineAsyncComponent(async () => { return comp })\n self.$options.components[name] = component\n self.components[name] = {\n component: component,\n pluginName: name,\n config: plugin,\n }\n })\n },\n\n async parseConfig() {\n [this.plugins, this.backends, this.procedures, this.hostname] =\n await Promise.all([\n this.request('config.get_plugins'),\n this.request('config.get_backends'),\n this.request('config.get_procedures'),\n this.request('config.get_device_id'),\n ])\n\n this.initializeDefaultViews()\n },\n\n initializeDefaultViews() {\n this.plugins.execute = {}\n this.plugins.switches = {}\n },\n },\n\n async mounted() {\n this.loading = true\n\n try {\n await this.parseConfig()\n this.initPanels()\n this.initSelectedPanel()\n } finally {\n this.loading = false\n }\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\nmain {\n height: 100%;\n display: flex;\n\n @media screen and (max-width: $tablet) {\n flex-direction: column;\n }\n\n .canvas {\n display: flex;\n flex-grow: 100;\n background: $menu-panel-bg;\n overflow: auto;\n\n .panel {\n width: 100%;\n height: 100%;\n display: flex;\n margin: 0 !important;\n box-shadow: none !important;\n overflow: auto;\n }\n }\n}\n</style>\n\n<style>\nhtml {\n overflow: auto !important;\n}\n</style>\n","<template>\n <nav :class=\"{collapsed: collapsed}\">\n <div class=\"toggler\" @click=\"collapsed = !collapsed\">\n <i class=\"fas fa-bars\" />\n <span class=\"hostname\" v-if=\"hostname\" v-text=\"hostname\" />\n </div>\n\n <ul class=\"plugins\">\n <li v-for=\"name in Object.keys(panels).sort()\" :key=\"name\" class=\"entry\" :class=\"{selected: name === selectedPanel}\"\n :title=\"name\" @click=\"onItemClick(name)\">\n <a :href=\"`/#${name}`\">\n <span class=\"icon\">\n <i :class=\"icons[name].class\" v-if=\"icons[name]?.class\" />\n <img :src=\"icons[name].imgUrl\" v-else-if=\"icons[name]?.imgUrl\" alt=\"name\"/>\n <i class=\"fas fa-puzzle-piece\" v-else />\n </span>\n <span class=\"name\" v-if=\"!collapsed\" v-text=\"name\" />\n </a>\n </li>\n </ul>\n\n <ul class=\"footer\">\n <li :class=\"{selected: selectedPanel === 'settings'}\" title=\"Settings\" @click=\"onItemClick('settings')\">\n <!--suppress HtmlUnknownAnchorTarget -->\n <a href=\"/#settings\">\n <span class=\"icon\">\n <i class=\"fa fa-cog\" />\n </span>\n <span class=\"name\" v-if=\"!collapsed\">Settings</span>\n </a>\n </li>\n\n <li title=\"Logout\" @click=\"onItemClick('logout')\">\n <!--suppress HtmlUnknownTarget -->\n <a href=\"/logout\">\n <span class=\"icon\">\n <i class=\"fas fa-sign-out-alt\" />\n </span>\n <span class=\"name\" v-if=\"!collapsed\">Logout</span>\n </a>\n </li>\n </ul>\n </nav>\n</template>\n\n<script>\nimport icons from '@/assets/icons.json'\nimport Utils from \"@/Utils\";\n\nexport default {\n name: \"Nav\",\n emits: ['select'],\n mixins: [Utils],\n props: {\n panels: {\n type: Object,\n required: true,\n },\n\n selectedPanel: {\n type: String,\n },\n\n hostname: {\n type: String,\n },\n },\n\n methods: {\n onItemClick(name) {\n this.$emit('select', name)\n this.collapsed = true\n },\n },\n\n data() {\n return {\n collapsed: true,\n icons: icons,\n host: null,\n }\n },\n\n mounted() {\n if (this.isMobile() && !this.$root.$route.hash.length)\n this.collapsed = false\n },\n}\n</script>\n\n<!--suppress SassScssResolvedByNameOnly -->\n<style lang=\"scss\" scoped>\n$toggler-height: 2em;\n$footer-collapsed-height: 4em;\n$footer-expanded-height: 7.5em;\n\nnav {\n @media screen and (max-width: $tablet) {\n width: 100%;\n height: 100vh;\n background: $nav-bg;\n color: $nav-fg;\n box-shadow: $nav-box-shadow-main;\n\n &:not(.collapsed) {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 5;\n }\n }\n\n @media screen and (min-width: $tablet) {\n width: calc(16em - 2vw);\n height: 100%;\n overflow: auto;\n background: $nav-bg;\n color: $nav-fg;\n box-shadow: $nav-box-shadow-main;\n margin-right: 2px;\n }\n\n @media screen and (min-width: $desktop) {\n width: 16em;\n }\n\n li {\n border: $nav-entry-border;\n cursor: pointer;\n list-style: none;\n\n a {\n display: block;\n color: $nav-fg;\n padding: 1em 0.5em;\n &:hover {\n color: $nav-fg;\n }\n }\n\n &:hover {\n background: $nav-entry-hover-bg;\n }\n\n &.selected {\n background: $nav-entry-selected-bg;\n }\n\n .name {\n margin-left: 0.5em;\n }\n\n .icon {\n margin-right: 0.5em;\n }\n }\n\n .toggler {\n width: 100%;\n display: flex;\n background: $nav-toggler-bg;\n font-size: 1.5em;\n cursor: pointer;\n padding: 0.6em;\n align-items: center;\n box-shadow: $nav-toggler-shadow;\n }\n\n .hostname {\n font-size: 0.7em;\n margin-top: -0.2em;\n\n @media screen and (min-width: $tablet) {\n margin-left: 1em;\n }\n\n @media screen and (max-width: $tablet) {\n text-align: right;\n margin-right: 0.25em;\n flex-grow: 1;\n }\n }\n\n .plugins {\n height: calc(100% - #{$toggler-height} - #{$footer-expanded-height} - 1.4em);\n overflow: auto;\n }\n\n .footer {\n height: $footer-expanded-height;\n background: $nav-footer-bg;\n padding: 0;\n margin: 0;\n }\n\n ul {\n li {\n .icon {\n margin-right: 0;\n\n & img {\n width: 1.25em;\n height: 1.25em;\n }\n }\n }\n }\n\n &.collapsed {\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $tablet) {\n width: 2.5em;\n min-width: unset;\n max-width: unset;\n background: $nav-collapsed-bg;\n color: $nav-collapsed-fg;\n box-shadow: $nav-box-shadow-collapsed;\n\n .hostname {\n display: none;\n }\n }\n\n @media screen and (max-width: $tablet) {\n height: auto;\n }\n\n a {\n color: $nav-collapsed-fg;\n padding: 0.25em 0;\n &:hover {\n color: $nav-collapsed-fg;\n }\n }\n\n .toggler {\n height: $toggler-height;\n background: none;\n text-align: center;\n padding: 0.4em;\n box-shadow: none;\n }\n\n .footer {\n height: $footer-collapsed-height;\n background: none;\n padding: 0;\n margin-bottom: .5em;\n }\n\n @media screen and (max-width: $tablet) {\n .footer {\n display: none;\n }\n }\n\n ul {\n display: flex;\n flex-direction: column;\n justify-content: center;\n height: calc(100% - #{$toggler-height} - #{$footer-collapsed-height});\n overflow: hidden;\n\n &.plugins {\n @media screen and (min-width: $tablet) and (max-width: $desktop - 1px) {\n justify-content: left;\n margin: 2em 0;\n }\n }\n\n &:hover {\n overflow: auto;\n }\n\n li {\n border: none;\n padding: 0;\n text-align: center;\n\n &.selected,\n &:hover {\n border-radius: 1em;\n margin: 0 0.2em;\n }\n\n &.selected {\n background: $nav-entry-collapsed-selected-bg;\n }\n\n &:hover {\n background: $nav-entry-collapsed-hover-bg;\n }\n\n .icon {\n margin-right: 0;\n }\n\n @media screen and (max-width: $tablet) {\n display: none;\n }\n }\n }\n }\n}\n</style>\n","import { render } from \"./Nav.vue?vue&type=template&id=6c2cfd7a&scoped=true\"\nimport script from \"./Nav.vue?vue&type=script&lang=js\"\nexport * from \"./Nav.vue?vue&type=script&lang=js\"\n\nimport \"./Nav.vue?vue&type=style&index=0&id=6c2cfd7a&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6c2cfd7a\"]])\n\nexport default __exports__","import { render } from \"./Panel.vue?vue&type=template&id=5ec69f95&scoped=true\"\nimport script from \"./Panel.vue?vue&type=script&lang=js\"\nexport * from \"./Panel.vue?vue&type=script&lang=js\"\n\nimport \"./Panel.vue?vue&type=style&index=0&id=5ec69f95&lang=scss&scoped=true\"\nimport \"./Panel.vue?vue&type=style&index=1&id=5ec69f95&lang=css\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5ec69f95\"]])\n\nexport default __exports__","<template>\n <main>\n <Loading v-if=\"loading\" />\n <div class=\"canvas\" v-else>\n <component :is=\"component\" :config=\"config\" :plugin-name=\"pluginName\" />\n </div>\n </main>\n</template>\n\n<script>\nimport {defineAsyncComponent} from \"vue\";\nimport Utils from '@/Utils'\nimport Loading from \"@/components/Loading\";\nimport Nav from \"@/components/Nav\";\nimport Settings from \"@/components/panels/Settings/Index\";\n\nexport default {\n name: 'Panel',\n mixins: [Utils],\n components: {Settings, Nav, Loading},\n\n data() {\n return {\n loading: false,\n config: {},\n plugins: {},\n backends: {},\n procedures: {},\n component: undefined,\n hostname: undefined,\n selectedPanel: undefined,\n }\n },\n\n computed: {\n pluginName() {\n return this.$route.params.plugin\n },\n },\n\n methods: {\n async initPanel() {\n const componentName = this.pluginName.split('.').map((token) => token[0].toUpperCase() + token.slice(1)).join('')\n let comp = null\n\n try {\n comp = await import(`@/components/panels/${componentName}/Index`)\n } catch (e) {\n console.error(e)\n this.notify({\n error: true,\n title: `Cannot load plugin ${this.pluginName}`,\n text: e.toString(),\n })\n\n return\n }\n\n this.component = defineAsyncComponent(async () => { return comp })\n this.$options.components[name] = this.component\n },\n\n async initConfig() {\n const config = await this.request('config.get')\n this.config = config[this.pluginName] || {}\n this.hostname = await this.request('config.get_device_id')\n },\n },\n\n async mounted() {\n this.loading = true\n\n try {\n await this.initConfig()\n await this.initPanel()\n } finally {\n this.loading = false\n }\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\nmain {\n height: 100%;\n display: flex;\n\n @media screen and (max-width: $tablet) {\n flex-direction: column;\n }\n\n .canvas {\n display: flex;\n flex-grow: 100;\n background: $menu-panel-bg;\n overflow: auto;\n\n .panel {\n width: 100%;\n height: 100%;\n display: flex;\n margin: 0 !important;\n box-shadow: none !important;\n overflow: auto;\n }\n }\n}\n</style>\n\n<style>\nhtml {\n overflow: auto !important;\n}\n</style>\n","import { render } from \"./Plugin.vue?vue&type=template&id=67571c94&scoped=true\"\nimport script from \"./Plugin.vue?vue&type=script&lang=js\"\nexport * from \"./Plugin.vue?vue&type=script&lang=js\"\n\nimport \"./Plugin.vue?vue&type=style&index=0&id=67571c94&lang=scss&scoped=true\"\nimport \"./Plugin.vue?vue&type=style&index=1&id=67571c94&lang=css\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-67571c94\"]])\n\nexport default __exports__","import { createWebHistory, createRouter } from \"vue-router\";\nimport Dashboard from \"@/views/Dashboard.vue\";\nimport NotFound from \"@/views/NotFound\";\nimport Login from \"@/views/Login\";\nimport Register from \"@/views/Register\";\nimport Panel from \"@/views/Panel\";\nimport Plugin from \"@/views/Plugin\";\n\nconst routes = [\n {\n path: \"/\",\n name: \"Panel\",\n component: Panel,\n },\n\n {\n path: \"/dashboard/:name\",\n name: \"Dashboard\",\n component: Dashboard,\n },\n\n {\n path: \"/plugin/:plugin\",\n name: \"Plugin\",\n component: Plugin,\n },\n\n {\n path: \"/login\",\n name: \"Login\",\n component: Login,\n },\n\n {\n path: \"/register\",\n name: \"Register\",\n component: Register,\n },\n\n {\n path: \"/:catchAll(.*)\",\n component: NotFound,\n },\n];\n\nconst router = createRouter({\n history: createWebHistory(),\n routes,\n});\n\nexport default router;\n","import { createApp } from 'vue'\nimport App from '@/App.vue'\nimport router from '@/router'\n\nconst app = createApp(App)\napp.config.globalProperties._config = window.config\napp.use(router).mount('#app')\n","<script>\nimport axios from 'axios'\n\nexport default {\n name: \"Api\",\n methods: {\n execute(request, timeout=60000) {\n const opts = {};\n\n if (!('target' in request) || !request['target']) {\n request['target'] = 'localhost'\n }\n\n if (!('type' in request) || !request['type']) {\n request['type'] = 'request'\n }\n\n if (timeout) {\n opts.timeout = timeout\n }\n\n return new Promise((resolve, reject) => {\n axios.post('/execute', request, opts)\n .then((response) => {\n response = response.data.response\n if (!response.errors?.length) {\n resolve(response.output);\n } else {\n const error = response.errors?.[0] || response\n this.notify({\n text: error,\n error: true,\n })\n\n reject(error)\n }\n })\n .catch((error) => {\n this.notify({\n text: error,\n error: true,\n })\n\n reject(error)\n })\n })\n },\n\n request(action, args={}, timeout=60000) {\n return this.execute({\n type: 'request',\n action: action,\n args: args,\n }, timeout);\n }\n },\n}\n</script>\n\n","import script from \"./Api.vue?vue&type=script&lang=js\"\nexport * from \"./Api.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nexport default {\n name: \"Cookies\",\n methods: {\n getCookies() {\n return document.cookie.split(/;\\s*/).reduce((obj, item) => {\n const [k, v] = item.split('=')\n obj[k] = v\n return obj\n }, {})\n }\n }\n}\n</script>\n","import script from \"./Cookies.vue?vue&type=script&lang=js\"\nexport * from \"./Cookies.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nexport default {\n name: \"DateTime\",\n methods: {\n formatDate(date, year=false) {\n if (typeof date === 'string')\n date = new Date(Date.parse(date))\n\n return date.toDateString().substring(0, year ? 15 : 10)\n },\n\n formatTime(date, seconds=true) {\n if (typeof date === 'string')\n date = new Date(Date.parse(date))\n\n return date.toTimeString().substring(0, seconds ? 8 : 5)\n },\n\n formatDateTime(date, year=false, seconds=true) {\n if (typeof date === 'string')\n date = new Date(Date.parse(date))\n\n return `${this.formatDate(date, year)}, ${this.formatTime(date, seconds)}`\n },\n },\n}\n</script>\n","import script from \"./DateTime.vue?vue&type=script&lang=js\"\nexport * from \"./DateTime.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nimport { bus } from \"@/bus\";\n\nexport default {\n name: \"Events\",\n computed: {\n _eventsReady() {\n return this.$root.$refs.events?.initialized\n },\n },\n\n methods: {\n subscribe(handler, handlerName, ...events) {\n const subFunc = () => {\n bus.emit('subscribe', {\n events: events,\n handler: handler,\n handlerName: handlerName || this.generateId(),\n })\n }\n\n if (this._eventsReady) {\n subFunc()\n return\n }\n\n const self = this\n const unwatch = this.$watch( () => self._eventsReady, (newVal) => {\n if (newVal) {\n subFunc()\n unwatch()\n }\n })\n\n return unwatch\n },\n\n unsubscribe(handlerName) {\n bus.emit('unsubscribe', handlerName)\n },\n\n generateId() {\n return btoa([...Array(11).keys()].map(() => String.fromCharCode(Math.round(Math.random() * 255))))\n },\n }\n}\n</script>\n","import script from \"./Events.vue?vue&type=script&lang=js\"\nexport * from \"./Events.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nimport { bus } from \"@/bus\";\n\nexport default {\n name: \"Notification\",\n methods: {\n notify(notification) {\n bus.emit('notification-create', notification)\n },\n\n warn(msg) {\n this.notify({\n text: msg,\n warning: true,\n })\n },\n\n error(msg) {\n this.notify({\n text: msg,\n error: true,\n })\n\n throw msg\n },\n }\n}\n</script>\n","import script from \"./Notification.vue?vue&type=script&lang=js\"\nexport * from \"./Notification.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nexport default {\n name: \"Screen\",\n methods: {\n isMobile() {\n return window.matchMedia(\"only screen and (max-width: 760px)\").matches\n },\n\n isTablet() {\n return !this.isMobile() && window.matchMedia(\"only screen and (max-width: 960px)\").matches\n },\n\n isDesktop() {\n return window.matchMedia(\"only screen and (min-width: 1152px)\").matches\n },\n },\n}\n</script>\n","import script from \"./Screen.vue?vue&type=script&lang=js\"\nexport * from \"./Screen.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nexport default {\n name: \"Types\",\n methods: {\n parseBoolean(value) {\n if (typeof value === 'string') {\n value = value.toLowerCase()\n if (value === 'true')\n return true\n if (value === 'false')\n return false\n\n return !!parseInt(value)\n }\n\n return !!value\n },\n\n convertSize(value) {\n if (typeof value === 'string')\n value = parseInt(value)\n\n let unit = null\n const units = ['B', 'KB', 'MB', 'GB', 'TB']\n\n units.forEach((u, i) => {\n if (value <= 1024 && unit == null) {\n unit = u\n } else if (value > 1024) {\n if (i === units.length-1) {\n unit = u\n } else {\n value = value/1024\n }\n }\n })\n\n return `${value.toFixed(2)} ${unit}`\n }\n },\n}\n</script>\n","import script from \"./Types.vue?vue&type=script&lang=js\"\nexport * from \"./Types.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nimport Api from \"@/utils/Api\";\nimport Cookies from \"@/utils/Cookies\";\nimport DateTime from \"@/utils/DateTime\";\nimport Events from \"@/utils/Events\";\nimport Notification from \"@/utils/Notification\";\nimport Screen from \"@/utils/Screen\";\nimport Types from \"@/utils/Types\";\n\nexport default {\n name: \"Utils\",\n mixins: [Api, Cookies, Notification, Events, DateTime, Screen, Types],\n}\n</script>\n","import script from \"./Utils.vue?vue&type=script&lang=js\"\nexport * from \"./Utils.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n <div class=\"loading\">\n <div class=\"icon\">\n <div v-for=\"n in 4\" :key=\"n\" />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.loading {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 3em;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: $loading-bg;\n opacity: 0.5;\n}\n\n.icon {\n display: inline-block;\n position: relative;\n width: 80px;\n height: 80px;\n\n div {\n position: absolute;\n top: 33px;\n width: 13px;\n height: 13px;\n border-radius: 50%;\n background: #fff;\n animation-timing-function: cubic-bezier(0, 1, 1, 0);\n\n &:nth-child(1) {\n left: 8px;\n animation: lds-ellipsis1 0.6s infinite;\n }\n\n &:nth-child(2) {\n left: 8px;\n animation: lds-ellipsis2 0.6s infinite;\n }\n\n &:nth-child(3) {\n left: 32px;\n animation: lds-ellipsis2 0.6s infinite;\n }\n\n &:nth-child(4) {\n left: 56px;\n animation: lds-ellipsis3 0.6s infinite;\n }\n }\n}\n\n@keyframes lds-ellipsis1 {\n 0% {\n transform: scale(0);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n@keyframes lds-ellipsis3 {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(0);\n }\n}\n\n@keyframes lds-ellipsis2 {\n 0% {\n transform: translate(0, 0);\n }\n 100% {\n transform: translate(24px, 0);\n }\n}\n</style>","import { render } from \"./Loading.vue?vue&type=template&id=4d9c871b&scoped=true\"\nconst script = {}\n\nimport \"./Loading.vue?vue&type=style&index=0&id=4d9c871b&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4d9c871b\"]])\n\nexport default __exports__","<template>\n <div class=\"modal-container fade-in\" :id=\"id\" :class=\"{hidden: !isVisible}\" :style=\"{'--z-index': zIndex}\" @click=\"close\">\n <div class=\"modal\">\n <div class=\"content\" :style=\"{'--width': width, '--height': height}\" @click=\"$event.stopPropagation()\">\n <div class=\"header\" v-text=\"title\" v-if=\"title\"></div>\n <div class=\"body\">\n <slot @modal-close=\"close\" />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n name: \"Modal\",\n emits: ['close', 'open'],\n props: {\n // Modal ID\n id: {\n type: String,\n },\n\n // Modal title\n title: {\n type: String,\n },\n\n // Modal width\n width: {\n type: [Number, String],\n },\n\n // Modal height\n height: {\n type: [Number, String],\n },\n\n // Modal initial visibility value\n visible: {\n type: Boolean,\n default: false,\n },\n\n // Modal timeout in seconds\n timeout: {\n type: [Number, String],\n },\n\n // Modal z-index level\n level: {\n type: Number,\n default: 1,\n },\n },\n\n data() {\n return {\n timeoutId: undefined,\n prevVisible: this.visible,\n isVisible: this.visible,\n }\n },\n\n computed: {\n zIndex() {\n return 500 + this.level\n },\n },\n\n methods: {\n close() {\n this.prevVisible = this.isVisible\n this.isVisible = false\n },\n\n hide() {\n this.close()\n },\n\n show() {\n this.prevVisible = this.isVisible\n this.isVisible = true\n },\n\n toggle() {\n if (this.isVisible)\n this.close()\n else\n this.show()\n },\n },\n\n mounted() {\n const self = this\n const visibleHndl = (visible) => {\n if (!visible)\n self.$emit('close')\n else\n self.$emit('open')\n\n self.isVisible = visible\n }\n\n this.$watch(() => this.visible, visibleHndl)\n this.$watch(() => this.isVisible, visibleHndl)\n },\n\n updated() {\n this.prevVisible = this.isVisible\n if (this.isVisible) {\n // Make sure that a newly opened or visible+updated modal always comes to the front\n let maxZIndex = parseInt(getComputedStyle(this.$el).zIndex)\n let outermostModals = []\n\n for (const modal of document.querySelectorAll('.modal-container:not(.hidden)')) {\n const zIndex = parseInt(getComputedStyle(modal).zIndex)\n\n if (zIndex > maxZIndex) {\n maxZIndex = zIndex\n outermostModals = [modal]\n } else if (zIndex === maxZIndex) {\n outermostModals.push(modal)\n }\n }\n\n if (outermostModals.indexOf(this.$el) < 0 || outermostModals.length > 1) {\n this.$el.style.zIndex = maxZIndex+1\n }\n }\n\n if (this.isVisible && this.timeout && !this.timeoutId) {\n const handler = (self) => {\n return () => {\n // self.modalClose()\n self.close()\n self.timeoutId = undefined\n }\n }\n\n this.timeoutId = setTimeout(handler(this), 0+this.timeout)\n }\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.modal-container {\n position: fixed;\n display: flex;\n align-items: center;\n justify-content: center;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: var(--z-index);\n background: rgba(10,10,10,0.9);\n\n .modal {\n display: flex;\n\n .content {\n --width: auto;\n --height: auto;\n width: var(--width);\n height: var(--height);\n border-radius: 0.5em;\n background: $modal-body-bg;\n }\n\n .header {\n display: flex;\n border-bottom: $modal-header-border;\n border-radius: 0.5em 0.5em 0 0;\n padding: 0.5em;\n text-align: center;\n justify-content: center;\n align-items: center;\n background: $modal-header-bg;\n text-transform: uppercase;\n }\n\n .body {\n max-height: 75vh;\n overflow: auto;\n padding: 2em;\n }\n }\n}\n</style>","import { render } from \"./Modal.vue?vue&type=template&id=010fadd6&scoped=true\"\nimport script from \"./Modal.vue?vue&type=script&lang=js\"\nexport * from \"./Modal.vue?vue&type=script&lang=js\"\n\nimport \"./Modal.vue?vue&type=style&index=0&id=010fadd6&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-010fadd6\"]])\n\nexport default __exports__","<template>\n <div class=\"dropdown-container\" ref=\"container\">\n <button :title=\"title\" ref=\"button\" @click.stop=\"toggle($event)\">\n <i class=\"icon\" :class=\"iconClass\" v-if=\"iconClass\" />\n <span class=\"text\" v-text=\"text\" v-if=\"text\" />\n </button>\n\n <div class=\"dropdown fade-in\" :id=\"id\" :class=\"{hidden: !visible}\" ref=\"dropdown\">\n <slot />\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n name: \"Dropdown\",\n emits: ['click'],\n props: {\n id: {\n type: String,\n },\n\n items: {\n type: Array,\n default: () => [],\n },\n\n iconClass: {\n type: String,\n default: 'fa fa-ellipsis-h',\n },\n\n text: {\n type: String,\n },\n\n title: {\n type: String,\n },\n },\n\n data() {\n return {\n visible: false,\n }\n },\n\n methods: {\n documentClickHndl(event) {\n if (!this.visible)\n return\n\n let element = event.target\n while (element) {\n if (!this.$refs.dropdown)\n break\n if (element === this.$refs.dropdown.element)\n return\n\n element = element.parentElement\n }\n\n this.close()\n },\n\n close() {\n this.visible = false\n document.removeEventListener('click', this.documentClickHndl)\n },\n\n open() {\n document.addEventListener('click', this.documentClickHndl)\n this.visible = true\n\n setTimeout(() => {\n const element = this.$refs.dropdown\n element.style.left = 0\n element.style.top = parseFloat(getComputedStyle(this.$refs.button).height) + 'px'\n\n if (element.getBoundingClientRect().left > window.innerWidth/2)\n element.style.left = (-element.clientWidth + parseFloat(getComputedStyle(this.$refs.button).width)) + 'px'\n\n if (element.getBoundingClientRect().top > window.innerHeight/2)\n element.style.top = (-element.clientHeight + parseFloat(getComputedStyle(this.$refs.button).height)) + 'px'\n }, 10)\n },\n\n toggle(event) {\n event.stopPropagation()\n this.$emit('click')\n this.visible ? this.close() : this.open()\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.dropdown-container {\n position: relative;\n display: inline-flex;\n flex-direction: column;\n\n .dropdown {\n position: absolute;\n width: max-content;\n background: $dropdown-bg;\n border-radius: .25em;\n border: $default-border-3;\n box-shadow: $dropdown-shadow;\n display: flex;\n flex-direction: column;\n z-index: 1;\n }\n}\n</style>\n","import { render } from \"./Dropdown.vue?vue&type=template&id=068c53bc&scoped=true\"\nimport script from \"./Dropdown.vue?vue&type=script&lang=js\"\nexport * from \"./Dropdown.vue?vue&type=script&lang=js\"\n\nimport \"./Dropdown.vue?vue&type=style&index=0&id=068c53bc&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-068c53bc\"]])\n\nexport default __exports__","<template>\n <div class=\"row item\" :class=\"itemClass\" @click=\"clicked\">\n <div class=\"col-1 icon\" v-if=\"iconClass\">\n <i :class=\"iconClass\" />\n </div>\n <div class=\"text\" :class=\"{'col-11': iconClass != null}\" v-text=\"text\" />\n </div>\n</template>\n\n<script>\nexport default {\n name: \"DropdownItem\",\n props: {\n iconClass: {\n type: String,\n },\n\n text: {\n type: String,\n },\n\n disabled: {\n type: Boolean,\n default: false,\n },\n\n itemClass: {\n type: String,\n }\n },\n\n methods: {\n clicked(event) {\n this.$parent.$emit('click', event)\n this.$parent.visible = false\n }\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.item {\n display: flex;\n padding: .5em .25em;\n cursor: pointer;\n align-items: center;\n\n &:hover {\n background: $hover-bg;\n }\n\n &.disabled {\n color: $dropdown-disabled-color;\n cursor: initial;\n }\n\n .icon {\n margin: 0 .5em;\n }\n}\n</style>\n","import { render } from \"./DropdownItem.vue?vue&type=template&id=6d8973c4&scoped=true\"\nimport script from \"./DropdownItem.vue?vue&type=script&lang=js\"\nexport * from \"./DropdownItem.vue?vue&type=script&lang=js\"\n\nimport \"./DropdownItem.vue?vue&type=style&index=0&id=6d8973c4&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6d8973c4\"]])\n\nexport default __exports__","<template>\n <div class=\"settings-container\">\n <header>\n <div class=\"col-8\">\n <select title=\"View\" @change=\"selectedView = $event.target.value\">\n <option value=\"users\" :selected=\"selectedView === 'users'\">Users</option>\n <option value=\"token\" :selected=\"selectedView === 'token'\">Generate Token</option>\n </select>\n </div>\n\n <div class=\"col-4 pull-right\">\n <button title=\"Add User\" @click=\"$refs.usersView.$refs.addUserModal.show()\" v-if=\"selectedView === 'users'\">\n <i class=\"fa fa-plus\" />\n </button>\n </div>\n </header>\n\n <main>\n <Users :session-token=\"sessionToken\" :current-user=\"currentUser\"\n v-if=\"selectedView === 'users'\" ref=\"usersView\" />\n <Token :session-token=\"sessionToken\" :current-user=\"currentUser\"\n v-else-if=\"selectedView === 'token'\" ref=\"tokenView\" />\n </main>\n </div>\n</template>\n\n<script>\nimport Token from \"@/components/panels/Settings/Token\";\nimport Users from \"@/components/panels/Settings/Users\";\nimport Utils from \"@/Utils\";\n\nexport default {\n name: \"Settings\",\n components: {Users, Token},\n mixins: [Utils],\n\n data() {\n return {\n selectedView: 'users',\n currentUser: null,\n sessionToken: null,\n }\n },\n\n methods: {\n async refresh() {\n this.sessionToken = this.getCookies()['session_token']\n this.currentUser = await this.request('user.get_user_by_session', {session_token: this.sessionToken})\n }\n },\n\n mounted() {\n this.refresh()\n }\n}\n</script>\n\n<style lang=\"scss\">\n$header-height: 3em;\n\n.settings-container {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n\n header {\n width: 100%;\n height: $header-height;\n display: flex;\n background: $background-color;\n box-shadow: $border-shadow-bottom;\n padding: .5em;\n\n select {\n width: 100%;\n }\n\n button {\n padding-top: .25em;\n }\n }\n\n main {\n height: calc(100% - #{$header-height});\n overflow: auto;\n }\n\n button {\n background: none;\n border: none;\n\n &:hover {\n border: none;\n color: $default-hover-fg;\n }\n }\n\n form {\n padding: 0;\n border: none;\n border-radius: 0;\n box-shadow: none;\n\n input {\n margin-bottom: 1em;\n }\n }\n\n input[type=password] {\n border-radius: 1em;\n }\n}\n</style>\n","<template>\n <div class=\"token-container\">\n <Loading v-if=\"loading\" />\n\n <Modal ref=\"tokenModal\">\n <div class=\"token-container\">\n <label>\n This is your generated token. Treat it carefully and do not share it with untrusted parties.<br/>\n Also, make sure to save it - it WILL NOT be displayed again.\n\n <textarea class=\"token\" v-text=\"token\" @focus=\"onTokenSelect\" />\n </label>\n </div>\n </Modal>\n\n <div class=\"body\">\n <div class=\"description\">\n <p>Generate a JWT authentication token that can be used for API calls to the <tt>/execute</tt> endpoint.</p><br/>\n <p>You can include the token in your requests in any of the following ways:</p>\n\n <ul>\n <li>Specify it on the <tt>Authorization: Bearer</tt> header;</li>\n <li>Specify it on the <tt>X-Token</tt> header;</li>\n <li>Specify it as a URL parameter: <tt>http://site:8008/execute?token=...</tt>;</li>\n <li>Specify it on the body of your JSON request: <tt>{\"type\":\"request\", \"action\", \"...\", \"token\":\"...\"}</tt>.</li>\n </ul>\n\n Confirm your credentials in order to generate a new token.\n </div>\n\n <div class=\"form-container\">\n <form @submit.prevent=\"generateToken\" ref=\"generateTokenForm\">\n <label>\n Username\n <input type=\"text\" name=\"username\" :value=\"currentUser.username\" disabled>\n </label>\n\n <label>\n Password\n <input type=\"password\" name=\"password\">\n </label>\n\n <label>\n Token validity in days\n <input type=\"text\" name=\"validityDays\">\n <span class=\"note\">\n Decimal values are also supported (e.g. <i>0.5</i> to identify 6 hours). An empty or zero value means that\n the token has no expiry date.\n </span>\n </label>\n\n <input type=\"submit\" value=\"Generate token\">\n </form>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nimport axios from \"axios\";\nimport Loading from \"@/components/Loading\";\nimport Utils from \"@/Utils\";\nimport Modal from \"@/components/Modal\";\n\nexport default {\n name: \"Token\",\n components: {Modal, Loading},\n mixins: [Utils],\n\n props: {\n currentUser: {\n type: Object,\n required: true,\n },\n },\n\n data() {\n return {\n loading: false,\n token: null,\n }\n },\n\n methods: {\n async generateToken(event) {\n const username = this.currentUser.username\n const password = event.target.password.value\n let validityDays = event.target.validityDays?.length ? parseInt(event.target.validityDays.value) : 0\n if (!validityDays)\n validityDays = null\n\n this.loading = true\n try {\n this.token = (await axios.post('/auth', {\n username: username,\n password: password,\n expiry_days: validityDays,\n })).data.token\n\n if (this.token?.length)\n this.$refs.tokenModal.show()\n } catch (e) {\n console.error(e.toString())\n this.notify({\n text: e.toString(),\n error: true,\n })\n } finally {\n this.loading = false\n }\n },\n\n onTokenSelect(event) {\n event.target.select()\n document.execCommand('copy')\n\n this.notify({\n text: 'Token copied to clipboard',\n image: {\n iconClass: 'fa fa-check',\n }\n })\n },\n }\n}\n</script>\n\n<style lang=\"scss\">\n.token-container {\n width: 100%;\n display: flex;\n margin-top: .15em;\n\n .body {\n background: $background-color;\n display: flex;\n\n .description {\n text-align: left;\n padding: 1em;\n }\n }\n\n ul {\n margin: 1em .5em;\n\n li {\n list-style: initial;\n }\n }\n\n .form-container {\n display: flex;\n }\n\n form {\n max-width: 250pt;\n\n .note {\n display: block;\n font-size: .75em;\n margin: -.75em 0 2em 0;\n }\n }\n\n input[type=password] {\n border-radius: 1em;\n }\n\n .modal {\n .content {\n width: 90%;\n }\n\n .body {\n margin-top: 0;\n }\n }\n\n .token-container {\n label {\n display: flex;\n flex-direction: column;\n }\n\n textarea {\n height: 10em;\n margin-top: 1em;\n border-radius: 1em;\n }\n }\n}\n\n@media screen and (max-width: calc(#{$desktop} - 1px)) {\n .token-container {\n .body {\n flex-direction: column;\n }\n }\n\n .form-container {\n justify-content: center;\n box-shadow: $border-shadow-top;\n margin-top: -1em;\n padding-top: 1em;\n }\n}\n\n@media screen and (min-width: $desktop) {\n .token-container {\n justify-content: center;\n align-items: center;\n\n .description {\n width: 50%;\n }\n\n .form-container {\n width: 50%;\n justify-content: right;\n padding: 1em;\n }\n\n .body {\n max-width: 650pt;\n flex-direction: row;\n justify-content: left;\n margin-top: 1.5em;\n border-radius: 1em;\n border: $default-border-2;\n }\n }\n}\n</style>\n","import { render } from \"./Token.vue?vue&type=template&id=5f9053de\"\nimport script from \"./Token.vue?vue&type=script&lang=js\"\nexport * from \"./Token.vue?vue&type=script&lang=js\"\n\nimport \"./Token.vue?vue&type=style&index=0&id=5f9053de&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <Loading v-if=\"loading\" />\n\n <Modal ref=\"addUserModal\" title=\"Add User\">\n <form action=\"#\" method=\"POST\" ref=\"addUserForm\" @submit=\"createUser\">\n <label>\n <input type=\"text\" name=\"username\" placeholder=\"Username\" :disabled=\"commandRunning\">\n </label>\n <label>\n <input type=\"password\" name=\"password\" placeholder=\"Password\" :disabled=\"commandRunning\">\n </label>\n <label>\n <input type=\"password\" name=\"confirm_password\" placeholder=\"Confirm password\" :disabled=\"commandRunning\">\n </label>\n\n <input type=\"submit\" value=\"Create User\" :disabled=\"commandRunning\">\n </form>\n </Modal>\n\n <Modal ref=\"changePasswordModal\" title=\"Change Password\">\n <form action=\"#\" method=\"POST\" ref=\"changePasswordForm\" @submit=\"changePassword\">\n <label>\n <input type=\"text\" name=\"username\" placeholder=\"Username\" :value=\"selectedUser\" disabled=\"disabled\">\n </label>\n <label>\n <input type=\"password\" name=\"password\" placeholder=\"Current password\" :disabled=\"commandRunning\">\n </label>\n <label>\n <input type=\"password\" name=\"new_password\" placeholder=\"New password\" :disabled=\"commandRunning\">\n </label>\n <label>\n <input type=\"password\" name=\"confirm_new_password\" placeholder=\"Confirm new password\" :disabled=\"commandRunning\">\n </label>\n <input type=\"submit\" value=\"Change Password\" :disabled=\"commandRunning\">\n </form>\n </modal>\n\n <div class=\"body\">\n <ul class=\"users-list\">\n <li v-for=\"user in users\" :key=\"user.user_id\" class=\"item user\" @click=\"selectedUser = user.username\">\n <div class=\"name col-8\" v-text=\"user.username\" />\n <div class=\"actions pull-right col-4\">\n <Dropdown title=\"User Actions\" icon-class=\"fa fa-cog\">\n <DropdownItem text=\"Change Password\" :disabled=\"commandRunning\" icon-class=\"fa fa-key\"\n @click=\"selectedUser = user.username; $refs.changePasswordModal.show()\" />\n <DropdownItem text=\"Delete User\" :disabled=\"commandRunning\" icon-class=\"fa fa-trash\"\n @click=\"deleteUser(user)\" />\n </Dropdown>\n </div>\n </li>\n </ul>\n </div>\n</template>\n\n<script>\nimport Dropdown from \"@/components/elements/Dropdown\";\nimport Modal from \"@/components/Modal\";\nimport Loading from \"@/components/Loading\";\nimport Utils from \"@/Utils\";\nimport DropdownItem from \"@/components/elements/DropdownItem\";\n\nexport default {\n name: \"Users\",\n components: {DropdownItem, Loading, Modal, Dropdown},\n mixins: [Utils],\n\n props: {\n sessionToken: {\n type: String,\n required: true,\n },\n\n currentUser: {\n type: Object,\n required: true,\n }\n },\n\n data() {\n return {\n users: [],\n commandRunning: false,\n loading: false,\n selectedUser: null,\n }\n },\n\n methods: {\n async refresh() {\n this.loading = true\n try {\n this.users = await this.request('user.get_users')\n } finally {\n this.loading = false\n }\n },\n\n async createUser(event) {\n event.preventDefault()\n\n const form = [...this.$refs.addUserForm.querySelectorAll('input[name]')].reduce((map, input) => {\n map[input.name] = input.value\n return map\n }, {})\n\n if (form.password !== form.confirm_password) {\n this.notify({\n title: 'Unable to create user',\n text: 'Please check that the passwords match',\n error: true,\n image: {\n iconClass: 'fas fa-times',\n },\n })\n\n return\n }\n\n this.commandRunning = true\n try {\n await this.request('user.create_user', {\n username: form.username,\n password: form.password,\n session_token: this.sessionToken,\n })\n } finally {\n this.commandRunning = false\n }\n\n this.notify({\n text: 'User ' + form.username + ' created',\n image: {\n iconClass: 'fas fa-check',\n },\n })\n\n this.$refs.addUserModal.close()\n await this.refresh()\n },\n\n // onTokenFocus(event) {\n // event.target.select()\n // this.document.execCommand('copy')\n // event.target.setAttribute('disabled', true)\n //\n // this.notify({\n // text: 'Token copied to the clipboard',\n // image: {\n // iconClass: 'fas fa-copy',\n // },\n // })\n // },\n //\n // onTokenBlur(event) {\n // event.target.select()\n // this.document.execCommand('copy')\n // event.target.removeAttribute('disabled')\n //\n // this.notify({\n // text: 'Token copied to clipboard',\n // image: {\n // iconClass: 'fas fa-copy',\n // },\n // })\n // },\n\n async changePassword(event) {\n event.preventDefault()\n\n const form = [...this.$refs.changePasswordForm.querySelectorAll('input[name]')].reduce((map, input) => {\n map[input.name] = input.value\n return map\n }, {})\n\n if (form.new_password !== form.confirm_new_password) {\n this.notify({\n title: 'Unable to update password',\n text: 'Please check that the passwords match',\n error: true,\n image: {\n iconClass: 'fas fa-times',\n },\n })\n\n return\n }\n\n this.commandRunning = true\n let success = false\n\n try {\n success = await this.request('user.update_password', {\n username: form.username,\n old_password: form.password,\n new_password: form.new_password,\n })\n } finally {\n this.commandRunning = false\n }\n\n if (success) {\n this.$refs.changePasswordModal.close()\n this.notify({\n text: 'Password successfully updated',\n image: {\n iconClass: 'fas fa-check',\n },\n })\n } else {\n this.notify({\n title: 'Unable to update password',\n text: 'The current password is incorrect',\n error: true,\n image: {\n iconClass: 'fas fa-times',\n },\n })\n }\n },\n\n async deleteUser(user) {\n if (!confirm('Are you sure that you want to remove the user ' + user.username + '?'))\n return\n\n this.commandRunning = true\n try {\n await this.request('user.delete_user', {\n username: user.username,\n session_token: this.sessionToken,\n })\n } finally {\n this.commandRunning = false\n }\n\n this.notify({\n text: 'User ' + user.username + ' removed',\n image: {\n iconClass: 'fas fa-check',\n },\n })\n\n await this.refresh()\n },\n },\n\n mounted() {\n this.refresh()\n },\n}\n</script>\n\n<style lang=\"scss\">\n.settings-container {\n .body {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n }\n\n .modal {\n .body {\n height: auto;\n }\n }\n\n .users-list {\n background: $background-color;\n margin-top: .15em;\n height: max-content;\n\n .user {\n display: flex;\n align-items: center;\n padding: .75em;\n box-shadow: $border-shadow-bottom;\n\n &:hover {\n background: $hover-bg;\n }\n\n .actions {\n display: inline-flex;\n justify-content: right;\n\n button {\n width: min-content;\n }\n }\n }\n }\n\n @media screen and (max-width: $desktop) {\n .users-list {\n width: 100%;\n }\n }\n\n @media screen and (min-width: $desktop) {\n .users-list {\n min-width: 400pt;\n max-width: 600pt;\n margin-top: 1em;\n border-radius: 1em;\n box-shadow: $border-shadow-bottom;\n\n .user {\n border-radius: 1em;\n }\n }\n }\n}\n</style>\n","import { render } from \"./Users.vue?vue&type=template&id=2153f27b\"\nimport script from \"./Users.vue?vue&type=script&lang=js\"\nexport * from \"./Users.vue?vue&type=script&lang=js\"\n\nimport \"./Users.vue?vue&type=style&index=0&id=2153f27b&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=d5c06b82\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=d5c06b82&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","var map = {\n\t\"./Camera/Index\": [\n\t\t5528,\n\t\t2989,\n\t\t5528\n\t],\n\t\"./CameraAndroidIpcam/Index\": [\n\t\t6739,\n\t\t6739\n\t],\n\t\"./CameraCv/Index\": [\n\t\t8184,\n\t\t2989,\n\t\t8184\n\t],\n\t\"./CameraFfmpeg/Index\": [\n\t\t5111,\n\t\t2989,\n\t\t5111\n\t],\n\t\"./CameraGstreamer/Index\": [\n\t\t699,\n\t\t2989,\n\t\t699\n\t],\n\t\"./CameraIrMlx90640/Index\": [\n\t\t9895,\n\t\t2989,\n\t\t9895\n\t],\n\t\"./CameraPi/Index\": [\n\t\t4548,\n\t\t2989,\n\t\t4548\n\t],\n\t\"./Execute/Index\": [\n\t\t7643,\n\t\t7643\n\t],\n\t\"./Light/Index\": [\n\t\t747,\n\t\t1474,\n\t\t8938,\n\t\t747\n\t],\n\t\"./LightHue/Index\": [\n\t\t3674,\n\t\t1474,\n\t\t8938,\n\t\t747,\n\t\t3674\n\t],\n\t\"./Media/Index\": [\n\t\t4196,\n\t\t8938,\n\t\t9978,\n\t\t8589,\n\t\t4196\n\t],\n\t\"./MediaMplayer/Index\": [\n\t\t6509,\n\t\t8938,\n\t\t9978,\n\t\t8589,\n\t\t4196,\n\t\t6509\n\t],\n\t\"./MediaMpv/Index\": [\n\t\t5895,\n\t\t8938,\n\t\t9978,\n\t\t8589,\n\t\t4196,\n\t\t5895\n\t],\n\t\"./MediaOmxplayer/Index\": [\n\t\t9633,\n\t\t8938,\n\t\t9978,\n\t\t8589,\n\t\t4196,\n\t\t9633\n\t],\n\t\"./MediaVlc/Index\": [\n\t\t767,\n\t\t8938,\n\t\t9978,\n\t\t8589,\n\t\t4196,\n\t\t767\n\t],\n\t\"./Music/Index\": [\n\t\t6833,\n\t\t8938,\n\t\t9978,\n\t\t6833\n\t],\n\t\"./MusicMpd/Index\": [\n\t\t3249,\n\t\t8938,\n\t\t9978,\n\t\t6833,\n\t\t3249\n\t],\n\t\"./MusicSnapcast/Index\": [\n\t\t2790,\n\t\t1474,\n\t\t8938,\n\t\t2790\n\t],\n\t\"./MusicSpotify/Index\": [\n\t\t9369,\n\t\t8938,\n\t\t9978,\n\t\t6833,\n\t\t9369\n\t],\n\t\"./Rtorrent/Index\": [\n\t\t2820,\n\t\t8589,\n\t\t6899,\n\t\t2820\n\t],\n\t\"./Settings/Index\": [\n\t\t5392\n\t],\n\t\"./Sound/Index\": [\n\t\t5193,\n\t\t5193\n\t],\n\t\"./Switches/Index\": [\n\t\t4276,\n\t\t4276\n\t],\n\t\"./Switches/LightHue/Index\": [\n\t\t2844,\n\t\t1474,\n\t\t6590,\n\t\t2844\n\t],\n\t\"./Switches/Smartthings/Index\": [\n\t\t9196,\n\t\t1474,\n\t\t6590,\n\t\t9196\n\t],\n\t\"./Switches/SwitchTplink/Index\": [\n\t\t3785,\n\t\t1474,\n\t\t6590,\n\t\t3785\n\t],\n\t\"./Switches/SwitchWemo/Index\": [\n\t\t5210,\n\t\t1474,\n\t\t6590,\n\t\t5210\n\t],\n\t\"./Switches/Switchbot/Index\": [\n\t\t9694,\n\t\t1474,\n\t\t6590,\n\t\t9694\n\t],\n\t\"./Switches/SwitchbotBluetooth/Index\": [\n\t\t9694,\n\t\t1474,\n\t\t6590,\n\t\t9694\n\t],\n\t\"./Switches/ZigbeeMqtt/Index\": [\n\t\t5466,\n\t\t1474,\n\t\t6590,\n\t\t5466\n\t],\n\t\"./Switches/Zwave/Index\": [\n\t\t7262,\n\t\t1474,\n\t\t6590,\n\t\t7262\n\t],\n\t\"./Switches/ZwaveMqtt/Index\": [\n\t\t2380,\n\t\t1474,\n\t\t6590,\n\t\t2380\n\t],\n\t\"./Torrent/Index\": [\n\t\t9299,\n\t\t8589,\n\t\t6899,\n\t\t9299\n\t],\n\t\"./Tts/Index\": [\n\t\t2466,\n\t\t4021,\n\t\t2466\n\t],\n\t\"./TtsGoogle/Index\": [\n\t\t1938,\n\t\t4021,\n\t\t1938\n\t],\n\t\"./TvSamsungWs/Index\": [\n\t\t615,\n\t\t615\n\t],\n\t\"./ZigbeeMqtt/Index\": [\n\t\t4604,\n\t\t1474,\n\t\t8938,\n\t\t4604\n\t],\n\t\"./Zwave/Index\": [\n\t\t6027,\n\t\t1474,\n\t\t8938,\n\t\t4764,\n\t\t6027\n\t],\n\t\"./ZwaveMqtt/Index\": [\n\t\t2362,\n\t\t1474,\n\t\t8938,\n\t\t4764,\n\t\t2362\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn Promise.all(ids.slice(1).map(__webpack_require__.e)).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function() { return Object.keys(map); };\nwebpackAsyncContext.id = 3379;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./Calendar/Index\": [\n\t\t345,\n\t\t345\n\t],\n\t\"./Camera/Index\": [\n\t\t2346,\n\t\t2346\n\t],\n\t\"./Component/Index\": [\n\t\t5824,\n\t\t1474,\n\t\t8938,\n\t\t5824\n\t],\n\t\"./DateTime/Index\": [\n\t\t1595,\n\t\t9575,\n\t\t1595\n\t],\n\t\"./DateTimeWeather/Index\": [\n\t\t5779,\n\t\t1798,\n\t\t9575,\n\t\t5779\n\t],\n\t\"./ImageCarousel/Index\": [\n\t\t6003,\n\t\t1798,\n\t\t9575,\n\t\t6003\n\t],\n\t\"./Music/Index\": [\n\t\t6013,\n\t\t6013\n\t],\n\t\"./Plugin/Index\": [\n\t\t4826,\n\t\t4826\n\t],\n\t\"./RssNews/Index\": [\n\t\t7420,\n\t\t7420\n\t],\n\t\"./Weather/Index\": [\n\t\t1798,\n\t\t1798\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn Promise.all(ids.slice(1).map(__webpack_require__.e)).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function() { return Object.keys(map); };\nwebpackAsyncContext.id = 6725;\nmodule.exports = webpackAsyncContext;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"static/js/\" + chunkId + \".\" + {\"345\":\"668e4cb2\",\"615\":\"27cc8f9e\",\"699\":\"5a760926\",\"747\":\"21f6bf7b\",\"767\":\"c8cb94e4\",\"1474\":\"cd648f8f\",\"1595\":\"d3f3ba5b\",\"1798\":\"e72decae\",\"1938\":\"1f474567\",\"2346\":\"4e0afde3\",\"2362\":\"84f3ec2e\",\"2380\":\"73b1a20d\",\"2466\":\"575a0b76\",\"2790\":\"bf6f297a\",\"2820\":\"be1f76ae\",\"2844\":\"357b0781\",\"2989\":\"bff9282e\",\"3249\":\"fd3db1b0\",\"3674\":\"3c7517b4\",\"3785\":\"8c572e27\",\"4021\":\"56f5f27b\",\"4196\":\"630e670c\",\"4276\":\"728421b8\",\"4548\":\"ec5c28d2\",\"4604\":\"ac359b97\",\"4764\":\"55084bfb\",\"4826\":\"5f8aa5e8\",\"5111\":\"8df28fdf\",\"5193\":\"5035fdb1\",\"5210\":\"fae85e4c\",\"5466\":\"2c2a80df\",\"5528\":\"3b6af320\",\"5779\":\"a25186e7\",\"5824\":\"0dd40d21\",\"5895\":\"6d58227e\",\"6003\":\"faab4096\",\"6013\":\"0f59b66b\",\"6027\":\"dc523874\",\"6509\":\"a6fd64ee\",\"6590\":\"e9c70586\",\"6739\":\"ab19c203\",\"6833\":\"cc55832d\",\"6899\":\"0f42d5c8\",\"7262\":\"b0ebadee\",\"7420\":\"a460b393\",\"7643\":\"802b7ba8\",\"8184\":\"f06cf9d8\",\"8589\":\"6ec60bee\",\"8938\":\"64d1bec5\",\"9196\":\"5e4f2f1b\",\"9299\":\"cba36f7a\",\"9369\":\"ab5c8c8c\",\"9575\":\"2bc3a9be\",\"9633\":\"5151828a\",\"9694\":\"dfa28ffb\",\"9895\":\"fa612682\",\"9978\":\"96bd5026\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"static/css/\" + chunkId + \".\" + {\"345\":\"39a334e8\",\"615\":\"17632d8f\",\"747\":\"9d7d27e7\",\"1474\":\"75891517\",\"1798\":\"f703a14d\",\"2346\":\"dd5b7fec\",\"2380\":\"a55977a1\",\"2790\":\"b7703d2a\",\"2844\":\"eabbb568\",\"2989\":\"6de074b2\",\"3785\":\"85dd63a7\",\"4021\":\"f58ac074\",\"4196\":\"8681eb9f\",\"4276\":\"008136f7\",\"4604\":\"e0765efd\",\"4764\":\"837012fe\",\"4826\":\"c0b8e5bf\",\"5193\":\"f7c1a776\",\"5210\":\"2082bfa6\",\"5466\":\"68827648\",\"5779\":\"0cad5256\",\"5824\":\"f7a25bb6\",\"6003\":\"76b4d677\",\"6013\":\"e5066be6\",\"6590\":\"e2b4dcb4\",\"6739\":\"f5527e3f\",\"6833\":\"9c099b40\",\"6899\":\"85849319\",\"7262\":\"e379f31b\",\"7420\":\"5775e7e6\",\"7643\":\"74797fcd\",\"8589\":\"c4c7f81a\",\"8938\":\"2bbd3b5d\",\"9196\":\"006b678a\",\"9575\":\"34cea1a0\",\"9694\":\"20e4266c\",\"9978\":\"f0a3a6c5\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"platypush:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","var createStylesheet = function(chunkId, fullhref, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tdocument.head.appendChild(linkTag);\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t2143: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"345\":1,\"615\":1,\"747\":1,\"1474\":1,\"1798\":1,\"2346\":1,\"2380\":1,\"2790\":1,\"2844\":1,\"2989\":1,\"3785\":1,\"4021\":1,\"4196\":1,\"4276\":1,\"4604\":1,\"4764\":1,\"4826\":1,\"5193\":1,\"5210\":1,\"5466\":1,\"5779\":1,\"5824\":1,\"6003\":1,\"6013\":1,\"6590\":1,\"6739\":1,\"6833\":1,\"6899\":1,\"7262\":1,\"7420\":1,\"7643\":1,\"8589\":1,\"8938\":1,\"9196\":1,\"9575\":1,\"9694\":1,\"9978\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t2143: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^((29|85)89|1474|4021|6590|8938|9575)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkplatypush\"] = self[\"webpackChunkplatypush\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [4998], function() { return __webpack_require__(9646); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["bus","mitt","hasWebsocket","ref","config","websocket_port","hasAssistant","hasPushbullet","class","notifications","notification","id","index","key","text","html","title","link","image","warning","error","destroy","clicked","src","alt","icon","style","color","iconClass","name","props","methods","this","window","open","$emit","__exports__","components","Notification","duration","type","Number","default","data","timeouts","create","args","parseInt","setTimeout","bind","wsPort","ws","initialized","pending","opened","timeout","reconnectMsecs","handlers","handlerNameToEventTypes","onWebsocketTimeout","console","log","close","onClose","onMessage","event","JSON","parse","e","warn","debug","push","Object","values","handler","Array","Function","onOpen","onclose","clearTimeout","undefined","onError","code","reason","init","protocol","location","url","hostname","WebSocket","err","onmessage","onopen","onerror","subscribe","msg","events","length","handlerName","unsubscribe","keys","created","state","alerting","responding","speechRecognized","listening","Modal","mixins","Utils","responseText","phrase","hideTimeout","reset","conversationStart","$refs","assistantModal","show","conversationEnd","self","response","response_text","alertOn","alertOff","registerHandlers","mounted","push_type","notify","body","Pushbullet","Notifications","Events","VoiceAssistant","userAuthenticated","computed","onNotification","async","request","initConfig","render","loading","classes","rows","row","i","widgets","widget","j","component","getWidgetProps","String","required","split","concat","Widget","Loading","Row","refreshSeconds","parseTemplate","tmpl","node","DOMParser","parseFromString","childNodes","attributes","nodeValue","getElementsByTagName","map","children","el","nodeName","attrs","reduce","obj","content","innerHTML","$options","$route","params","template","refreshDashboard","setInterval","toFixed","method","placeholder","_register","value","register","Boolean","parseBoolean","Login","panels","selectedPanel","$event","panel","href","collapsed","sort","onItemClick","icons","imgUrl","emits","host","isMobile","$root","hash","Settings","Nav","plugins","backends","procedures","initSelectedPanel","match","plugin","initPanels","entries","forEach","componentName","token","toUpperCase","slice","join","comp","pluginName","Promise","all","initializeDefaultViews","execute","switches","parseConfig","toString","initPanel","routes","path","Panel","Dashboard","Plugin","Register","NotFound","router","createRouter","history","createWebHistory","app","createApp","App","globalProperties","_config","use","mount","opts","resolve","reject","then","errors","output","catch","action","getCookies","document","cookie","item","k","v","formatDate","date","year","Date","toDateString","substring","formatTime","seconds","toTimeString","formatDateTime","_eventsReady","subFunc","generateId","unwatch","$watch","newVal","btoa","fromCharCode","Math","round","random","matchMedia","matches","isTablet","isDesktop","toLowerCase","convertSize","unit","units","u","Api","Cookies","DateTime","Screen","Types","n","script","isVisible","zIndex","width","height","stopPropagation","visible","level","timeoutId","prevVisible","hide","toggle","visibleHndl","updated","maxZIndex","getComputedStyle","$el","outermostModals","modal","querySelectorAll","indexOf","items","documentClickHndl","element","target","dropdown","parentElement","removeEventListener","addEventListener","left","top","parseFloat","button","getBoundingClientRect","innerWidth","clientWidth","innerHeight","clientHeight","itemClass","disabled","$parent","selectedView","selected","usersView","addUserModal","sessionToken","currentUser","onTokenSelect","generateToken","username","password","validityDays","expiry_days","tokenModal","select","execCommand","createUser","commandRunning","changePassword","selectedUser","users","user","user_id","changePasswordModal","deleteUser","DropdownItem","Dropdown","preventDefault","form","addUserForm","input","confirm_password","session_token","refresh","changePasswordForm","new_password","confirm_new_password","success","old_password","confirm","Users","Token","webpackAsyncContext","req","__webpack_require__","o","Error","ids","module","exports","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","every","splice","r","getter","__esModule","d","a","definition","defineProperty","enumerable","get","f","chunkId","promises","miniCssF","g","globalThis","prop","prototype","hasOwnProperty","call","inProgress","dataWebpackPrefix","l","done","needAttach","scripts","s","getAttribute","createElement","charset","nc","setAttribute","onScriptComplete","prev","onload","doneFns","parentNode","removeChild","head","appendChild","Symbol","toStringTag","p","createStylesheet","fullhref","linkTag","rel","onLinkComplete","errorType","realHref","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","test","promise","loadingEnded","realSrc","message","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}