openc3-tool-tlmgrapher 5.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js/226.js","mappings":"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A,yBAGA,sBACA,yBACA,0BACA,uCACA,UACA,0BACAmN,EAAAA,EAAAA,KAAAA,gBAEA,MACAA,EAAAA,GAEA,yBAAAA,IAAAA,EAAAC,IAAAA,GAZA,CAaA,EACA1G,UAAAA,SAAAA,EAAAA,GACA,oBACA,WACA,kBAEA,oBACA,EACAC,UAAAA,SAAAA,EAAAA,GACA,oBACA,WACA,kBAEA,oBACA,EACAL,mBAAAA,SAAAA,GACA,qBACA,yBACA,wBACA,gDAEA,EACAC,iBAAAA,SAAAA,GACA,qBACA,yBACA,sBACA,8CAEA,GAEA6C,QAAAA,CACAlB,WAAAA,SAAAA,GACA,UACA,aACA,gDACA,gDACA,+CACA,MACA,UACA,gDACA,gDACA,4CACA,MACA,WACA,+CACA,6CACA,6CACA,MACA,YACA,+CACA,gDACA,6CACA,MAEA,sBACA,aACA,EACAlB,YAAAA,WACA,cACA,EACAX,eAAAA,WACA,kBACA,oBACA,mCACA,8BACA,sBAEA,oCACA,EACAmH,aAAAA,WAEA,0CACA,+CACA,EACA5P,OAAAA,WACA,0CACA,gDACA,4BACA,EACA4H,UAAAA,WACA,kBACA,mBACA,aACA,EACAF,YAAAA,WACA,kBACA,mBACA,aACA,EACAK,YAAAA,WACA,kBACA,aACA,EACAF,cAAAA,WACA,kBACA,aACA,EACAK,aAAAA,WACA,mBACA,aACA,EACAF,eAAAA,WACA,mBACA,aACA,EACAG,iBAAAA,WACA,yBACA,mCACA,EACA0H,cAAAA,WAAA,WACA,MAEA,gBACA,oBACA,gBACA,sBAEAC,EAAAA,GAEA,0CACA,SACA,gCACAP,EAAAA,EAAAA,WAEA,QAIA,OAHA,gCACAC,EAAAA,EAAAA,WAEA,sBACA,CACA,EACAO,UAAAA,WAAA,yEACA,WACAC,mBAAA,mBAAAxO,aAAAA,MAAA,CACAyO,SAAAA,SAAAA,GAAA,sBACAC,UAAAA,WACA,mCACA,EACAC,aAAAA,WACA,eACAxL,KAAAA,eACAtC,QAAAA,yCACA0I,MAAAA,IAAAA,MAAAA,WAEA,EACAqF,SAAAA,WACA,eACAzL,KAAAA,WACAtC,QA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","sources":["webpack://@openc3/tool-tlmgrapher/./src/tools/TlmGrapher/TlmGrapher.vue?c00b","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/services/axios.js","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/services/openc3-api.js","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/Graph.vue?d273","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/DateTimeChooser.vue?9d82","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/DateTimeChooser.vue","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/DateTimeChooser.vue?5af2","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/DateTimeChooser.vue?b0ec","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/services/cable.js","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/Graph.vue","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/Graph.vue?237b","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/Graph.vue?a4ec","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/OpenConfigDialog.vue?33ed","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/OpenConfigDialog.vue","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/OpenConfigDialog.vue?15fa","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/OpenConfigDialog.vue?22a0","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/SaveConfigDialog.vue?282a","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/SaveConfigDialog.vue","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/SaveConfigDialog.vue?eb28","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/SaveConfigDialog.vue?5010","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/TargetPacketItemChooser.vue?6dbd","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/TargetPacketItemChooser.vue","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/TargetPacketItemChooser.vue?9bd0","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/TargetPacketItemChooser.vue?766a","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/TopBar.vue?79bd","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/TopBar.vue","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/TopBar.vue?231a","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/TopBar.vue?d9e2","webpack://@openc3/tool-tlmgrapher/./src/tools/TlmGrapher/SettingsDialog.vue?af88","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/services/api.js","webpack://@openc3/tool-tlmgrapher/src/tools/TlmGrapher/SettingsDialog.vue","webpack://@openc3/tool-tlmgrapher/./src/tools/TlmGrapher/SettingsDialog.vue?1d10","webpack://@openc3/tool-tlmgrapher/./src/tools/TlmGrapher/SettingsDialog.vue","webpack://@openc3/tool-tlmgrapher/src/tools/TlmGrapher/TlmGrapher.vue","webpack://@openc3/tool-tlmgrapher/./src/tools/TlmGrapher/TlmGrapher.vue?d663","webpack://@openc3/tool-tlmgrapher/./src/tools/TlmGrapher/TlmGrapher.vue","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/Graph.vue?ad90","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/Graph.vue?cfb6","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/TopBar.vue?bfe1","webpack://@openc3/tool-tlmgrapher/./src/tools/TlmGrapher/TlmGrapher.vue?43e1","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/Graph.vue?1702","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/Graph.vue?ef6c","webpack://@openc3/tool-tlmgrapher/../openc3-tool-common/src/components/TopBar.vue?1e7c","webpack://@openc3/tool-tlmgrapher/./src/tools/TlmGrapher/TlmGrapher.vue?30b8"],"sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('top-bar',{attrs:{\"menus\":_vm.menus,\"title\":_vm.title}}),_c('div',[_c('v-snackbar',{attrs:{\"top\":\"\",\"type\":_vm.alertType,\"icon\":_vm.alertType,\"timeout\":5000},scopedSlots:_vm._u([{key:\"action\",fn:function(ref){\nvar attrs = ref.attrs;\nreturn [_c('v-btn',_vm._b({attrs:{\"text\":\"\"},on:{\"click\":function () {\n _vm.showAlert = false\n }}},'v-btn',attrs,false),[_vm._v(\" Close \")])]}}]),model:{value:(_vm.showAlert),callback:function ($$v) {_vm.showAlert=$$v},expression:\"showAlert\"}},[_c('v-icon',[_vm._v(\" mdi-\"+_vm._s(_vm.alertType)+\" \")]),_vm._v(\" \"+_vm._s(_vm.alert)+\" \")],1),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(this.selectedGraphId === null),expression:\"this.selectedGraphId === null\"}]},[_c('v-row',{staticClass:\"my-5\"},[_c('v-spacer'),_c('span',[_vm._v(\" Add a graph from the menu bar or select an existing graph to continue \")]),_c('v-spacer')],1)],1),_c('v-row',{directives:[{name:\"show\",rawName:\"v-show\",value:(this.selectedGraphId !== null),expression:\"this.selectedGraphId !== null\"}],staticClass:\"px-1\",attrs:{\"justify\":\"space-between\"}},[_c('v-col',{attrs:{\"cols\":\"11\"}},[_c('target-packet-item-chooser',{attrs:{\"initial-target-name\":this.$route.params.target,\"initial-packet-name\":this.$route.params.packet,\"initial-item-name\":this.$route.params.item,\"button-text\":\"Add Item\",\"choose-item\":\"\"},on:{\"click\":_vm.addItem}})],1),_c('v-col',{attrs:{\"cols\":\"1\"}},[_c('v-btn',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.state === 'pause'),expression:\"state === 'pause'\"}],staticClass:\"pulse\",attrs:{\"color\":\"primary\",\"fab\":\"\",\"data-test\":\"start-graph\"},on:{\"click\":function () {\n _vm.state = 'start'\n }}},[_c('v-icon',{attrs:{\"large\":\"\"}},[_vm._v(\"mdi-play\")])],1),_c('v-btn',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.state === 'start'),expression:\"state === 'start'\"}],attrs:{\"color\":\"primary\",\"fab\":\"\",\"data-test\":\"pause-graph\"},on:{\"click\":function () {\n _vm.state = 'pause'\n }}},[_c('v-icon',{attrs:{\"large\":\"\"}},[_vm._v(\"mdi-pause\")])],1)],1)],1),_c('div',{staticClass:\"grid\"},_vm._l((_vm.graphs),function(graph){return _c('div',{key:graph,ref:(\"gridItem\" + graph),refInFor:true,staticClass:\"item\",attrs:{\"id\":(\"gridItem\" + graph)}},[_c('div',{staticClass:\"item-content\"},[_c('graph',{ref:(\"graph\" + graph),refInFor:true,attrs:{\"id\":graph,\"state\":_vm.state,\"start-time\":_vm.startTime,\"selected-graph-id\":_vm.selectedGraphId,\"seconds-graphed\":_vm.settings.secondsGraphed.value,\"points-saved\":_vm.settings.pointsSaved.value,\"points-graphed\":_vm.settings.pointsGraphed.value},on:{\"close-graph\":function () { return _vm.closeGraph(graph); },\"min-max-graph\":function () { return _vm.minMaxGraph(graph); },\"resize\":function () { return _vm.resize(); },\"click\":function () { return _vm.graphSelected(graph); },\"started\":_vm.graphStarted}})],1)])}),0)],1),(_vm.showOpenConfig)?_c('open-config-dialog',{attrs:{\"tool\":_vm.toolName},on:{\"success\":_vm.openConfiguration},model:{value:(_vm.showOpenConfig),callback:function ($$v) {_vm.showOpenConfig=$$v},expression:\"showOpenConfig\"}}):_vm._e(),(_vm.showSaveConfig)?_c('save-config-dialog',{attrs:{\"tool\":_vm.toolName},on:{\"success\":_vm.saveConfiguration},model:{value:(_vm.showSaveConfig),callback:function ($$v) {_vm.showSaveConfig=$$v},expression:\"showSaveConfig\"}}):_vm._e(),_c('settings-dialog',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showSettingsDialog),expression:\"showSettingsDialog\"}],attrs:{\"settings\":_vm.settings},model:{value:(_vm.showSettingsDialog),callback:function ($$v) {_vm.showSettingsDialog=$$v},expression:\"showSettingsDialog\"}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/*\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n*/\n\nimport axios from 'axios'\nimport Vue from 'vue'\n\nconst vueInstance = new Vue()\n\nconst axiosInstance = axios.create({\n baseURL: location.origin,\n timeout: 60000,\n params: {},\n})\n\naxiosInstance.interceptors.response.use(\n (response) => response,\n (error) => {\n if (error.response) {\n if (error.response.status === 401) {\n delete localStorage.openc3Token\n OpenC3Auth.login(location.href)\n } else {\n // Individual tools can set axiosIgnoreResponse to an error code\n // they potentially expect, e.g. '404', in which case we ignore it\n // Since localStorage only supports strings call toString on the status\n if (\n localStorage.axiosIgnoreResponse === error.response.status.toString()\n ) {\n return Promise.reject(error)\n }\n let body = `HTTP ${error.response.status} - `\n if (error.response?.statusText) {\n body += `${error.response.statusText} `\n }\n if (error.response?.config?.data) {\n body += `${error.response.config.data} `\n }\n if (error.response?.data?.message) {\n body += `${error.response.data.message}`\n } else if (error.response?.data?.exception) {\n body += `${error.response.data.exception}`\n } else if (error.response?.data?.error?.message) {\n if (error.response.data.error.class) {\n body += `${error.response.data.error.class} `\n }\n body += `${error.response.data.error.message}`\n } else {\n body += `${error.response?.data}`\n }\n vueInstance.$notify.serious({\n title: 'Network error',\n body,\n })\n }\n throw error\n } else {\n throw error\n }\n }\n)\n\nexport default axiosInstance\n","/*\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n*/\n\nimport axios from './axios.js'\n\nexport class OpenC3Api {\n id = 1\n\n constructor() {}\n\n // This is hacky Json-rpc for now. Should probably use a jsonrpc library.\n async exec(method, params, kwparams = {}) {\n try {\n await OpenC3Auth.updateToken(OpenC3Auth.defaultMinValidity)\n } catch (error) {\n OpenC3Auth.login()\n }\n this.id = this.id + 1\n try {\n kwparams['scope'] = localStorage.scope\n const response = await axios.post(\n '/openc3-api/api',\n {\n jsonrpc: '2.0',\n method: method,\n params: params,\n id: this.id,\n keyword_params: kwparams,\n },\n {\n headers: {\n Authorization: localStorage.openc3Token,\n 'Content-Type': 'application/json-rpc',\n },\n }\n )\n // var data = response.data\n // if (data.error) {\n // var err = new Error()\n // err.name = data.error.data.class\n // err.message = data.error.data.message\n // console.log(data.error.data.backtrace.join('\\n'))\n // throw err\n // }\n return response.data.result\n } catch (error) {\n var err = new Error()\n if (error.response) {\n // The request was made and the server responded with a\n // status code that falls out of the range of 2xx\n err.name = error.response.data.error.data.class\n err.message = error.response.data.error.data.message\n } else if (error.request) {\n // The request was made but no response was received, `error.request`\n // is an instance of XMLHttpRequest in the browser and an instance\n // of http.ClientRequest in Node.js\n err.name = 'Request error'\n err.message = 'Request error, no response received'\n } else {\n // Something happened in setting up the request and triggered an Error\n err.name = 'Unknown error'\n }\n //console.log(error)\n throw err\n }\n }\n\n decode_openc3_type(val) {\n if (val !== null && typeof val === 'object') {\n if (val.json_class == 'Float' && val.raw) {\n if (val.raw == 'NaN') {\n return NaN\n } else if (val.raw == 'Infinity') {\n return Infinity\n } else if (val.raw == '-Infinity') {\n return -Infinity\n }\n }\n }\n return null\n }\n\n encode_openc3_type(val) {\n if (Number.isNaN(val)) {\n return { json_class: 'Float', raw: 'NaN' }\n } else if (val == Number.POSITIVE_INFINITY) {\n return { json_class: 'Float', raw: 'Infinity' }\n } else if (val == Number.NEGATIVE_INFINITY) {\n return { json_class: 'Float', raw: '-Infinity' }\n }\n return null\n }\n\n // ***********************************************\n // The following APIs are used by the CmdTlmServer\n // ***********************************************\n get_all_interface_info() {\n return this.exec('get_all_interface_info', [])\n }\n\n connect_interface(interface_name) {\n return this.exec('connect_interface', [interface_name])\n }\n\n disconnect_interface(interface_name) {\n return this.exec('disconnect_interface', [interface_name])\n }\n\n get_all_router_info() {\n return this.exec('get_all_router_info', [])\n }\n\n connect_router(router_name) {\n return this.exec('connect_router', [router_name])\n }\n\n disconnect_router(router_name) {\n return this.exec('disconnect_router', [router_name])\n }\n\n get_all_target_info() {\n return this.exec('get_all_target_info', [])\n }\n\n get_tlm_cnts(target_commands) {\n return this.exec('get_tlm_cnts', [target_commands])\n }\n\n get_item(target, packet, item) {\n return this.exec('get_item', [target, packet, item])\n }\n\n get_parameter(target, packet, item) {\n return this.exec('get_parameter', [target, packet, item])\n }\n\n get_all_packet_logger_info() {\n return this.exec('get_all_packet_logger_info', [])\n }\n\n start_logging() {\n return this.exec('start_logging', [])\n }\n\n stop_logging() {\n return this.exec('stop_logging', [])\n }\n\n start_cmd_log(log_writer_name) {\n return this.exec('start_cmd_log', [log_writer_name])\n }\n\n start_tlm_log(log_writer_name) {\n return this.exec('start_tlm_log', [log_writer_name])\n }\n\n stop_cmd_log(log_writer_name) {\n return this.exec('stop_cmd_log', [log_writer_name])\n }\n\n stop_tlm_log(log_writer_name) {\n return this.exec('stop_tlm_log', [log_writer_name])\n }\n\n get_server_status() {\n return this.exec('get_server_status', [])\n }\n\n get_limits_sets() {\n return this.exec('get_limits_sets', [])\n }\n\n get_limits_set() {\n return this.exec('get_limits_set', [])\n }\n\n set_limits_set(limits_set) {\n return this.exec('set_limits_set', [limits_set])\n }\n\n get_background_tasks() {\n return this.exec('get_background_tasks', [])\n }\n\n start_background_task(name) {\n return this.exec('start_background_task', [name])\n }\n\n stop_background_task(name) {\n return this.exec('stop_background_task', [name])\n }\n\n // ***********************************************\n // End CmdTlmServer APIs\n // ***********************************************\n\n get_oldest_logfile() {\n return this.exec('get_oldest_logfile', [])\n }\n\n get_target(target_name) {\n return this.exec('get_target', [target_name])\n }\n\n get_target_list() {\n return this.exec('get_target_list', [])\n }\n\n get_telemetry(target_name, packet_name) {\n return this.exec('get_telemetry', [target_name, packet_name])\n }\n\n get_all_telemetry(target_name) {\n return this.exec('get_all_telemetry', [target_name])\n }\n\n get_all_telemetry_names(target_name) {\n return this.exec('get_all_telemetry_names', [target_name])\n }\n\n // Called by PacketViewerComponent\n async get_tlm_packet(target_name, packet_name, value_type) {\n const data = await this.exec('get_tlm_packet', [target_name, packet_name], {\n type: value_type,\n })\n // Make sure data isn't null or undefined. Note this is the only valid use of == or !=\n if (data != null) {\n var len = data.length\n var converted = null\n for (var i = 0; i < len; i++) {\n converted = this.decode_openc3_type(data[i][1])\n if (converted !== null) {\n data[i][1] = converted\n }\n }\n }\n return data\n }\n\n // Called by PacketViewerComponent\n get_packet_derived_items(target_name, packet_name) {\n return this.exec('get_packet_derived_items', [target_name, packet_name])\n }\n\n // Called by CmdTlmServer Tlm Packets tab\n get_tlm_buffer(target_name, packet_name) {\n return this.exec('get_tlm_buffer', [target_name, packet_name])\n }\n\n // Called by OpenC3ScreenComponent\n async get_tlm_values(items) {\n const data = await this.exec('get_tlm_values', [items])\n var len = data[0].length\n var converted = null\n for (var i = 0; i < len; i++) {\n converted = this.decode_openc3_type(data[0][i])\n if (converted !== null) {\n data[0][i] = converted\n }\n }\n return data\n }\n\n // Called by LimitsbarWidget\n get_limits(target_name, packet_name, item_name) {\n return this.exec('get_limits', [target_name, packet_name, item_name])\n }\n\n // Called by LimitsMonitorComponent\n async tlm(target_name, packet_name, item_name) {\n const data = await this.exec('tlm', [target_name, packet_name, item_name])\n var converted = this.decode_openc3_type(data)\n if (converted !== null) {\n data = converted\n }\n return data\n }\n\n get_all_commands(target_name) {\n return this.exec('get_all_commands', [target_name])\n }\n\n get_all_command_names(target_name) {\n return this.exec('get_all_command_names', [target_name])\n }\n\n get_command(target_name, command_name) {\n return this.exec('get_command', [target_name, command_name])\n }\n\n get_cmd_cnts(target_commands) {\n return this.exec('get_cmd_cnts', [target_commands])\n }\n\n get_cmd_value(\n target_name,\n packet_name,\n parameter_name,\n value_type = 'CONVERTED'\n ) {\n return this.exec('get_cmd_value', [\n target_name,\n packet_name,\n parameter_name,\n value_type,\n ])\n }\n\n // Called by CmdTlmServer Cmd Packets tab\n get_cmd_buffer(target_name, packet_name) {\n return this.exec('get_cmd_buffer', [target_name, packet_name])\n }\n\n // Implementation of functionality shared by cmd methods with param_lists.\n _cmd(method, target_name, command_name, param_list) {\n var converted = null\n for (var key in param_list) {\n if (Object.prototype.hasOwnProperty.call(param_list, key)) {\n converted = this.encode_openc3_type(param_list[key])\n if (converted !== null) {\n param_list[key] = converted\n }\n }\n }\n return this.exec(method, [target_name, command_name, param_list])\n }\n\n // Called by CmdSenderComponent\n get_cmd_hazardous(target_name, command_name, param_list) {\n if (command_name === undefined) {\n return this.exec('get_cmd_hazardous', target_name)\n } else {\n return this._cmd(\n 'get_cmd_hazardous',\n target_name,\n command_name,\n param_list\n )\n }\n }\n\n // Called by CmdSenderComponent\n cmd(target_name, command_name, param_list) {\n if (command_name === undefined) {\n return this.exec('cmd', target_name)\n } else {\n return this._cmd('cmd', target_name, command_name, param_list)\n }\n }\n\n // Called by CmdSenderComponent\n cmd_no_range_check(target_name, command_name, param_list) {\n if (command_name === undefined) {\n return this.exec('cmd_no_range_check', target_name)\n } else {\n return this._cmd(\n 'cmd_no_range_check',\n target_name,\n command_name,\n param_list\n )\n }\n }\n\n // Called by CmdSenderComponent\n cmd_raw(target_name, command_name, param_list) {\n if (command_name === undefined) {\n return this.exec('cmd_raw', target_name)\n } else {\n return this._cmd('cmd_raw', target_name, command_name, param_list)\n }\n }\n\n // Called by CmdSenderComponent\n cmd_raw_no_range_check(target_name, command_name, param_list) {\n if (command_name === undefined) {\n return this.exec('cmd_raw_no_range_check', target_name)\n } else {\n return this._cmd(\n 'cmd_raw_no_range_check',\n target_name,\n command_name,\n param_list\n )\n }\n }\n\n // Called by CmdSenderComponent\n cmd_no_hazardous_check(target_name, command_name, param_list) {\n if (command_name === undefined) {\n return this.exec('cmd_no_hazardous_check', target_name)\n } else {\n return this._cmd(\n 'cmd_no_hazardous_check',\n target_name,\n command_name,\n param_list\n )\n }\n }\n\n // Called by CmdSenderComponent\n cmd_no_checks(target_name, command_name, param_list) {\n if (command_name === undefined) {\n return this.exec('cmd_no_checks', target_name)\n } else {\n return this._cmd('cmd_no_checks', target_name, command_name, param_list)\n }\n }\n\n // Called by CmdSenderComponent\n cmd_raw_no_hazardous_check(target_name, command_name, param_list) {\n if (command_name === undefined) {\n return this.exec('cmd_raw_no_hazardous_check', target_name)\n } else {\n return this._cmd(\n 'cmd_raw_no_hazardous_check',\n target_name,\n command_name,\n param_list\n )\n }\n }\n\n // Called by CmdSenderComponent\n cmd_raw_no_checks(target_name, command_name, param_list) {\n if (command_name === undefined) {\n return this.exec('cmd_raw_no_checks', target_name)\n } else {\n return this._cmd(\n 'cmd_raw_no_checks',\n target_name,\n command_name,\n param_list\n )\n }\n }\n\n // Called by CmdSenderComponent\n get_interface_names() {\n return this.exec('get_interface_names', [])\n }\n\n // Called by CmdSenderComponent\n send_raw(interface_name, data) {\n return this.exec('send_raw', [interface_name, data])\n }\n\n list_configs(tool) {\n return this.exec('list_configs', [tool])\n }\n\n load_config(tool, name) {\n return this.exec('load_config', [tool, name])\n }\n\n save_config(tool, name, data) {\n return this.exec('save_config', [tool, name, data])\n }\n\n delete_config(tool, name) {\n return this.exec('delete_config', [tool, name])\n }\n\n get_out_of_limits() {\n return this.exec('get_out_of_limits', [])\n }\n\n get_overall_limits_state(ignored) {\n return this.exec('get_overall_limits_state', [ignored])\n }\n\n list_settings() {\n return this.exec('list_settings', [])\n }\n\n get_all_settings() {\n return this.exec('get_all_settings', [])\n }\n\n get_setting(name) {\n return this.exec('get_setting', [name])\n }\n\n get_settings(array) {\n return this.exec('get_settings', array)\n }\n\n save_setting(name, data) {\n return this.exec('save_setting', [name, data])\n }\n\n // TODO: Currently unused but seemed like a useful function\n async hashString(string) {\n if (window.isSecureContext) {\n // Encode the string as an arrayBuffer which the subtle crypto API uses\n const arrayBuffer = new TextEncoder().encode(string)\n // Use the subtle crypto API to perform a SHA256 Sum of the array buffer\n // The resulting hash is stored in an array buffer\n const hashAsArrayBuffer = await crypto.subtle.digest(\n 'SHA-256',\n arrayBuffer\n )\n // To create a string we will get the hexadecimal value of each byte of the array buffer\n // This gets us an array where each byte of the array buffer becomes one item in the array\n const uint8ViewOfHash = new Uint8Array(hashAsArrayBuffer)\n // We then convert it to a regular array so we can convert each item to hexadecimal strings\n // Where to characters of 0-9 or a-f represent a number between 0 and 16, containing 4 bits of information, so 2 of them is 8 bits (1 byte).\n return Array.from(uint8ViewOfHash)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n }\n // else ?\n }\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('v-card',{nativeOn:{\"click\":function($event){return _vm.$emit('click')}}},[_c('v-system-bar',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.hideSystemBar),expression:\"!hideSystemBar\"}],class:_vm.selectedGraphId === _vm.id ? 'active' : 'inactive'},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.errors.length !== 0),expression:\"errors.length !== 0\"}],staticClass:\"mx-2\"},[_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('div',_vm._g(_vm._b({},'div',attrs,false),on),[_c('v-icon',{attrs:{\"data-test\":\"error-graph-icon\"},on:{\"click\":function($event){_vm.errorDialog = true}}},[_vm._v(\"mdi-alert\")])],1)]}}])},[_c('span',[_vm._v(\"Errors\")])])],1),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('div',_vm._g(_vm._b({},'div',attrs,false),on),[_c('v-icon',{attrs:{\"data-test\":\"edit-graph-icon\"},on:{\"click\":function($event){_vm.editGraph = true}}},[_vm._v(\" mdi-pencil \")])],1)]}}])},[_c('span',[_vm._v(\" Edit \")])]),_c('v-spacer'),_c('span',[_vm._v(_vm._s(_vm.title))]),_c('v-spacer'),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.expand),expression:\"expand\"}]},[_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('div',_vm._g(_vm._b({},'div',attrs,false),on),[_c('v-icon',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.calcFullSize),expression:\"calcFullSize\"}],attrs:{\"data-test\":\"collapse-all\"},on:{\"click\":_vm.collapseAll}},[_vm._v(\" mdi-arrow-collapse \")]),_c('v-icon',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.calcFullSize),expression:\"!calcFullSize\"}],attrs:{\"data-test\":\"expand-all\"},on:{\"click\":_vm.expandAll}},[_vm._v(\" mdi-arrow-expand \")])],1)]}}])},[_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.calcFullSize),expression:\"calcFullSize\"}]},[_vm._v(\" Collapse \")]),_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.calcFullSize),expression:\"!calcFullSize\"}]},[_vm._v(\" Expand \")])])],1),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.expand),expression:\"expand\"}]},[_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('div',_vm._g(_vm._b({},'div',attrs,false),on),[_c('v-icon',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.fullWidth),expression:\"fullWidth\"}],attrs:{\"data-test\":\"collapse-width\"},on:{\"click\":_vm.collapseWidth}},[_vm._v(\" mdi-arrow-collapse-horizontal \")]),_c('v-icon',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.fullWidth),expression:\"!fullWidth\"}],attrs:{\"data-test\":\"expand-width\"},on:{\"click\":_vm.expandWidth}},[_vm._v(\" mdi-arrow-expand-horizontal \")])],1)]}}])},[_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.fullWidth),expression:\"fullWidth\"}]},[_vm._v(\" Collapse Width \")]),_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.fullWidth),expression:\"!fullWidth\"}]},[_vm._v(\" Expand Width \")])])],1),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.expand),expression:\"expand\"}]},[_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('div',_vm._g(_vm._b({},'div',attrs,false),on),[_c('v-icon',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.fullHeight),expression:\"fullHeight\"}],attrs:{\"data-test\":\"collapse-height\"},on:{\"click\":_vm.collapseHeight}},[_vm._v(\" mdi-arrow-collapse-vertical \")]),_c('v-icon',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.fullHeight),expression:\"!fullHeight\"}],attrs:{\"data-test\":\"expand-height\"},on:{\"click\":_vm.expandHeight}},[_vm._v(\" mdi-arrow-expand-vertical \")])],1)]}}])},[_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.fullHeight),expression:\"fullHeight\"}]},[_vm._v(\" Collapse Height \")]),_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.fullHeight),expression:\"!fullHeight\"}]},[_vm._v(\" Expand Height \")])])],1),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('div',_vm._g(_vm._b({},'div',attrs,false),on),[_c('v-icon',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.expand),expression:\"expand\"}],attrs:{\"data-test\":\"minimize-screen-icon\"},on:{\"click\":_vm.minMaxTransition}},[_vm._v(\" mdi-window-minimize \")]),_c('v-icon',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.expand),expression:\"!expand\"}],attrs:{\"data-test\":\"maximize-screen-icon\"},on:{\"click\":_vm.minMaxTransition}},[_vm._v(\" mdi-window-maximize \")])],1)]}}])},[_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.expand),expression:\"expand\"}]},[_vm._v(\" Minimize \")]),_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.expand),expression:\"!expand\"}]},[_vm._v(\" Maximize \")])]),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('div',_vm._g(_vm._b({},'div',attrs,false),on),[_c('v-icon',{attrs:{\"data-test\":\"close-graph-icon\"},on:{\"click\":function($event){return _vm.$emit('close-graph')}}},[_vm._v(\" mdi-close-box \")])],1)]}}])},[_c('span',[_vm._v(\" Close \")])])],1),_c('v-expand-transition',[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.expand),expression:\"expand\"}],ref:\"chart\",staticClass:\"pa-1\",attrs:{\"id\":\"chart\"}},[_c('div',{attrs:{\"id\":(\"chart\" + _vm.id)}}),_c('div',{attrs:{\"id\":\"betweenCharts\"}}),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.hideOverview),expression:\"!hideOverview\"}],attrs:{\"id\":(\"overview\" + _vm.id)}})])])],1),_c('v-dialog',{attrs:{\"max-width\":\"600\"},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }return _vm.$emit('input')},\"input\":function($event){return _vm.editGraphClose()}},model:{value:(_vm.editGraph),callback:function ($$v) {_vm.editGraph=$$v},expression:\"editGraph\"}},[_c('v-system-bar',[_c('v-spacer'),_c('span',[_vm._v(\"Edit Graph\")]),_c('v-spacer')],1),_c('v-card',{staticClass:\"pa-3\"},[_c('v-row',{attrs:{\"dense\":\"\"}},[_c('v-text-field',{staticClass:\"pb-2\",attrs:{\"label\":\"Title\",\"hide-details\":\"\",\"data-test\":\"edit-graph-title\"},model:{value:(_vm.title),callback:function ($$v) {_vm.title=$$v},expression:\"title\"}})],1),_c('v-card-text',{staticClass:\"pa-0\"},[_vm._v(\" Select a start date/time for the graph. Leave blank for start now. \")]),_c('date-time-chooser',{attrs:{\"required\":false,\"date-label\":\"Start Date\",\"time-label\":\"Start Time\"},on:{\"date-time\":function($event){_vm.graphStartDateTime = $event}}}),_c('v-card-text',{staticClass:\"pa-0\"},[_vm._v(\" Select a end date/time for the graph. Leave blank for continuous real-time graphing. \")]),_c('date-time-chooser',{attrs:{\"date-label\":\"End Date\",\"time-label\":\"End Time\"},on:{\"date-time\":function($event){_vm.graphEndDateTime = $event}}}),_c('v-row',{attrs:{\"dense\":\"\"}},[_c('v-select',{attrs:{\"label\":\"Legend Position\",\"items\":_vm.legendPositions,\"data-test\":\"edit-legend-position\"},model:{value:(_vm.legendPosition),callback:function ($$v) {_vm.legendPosition=$$v},expression:\"legendPosition\"}})],1),_c('v-card-text',{staticClass:\"pa-0\"},[_vm._v(\" Optional Y axis settings. \")]),_c('v-row',{attrs:{\"dense\":\"\"}},[_c('v-col',{staticClass:\"px-2\"},[_c('v-text-field',{attrs:{\"hide-details\":\"\",\"label\":\"Min Y\",\"type\":\"number\",\"data-test\":\"graph-min-y\"},model:{value:(_vm.graphMinY),callback:function ($$v) {_vm.graphMinY=$$v},expression:\"graphMinY\"}})],1),_c('v-col',{staticClass:\"px-2\"},[_c('v-text-field',{attrs:{\"hide-details\":\"\",\"label\":\"Max Y\",\"type\":\"number\",\"data-test\":\"graph-max-y\"},model:{value:(_vm.graphMaxY),callback:function ($$v) {_vm.graphMaxY=$$v},expression:\"graphMaxY\"}})],1)],1),_c('v-data-table',{staticClass:\"elevation-1 my-2\",attrs:{\"item-key\":\"itemId\",\"headers\":_vm.itemHeaders,\"items\":_vm.editItems,\"items-per-page\":5,\"footer-props\":{\n 'items-per-page-options': [5],\n }},scopedSlots:_vm._u([{key:\"item.actions\",fn:function(ref){\n var item = ref.item;\nreturn [_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\n var on = ref.on;\n var attrs = ref.attrs;\nreturn [_c('div',_vm._g(_vm._b({},'div',attrs,false),on),[_c('v-btn',{attrs:{\"icon\":\"\",\"data-test\":(\"delete-item-icon\" + (item.itemId))},on:{\"click\":function () { return _vm.removeItems([item]); }}},[_c('v-icon',[_vm._v(\"mdi-delete\")])],1)],1)]}}],null,true)},[_c('span',[_vm._v(\"Remove\")])])]}},{key:\"no-data\",fn:function(){return [_c('span',[_vm._v(\"Currently no items on this graph\")])]},proxy:true}])}),_c('v-card-actions',[_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){return _vm.editGraphClose()}}},[_vm._v(\" Ok \")])],1)],1)],1),_c('v-dialog',{attrs:{\"max-width\":\"600\"},model:{value:(_vm.errorDialog),callback:function ($$v) {_vm.errorDialog=$$v},expression:\"errorDialog\"}},[_c('v-system-bar',[_c('v-spacer'),_c('span',[_vm._v(\"Errors\")]),_c('v-spacer')],1),_c('v-card',{staticClass:\"pa-3\"},[_c('v-row',{attrs:{\"dense\":\"\"}},[_c('v-text-field',{staticClass:\"pb-2\",attrs:{\"readonly\":\"\",\"hide-details\":\"\",\"label\":\"Graph Title\"},model:{value:(_vm.title),callback:function ($$v) {_vm.title=$$v},expression:\"title\"}})],1),_c('v-row',{staticClass:\"my-3\"},[_c('v-textarea',{attrs:{\"readonly\":\"\",\"rows\":\"8\",\"value\":_vm.error}})],1),_c('v-row',[_c('v-btn',{attrs:{\"block\":\"\"},on:{\"click\":_vm.clearErrors}},[_vm._v(\" Clear \")])],1)],1)],1),(_vm.editGraphMenu)?_c('v-menu',{attrs:{\"position-x\":_vm.editGraphMenuX,\"position-y\":_vm.editGraphMenuY,\"absolute\":\"\",\"offset-y\":\"\"},model:{value:(_vm.editGraphMenu),callback:function ($$v) {_vm.editGraphMenu=$$v},expression:\"editGraphMenu\"}},[_c('v-list',[_c('v-list-item',{on:{\"click\":function($event){_vm.editGraph = true}}},[_c('v-list-item-title',{staticStyle:{\"cursor\":\"pointer\"}},[_vm._v(\" Edit \"+_vm._s(_vm.title)+\" \")])],1)],1)],1):_vm._e(),(_vm.editItem)?_c('v-dialog',{attrs:{\"max-width\":\"600\"},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }_vm.editItem = false}},model:{value:(_vm.editItem),callback:function ($$v) {_vm.editItem=$$v},expression:\"editItem\"}},[_c('v-card',{staticClass:\"pa-3\"},[_c('v-card-title',{staticClass:\"headline\"},[_vm._v(\"Edit Item\")]),_c('v-select',{attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"label\":\"Value Type\",\"items\":_vm.valueTypes},model:{value:(_vm.currentType),callback:function ($$v) {_vm.currentType=$$v},expression:\"currentType\"}}),_c('v-card-actions',[_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){return _vm.closeEditItem()}}},[_vm._v(\"Ok\")])],1)],1)],1):_vm._e(),(_vm.itemMenu)?_c('v-menu',{attrs:{\"position-x\":_vm.itemMenuX,\"position-y\":_vm.itemMenuY,\"absolute\":\"\",\"offset-y\":\"\"},model:{value:(_vm.itemMenu),callback:function ($$v) {_vm.itemMenu=$$v},expression:\"itemMenu\"}},[_c('v-list',[_c('v-list-item',{on:{\"click\":function($event){return _vm.openEditItem()}}},[_c('v-list-item-title',{staticStyle:{\"cursor\":\"pointer\"}},[_vm._v(\" Edit \"+_vm._s(_vm.selectedItem.itemName)+\" \")])],1),_c('v-list-item',{on:{\"click\":function($event){return _vm.removeItems([_vm.selectedItem])}}},[_c('v-list-item-title',{staticStyle:{\"cursor\":\"pointer\"}},[_vm._v(\" Delete \"+_vm._s(_vm.selectedItem.itemName)+\" \")])],1)],1)],1):_vm._e(),(_vm.legendMenu)?_c('v-menu',{attrs:{\"position-x\":_vm.legendMenuX,\"position-y\":_vm.legendMenuY,\"absolute\":\"\",\"offset-y\":\"\"},model:{value:(_vm.legendMenu),callback:function ($$v) {_vm.legendMenu=$$v},expression:\"legendMenu\"}},[_c('v-list',[_c('v-list-item',{on:{\"click\":function($event){return _vm.moveLegend('top')}}},[_c('v-list-item-title',{staticStyle:{\"cursor\":\"pointer\"}},[_vm._v(\"Legend Top\")])],1),_c('v-list-item',{on:{\"click\":function($event){return _vm.moveLegend('bottom')}}},[_c('v-list-item-title',{staticStyle:{\"cursor\":\"pointer\"}},[_vm._v(\"Legend Bottom\")])],1),_c('v-list-item',{on:{\"click\":function($event){return _vm.moveLegend('left')}}},[_c('v-list-item-title',{staticStyle:{\"cursor\":\"pointer\"}},[_vm._v(\"Legend Left\")])],1),_c('v-list-item',{on:{\"click\":function($event){return _vm.moveLegend('right')}}},[_c('v-list-item-title',{staticStyle:{\"cursor\":\"pointer\"}},[_vm._v(\"Legend RIght\")])],1)],1)],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('v-row',[_c('v-col',[_c('v-menu',{attrs:{\"close-on-content-click\":\"\",\"transition\":\"scale-transition\",\"offset-y\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":_vm.dateLabel,\"name\":(\"date\" + (Date.now())),\"rules\":_vm.dateRules,\"type\":\"date\",\"data-test\":\"date-chooser\"},model:{value:(_vm.date),callback:function ($$v) {_vm.date=$$v},expression:\"date\"}},on))]}}])})],1),_c('v-col',[_c('v-text-field',{attrs:{\"label\":_vm.timeLabel,\"name\":(\"time\" + (Date.now())),\"rules\":_vm.timeRules,\"type\":\"time\",\"step\":\"1\",\"data-test\":\"time-chooser\"},on:{\"change\":_vm.onChange},model:{value:(_vm.time),callback:function ($$v) {_vm.time=$$v},expression:\"time\"}})],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n-->\n\n<template>\n <div>\n <v-row>\n <v-col>\n <v-menu\n close-on-content-click\n transition=\"scale-transition\"\n offset-y\n max-width=\"290px\"\n min-width=\"290px\"\n >\n <template v-slot:activator=\"{ on }\">\n <!-- We set the :name attribute to be unique to avoid auto-completion -->\n <v-text-field\n :label=\"dateLabel\"\n :name=\"`date${Date.now()}`\"\n :rules=\"dateRules\"\n v-model=\"date\"\n v-on=\"on\"\n type=\"date\"\n data-test=\"date-chooser\"\n />\n </template>\n </v-menu>\n </v-col>\n <v-col>\n <!-- We set the :name attribute to be unique to avoid auto-completion -->\n <v-text-field\n :label=\"timeLabel\"\n :name=\"`time${Date.now()}`\"\n :rules=\"timeRules\"\n v-model=\"time\"\n type=\"time\"\n step=\"1\"\n @change=\"onChange\"\n data-test=\"time-chooser\"\n />\n </v-col>\n </v-row>\n </div>\n</template>\n\n<script>\nimport { isValid, parse, format, getTime } from 'date-fns'\n\nexport default {\n props: {\n required: {\n type: Boolean,\n default: true,\n },\n initialDate: {\n type: Date,\n default: null,\n },\n initialTime: {\n type: Date,\n default: null,\n },\n dateLabel: {\n type: String,\n default: 'Date',\n },\n timeLabel: {\n type: String,\n default: 'Time',\n },\n },\n data() {\n return {\n date: null,\n time: null,\n rules: {\n required: (value) => !!value || 'Required',\n date: (value) => {\n if (!value) return true\n try {\n return (\n isValid(parse(value, 'yyyy-MM-dd', new Date())) ||\n 'Invalid date (YYYY-MM-DD)'\n )\n } catch (e) {\n return 'Invalid date (YYYY-MM-DD)'\n }\n },\n time: (value) => {\n if (!value) return true\n try {\n return (\n isValid(parse(value, 'HH:mm:ss', new Date())) ||\n 'Invalid time (HH:MM:SS)'\n )\n } catch (e) {\n return 'Invalid time (HH:MM:SS)'\n }\n },\n },\n }\n },\n computed: {\n dateRules() {\n let result = [this.rules.date]\n if (this.time || this.required) {\n result.push(this.rules.required)\n }\n return result\n },\n timeRules() {\n let result = [this.rules.time]\n if (this.date || this.required) {\n result.push(this.rules.required)\n }\n return result\n },\n },\n methods: {\n onChange() {\n if (!!this.date && !!this.time) {\n this.$emit('date-time', this.date + ' ' + this.time)\n } else {\n this.$emit('date-time', null)\n }\n },\n },\n}\n</script>\n","import mod from \"-!../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./DateTimeChooser.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./DateTimeChooser.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DateTimeChooser.vue?vue&type=template&id=00fd3b2e&\"\nimport script from \"./DateTimeChooser.vue?vue&type=script&lang=js&\"\nexport * from \"./DateTimeChooser.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","/*\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n*/\n\nimport * as ActionCable from '@rails/actioncable'\n//ActionCable.logger.enabled = true\nActionCable.ConnectionMonitor.staleThreshold = 60\n\nexport default class Cable {\n constructor(url = '/openc3-api/cable') {\n this._cable = ActionCable.createConsumer(url)\n }\n disconnect() {\n this._cable.disconnect()\n }\n createSubscription(channel, scope, callbacks = {}, additionalOptions = {}) {\n return OpenC3Auth.updateToken(OpenC3Auth.defaultMinValidity).then(() => {\n return this._cable.subscriptions.create(\n {\n channel,\n scope,\n token: localStorage.openc3Token,\n ...additionalOptions,\n },\n callbacks\n )\n })\n }\n}\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n-->\n\n<template>\n <div>\n <v-card @click.native=\"$emit('click')\">\n <v-system-bar\n :class=\"selectedGraphId === id ? 'active' : 'inactive'\"\n v-show=\"!hideSystemBar\"\n >\n <div v-show=\"errors.length !== 0\" class=\"mx-2\">\n <v-tooltip top>\n <template v-slot:activator=\"{ on, attrs }\">\n <div v-on=\"on\" v-bind=\"attrs\">\n <v-icon data-test=\"error-graph-icon\" @click=\"errorDialog = true\"\n >mdi-alert</v-icon\n >\n </div>\n </template>\n <span>Errors</span>\n </v-tooltip>\n </div>\n\n <v-tooltip top>\n <template v-slot:activator=\"{ on, attrs }\">\n <div v-on=\"on\" v-bind=\"attrs\">\n <v-icon data-test=\"edit-graph-icon\" @click=\"editGraph = true\">\n mdi-pencil\n </v-icon>\n </div>\n </template>\n <span> Edit </span>\n </v-tooltip>\n\n <v-spacer />\n <span>{{ title }}</span>\n <v-spacer />\n\n <div v-show=\"expand\">\n <v-tooltip top>\n <template v-slot:activator=\"{ on, attrs }\">\n <div v-on=\"on\" v-bind=\"attrs\">\n <v-icon\n data-test=\"collapse-all\"\n v-show=\"calcFullSize\"\n @click=\"collapseAll\"\n >\n mdi-arrow-collapse\n </v-icon>\n <v-icon\n data-test=\"expand-all\"\n v-show=\"!calcFullSize\"\n @click=\"expandAll\"\n >\n mdi-arrow-expand\n </v-icon>\n </div>\n </template>\n <span v-show=\"calcFullSize\"> Collapse </span>\n <span v-show=\"!calcFullSize\"> Expand </span>\n </v-tooltip>\n </div>\n\n <div v-show=\"expand\">\n <v-tooltip top>\n <template v-slot:activator=\"{ on, attrs }\">\n <div v-on=\"on\" v-bind=\"attrs\">\n <v-icon\n data-test=\"collapse-width\"\n v-show=\"fullWidth\"\n @click=\"collapseWidth\"\n >\n mdi-arrow-collapse-horizontal\n </v-icon>\n <v-icon\n data-test=\"expand-width\"\n v-show=\"!fullWidth\"\n @click=\"expandWidth\"\n >\n mdi-arrow-expand-horizontal\n </v-icon>\n </div>\n </template>\n <span v-show=\"fullWidth\"> Collapse Width </span>\n <span v-show=\"!fullWidth\"> Expand Width </span>\n </v-tooltip>\n </div>\n\n <div v-show=\"expand\">\n <v-tooltip top>\n <template v-slot:activator=\"{ on, attrs }\">\n <div v-on=\"on\" v-bind=\"attrs\">\n <v-icon\n data-test=\"collapse-height\"\n v-show=\"fullHeight\"\n @click=\"collapseHeight\"\n >\n mdi-arrow-collapse-vertical\n </v-icon>\n <v-icon\n data-test=\"expand-height\"\n v-show=\"!fullHeight\"\n @click=\"expandHeight\"\n >\n mdi-arrow-expand-vertical\n </v-icon>\n </div>\n </template>\n <span v-show=\"fullHeight\"> Collapse Height </span>\n <span v-show=\"!fullHeight\"> Expand Height </span>\n </v-tooltip>\n </div>\n\n <v-tooltip top>\n <template v-slot:activator=\"{ on, attrs }\">\n <div v-on=\"on\" v-bind=\"attrs\">\n <v-icon\n data-test=\"minimize-screen-icon\"\n @click=\"minMaxTransition\"\n v-show=\"expand\"\n >\n mdi-window-minimize\n </v-icon>\n <v-icon\n data-test=\"maximize-screen-icon\"\n @click=\"minMaxTransition\"\n v-show=\"!expand\"\n >\n mdi-window-maximize\n </v-icon>\n </div>\n </template>\n <span v-show=\"expand\"> Minimize </span>\n <span v-show=\"!expand\"> Maximize </span>\n </v-tooltip>\n\n <v-tooltip top>\n <template v-slot:activator=\"{ on, attrs }\">\n <div v-on=\"on\" v-bind=\"attrs\">\n <v-icon\n data-test=\"close-graph-icon\"\n @click=\"$emit('close-graph')\"\n >\n mdi-close-box\n </v-icon>\n </div>\n </template>\n <span> Close </span>\n </v-tooltip>\n </v-system-bar>\n\n <v-expand-transition>\n <div class=\"pa-1\" id=\"chart\" ref=\"chart\" v-show=\"expand\">\n <div :id=\"`chart${id}`\"></div>\n <div id=\"betweenCharts\" />\n <div :id=\"`overview${id}`\" v-show=\"!hideOverview\"></div>\n </div>\n </v-expand-transition>\n </v-card>\n\n <!-- Edit dialog -->\n <v-dialog\n v-model=\"editGraph\"\n @keydown.esc=\"$emit('input')\"\n @input=\"editGraphClose()\"\n max-width=\"600\"\n >\n <v-system-bar>\n <v-spacer />\n <span>Edit Graph</span>\n <v-spacer />\n </v-system-bar>\n <v-card class=\"pa-3\">\n <v-row dense>\n <v-text-field\n class=\"pb-2\"\n label=\"Title\"\n v-model=\"title\"\n hide-details\n data-test=\"edit-graph-title\"\n />\n </v-row>\n <v-card-text class=\"pa-0\">\n Select a start date/time for the graph. Leave blank for start now.\n </v-card-text>\n <date-time-chooser\n :required=\"false\"\n date-label=\"Start Date\"\n time-label=\"Start Time\"\n @date-time=\"graphStartDateTime = $event\"\n />\n <v-card-text class=\"pa-0\">\n Select a end date/time for the graph. Leave blank for continuous\n real-time graphing.\n </v-card-text>\n <date-time-chooser\n date-label=\"End Date\"\n time-label=\"End Time\"\n @date-time=\"graphEndDateTime = $event\"\n />\n <v-row dense>\n <v-select\n label=\"Legend Position\"\n :items=\"legendPositions\"\n v-model=\"legendPosition\"\n data-test=\"edit-legend-position\"\n />\n </v-row>\n <v-card-text class=\"pa-0\"> Optional Y axis settings. </v-card-text>\n <v-row dense>\n <v-col class=\"px-2\">\n <v-text-field\n hide-details\n label=\"Min Y\"\n v-model=\"graphMinY\"\n type=\"number\"\n data-test=\"graph-min-y\"\n />\n </v-col>\n <v-col class=\"px-2\">\n <v-text-field\n hide-details\n label=\"Max Y\"\n v-model=\"graphMaxY\"\n type=\"number\"\n data-test=\"graph-max-y\"\n />\n </v-col>\n </v-row>\n <v-data-table\n item-key=\"itemId\"\n class=\"elevation-1 my-2\"\n :headers=\"itemHeaders\"\n :items=\"editItems\"\n :items-per-page=\"5\"\n :footer-props=\"{\n 'items-per-page-options': [5],\n }\"\n >\n <template v-slot:item.actions=\"{ item }\">\n <v-tooltip top>\n <template v-slot:activator=\"{ on, attrs }\">\n <div v-on=\"on\" v-bind=\"attrs\">\n <v-btn\n icon\n :data-test=\"`delete-item-icon${item.itemId}`\"\n @click=\"() => removeItems([item])\"\n >\n <v-icon>mdi-delete</v-icon>\n </v-btn>\n </div>\n </template>\n <span>Remove</span>\n </v-tooltip>\n </template>\n <template v-slot:no-data>\n <span>Currently no items on this graph</span>\n </template>\n </v-data-table>\n <v-card-actions>\n <v-btn color=\"primary\" @click=\"editGraphClose()\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n\n <!-- Error dialog -->\n <v-dialog v-model=\"errorDialog\" max-width=\"600\">\n <v-system-bar>\n <v-spacer />\n <span>Errors</span>\n <v-spacer />\n </v-system-bar>\n <v-card class=\"pa-3\">\n <v-row dense>\n <v-text-field\n readonly\n hide-details\n v-model=\"title\"\n class=\"pb-2\"\n label=\"Graph Title\"\n />\n </v-row>\n <v-row class=\"my-3\">\n <v-textarea readonly rows=\"8\" :value=\"error\" />\n </v-row>\n <v-row>\n <v-btn block @click=\"clearErrors\"> Clear </v-btn>\n </v-row>\n </v-card>\n </v-dialog>\n\n <!-- Edit right click context menu -->\n <v-menu\n v-if=\"editGraphMenu\"\n v-model=\"editGraphMenu\"\n :position-x=\"editGraphMenuX\"\n :position-y=\"editGraphMenuY\"\n absolute\n offset-y\n >\n <v-list>\n <v-list-item @click=\"editGraph = true\">\n <v-list-item-title style=\"cursor: pointer\">\n Edit {{ title }}\n </v-list-item-title>\n </v-list-item>\n </v-list>\n </v-menu>\n\n <!-- Edit Item dialog -->\n <v-dialog\n max-width=\"600\"\n v-if=\"editItem\"\n v-model=\"editItem\"\n @keydown.esc=\"editItem = false\"\n >\n <v-card class=\"pa-3\">\n <v-card-title class=\"headline\">Edit Item</v-card-title>\n <v-select\n outlined\n hide-details\n label=\"Value Type\"\n :items=\"valueTypes\"\n v-model=\"currentType\"\n />\n <v-card-actions>\n <v-btn color=\"primary\" @click=\"closeEditItem()\">Ok</v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n\n <!-- Edit Item right click context menu -->\n <v-menu\n v-if=\"itemMenu\"\n v-model=\"itemMenu\"\n :position-x=\"itemMenuX\"\n :position-y=\"itemMenuY\"\n absolute\n offset-y\n >\n <v-list>\n <v-list-item @click=\"openEditItem()\">\n <v-list-item-title style=\"cursor: pointer\">\n Edit {{ selectedItem.itemName }}\n </v-list-item-title>\n </v-list-item>\n <v-list-item @click=\"removeItems([selectedItem])\">\n <v-list-item-title style=\"cursor: pointer\">\n Delete {{ selectedItem.itemName }}\n </v-list-item-title>\n </v-list-item>\n </v-list>\n </v-menu>\n\n <!-- Edit Legend right click context menu -->\n <v-menu\n v-if=\"legendMenu\"\n v-model=\"legendMenu\"\n :position-x=\"legendMenuX\"\n :position-y=\"legendMenuY\"\n absolute\n offset-y\n >\n <v-list>\n <v-list-item @click=\"moveLegend('top')\">\n <v-list-item-title style=\"cursor: pointer\"\n >Legend Top</v-list-item-title\n >\n </v-list-item>\n <v-list-item @click=\"moveLegend('bottom')\">\n <v-list-item-title style=\"cursor: pointer\"\n >Legend Bottom</v-list-item-title\n >\n </v-list-item>\n <v-list-item @click=\"moveLegend('left')\">\n <v-list-item-title style=\"cursor: pointer\"\n >Legend Left</v-list-item-title\n >\n </v-list-item>\n <v-list-item @click=\"moveLegend('right')\">\n <v-list-item-title style=\"cursor: pointer\"\n >Legend RIght</v-list-item-title\n >\n </v-list-item>\n </v-list>\n </v-menu>\n </div>\n</template>\n\n<script>\nimport DateTimeChooser from './DateTimeChooser'\nimport uPlot from 'uplot'\nimport bs from 'binary-search'\nimport { toDate, format, getTime } from 'date-fns'\nimport Cable from '../services/cable.js'\n\nrequire('uplot/dist/uPlot.min.css')\n\nexport default {\n components: {\n DateTimeChooser,\n },\n props: {\n id: {\n type: Number,\n required: true,\n },\n selectedGraphId: {\n type: Number,\n // Not required because we pass null\n },\n state: {\n type: String,\n required: true,\n },\n // start time in nanoseconds to start the graph\n // this allows multiple graphs to be synchronized\n startTime: {\n type: Number,\n },\n secondsGraphed: {\n type: Number,\n required: true,\n },\n pointsSaved: {\n type: Number,\n required: true,\n },\n pointsGraphed: {\n type: Number,\n required: true,\n },\n hideSystemBar: {\n type: Boolean,\n default: false,\n },\n hideOverview: {\n type: Boolean,\n default: false,\n },\n initialItems: {\n type: Array,\n },\n // These allow the parent to force a specific height and/or width\n height: {\n type: Number,\n },\n width: {\n type: Number,\n },\n },\n data() {\n return {\n itemHeaders: [\n { text: 'Target Name', value: 'targetName' },\n { text: 'Packet Name', value: 'packetName' },\n { text: 'Item Name', value: 'itemName' },\n { text: 'Actions', value: 'actions', sortable: false },\n ],\n valueTypes: ['CONVERTED', 'RAW'],\n active: true,\n expand: true,\n fullWidth: true,\n fullHeight: true,\n graph: null,\n editGraph: false,\n editGraphMenu: false,\n editGraphMenuX: 0,\n editGraphMenuY: 0,\n editItem: false,\n itemMenu: false,\n itemMenuX: 0,\n itemMenuY: 0,\n legendMenu: false,\n legendMenuX: 0,\n legendMenuY: 0,\n legendPosition: 'bottom',\n legendPositions: ['top', 'bottom', 'left', 'right'],\n selectedItem: null,\n currentType: null,\n title: '',\n overview: null,\n data: [[]],\n graphMinY: '',\n graphMaxY: '',\n graphStartDateTime: this.startTime,\n graphEndDateTime: null,\n indexes: {},\n items: this.initialItems || [],\n drawInterval: null,\n zoomChart: false,\n zoomOverview: false,\n cable: new Cable(),\n subscription: null,\n needToUpdate: false,\n errorDialog: false,\n errors: [],\n colors: [\n 'blue',\n 'red',\n 'green',\n 'darkorange',\n 'purple',\n 'cornflowerblue',\n 'lime',\n 'gold',\n 'hotpink',\n 'tan',\n 'cyan',\n 'peru',\n 'maroon',\n 'coral',\n 'navy',\n 'teal',\n 'brown',\n 'crimson',\n 'lightblue',\n 'black',\n ],\n }\n },\n computed: {\n calcFullSize: function () {\n return this.fullWidth || this.fullHeight\n },\n editItems: function () {\n if (!this.items) return []\n let itemId = 0\n return this.items.map((item) => {\n itemId += 1\n return { ...item, itemId }\n })\n },\n error: function () {\n if (this.errorDialog && this.errors.length > 0) {\n return JSON.stringify(this.errors, null, 4)\n }\n return null\n },\n },\n created() {\n this.title = `Graph ${this.id}`\n for (const [index, item] of this.items.entries()) {\n this.data.push([]) // initialize the empty data arrays\n this.indexes[this.subscriptionKey(item)] = index + 1\n }\n },\n mounted() {\n // This code allows for temporary pulling in a patched uPlot\n // Also note you need to add 'async' before the mounted method for await\n // const plugin = document.createElement('script')\n // plugin.setAttribute(\n // 'src',\n // 'https://leeoniya.github.io/uPlot/dist/uPlot.iife.min.js'\n // )\n // plugin.async = true\n // document.head.appendChild(plugin)\n // await new Promise(r => setTimeout(r, 500)) // Allow the js to load\n\n // TODO: This is demo / performance code of multiple items with many data points\n // 10 items at 500,000 each renders immediately and uses 180MB in Chrome\n // Refresh still works, chrome is sluggish but once you pause it is very performant\n // 500,000 pts at 1Hz is 138.9hrs .. almost 6 days\n //\n // 10 items at 100,000 each is very performant ... 1,000,000 pts is Qt TlmGrapher default\n // 100,000 pts at 1Hz is 27.8hrs\n //\n // 100,000 takes 40ms, Chrome uses 160MB\n // this.data = []\n // const dataPoints = 100000\n // const items = 10\n // let pts = new Array(dataPoints)\n // let times = new Array(dataPoints)\n // let time = 1589398007\n // let series = [{}]\n // for (let i = 0; i < dataPoints; i++) {\n // times[i] = time\n // pts[i] = i\n // time += 1\n // }\n // this.data.push(times)\n // for (let i = 0; i < items; i++) {\n // this.data.push(pts.map(x => x + i))\n // series.push({\n // label: 'Item' + i,\n // stroke: this.colors[i]\n // })\n // }\n\n const { chartSeries, overviewSeries } = this.items.reduce(\n (seriesObj, item) => {\n const commonProps = {\n spanGaps: true,\n stroke: this.colors.shift(),\n }\n seriesObj.chartSeries.push({\n ...commonProps,\n item: item,\n label: item.itemName,\n value: (self, rawValue) => {\n if (typeof rawValue === 'string' || isNaN(rawValue)) {\n return 'NaN'\n } else {\n return rawValue == null ? '--' : rawValue.toFixed(2)\n }\n },\n })\n seriesObj.overviewSeries.push({\n ...commonProps,\n })\n return seriesObj\n },\n { chartSeries: [], overviewSeries: [] }\n )\n\n let chartOpts = {\n ...this.getSize('chart'),\n ...this.getScales(),\n ...this.getAxes('chart'),\n // series: series, // TODO: Uncomment with the performance code\n series: [\n {\n label: 'Time',\n value: (u, v) =>\n // Convert the unix timestamp into a formatted date / time\n v == null ? '--' : format(toDate(v * 1000), 'yyyy-MM-dd HH:mm:ss'),\n },\n ...chartSeries,\n ],\n cursor: {\n drag: {\n x: true,\n y: false,\n },\n // Sync the cursor across graphs so mouseovers are synced\n sync: {\n key: 'openc3',\n // setSeries links graphs so clicking an item to hide it also hides the other graph item\n // setSeries: true,\n },\n },\n hooks: {\n setScale: [\n (chart, key) => {\n if (key == 'x' && !this.zoomOverview && this.overview) {\n this.zoomChart = true\n let left = Math.round(\n this.overview.valToPos(chart.scales.x.min, 'x')\n )\n let right = Math.round(\n this.overview.valToPos(chart.scales.x.max, 'x')\n )\n this.overview.setSelect({ left, width: right - left })\n this.zoomChart = false\n }\n },\n ],\n ready: [\n (u) => {\n let canvas = u.root.querySelector('.u-over')\n canvas.addEventListener('contextmenu', (e) => {\n e.preventDefault()\n this.itemMenu = false\n this.legendMenu = false\n this.editGraphMenuX = e.clientX\n this.editGraphMenuY = e.clientY\n this.editGraphMenu = true\n })\n // Tell TlmGrapher that you might need to resize since on mouseenter\n // we start showing value popups and the graph can expand\n canvas.addEventListener('mouseenter', (e) => {\n this.$emit('resize')\n })\n canvas.addEventListener('mouseleave', (e) => {\n this.$emit('resize')\n })\n let legend = u.root.querySelector('.u-legend')\n legend.addEventListener('contextmenu', (e) => {\n e.preventDefault()\n this.editGraphMenu = false\n this.legendMenu = false\n this.itemMenuX = e.clientX\n this.itemMenuY = e.clientY\n // Grab the closest series and then figure out which index it is\n let seriesEl = e.target.closest('.u-series')\n let seriesIdx = Array.prototype.slice\n .call(legend.childNodes)\n .indexOf(seriesEl)\n let series = u.series[seriesIdx]\n if (series.item) {\n this.selectedItem = series.item\n this.itemMenu = true\n } else {\n this.itemMenu = false\n this.legendMenuX = e.clientX\n this.legendMenuY = e.clientY\n this.legendMenu = true\n }\n })\n },\n ],\n },\n }\n // console.time('chart')\n this.graph = new uPlot(\n chartOpts,\n this.data,\n document.getElementById(`chart${this.id}`)\n )\n\n const overviewOpts = {\n ...this.getSize('overview'),\n ...this.getScales(),\n ...this.getAxes('overview'),\n // series: series, // TODO: Uncomment with the performance code\n series: [...overviewSeries],\n cursor: {\n y: false,\n points: {\n show: false, // TODO: This isn't working\n },\n drag: {\n setScale: false,\n x: true,\n y: false,\n },\n },\n legend: {\n show: false,\n },\n hooks: {\n setSelect: [\n (chart) => {\n if (!this.zoomChart) {\n this.zoomOverview = true\n let min = chart.posToVal(chart.select.left, 'x')\n let max = chart.posToVal(\n chart.select.left + chart.select.width,\n 'x'\n )\n this.graph.setScale('x', { min, max })\n this.zoomOverview = false\n }\n },\n ],\n },\n }\n this.overview = new uPlot(\n overviewOpts,\n this.data,\n document.getElementById(`overview${this.id}`)\n )\n //console.timeEnd('chart')\n this.moveLegend(this.legendPosition)\n\n // Allow the charts to dynamically resize when the window resizes\n window.addEventListener('resize', this.handleResize)\n\n if (this.state !== 'stop') {\n this.subscribe()\n }\n },\n beforeDestroy: function () {\n if (this.subscription) {\n this.subscription.unsubscribe()\n }\n this.cable.disconnect()\n window.removeEventListener('resize', this.handleResize)\n },\n watch: {\n state: function (newState, oldState) {\n switch (newState) {\n case 'start':\n // Only subscribe if we were previously stopped\n // If we were paused we do nothing ... see the data function\n if (oldState === 'stop') {\n this.subscribe()\n }\n break\n // case 'pause': Nothing to do ... see the data function\n case 'stop':\n this.subscription.unsubscribe()\n this.subscription = null\n break\n }\n },\n data: function (newData, oldData) {\n // Ignore changes to the data while we're paused\n if (this.state === 'pause') {\n return\n }\n this.graph.setData(newData)\n this.overview.setData(newData)\n let max = newData[0][newData[0].length - 1]\n let ptsMin = newData[0][newData[0].length - this.pointsGraphed]\n let min = newData[0][0]\n if (min < max - this.secondsGraphed) {\n min = max - this.secondsGraphed\n }\n if (ptsMin > min) {\n min = ptsMin\n }\n this.graph.setScale('x', { min, max })\n },\n graphMinY: function (newVal, oldVal) {\n let val = parseFloat(newVal)\n if (!isNaN(val)) {\n this.graphMinY = val\n }\n this.setGraphRange()\n },\n graphMaxY: function (newVal, oldVal) {\n let val = parseFloat(newVal)\n if (!isNaN(val)) {\n this.graphMaxY = val\n }\n this.setGraphRange()\n },\n graphStartDateTime: function (val) {\n this.needToUpdate = true\n if (val && typeof val === 'string') {\n this.graphStartDateTime =\n new Date(this.graphStartDateTime).getTime() * 1_000_000\n }\n },\n graphEndDateTime: function (val) {\n this.needToUpdate = true\n if (val && typeof val === 'string') {\n this.graphEndDateTime =\n new Date(this.graphEndDateTime).getTime() * 1_000_000\n }\n },\n },\n methods: {\n moveLegend: function (desired) {\n switch (desired) {\n case 'bottom':\n this.graph.root.classList.remove('side-legend')\n this.graph.root.classList.remove('left-legend')\n this.graph.root.classList.remove('top-legend')\n break\n case 'top':\n this.graph.root.classList.remove('side-legend')\n this.graph.root.classList.remove('left-legend')\n this.graph.root.classList.add('top-legend')\n break\n case 'left':\n this.graph.root.classList.remove('top-legend')\n this.graph.root.classList.add('side-legend')\n this.graph.root.classList.add('left-legend')\n break\n case 'right':\n this.graph.root.classList.remove('top-legend')\n this.graph.root.classList.remove('left-legend')\n this.graph.root.classList.add('side-legend')\n break\n }\n this.legendPosition = desired\n this.resize()\n },\n clearErrors: function () {\n this.errors = []\n },\n editGraphClose: function () {\n this.editGraph = false\n if (this.needToUpdate) {\n this.removeItemsFromSubscription()\n this.addItemsToSubscription()\n this.needToUpdate = false\n }\n this.moveLegend(this.legendPosition)\n },\n handleResize: function () {\n // TODO: Should this method be throttled?\n this.graph.setSize(this.getSize('chart'))\n this.overview.setSize(this.getSize('overview'))\n },\n resize: function () {\n this.graph.setSize(this.getSize('chart'))\n this.overview.setSize(this.getSize('overview'))\n this.$emit('resize', this.id)\n },\n expandAll: function () {\n this.fullWidth = true\n this.fullHeight = true\n this.resize()\n },\n collapseAll: function () {\n this.fullWidth = false\n this.fullHeight = false\n this.resize()\n },\n expandWidth: function () {\n this.fullWidth = true\n this.resize()\n },\n collapseWidth: function () {\n this.fullWidth = false\n this.resize()\n },\n expandHeight: function () {\n this.fullHeight = true\n this.resize()\n },\n collapseHeight: function () {\n this.fullHeight = false\n this.resize()\n },\n minMaxTransition: function () {\n this.expand = !this.expand\n this.$emit('min-max-graph', this.id)\n },\n setGraphRange: function () {\n let pad = 0.1\n if (\n this.graphMinY ||\n this.graphMinY === 0 ||\n this.graphMaxY ||\n this.graphMaxY === 0\n ) {\n pad = 0\n }\n this.graph.scales.y.range = (u, dataMin, dataMax) => {\n let min = dataMin\n if (this.graphMinY || this.graphMinY === 0) {\n min = this.graphMinY\n }\n let max = dataMax\n if (this.graphMaxY || this.graphMaxY === 0) {\n max = this.graphMaxY\n }\n return uPlot.rangeNum(min, max, pad, true)\n }\n },\n subscribe: function (endTime = null) {\n this.cable\n .createSubscription('StreamingChannel', localStorage.scope, {\n received: (data) => this.received(data),\n connected: () => {\n this.addItemsToSubscription(this.items, endTime)\n },\n disconnected: () => {\n this.errors.push({\n type: 'disconnected',\n message: 'OpenC3 backend connection disconnected',\n time: new Date().getTime(),\n })\n },\n rejected: () => {\n this.errors.push({\n type: 'rejected',\n message: 'OpenC3 backend connection rejected',\n time: new Date().getTime(),\n })\n },\n })\n .then((subscription) => {\n this.subscription = subscription\n })\n },\n // throttle(cb, limit) {\n // var wait = false\n // return () => {\n // if (!wait) {\n // requestAnimationFrame(cb)\n // wait = true\n // setTimeout(() => {\n // wait = false\n // }, limit)\n // }\n // }\n // },\n getSize: function (type) {\n const navDrawer = document.getElementById('openc3-nav-drawer')\n const navDrawerWidth = navDrawer.classList.contains(\n 'v-navigation-drawer--open'\n )\n ? navDrawer.clientWidth\n : 0\n\n let legendWidth = 0\n if (this.legendPosition === 'right' || this.legendPosition === 'left') {\n const legend = document.getElementsByClassName('u-legend')[0]\n legendWidth = legend.clientWidth\n }\n const viewWidth =\n Math.max(document.documentElement.clientWidth, window.innerWidth || 0) -\n navDrawerWidth -\n legendWidth\n const viewHeight = Math.max(\n document.documentElement.clientHeight,\n window.innerHeight || 0\n )\n\n const chooser = document.getElementsByClassName('c-chooser')[0]\n let height = 100\n if (type === 'overview') {\n // Hide overview if we're NOT full height\n this.hideOverview = !this.fullHeight\n } else if (chooser) {\n // Height of chart is viewportSize - chooser - overview - fudge factor (primarily padding)\n height = viewHeight - chooser.clientHeight - height - 190\n if (!this.fullHeight) {\n height = height / 2.0 + 10 // 5px padding top and bottom\n }\n }\n let width = viewWidth - 60 // 30px padding left and right\n if (!this.fullWidth) {\n width = width / 2.0 - 10 // 5px padding left and right\n }\n return {\n width: this.width || width,\n height: this.height || height,\n }\n },\n getScales: function () {\n return {\n scales: {\n x: {\n range(u, dataMin, dataMax) {\n if (dataMin == null) return [1566453600, 1566497660]\n return [dataMin, dataMax]\n },\n },\n y: {\n range(u, dataMin, dataMax) {\n if (dataMin == null) return [-100, 100]\n return uPlot.rangeNum(dataMin, dataMax, 0.1, true)\n },\n },\n },\n }\n },\n getAxes: function (type) {\n let strokeColor = 'rgba(0, 0, 0, .1)'\n let axisColor = 'black'\n if (this.$vuetify.theme.dark) {\n strokeColor = 'rgba(255, 255, 255, .1)'\n axisColor = 'white'\n }\n return {\n axes: [\n {\n stroke: axisColor,\n grid: {\n show: true,\n stroke: strokeColor,\n width: 2,\n },\n },\n {\n size: 70, // This size supports values up to 99 million\n stroke: axisColor,\n grid: {\n show: type === 'overview' ? false : true,\n stroke: strokeColor,\n width: 2,\n },\n },\n ],\n }\n },\n openEditItem: function () {\n this.currentType = this.selectedItem.valueType\n this.editItem = true\n },\n closeEditItem: function () {\n this.editItem = false\n // Only change if the type was changed\n if (this.selectedItem.valueType !== this.currentType) {\n this.changeType()\n }\n },\n changeType: function () {\n this.removeItems([this.selectedItem])\n this.selectedItem.valueType = this.currentType\n this.addItems([this.selectedItem])\n },\n addItems: function (itemArray, type = 'CONVERTED') {\n for (const item of itemArray) {\n item.valueType ||= type // set the default type\n this.items.push(item)\n const index = this.data.length\n const color = this.colors.shift()\n this.graph.addSeries(\n {\n spanGaps: true,\n item: item,\n label: item.itemName,\n stroke: color,\n value: (self, rawValue) => {\n if (typeof rawValue === 'string' || isNaN(rawValue)) {\n return 'NaN'\n } else {\n return rawValue === null ? '--' : rawValue.toFixed(2)\n }\n },\n },\n index\n )\n this.overview.addSeries({ spanGaps: true, stroke: color }, index)\n let newData = Array(this.data[0].length)\n this.data.splice(index, 0, newData)\n this.indexes[this.subscriptionKey(item)] = index\n }\n this.addItemsToSubscription(itemArray)\n },\n addItemsToSubscription: function (\n itemArray = this.items,\n endTime = this.graphEndDateTime\n ) {\n if (this.subscription) {\n OpenC3Auth.updateToken(OpenC3Auth.defaultMinValidity).then(() => {\n this.subscription.perform('add', {\n scope: localStorage.scope,\n mode: 'DECOM',\n token: localStorage.openc3Token,\n items: itemArray.map(this.subscriptionKey),\n start_time: this.graphStartDateTime,\n end_time: endTime,\n })\n })\n }\n },\n removeItems: function (itemArray) {\n this.removeItemsFromSubscription(itemArray)\n\n for (const key of itemArray.map(this.subscriptionKey)) {\n const index = this.reorderIndexes(key)\n // Put back the color so it's available for new series\n this.colors.unshift(this.graph.series[index].stroke)\n this.items.splice(index - 1, 1)\n this.data.splice(index, 1)\n this.graph.delSeries(index)\n this.overview.delSeries(index)\n this.graph.setData(this.data)\n this.overview.setData(this.data)\n }\n },\n removeItemsFromSubscription: function (itemArray = this.items) {\n if (this.subscription) {\n this.subscription.perform('remove', {\n scope: localStorage.scope,\n items: itemArray.map(this.subscriptionKey),\n })\n }\n },\n reorderIndexes: function (key) {\n let index = this.indexes[key]\n delete this.indexes[key]\n for (var i in this.indexes) {\n if (this.indexes[i] > index) {\n this.indexes[i] -= 1\n }\n }\n return index\n },\n received: function (json_data) {\n // TODO: Shouldn't get errors but should we handle this every time?\n // if (json_data.error) {\n // console.log(json_data.error)\n // return\n // }\n let data = JSON.parse(json_data)\n for (let i = 0; i < data.length; i++) {\n let time = data[i].time / 1_000_000_000.0 // Time in seconds\n let length = data[0].length\n if (length == 0 || time > data[0][length - 1]) {\n // Nominal case - append new data to end\n for (let j = 0; j < this.data.length; j++) {\n this.data[j].push(null)\n }\n this.set_data_at_index(this.data[0].length - 1, time, data[i])\n } else {\n let index = bs(this.data[0], time, this.bs_comparator)\n if (index >= 0) {\n // Found the slot in the existing data\n this.set_data_at_index(index, time, data[i])\n } else {\n // Insert a new null slot at the ideal index\n let ideal_index = -index - 1\n for (let j = 0; j < this.data.length; j++) {\n this.data[j].splice(ideal_index, 0, null)\n }\n this.set_data_at_index(ideal_index, time, data[i])\n }\n }\n }\n // If we weren't passed a startTime notify grapher of our start\n if (this.startTime === null) {\n this.graphStartDateTime = this.data[0][0] * 1_000_000_000\n this.$emit('started', this.graphStartDateTime)\n }\n },\n bs_comparator: function (element, needle) {\n return element - needle\n },\n set_data_at_index: function (index, time, new_data) {\n this.data[0][index] = time\n for (const [key, value] of Object.entries(new_data)) {\n if (key == 'time') {\n continue\n }\n let key_index = this.indexes[key]\n if (key_index) {\n let array = this.data[key_index]\n // NaN and Infinite values are sent as objects with raw attribute set\n // to 'NaN', '-Infinity', or 'Infinity', just set data to null\n if (value.raw) {\n array[index] = null\n } else if (typeof value === 'string') {\n // Can't graph strings so just set to null\n array[index] = null\n // If it's not already RAW, change the type to RAW\n // NOTE: Some items are RAW strings so they won't ever work\n if (!key.includes('__RAW')) {\n for (let item of this.items) {\n if (this.subscriptionKey(item) === key) {\n this.selectedItem = item\n break\n }\n }\n this.currentType = 'RAW'\n this.changeType()\n }\n } else {\n array[index] = value\n }\n }\n }\n },\n subscriptionKey: function (item) {\n return `TLM__${item.targetName}__${item.packetName}__${item.itemName}__${item.valueType}`\n },\n },\n}\n</script>\n\n<style>\n/* left right stacked legend */\n.uplot.side-legend {\n display: flex;\n width: auto;\n}\n.uplot.side-legend .u-wrap {\n flex: none;\n}\n.uplot.side-legend .u-legend {\n text-align: left;\n margin-left: 0;\n width: 220px;\n}\n.uplot.side-legend .u-legend,\n.uplot.side-legend .u-legend tr,\n.uplot.side-legend .u-legend th,\n.uplot.side-legend .u-legend td {\n display: revert;\n}\n/* left side we need to order the legend before the plot */\n.uplot.left-legend .u-legend {\n order: -1;\n}\n/* top legend */\n.uplot.top-legend {\n display: flex;\n flex-direction: column;\n}\n.uplot.top-legend .u-legend {\n order: -1;\n}\n</style>\n\n<style scoped>\n#chart {\n background-color: var(--v-tertiary-darken2);\n}\n/* TODO: Get this to work with white theme, values would be 0 in white */\n#chart >>> .u-select {\n background-color: rgba(255, 255, 255, 0.07);\n}\n/* This prevents the axis from responding to pointer-events.\n Necessary if we set overview height to 0 which makes it hidden but still present.\n However, we simply don't display the overview with v-show.\n See https://github.com/leeoniya/uPlot/issues/689\n#chart >>> .u-axis {\n pointer-events: none;\n} */\n</style>\n","import mod from \"-!../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Graph.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Graph.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Graph.vue?vue&type=template&id=335d365e&scoped=true&\"\nimport script from \"./Graph.vue?vue&type=script&lang=js&\"\nexport * from \"./Graph.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Graph.vue?vue&type=style&index=0&id=335d365e&prod&lang=css&\"\nimport style1 from \"./Graph.vue?vue&type=style&index=1&id=335d365e&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"335d365e\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"600\"},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }return _vm.cancel.apply(null, arguments)}},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.success.apply(null, arguments)}}},[_c('v-system-bar',[_c('v-spacer'),_c('span',[_vm._v(\"Open Configuration\")]),_c('v-spacer')],1),_c('v-card-text',[_c('div',{staticClass:\"pa-3\"},[_c('v-row',{attrs:{\"dense\":\"\"}},[_c('v-text-field',{attrs:{\"label\":\"search\",\"type\":\"text\",\"data-test\":\"search\",\"prepend-icon\":\"mdi-magnify\",\"clear-icon\":\"mdi-close-circle-outline\",\"clearable\":\"\",\"autofocus\":\"\",\"single-line\":\"\",\"hide-details\":\"\"},model:{value:(_vm.search),callback:function ($$v) {_vm.search=$$v},expression:\"search\"}})],1),_c('v-data-table',{attrs:{\"show-select\":\"\",\"single-select\":\"\",\"item-key\":\"configId\",\"search\":_vm.search,\"headers\":_vm.headers,\"items\":_vm.configs,\"items-per-page\":5,\"footer-props\":{ 'items-per-page-options': [5] }},on:{\"item-selected\":_vm.itemSelected,\"click:row\":function (item, slot) { return slot.select(item); }},scopedSlots:_vm._u([{key:\"item.actions\",fn:function(ref){\nvar item = ref.item;\nreturn [_c('v-btn',{staticClass:\"mt-1\",attrs:{\"data-test\":\"item-delete\",\"icon\":\"\"},on:{\"click\":function($event){return _vm.deleteConfig(item)}}},[_c('v-icon',[_vm._v(\"mdi-delete\")])],1)]}}])}),_c('v-row',{attrs:{\"dense\":\"\"}},[_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.error),expression:\"error\"}],staticClass:\"ma-2 red--text\",domProps:{\"textContent\":_vm._s(_vm.error)}})]),_c('v-row',[_c('v-btn',{attrs:{\"type\":\"submit\",\"color\":\"success\",\"data-test\":\"open-config-submit-btn\",\"disabled\":!!_vm.error},on:{\"click\":function($event){$event.preventDefault();return _vm.success.apply(null, arguments)}}},[_vm._v(\" Ok \")]),_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"primary\",\"data-test\":\"open-config-cancel-btn\"},on:{\"click\":_vm.cancel}},[_vm._v(\" Cancel \")])],1)],1)])],1)])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n-->\n\n<template>\n <v-dialog v-model=\"show\" @keydown.esc=\"cancel\" width=\"600\">\n <v-card>\n <form v-on:submit.prevent=\"success\">\n <v-system-bar>\n <v-spacer />\n <span>Open Configuration</span>\n <v-spacer />\n </v-system-bar>\n\n <v-card-text>\n <div class=\"pa-3\">\n <v-row dense>\n <v-text-field\n label=\"search\"\n v-model=\"search\"\n type=\"text\"\n data-test=\"search\"\n prepend-icon=\"mdi-magnify\"\n clear-icon=\"mdi-close-circle-outline\"\n clearable\n autofocus\n single-line\n hide-details\n />\n </v-row>\n <v-data-table\n show-select\n single-select\n item-key=\"configId\"\n :search=\"search\"\n :headers=\"headers\"\n :items=\"configs\"\n :items-per-page=\"5\"\n :footer-props=\"{ 'items-per-page-options': [5] }\"\n @item-selected=\"itemSelected\"\n @click:row=\"(item, slot) => slot.select(item)\"\n >\n <template v-slot:item.actions=\"{ item }\">\n <v-btn\n class=\"mt-1\"\n data-test=\"item-delete\"\n icon\n @click=\"deleteConfig(item)\"\n >\n <v-icon>mdi-delete</v-icon>\n </v-btn>\n </template>\n </v-data-table>\n <v-row dense>\n <span class=\"ma-2 red--text\" v-show=\"error\" v-text=\"error\" />\n </v-row>\n <v-row>\n <v-btn\n @click.prevent=\"success\"\n type=\"submit\"\n color=\"success\"\n data-test=\"open-config-submit-btn\"\n :disabled=\"!!error\"\n >\n Ok\n </v-btn>\n <v-spacer />\n <v-btn\n @click=\"cancel\"\n color=\"primary\"\n data-test=\"open-config-cancel-btn\"\n >\n Cancel\n </v-btn>\n </v-row>\n </div>\n </v-card-text>\n </form>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { OpenC3Api } from '../services/openc3-api.js'\n\nexport default {\n props: {\n tool: String,\n value: Boolean, // value is the default prop when using v-model\n },\n data() {\n return {\n configs: [],\n headers: [\n {\n text: 'Configuration',\n value: 'config',\n },\n {\n text: 'Actions',\n value: 'actions',\n align: 'end',\n sortable: false,\n },\n ],\n search: null,\n selectedItem: null,\n }\n },\n computed: {\n error: function () {\n if (this.selectedItem === '' || this.selectedItem === null) {\n return 'Must select a config'\n }\n return null\n },\n show: {\n get() {\n return this.value\n },\n set(value) {\n this.$emit('input', value) // input is the default event when using v-model\n },\n },\n },\n mounted() {\n let configId = -1\n new OpenC3Api()\n .list_configs(this.tool)\n .then((response) => {\n this.configs = response.map((config) => {\n configId += 1\n return { configId, config }\n })\n })\n .catch((error) => {\n this.$emit('warning', `Failed to connect to OpenC3. ${error}`)\n })\n },\n methods: {\n itemSelected: function (item) {\n if (item.value) {\n this.selectedItem = item.item\n } else {\n this.selectedItem = null\n }\n },\n success: function () {\n this.$emit('success', this.selectedItem.config)\n this.show = false\n this.search = null\n this.selectedItem = null\n },\n cancel: function () {\n this.show = false\n this.search = null\n this.selectedItem = null\n },\n deleteConfig: function (item) {\n this.$dialog\n .confirm(`Are you sure you want to delete: ${item.config}`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n if (this.selectedItem.config === item.config) {\n this.selectedItem = null\n }\n this.configs.splice(this.configs.indexOf(item), 1)\n new OpenC3Api().delete_config(this.tool, item.config)\n })\n .catch((error) => {\n if (error) {\n this.$emit(\n 'warning',\n `Failed to delete config ${item.config} Error: ${error}`\n )\n }\n })\n },\n },\n}\n</script>\n\n<style scoped></style>\n","import mod from \"-!../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./OpenConfigDialog.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./OpenConfigDialog.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./OpenConfigDialog.vue?vue&type=template&id=db42aa32&scoped=true&\"\nimport script from \"./OpenConfigDialog.vue?vue&type=script&lang=js&\"\nexport * from \"./OpenConfigDialog.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"db42aa32\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"600\"},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }return _vm.cancel.apply(null, arguments)}},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.success.apply(null, arguments)}}},[_c('v-system-bar',[_c('v-spacer'),_c('span',[_vm._v(\"Save Configuration\")]),_c('v-spacer')],1),_c('v-card-text',[_c('div',{staticClass:\"pa-3\"},[_c('v-row',{attrs:{\"dense\":\"\"}},[_c('v-text-field',{attrs:{\"label\":\"search\",\"type\":\"text\",\"data-test\":\"search\",\"prepend-icon\":\"mdi-magnify\",\"clear-icon\":\"mdi-close-circle-outline\",\"clearable\":\"\",\"single-line\":\"\",\"hide-details\":\"\"},model:{value:(_vm.search),callback:function ($$v) {_vm.search=$$v},expression:\"search\"}})],1),_c('v-data-table',{attrs:{\"show-select\":\"\",\"single-select\":\"\",\"item-key\":\"configId\",\"search\":_vm.search,\"headers\":_vm.headers,\"items\":_vm.configs,\"items-per-page\":5,\"footer-props\":{ 'items-per-page-options': [5] }},on:{\"item-selected\":_vm.itemSelected,\"click:row\":function (item, slot) { return slot.select(item); }},scopedSlots:_vm._u([{key:\"item.actions\",fn:function(ref){\nvar item = ref.item;\nreturn [_c('v-btn',{staticClass:\"mt-1\",attrs:{\"icon\":\"\",\"data-test\":\"item-delete\"},on:{\"click\":function($event){return _vm.deleteConfig(item)}}},[_c('v-icon',[_vm._v(\"mdi-delete\")])],1)]}}])}),_c('v-row',{attrs:{\"dense\":\"\"}},[_c('v-text-field',{attrs:{\"hide-details\":\"\",\"autofocus\":\"\",\"disabled\":!!_vm.selectedItem,\"label\":\"Configuration Name\",\"data-test\":\"name-input-save-config-dialog\"},model:{value:(_vm.configName),callback:function ($$v) {_vm.configName=$$v},expression:\"configName\"}})],1),_c('v-row',{attrs:{\"dense\":\"\"}},[_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.error),expression:\"error\"}],staticClass:\"ma-2 red--text\",domProps:{\"textContent\":_vm._s(_vm.error)}})]),_c('v-row',[_c('v-spacer'),_c('v-btn',{staticClass:\"mx-2\",attrs:{\"outlined\":\"\"},on:{\"click\":_vm.cancel}},[_vm._v(\" Cancel \")]),_c('v-btn',{staticClass:\"mx-2\",attrs:{\"type\":\"submit\",\"color\":\"primary\",\"data-test\":\"save-config-submit-btn\",\"disabled\":!!_vm.error},on:{\"click\":function($event){$event.preventDefault();return _vm.success.apply(null, arguments)}}},[_vm._v(\" Ok \")])],1)],1)])],1)])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n-->\n\n<template>\n <v-dialog v-model=\"show\" @keydown.esc=\"cancel\" width=\"600\">\n <v-card>\n <form v-on:submit.prevent=\"success\">\n <v-system-bar>\n <v-spacer />\n <span>Save Configuration</span>\n <v-spacer />\n </v-system-bar>\n\n <v-card-text>\n <div class=\"pa-3\">\n <v-row dense>\n <v-text-field\n label=\"search\"\n v-model=\"search\"\n type=\"text\"\n data-test=\"search\"\n prepend-icon=\"mdi-magnify\"\n clear-icon=\"mdi-close-circle-outline\"\n clearable\n single-line\n hide-details\n />\n </v-row>\n <v-data-table\n show-select\n single-select\n item-key=\"configId\"\n :search=\"search\"\n :headers=\"headers\"\n :items=\"configs\"\n :items-per-page=\"5\"\n :footer-props=\"{ 'items-per-page-options': [5] }\"\n @item-selected=\"itemSelected\"\n @click:row=\"(item, slot) => slot.select(item)\"\n >\n <template v-slot:item.actions=\"{ item }\">\n <v-btn\n icon\n class=\"mt-1\"\n data-test=\"item-delete\"\n @click=\"deleteConfig(item)\"\n >\n <v-icon>mdi-delete</v-icon>\n </v-btn>\n </template>\n </v-data-table>\n <v-row dense>\n <v-text-field\n v-model=\"configName\"\n hide-details\n autofocus\n :disabled=\"!!selectedItem\"\n label=\"Configuration Name\"\n data-test=\"name-input-save-config-dialog\"\n />\n </v-row>\n <v-row dense>\n <span class=\"ma-2 red--text\" v-show=\"error\" v-text=\"error\" />\n </v-row>\n <v-row>\n <v-spacer />\n <v-btn outlined class=\"mx-2\" @click=\"cancel\"> Cancel </v-btn>\n <v-btn\n @click.prevent=\"success\"\n type=\"submit\"\n color=\"primary\"\n class=\"mx-2\"\n data-test=\"save-config-submit-btn\"\n :disabled=\"!!error\"\n >\n Ok\n </v-btn>\n </v-row>\n </div>\n </v-card-text>\n </form>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { OpenC3Api } from '../services/openc3-api.js'\n\nexport default {\n props: {\n tool: String,\n value: Boolean, // value is the default prop when using v-model\n },\n data() {\n return {\n configName: '',\n configs: [],\n headers: [\n {\n text: 'Configuration',\n value: 'config',\n },\n {\n text: 'Actions',\n value: 'actions',\n align: 'end',\n sortable: false,\n },\n ],\n search: null,\n selectedItem: null,\n }\n },\n computed: {\n error: function () {\n if (this.configName === '') {\n return 'Config must have a name'\n }\n return null\n },\n show: {\n get() {\n return this.value\n },\n set(value) {\n this.$emit('input', value) // input is the default event when using v-model\n },\n },\n },\n mounted() {\n let configId = -1\n new OpenC3Api()\n .list_configs(this.tool)\n .then((response) => {\n this.configs = response.map((config) => {\n configId += 1\n return { configId, config }\n })\n })\n .catch((error) => {\n this.$emit('warning', `Failed to connect to OpenC3. ${error}`)\n })\n },\n methods: {\n itemSelected: function (item) {\n if (item.value) {\n this.selectedItem = item.item\n this.configName = item.item.config\n } else {\n this.selectedItem = null\n this.configName = ''\n }\n },\n success: function () {\n this.$emit('success', this.configName)\n this.show = false\n this.search = null\n this.selectedItem = null\n this.configName = ''\n },\n cancel: function () {\n this.show = false\n this.search = null\n this.selectedItem = null\n this.configName = ''\n },\n deleteConfig: function (item) {\n this.$dialog\n .confirm(`Are you sure you want to delete: ${item.config}`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n if (this.configName === item.config) {\n this.selectedItem = null\n this.configName = ''\n }\n this.configs.splice(this.configs.indexOf(item.config), 1)\n new OpenC3Api().delete_config(this.tool, item.config)\n })\n .catch((error) => {\n if (error) {\n this.$emit(\n 'warning',\n `Failed to delete config ${item.config} Error: ${error}`\n )\n }\n })\n },\n },\n}\n</script>\n","import mod from \"-!../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SaveConfigDialog.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SaveConfigDialog.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SaveConfigDialog.vue?vue&type=template&id=d7576030&\"\nimport script from \"./SaveConfigDialog.vue?vue&type=script&lang=js&\"\nexport * from \"./SaveConfigDialog.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-container',{staticClass:\"c-chooser px-0\"},[_c('v-row',[_c('v-col',{attrs:{\"cols\":_vm.colSize,\"data-test\":\"select-target\"}},[_c('v-autocomplete',{attrs:{\"label\":\"Select Target\",\"hide-details\":\"\",\"dense\":\"\",\"items\":_vm.targetNames,\"item-text\":\"label\",\"item-value\":\"value\"},on:{\"change\":_vm.targetNameChanged},model:{value:(_vm.selectedTargetName),callback:function ($$v) {_vm.selectedTargetName=$$v},expression:\"selectedTargetName\"}})],1),_c('v-col',{attrs:{\"cols\":_vm.colSize,\"data-test\":\"select-packet\"}},[_c('v-autocomplete',{attrs:{\"label\":\"Select Packet\",\"hide-details\":\"\",\"dense\":\"\",\"disabled\":_vm.packetsDisabled || _vm.buttonDisabled,\"items\":_vm.packetNames,\"item-text\":\"label\",\"item-value\":\"value\"},on:{\"change\":_vm.packetNameChanged},model:{value:(_vm.selectedPacketName),callback:function ($$v) {_vm.selectedPacketName=$$v},expression:\"selectedPacketName\"}})],1),(_vm.chooseItem && !_vm.buttonDisabled)?_c('v-col',{attrs:{\"cols\":_vm.colSize,\"data-test\":\"select-item\"}},[_c('v-autocomplete',{attrs:{\"label\":\"Select Item\",\"hide-details\":\"\",\"dense\":\"\",\"disabled\":_vm.itemsDisabled || _vm.buttonDisabled,\"items\":_vm.itemNames,\"item-text\":\"label\",\"item-value\":\"value\"},on:{\"change\":function($event){return _vm.itemNameChanged($event)}},model:{value:(_vm.selectedItemName),callback:function ($$v) {_vm.selectedItemName=$$v},expression:\"selectedItemName\"}})],1):_vm._e(),(_vm.buttonText)?_c('v-col',{attrs:{\"cols\":_vm.colSize}},[_c('v-btn',{attrs:{\"disabled\":_vm.buttonDisabled,\"block\":\"\",\"color\":\"primary\",\"data-test\":\"select-send\"},on:{\"click\":_vm.buttonPressed}},[_vm._v(\" \"+_vm._s(_vm.actualButtonText)+\" \")])],1):_vm._e()],1),_c('v-row',{attrs:{\"no-gutters\":\"\"}},[_c('v-col',{attrs:{\"cols\":_vm.colSize}},[_vm._v(\"Description: \"+_vm._s(_vm.description))])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n-->\n\n<template>\n <v-container class=\"c-chooser px-0\">\n <v-row>\n <v-col :cols=\"colSize\" data-test=\"select-target\">\n <v-autocomplete\n label=\"Select Target\"\n hide-details\n dense\n @change=\"targetNameChanged\"\n :items=\"targetNames\"\n item-text=\"label\"\n item-value=\"value\"\n v-model=\"selectedTargetName\"\n />\n </v-col>\n <v-col :cols=\"colSize\" data-test=\"select-packet\">\n <v-autocomplete\n label=\"Select Packet\"\n hide-details\n dense\n @change=\"packetNameChanged\"\n :disabled=\"packetsDisabled || buttonDisabled\"\n :items=\"packetNames\"\n item-text=\"label\"\n item-value=\"value\"\n v-model=\"selectedPacketName\"\n />\n </v-col>\n <v-col\n v-if=\"chooseItem && !buttonDisabled\"\n :cols=\"colSize\"\n data-test=\"select-item\"\n >\n <v-autocomplete\n label=\"Select Item\"\n hide-details\n dense\n @change=\"itemNameChanged($event)\"\n :disabled=\"itemsDisabled || buttonDisabled\"\n :items=\"itemNames\"\n item-text=\"label\"\n item-value=\"value\"\n v-model=\"selectedItemName\"\n />\n </v-col>\n <v-col v-if=\"buttonText\" :cols=\"colSize\">\n <v-btn\n :disabled=\"buttonDisabled\"\n block\n color=\"primary\"\n data-test=\"select-send\"\n @click=\"buttonPressed\"\n >\n {{ actualButtonText }}\n </v-btn>\n </v-col>\n </v-row>\n <v-row no-gutters>\n <v-col :cols=\"colSize\">Description: {{ description }}</v-col>\n </v-row>\n </v-container>\n</template>\n\n<script>\nimport { OpenC3Api } from '../services/openc3-api'\nexport default {\n props: {\n allowAll: {\n type: Boolean,\n default: false,\n },\n buttonText: {\n type: String,\n default: null,\n },\n chooseItem: {\n type: Boolean,\n default: false,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n initialTargetName: {\n type: String,\n default: '',\n },\n initialPacketName: {\n type: String,\n default: '',\n },\n initialItemName: {\n type: String,\n default: '',\n },\n mode: {\n type: String,\n default: 'tlm',\n // TODO: add validators throughout\n validator: (propValue) => {\n return ['cmd', 'tlm'].includes(propValue)\n },\n },\n reduced: {\n type: String,\n default: 'DECOM',\n validator: (propValue) => {\n return [\n 'REDUCED_DAY',\n 'REDUCED_HOUR',\n 'REDUCED_MINUTE',\n 'DECOM',\n ].includes(propValue)\n },\n },\n unknown: {\n type: Boolean,\n default: false,\n },\n vertical: {\n type: Boolean,\n default: false,\n },\n },\n data() {\n return {\n targetNames: [],\n packetNames: [],\n itemNames: [],\n selectedTargetName: this.initialTargetName?.toUpperCase(),\n selectedPacketName: this.initialPacketName?.toUpperCase(),\n selectedItemName: this.initialItemName?.toUpperCase(),\n description: '',\n internalDisabled: false,\n packetsDisabled: false,\n itemsDisabled: false,\n api: null,\n ALL: {\n label: '[ ALL ]',\n value: 'ALL',\n description: 'ALL',\n }, // Constant to indicate all packets or items\n UNKNOWN: {\n label: '[ UNKNOWN ]',\n value: 'UNKNOWN',\n description: 'UNKNOWN',\n },\n }\n },\n created() {\n this.internalDisabled = true\n this.api = new OpenC3Api()\n this.api.get_target_list().then((result) => {\n this.targetNames = result.map((target) => {\n return { label: target, value: target }\n })\n if (!this.selectedTargetName) {\n this.selectedTargetName = this.targetNames[0].value\n this.targetNameChanged(this.selectedTargetName)\n }\n this.updatePackets()\n if (this.unknown) {\n this.targetNames.push(this.UNKNOWN)\n }\n })\n },\n computed: {\n actualButtonText: function () {\n if (this.selectedPacketName === 'ALL') {\n return 'Add Target'\n }\n if (this.selectedItemName === 'ALL') {\n return 'Add Packet'\n }\n return this.buttonText\n },\n buttonDisabled: function () {\n return this.disabled || this.internalDisabled\n },\n targetChooserStyle: function () {\n if (this.chooseItem || this.buttonText) {\n return { width: '25%', float: 'left', 'margin-right': '5px' }\n } else {\n return { width: '49%', float: 'left' }\n }\n },\n packetChooserStyle: function () {\n if (this.chooseItem || this.buttonText) {\n return { width: '25%', float: 'left', 'margin-right': '5px' }\n } else {\n return { width: '50%', float: 'right' }\n }\n },\n colSize: function () {\n return this.vertical ? 12 : false\n },\n },\n watch: {\n mode: function (newVal, oldVal) {\n this.updatePackets()\n this.itemNames = []\n },\n reduced: function (newVal, oldVal) {\n this.updateItems()\n },\n },\n methods: {\n updatePackets: function () {\n if (this.selectedTargetName === 'UNKNOWN') {\n this.packetNames = [this.UNKNOWN]\n this.selectedPacketName = this.packetNames[0].value\n this.packetNameChanged(this.UNKNOWN.value)\n this.description = 'UNKNOWN'\n return\n }\n this.internalDisabled = true\n const cmd =\n this.mode === 'tlm'\n ? 'get_all_telemetry_names'\n : 'get_all_command_names'\n this.api[cmd](this.selectedTargetName).then((names) => {\n this.packetNames = names.map((name) => {\n return {\n label: name,\n value: name,\n }\n })\n if (this.allowAll) {\n this.packetNames.unshift(this.ALL)\n }\n if (!this.selectedPacketName) {\n this.selectedPacketName = this.packetNames[0].value\n }\n this.packetNameChanged(this.selectedPacketName)\n const item = this.packetNames.find((packet) => {\n return packet.value === this.selectedPacketName\n })\n if (this.chooseItem) {\n this.updateItems()\n }\n this.internalDisabled = false\n })\n },\n\n updateItems: function () {\n if (this.selectedPacketName === 'ALL') {\n return\n }\n this.internalDisabled = true\n const cmd = this.mode === 'tlm' ? 'get_telemetry' : 'get_command'\n this.api[cmd](this.selectedTargetName, this.selectedPacketName).then(\n (packet) => {\n this.itemNames = packet.items\n .map((item) => {\n if (this.reduced === 'DECOM') {\n return [\n {\n label: item.name,\n value: item.name,\n description: item.description,\n },\n ]\n } else {\n return this.makeReducedItems(item)\n }\n })\n .reduce((result, item) => {\n return result.concat(item)\n }, [])\n if (this.allowAll) {\n this.itemNames.unshift(this.ALL)\n }\n if (!this.selectedItemName) {\n this.selectedItemName = this.itemNames[0].value\n }\n this.description = this.itemNames[0].description\n this.internalDisabled = false\n this.$emit('on-set', {\n targetName: this.selectedTargetName,\n packetName: this.selectedPacketName,\n itemName: this.selectedItemName,\n reduced: this.reduced,\n })\n }\n )\n },\n\n makeReducedItems: function (item) {\n const reducedOptions = !item.array_size && !item.states\n if (reducedOptions && ['UINT', 'INT', 'FLOAT'].includes(item.data_type)) {\n return ['MIN', 'MAX', 'AVG', 'STDDEV'].map((ext) => {\n return {\n label: `${item.name}_${ext}`,\n value: `${item.name}_${ext}`,\n description: `${ext} ${item.description}`,\n }\n })\n }\n return []\n },\n\n targetNameChanged: function (value) {\n this.selectedTargetName = value\n this.selectedPacketName = ''\n this.selectedItemName = ''\n this.updatePackets()\n },\n\n packetNameChanged: function (value) {\n if (value === 'ALL') {\n this.itemsDisabled = true\n this.internalDisabled = false\n } else {\n this.itemsDisabled = false\n const packet = this.packetNames.find((packet) => {\n return value === packet.value\n })\n this.selectedPacketName = packet.value\n const cmd = this.mode === 'tlm' ? 'get_telemetry' : 'get_command'\n this.api[cmd](this.selectedTargetName, this.selectedPacketName).then(\n (packet) => {\n this.description = packet.description\n }\n )\n }\n if (this.chooseItem) {\n this.selectedItemName = ''\n this.updateItems()\n } else {\n this.$emit('on-set', {\n targetName: this.selectedTargetName,\n packetName: this.selectedPacketName,\n reduced: this.reduced,\n })\n }\n },\n\n itemNameChanged: function (value) {\n const item = this.itemNames.find((item) => {\n return value === item.value\n })\n this.selectedItemName = item.value\n this.description = item.description\n this.$emit('on-set', {\n targetName: this.selectedTargetName,\n packetName: this.selectedPacketName,\n itemName: this.selectedItemName,\n reduced: this.reduced,\n })\n },\n\n buttonPressed: function () {\n if (this.selectedPacketName === 'ALL') {\n this.allTargetPacketItems()\n } else if (this.selectedItemName === 'ALL') {\n this.allPacketItems()\n } else if (this.chooseItem) {\n this.$emit('click', {\n targetName: this.selectedTargetName,\n packetName: this.selectedPacketName,\n itemName: this.selectedItemName,\n reduced: this.reduced,\n })\n } else {\n this.$emit('click', {\n targetName: this.selectedTargetName,\n packetName: this.selectedPacketName,\n reduced: this.reduced,\n })\n }\n },\n\n allTargetPacketItems: function () {\n this.packetNames.forEach((packetName) => {\n if (packetName === this.ALL) return\n const cmd = this.mode === 'tlm' ? 'get_telemetry' : 'get_command'\n this.api[cmd](this.selectedTargetName, packetName.value).then(\n (packet) => {\n packet.items.forEach((item) => {\n this.$emit('click', {\n targetName: this.selectedTargetName,\n packetName: packetName.value,\n itemName: item['name'],\n reduced: this.reduced,\n })\n })\n }\n )\n })\n },\n\n allPacketItems: function () {\n this.itemNames.forEach((item) => {\n if (item === this.ALL) return\n this.$emit('click', {\n targetName: this.selectedTargetName,\n packetName: this.selectedPacketName,\n itemName: item.value,\n reduced: this.reduced,\n })\n })\n },\n },\n}\n</script>\n","import mod from \"-!../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./TargetPacketItemChooser.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./TargetPacketItemChooser.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TargetPacketItemChooser.vue?vue&type=template&id=08088b8d&\"\nimport script from \"./TargetPacketItemChooser.vue?vue&type=script&lang=js&\"\nexport * from \"./TargetPacketItemChooser.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('mounting-portal',{attrs:{\"mount-to\":\"#openc3-menu\",\"append\":\"\"}},[_c('div',{staticClass:\"v-toolbar__content\"},[_vm._l((_vm.menus),function(menu,i){return _c('v-menu',{key:i,attrs:{\"offset-y\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('v-btn',_vm._g(_vm._b({staticClass:\"mx-1\",attrs:{\"outlined\":\"\",\"data-test\":_vm.formatDT((_vm.title + \" \" + (menu.label)))}},'v-btn',attrs,false),on),[_c('span',{domProps:{\"textContent\":_vm._s(menu.label)}}),_c('v-icon',{attrs:{\"right\":\"\"}},[_vm._v(\" mdi-menu-down \")])],1)]}}],null,true)},[_c('v-list',[_c('v-radio-group',{staticClass:\"ma-0 pa-0\",attrs:{\"value\":menu.radioGroup,\"hide-details\":\"\",\"dense\":\"\"}},[_vm._l((menu.items),function(option,j){return [(option.divider)?_c('v-divider'):_c('v-list-item',{key:j,attrs:{\"disabled\":option.disabled,\"data-test\":_vm.formatDT((_vm.title + \" \" + (menu.label) + \" \" + (option.label)))},on:{\"click\":option.command}},[(option.radio)?_c('v-list-item-action',[_c('v-radio',{attrs:{\"color\":\"secondary\",\"label\":option.label,\"value\":option.label}})],1):_vm._e(),(option.checkbox)?_c('v-list-item-action',[_c('v-checkbox',{attrs:{\"color\":\"secondary\",\"label\":option.label,\"value\":option.label},model:{value:(_vm.checked),callback:function ($$v) {_vm.checked=$$v},expression:\"checked\"}})],1):_vm._e(),(option.icon)?_c('v-list-item-icon',[_c('v-icon',{attrs:{\"disabled\":option.disabled}},[_vm._v(_vm._s(option.icon))])],1):_vm._e(),(!option.radio && !option.checkbox)?_c('v-list-item-title',{style:('cursor: pointer;' + (option.disabled ? 'opacity: 0.2' : ''))},[_vm._v(_vm._s(option.label))]):_vm._e()],1)]})],2)],1)],1)}),_c('v-spacer'),_c('v-toolbar-title',[_vm._v(_vm._s(_vm.title))]),_c('v-spacer')],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n-->\n\n<template>\n <mounting-portal mount-to=\"#openc3-menu\" append>\n <div class=\"v-toolbar__content\">\n <v-menu offset-y v-for=\"(menu, i) in menus\" :key=\"i\">\n <template v-slot:activator=\"{ on, attrs }\">\n <v-btn\n outlined\n v-bind=\"attrs\"\n v-on=\"on\"\n class=\"mx-1\"\n :data-test=\"formatDT(`${title} ${menu.label}`)\"\n >\n <span v-text=\"menu.label\" />\n <v-icon right> mdi-menu-down </v-icon>\n </v-btn>\n </template>\n <v-list>\n <!-- The radio-group is necessary in case the application wants radio buttons -->\n <v-radio-group\n :value=\"menu.radioGroup\"\n hide-details\n dense\n class=\"ma-0 pa-0\"\n >\n <template v-for=\"(option, j) in menu.items\">\n <v-divider v-if=\"option.divider\" />\n <v-list-item\n v-else\n @click=\"option.command\"\n :disabled=\"option.disabled\"\n :data-test=\"formatDT(`${title} ${menu.label} ${option.label}`)\"\n :key=\"j\"\n >\n <v-list-item-action v-if=\"option.radio\">\n <v-radio\n color=\"secondary\"\n :label=\"option.label\"\n :value=\"option.label\"\n />\n </v-list-item-action>\n <v-list-item-action v-if=\"option.checkbox\">\n <v-checkbox\n v-model=\"checked\"\n color=\"secondary\"\n :label=\"option.label\"\n :value=\"option.label\"\n />\n </v-list-item-action>\n <v-list-item-icon v-if=\"option.icon\">\n <v-icon :disabled=\"option.disabled\">{{ option.icon }}</v-icon>\n </v-list-item-icon>\n <v-list-item-title\n v-if=\"!option.radio && !option.checkbox\"\n :style=\"\n 'cursor: pointer;' + (option.disabled ? 'opacity: 0.2' : '')\n \"\n >{{ option.label }}</v-list-item-title\n >\n </v-list-item>\n </template>\n </v-radio-group>\n </v-list>\n </v-menu>\n <v-spacer />\n <v-toolbar-title>{{ title }}</v-toolbar-title>\n <v-spacer />\n </div>\n </mounting-portal>\n</template>\n\n<script>\nexport default {\n props: {\n menus: {\n type: Array,\n default: function () {\n return []\n },\n },\n title: {\n type: String,\n default: '',\n },\n },\n methods: {\n // Convert the string to a standard data-test format\n formatDT: function (string) {\n return string.replaceAll(' ', '-').toLowerCase()\n },\n },\n}\n</script>\n\n<style scoped>\n.v-list >>> .v-label {\n margin-left: 5px;\n}\n.v-list-item__icon {\n /* For some reason the default margin-right is huge */\n margin-right: 15px !important;\n}\n.v-list-item__title {\n color: white;\n}\n</style>\n","import mod from \"-!../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./TopBar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./TopBar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TopBar.vue?vue&type=template&id=3237297b&scoped=true&\"\nimport script from \"./TopBar.vue?vue&type=script&lang=js&\"\nexport * from \"./TopBar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TopBar.vue?vue&type=style&index=0&id=3237297b&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3237297b\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"600\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-system-bar',[_c('v-spacer'),_c('span',[_vm._v(\"TlmGrapher Settings\")]),_c('v-spacer')],1),_c('v-card',{staticClass:\"pa-3\"},[_c('v-card-text',[_vm._l((_vm.settings),function(item){return _c('div',{key:item.title},[_c('v-row',{staticClass:\"my-5\"},[_c('v-text-field',{attrs:{\"hide-details\":\"auto\",\"type\":\"number\",\"rules\":item.rules,\"label\":item.title},model:{value:(item.value),callback:function ($$v) {_vm.$set(item, \"value\", _vm._n($$v))},expression:\"item.value\"}})],1)],1)}),_c('v-row',[_c('span',{staticClass:\"red--text\"},[_vm._v(\" Increasing these values may cause issues \")])])],2)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/*\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n*/\n\nimport axios from './axios.js'\n\nconst request = async function (\n method,\n url,\n { data, params = {}, headers, noAuth = false, noScope = false } = {}\n) {\n if (!noAuth) {\n try {\n await OpenC3Auth.updateToken(OpenC3Auth.defaultMinValidity)\n } catch (error) {\n OpenC3Auth.login()\n }\n headers['Authorization'] = localStorage.openc3Token\n }\n if (!noScope && !params['scope']) {\n params['scope'] = localStorage.scope\n }\n return axios({\n method,\n url,\n data,\n params,\n headers,\n })\n}\n\nconst acceptOnlyDefaultHeaders = {\n Accept: 'application/json',\n}\n\nconst fullDefaultHeaders = {\n ...acceptOnlyDefaultHeaders,\n 'Content-Type': 'application/json',\n}\n\nexport default {\n get: function (\n path,\n { params, headers = acceptOnlyDefaultHeaders, noScope, noAuth } = {}\n ) {\n return request('get', path, { params, headers, noScope, noAuth })\n },\n\n put: function (\n path,\n { data, params, headers = fullDefaultHeaders, noScope, noAuth } = {}\n ) {\n return request('put', path, { data, params, headers, noScope, noAuth })\n },\n\n post: function (\n path,\n { data, params, headers = fullDefaultHeaders, noScope, noAuth } = {}\n ) {\n return request('post', path, { data, params, headers, noScope, noAuth })\n },\n\n delete: function (\n path,\n { params, headers = acceptOnlyDefaultHeaders, noScope, noAuth } = {}\n ) {\n return request('delete', path, { params, headers, noScope, noAuth })\n },\n}\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n-->\n\n<template>\n <v-dialog v-model=\"show\" width=\"600\">\n <v-system-bar>\n <v-spacer />\n <span>TlmGrapher Settings</span>\n <v-spacer />\n </v-system-bar>\n <v-card class=\"pa-3\">\n <v-card-text>\n <div v-for=\"item in settings\" :key=\"item.title\">\n <v-row class=\"my-5\">\n <v-text-field\n hide-details=\"auto\"\n type=\"number\"\n :rules=\"item.rules\"\n :label=\"item.title\"\n v-model.number=\"item.value\"\n />\n </v-row>\n </div>\n <v-row>\n <span class=\"red--text\">\n Increasing these values may cause issues\n </span>\n </v-row>\n </v-card-text>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport Api from '@openc3/tool-common/src/services/api'\n\nexport default {\n props: {\n settings: {\n type: Object,\n required: true,\n },\n value: Boolean, // value is the default prop when using v-model\n },\n data() {\n return {}\n },\n computed: {\n show: {\n get() {\n return this.value\n },\n set(value) {\n this.$emit('input', value) // input is the default event when using v-model\n },\n },\n },\n methods: {},\n}\n</script>\n","import mod from \"-!../../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SettingsDialog.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SettingsDialog.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SettingsDialog.vue?vue&type=template&id=1c4f40a8&\"\nimport script from \"./SettingsDialog.vue?vue&type=script&lang=js&\"\nexport * from \"./SettingsDialog.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n-->\n\n<template>\n <div>\n <top-bar :menus=\"menus\" :title=\"title\" />\n <div>\n <v-snackbar\n v-model=\"showAlert\"\n top\n :type=\"alertType\"\n :icon=\"alertType\"\n :timeout=\"5000\"\n >\n <v-icon> mdi-{{ alertType }} </v-icon>\n {{ alert }}\n <template v-slot:action=\"{ attrs }\">\n <v-btn\n text\n v-bind=\"attrs\"\n @click=\"\n () => {\n showAlert = false\n }\n \"\n >\n Close\n </v-btn>\n </template>\n </v-snackbar>\n\n <div v-show=\"this.selectedGraphId === null\">\n <v-row class=\"my-5\">\n <v-spacer />\n <span>\n Add a graph from the menu bar or select an existing graph to\n continue\n </span>\n <v-spacer />\n </v-row>\n </div>\n\n <v-row\n class=\"px-1\"\n justify=\"space-between\"\n v-show=\"this.selectedGraphId !== null\"\n >\n <v-col cols=\"11\">\n <target-packet-item-chooser\n :initial-target-name=\"this.$route.params.target\"\n :initial-packet-name=\"this.$route.params.packet\"\n :initial-item-name=\"this.$route.params.item\"\n @click=\"addItem\"\n button-text=\"Add Item\"\n choose-item\n />\n </v-col>\n <v-col cols=\"1\">\n <v-btn\n v-show=\"state === 'pause'\"\n class=\"pulse\"\n v-on:click=\"\n () => {\n state = 'start'\n }\n \"\n color=\"primary\"\n fab\n data-test=\"start-graph\"\n >\n <v-icon large>mdi-play</v-icon>\n </v-btn>\n <v-btn\n v-show=\"state === 'start'\"\n v-on:click=\"\n () => {\n state = 'pause'\n }\n \"\n color=\"primary\"\n fab\n data-test=\"pause-graph\"\n >\n <v-icon large>mdi-pause</v-icon>\n </v-btn>\n </v-col>\n </v-row>\n\n <div class=\"grid\">\n <div\n class=\"item\"\n v-for=\"graph in graphs\"\n :key=\"graph\"\n :id=\"`gridItem${graph}`\"\n :ref=\"`gridItem${graph}`\"\n >\n <div class=\"item-content\">\n <graph\n :ref=\"`graph${graph}`\"\n :id=\"graph\"\n :state=\"state\"\n :start-time=\"startTime\"\n :selected-graph-id=\"selectedGraphId\"\n :seconds-graphed=\"settings.secondsGraphed.value\"\n :points-saved=\"settings.pointsSaved.value\"\n :points-graphed=\"settings.pointsGraphed.value\"\n @close-graph=\"() => closeGraph(graph)\"\n @min-max-graph=\"() => minMaxGraph(graph)\"\n @resize=\"() => resize()\"\n @click=\"() => graphSelected(graph)\"\n @started=\"graphStarted\"\n />\n </div>\n </div>\n </div>\n </div>\n <!-- Note we're using v-if here so it gets re-created each time and refreshes the list -->\n <open-config-dialog\n v-if=\"showOpenConfig\"\n v-model=\"showOpenConfig\"\n :tool=\"toolName\"\n @success=\"openConfiguration\"\n />\n <!-- Note we're using v-if here so it gets re-created each time and refreshes the list -->\n <save-config-dialog\n v-if=\"showSaveConfig\"\n v-model=\"showSaveConfig\"\n :tool=\"toolName\"\n @success=\"saveConfiguration\"\n />\n <!-- Note we're using v-if here so it gets re-created each time and refreshes the list -->\n <settings-dialog\n v-show=\"showSettingsDialog\"\n v-model=\"showSettingsDialog\"\n :settings=\"settings\"\n />\n </div>\n</template>\n\n<script>\nimport { OpenC3Api } from '@openc3/tool-common/src/services/openc3-api'\nimport Graph from '@openc3/tool-common/src/components/Graph.vue'\nimport OpenConfigDialog from '@openc3/tool-common/src/components/OpenConfigDialog'\nimport SaveConfigDialog from '@openc3/tool-common/src/components/SaveConfigDialog'\nimport TargetPacketItemChooser from '@openc3/tool-common/src/components/TargetPacketItemChooser'\nimport TopBar from '@openc3/tool-common/src/components/TopBar'\nimport Muuri from 'muuri'\n\nimport SettingsDialog from '@/tools/TlmGrapher/SettingsDialog'\n\nconst MURRI_REFRESH_TIME = 250\nexport default {\n components: {\n Graph,\n OpenConfigDialog,\n SaveConfigDialog,\n SettingsDialog,\n TargetPacketItemChooser,\n TopBar,\n },\n data() {\n return {\n alert: '',\n alertType: 'success',\n showAlert: false,\n title: 'Telemetry Grapher',\n toolName: 'telemetry-grapher',\n showOpenConfig: false,\n showSaveConfig: false,\n showSettingsDialog: false,\n grid: null,\n state: 'stop', // Valid: stop, start, pause\n startTime: null, // Start time in nanoseconds\n // Setup defaults to show an initial graph\n graphs: [0],\n selectedGraphId: 0,\n counter: 1,\n menus: [\n {\n label: 'File',\n items: [\n {\n label: 'Open Configuration',\n icon: 'mdi-folder-open',\n command: () => {\n this.showOpenConfig = true\n },\n },\n {\n label: 'Save Configuration',\n icon: 'mdi-content-save',\n command: () => {\n this.showSaveConfig = true\n },\n },\n ],\n },\n {\n label: 'Graph',\n items: [\n {\n label: 'Add Graph',\n icon: 'mdi-plus',\n command: () => {\n this.addGraph()\n },\n },\n {\n divider: true,\n },\n {\n label: 'Start / Resume',\n icon: 'mdi-play',\n command: () => {\n this.state = 'start'\n },\n },\n {\n label: 'Pause',\n icon: 'mdi-pause',\n command: () => {\n this.state = 'pause'\n },\n },\n {\n label: 'Stop',\n icon: 'mdi-stop',\n command: () => {\n this.state = 'stop'\n },\n },\n {\n divider: true,\n },\n {\n label: 'Settings',\n icon: 'mdi-cog',\n command: () => {\n this.showSettingsDialog = true\n },\n },\n ],\n },\n ],\n settings: {\n secondsGraphed: {\n title: 'Seconds Graphed',\n value: 1000,\n rules: [(value) => !!value || 'Required'],\n },\n pointsSaved: {\n title: 'Points Saved',\n value: 1000000,\n rules: [(value) => !!value || 'Required'],\n },\n pointsGraphed: {\n title: 'Points Graphed',\n value: 1000,\n rules: [(value) => !!value || 'Required'],\n },\n },\n }\n },\n mounted: function () {\n this.grid = new Muuri('.grid', {\n dragEnabled: true,\n layoutOnResize: true,\n // Only allow drags starting from the v-system-bar title\n dragHandle: '.v-system-bar',\n })\n // Sometimes when we move graphs, other graphs become non-interactive\n // This seems to fix that issue\n this.grid.on('move', function (data) {\n data.item.getGrid().synchronize()\n })\n const previousConfig = this.getLocalStorageConfig()\n // If we're passed in the route then manually addItem\n if (\n this.$route.params.target &&\n this.$route.params.packet &&\n this.$route.params.item\n ) {\n this.addItem({\n targetName: this.$route.params.target.toUpperCase(),\n packetName: this.$route.params.packet.toUpperCase(),\n itemName: this.$route.params.item.toUpperCase(),\n })\n } else if (previousConfig) {\n this.openConfiguration(previousConfig)\n }\n },\n methods: {\n alertHandler: function (event) {\n this.alert = event.text\n this.alertType = event.type\n this.showAlert = true\n },\n setLocalStorageConfig: function (value) {\n localStorage['lastconfig__telemetry_grapher'] = value\n },\n getLocalStorageConfig: function () {\n return localStorage['lastconfig__telemetry_grapher']\n },\n graphSelected: function (id) {\n this.selectedGraphId = id\n },\n addItem: function (item, startGraphing = true) {\n this.$refs[`graph${this.selectedGraphId}`][0].addItems([item])\n if (startGraphing === true) {\n this.state = 'start'\n }\n },\n addGraph: function () {\n const id = this.counter\n this.graphs.push(id)\n this.counter += 1\n this.$nextTick(function () {\n var items = this.grid.add(this.$refs[`gridItem${id}`], {\n active: false,\n })\n this.grid.show(items)\n this.selectedGraphId = id\n setTimeout(() => {\n this.grid.refreshItems().layout()\n }, MURRI_REFRESH_TIME)\n })\n },\n closeGraph: function (id) {\n var items = this.grid.getItems([document.getElementById(`gridItem${id}`)])\n this.grid.remove(items)\n this.graphs.splice(this.graphs.indexOf(id), 1)\n this.selectedGraphId = null\n },\n closeAllGraphs: function () {\n // Make a copy of this.graphs to iterate on since closeGraph modifies in place\n for (let graph of [...this.graphs]) {\n this.closeGraph(graph)\n }\n this.counter = 0\n },\n minMaxGraph: function (id) {\n this.selectedGraphId = id\n setTimeout(\n () => {\n this.grid.refreshItems().layout()\n },\n MURRI_REFRESH_TIME * 2 // Double the time since there is more animation\n )\n },\n resize: function () {\n setTimeout(\n () => {\n this.grid.refreshItems().layout()\n },\n MURRI_REFRESH_TIME * 2 // Double the time since there is more animation\n )\n },\n graphStarted: function (time) {\n // Only set startTime once when notified by the first graph to start\n // This allows us to have a uniform start time on all graphs\n if (this.startTime === null) {\n this.startTime = time\n }\n },\n saveConfiguration: function (name) {\n const config = this.grid.getItems().map((item) => {\n // Map the gridItem id to the graph id\n const graphId = `graph${item.getElement().id.substring(8)}`\n const vueGraph = this.$refs[graphId][0]\n return {\n items: vueGraph.items,\n title: vueGraph.title,\n fullWidth: vueGraph.fullWidth,\n fullHeight: vueGraph.fullHeight,\n graphMinX: vueGraph.graphMinX,\n graphMaxX: vueGraph.graphMaxX,\n legendPosition: vueGraph.legendPosition,\n }\n })\n new OpenC3Api()\n .save_config(this.toolName, name, JSON.stringify(config))\n .then((response) => {\n this.setLocalStorageConfig(name)\n this.alertHandler({\n text: `Saved configuration: ${name}`,\n type: 'success',\n })\n })\n .catch((error) => {\n if (error) {\n this.alertHandler({\n text: `Failed to save configuration: ${name}. ${error}`,\n type: 'error',\n })\n }\n })\n },\n openConfiguration: function (name) {\n this.setLocalStorageConfig(name)\n new OpenC3Api()\n .load_config(this.toolName, name)\n .then((response) => {\n if (response) {\n this.loadConfiguration(response)\n }\n })\n .catch((error) => {\n if (error) {\n this.alertHandler({\n text: `Failed to open configuration: ${name}. ${error}`,\n type: 'error',\n })\n this.setLocalStorageConfig(null)\n }\n })\n },\n async loadConfiguration(configStr) {\n this.closeAllGraphs()\n await this.$nextTick()\n const config = JSON.parse(configStr)\n for (let graph of config) {\n this.addGraph()\n }\n await this.$nextTick()\n const that = this\n config.forEach(function (graph, i) {\n let vueGraph = that.$refs[`graph${i}`][0]\n vueGraph.title = graph.title\n vueGraph.fullWidth = graph.fullWidth\n vueGraph.fullHeight = graph.fullHeight\n vueGraph.graphMinX = graph.graphMinX\n vueGraph.graphMaxX = graph.graphMaxX\n vueGraph.moveLegend(graph.legendPosition)\n vueGraph.addItems([...graph.items])\n })\n this.state = 'start'\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.v-navigation-drawer {\n z-index: 2;\n}\n.theme--dark.v-navigation-drawer {\n background-color: var(--v-primary-darken2);\n}\n.grid {\n position: relative;\n}\n.item {\n position: absolute;\n z-index: 1;\n}\n.item.muuri-item-dragging {\n z-index: 3;\n}\n.item.muuri-item-releasing {\n z-index: 2;\n}\n.item.muuri-item-hidden {\n z-index: 0;\n}\n.item-content {\n position: relative;\n cursor: pointer;\n border-radius: 6px;\n margin: 5px;\n}\n\n.pulse {\n animation: pulse 1s infinite;\n}\n\n@keyframes pulse {\n 0% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.5;\n }\n}\n</style>\n","import mod from \"-!../../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./TlmGrapher.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./TlmGrapher.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TlmGrapher.vue?vue&type=template&id=a295d204&scoped=true&\"\nimport script from \"./TlmGrapher.vue?vue&type=script&lang=js&\"\nexport * from \"./TlmGrapher.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TlmGrapher.vue?vue&type=style&index=0&id=a295d204&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"a295d204\",\n null\n \n)\n\nexport default component.exports","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/@vue/cli-service/node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/@vue/cli-service/node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".uplot.side-legend{display:flex;width:auto}.uplot.side-legend .u-wrap{flex:none}.uplot.side-legend .u-legend{text-align:left;margin-left:0;width:220px}.uplot.side-legend .u-legend,.uplot.side-legend .u-legend td,.uplot.side-legend .u-legend th,.uplot.side-legend .u-legend tr{display:revert}.uplot.left-legend .u-legend{order:-1}.uplot.top-legend{display:flex;flex-direction:column}.uplot.top-legend .u-legend{order:-1}\", \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/@vue/cli-service/node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/@vue/cli-service/node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"#chart[data-v-335d365e]{background-color:var(--v-tertiary-darken2)}#chart[data-v-335d365e] .u-select{background-color:hsla(0,0%,100%,.07)}\", \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/@vue/cli-service/node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/@vue/cli-service/node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".v-list[data-v-3237297b] .v-label{margin-left:5px}.v-list-item__icon[data-v-3237297b]{margin-right:15px!important}.v-list-item__title[data-v-3237297b]{color:#fff}\", \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/@vue/cli-service/node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/@vue/cli-service/node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".v-navigation-drawer[data-v-a295d204]{z-index:2}.theme--dark.v-navigation-drawer[data-v-a295d204]{background-color:var(--v-primary-darken2)}.grid[data-v-a295d204]{position:relative}.item[data-v-a295d204]{position:absolute;z-index:1}.item.muuri-item-dragging[data-v-a295d204]{z-index:3}.item.muuri-item-releasing[data-v-a295d204]{z-index:2}.item.muuri-item-hidden[data-v-a295d204]{z-index:0}.item-content[data-v-a295d204]{position:relative;cursor:pointer;border-radius:6px;margin:5px}.pulse[data-v-a295d204]{-webkit-animation:pulse-data-v-a295d204 1s infinite;animation:pulse-data-v-a295d204 1s infinite}@-webkit-keyframes pulse-data-v-a295d204{0%{opacity:1}50%{opacity:.5}}@keyframes pulse-data-v-a295d204{0%{opacity:1}50%{opacity:.5}}\", \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../node_modules/@vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!../../../../node_modules/@vue/cli-service/node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!../../../../node_modules/@vue/cli-service/node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[3]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Graph.vue?vue&type=style&index=0&id=335d365e&prod&lang=css&\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"4d874f9a\", content, true, {\"sourceMap\":false,\"shadowMode\":false});","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../node_modules/@vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!../../../../node_modules/@vue/cli-service/node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!../../../../node_modules/@vue/cli-service/node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[3]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Graph.vue?vue&type=style&index=1&id=335d365e&prod&scoped=true&lang=css&\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"b50c2682\", content, true, {\"sourceMap\":false,\"shadowMode\":false});","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../node_modules/@vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!../../../../node_modules/@vue/cli-service/node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!../../../../node_modules/@vue/cli-service/node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[3]!../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./TopBar.vue?vue&type=style&index=0&id=3237297b&prod&scoped=true&lang=css&\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"9f637652\", content, true, {\"sourceMap\":false,\"shadowMode\":false});","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../node_modules/@vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!../../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!../../../../../node_modules/@vue/cli-service/node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!../../../../../node_modules/@vue/cli-service/node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[3]!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[4]!../../../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./TlmGrapher.vue?vue&type=style&index=0&id=a295d204&prod&lang=scss&scoped=true&\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"29069048\", content, true, {\"sourceMap\":false,\"shadowMode\":false});"],"names":["render","_vm","this","_h","$createElement","_c","_self","attrs","menus","title","alertType","scopedSlots","_u","key","fn","ref","_b","on","showAlert","_v","model","value","callback","$$v","expression","_s","alert","directives","name","rawName","selectedGraphId","staticClass","$route","params","target","packet","item","addItem","state","_l","graph","refInFor","startTime","settings","secondsGraphed","pointsSaved","pointsGraphed","closeGraph","minMaxGraph","resize","graphSelected","graphStarted","toolName","openConfiguration","showOpenConfig","_e","saveConfiguration","showSaveConfig","showSettingsDialog","staticRenderFns","vueInstance","Vue","axiosInstance","axios","baseURL","location","origin","timeout","interceptors","response","use","error","status","localStorage","openc3Token","OpenC3Auth","login","href","axiosIgnoreResponse","toString","Promise","reject","body","statusText","config","data","message","exception","class","$notify","serious","OpenC3Api","method","kwparams","updateToken","defaultMinValidity","id","scope","jsonrpc","keyword_params","headers","Authorization","result","err","Error","request","val","json_class","raw","NaN","Infinity","Number","isNaN","POSITIVE_INFINITY","NEGATIVE_INFINITY","exec","interface_name","router_name","target_commands","log_writer_name","limits_set","target_name","packet_name","value_type","type","len","length","converted","i","decode_openc3_type","items","item_name","command_name","parameter_name","param_list","Object","prototype","hasOwnProperty","call","encode_openc3_type","undefined","_cmd","tool","ignored","array","string","window","isSecureContext","arrayBuffer","TextEncoder","encode","crypto","subtle","digest","hashAsArrayBuffer","uint8ViewOfHash","Uint8Array","Array","from","map","b","padStart","join","nativeOn","$event","$emit","hideSystemBar","errors","_g","errorDialog","editGraph","collapseAll","calcFullSize","expandAll","collapseWidth","fullWidth","expandWidth","collapseHeight","fullHeight","expandHeight","minMaxTransition","expand","hideOverview","indexOf","_k","keyCode","editGraphClose","graphStartDateTime","graphEndDateTime","legendPositions","legendPosition","graphMinY","graphMaxY","itemHeaders","editItems","removeItems","proxy","clearErrors","editGraphMenuX","editGraphMenuY","editGraphMenu","staticStyle","editItem","valueTypes","currentType","closeEditItem","itemMenuX","itemMenuY","itemMenu","openEditItem","selectedItem","itemName","legendMenuX","legendMenuY","legendMenu","moveLegend","dateLabel","Date","now","dateRules","date","timeLabel","timeRules","onChange","time","props","required","default","initialDate","initialTime","rules","isValid","computed","methods","component","ActionCable","Cable","url","_cable","disconnect","channel","callbacks","additionalOptions","then","subscriptions","create","token","require","components","DateTimeChooser","initialItems","height","width","text","sortable","active","overview","indexes","drawInterval","zoomChart","zoomOverview","cable","subscription","needToUpdate","colors","itemId","created","mounted","spanGaps","stroke","seriesObj","commonProps","label","chartSeries","overviewSeries","series","v","cursor","drag","x","y","sync","hooks","setScale","left","ready","canvas","e","legend","seriesEl","chartOpts","document","points","show","setSelect","chart","min","max","overviewOpts","beforeDestroy","watch","handleResize","setGraphRange","pad","subscribe","createSubscription","received","connected","disconnected","rejected","getSize","navDrawer","legendWidth","Math","navDrawerWidth","getScales","scales","range","u","dataMin","dataMax","getAxes","strokeColor","axisColor","axes","grid","size","changeType","addItems","itemArray","index","addItemsToSubscription","endTime","mode","start_time","end_time","removeItemsFromSubscription","reorderIndexes","bs_comparator","set_data_at_index","subscriptionKey","cancel","apply","arguments","preventDefault","success","search","configs","itemSelected","slot","select","deleteConfig","domProps","align","get","set","list_configs","configId","catch","confirm","okText","cancelText","configName","colSize","targetNames","targetNameChanged","selectedTargetName","packetsDisabled","buttonDisabled","packetNames","packetNameChanged","selectedPacketName","chooseItem","itemsDisabled","itemNames","itemNameChanged","selectedItemName","buttonPressed","actualButtonText","description","allowAll","buttonText","disabled","initialTargetName","initialPacketName","initialItemName","validator","reduced","includes","propValue","unknown","vertical","internalDisabled","api","ALL","UNKNOWN","targetChooserStyle","float","packetChooserStyle","updatePackets","updateItems","reduce","targetName","packetName","makeReducedItems","allTargetPacketItems","allPacketItems","menu","formatDT","radioGroup","option","j","command","checked","icon","radio","checkbox","style","$set","_n","acceptOnlyDefaultHeaders","Accept","Graph","OpenConfigDialog","SaveConfigDialog","SettingsDialog","TargetPacketItemChooser","TopBar","graphs","counter","divider","dragEnabled","layoutOnResize","dragHandle","alertHandler","setLocalStorageConfig","getLocalStorageConfig","addGraph","setTimeout","MURRI_REFRESH_TIME","closeAllGraphs","graphMinX","graphMaxX","save_config","JSON","load_config","loadConfiguration","configStr","that","vueGraph","___CSS_LOADER_EXPORT___","push","module","content","__esModule","locals","exports","add"],"sourceRoot":""}