cosmosc2-tool-tlmgrapher 5.0.4 → 5.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +6 -1
- data/tools/tlmgrapher/js/632.js +2 -0
- data/tools/tlmgrapher/js/632.js.map +1 -0
- data/tools/tlmgrapher/js/809.js +24 -0
- data/tools/tlmgrapher/js/809.js.map +1 -0
- data/tools/tlmgrapher/js/app.js +1 -1
- data/tools/tlmgrapher/js/app.js.map +1 -1
- metadata +6 -6
- data/tools/tlmgrapher/js/170.js +0 -24
- data/tools/tlmgrapher/js/170.js.map +0 -1
- data/tools/tlmgrapher/js/735.js +0 -2
- data/tools/tlmgrapher/js/735.js.map +0 -1
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"js/735.js","mappings":"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","sources":["webpack://@cosmosc2/tool-tlmgrapher/./src/tools/TlmGrapher/TlmGrapher.vue?864a","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/services/axios.js","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/services/cosmos-api.js","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/Graph.vue?d0ae","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/DateTimeChooser.vue?40c6","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/DateTimeChooser.vue","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/DateTimeChooser.vue?2f38","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/DateTimeChooser.vue?f834","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/services/cable.js","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/Graph.vue","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/Graph.vue?25dc","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/Graph.vue?0667","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/OpenConfigDialog.vue?d129","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/OpenConfigDialog.vue","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/OpenConfigDialog.vue?b667","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/OpenConfigDialog.vue?6158","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/SaveConfigDialog.vue?36c2","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/SaveConfigDialog.vue","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/SaveConfigDialog.vue?e52f","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/SaveConfigDialog.vue?65b7","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/TargetPacketItemChooser.vue?1730","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/TargetPacketItemChooser.vue","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/TargetPacketItemChooser.vue?44cd","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/TargetPacketItemChooser.vue?b395","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/TopBar.vue?228d","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/TopBar.vue","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/TopBar.vue?adab","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/TopBar.vue?dfc0","webpack://@cosmosc2/tool-tlmgrapher/./src/tools/TlmGrapher/SettingsDialog.vue?2b81","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/services/api.js","webpack://@cosmosc2/tool-tlmgrapher/src/tools/TlmGrapher/SettingsDialog.vue","webpack://@cosmosc2/tool-tlmgrapher/./src/tools/TlmGrapher/SettingsDialog.vue?844c","webpack://@cosmosc2/tool-tlmgrapher/./src/tools/TlmGrapher/SettingsDialog.vue","webpack://@cosmosc2/tool-tlmgrapher/src/tools/TlmGrapher/TlmGrapher.vue","webpack://@cosmosc2/tool-tlmgrapher/./src/tools/TlmGrapher/TlmGrapher.vue?70c2","webpack://@cosmosc2/tool-tlmgrapher/./src/tools/TlmGrapher/TlmGrapher.vue","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/Graph.vue?c458","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/TopBar.vue?b2db","webpack://@cosmosc2/tool-tlmgrapher/./src/tools/TlmGrapher/TlmGrapher.vue?be4f","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/Graph.vue?d6b3","webpack://@cosmosc2/tool-tlmgrapher/../cosmosc2-tool-common/src/components/TopBar.vue?5429","webpack://@cosmosc2/tool-tlmgrapher/./src/tools/TlmGrapher/TlmGrapher.vue?7fa1"],"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# This program may also be used under the terms of a commercial or\n# enterprise edition license of COSMOS if purchased from the\n# copyright holder\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: 10000,\n params: {},\n})\n\naxiosInstance.interceptors.response.use(\n (response) => response,\n (error) => {\n if (error.response.status === 401) {\n delete localStorage.cosmosToken\n CosmosAuth.login(location.href)\n } else {\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 }\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# This program may also be used under the terms of a commercial or\n# enterprise edition license of COSMOS if purchased from the\n# copyright holder\n*/\n\nimport axios from './axios.js'\n\nexport class CosmosApi {\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 CosmosAuth.updateToken(CosmosAuth.defaultMinValidity)\n } catch (error) {\n CosmosAuth.login()\n }\n this.id = this.id + 1\n try {\n kwparams['scope'] = localStorage.scope\n const response = await axios.post(\n '/cosmos-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.cosmosToken,\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_cosmos_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_cosmos_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_all_cmd_info() {\n return this.exec('get_all_cmd_info', [])\n }\n\n get_all_tlm_info() {\n return this.exec('get_all_tlm_info', [])\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_list(target_name) {\n return this.exec('get_all_telemetry_list', [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_cosmos_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 CosmosScreenComponent\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_cosmos_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_cosmos_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_commands_list(target_name) {\n return this.exec('get_all_commands_list', [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_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_cosmos_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","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',{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-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()],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# This program may also be used under the terms of a commercial or\n# enterprise edition license of COSMOS if purchased from the\n# copyright holder\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[0].rules[0].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[0].rules[0].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=37777c5e&\"\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# This program may also be used under the terms of a commercial or\n# enterprise edition license of COSMOS if purchased from the\n# copyright holder\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 = '/cosmos-api/cable') {\n this._cable = ActionCable.createConsumer(url)\n }\n disconnect() {\n this._cable.disconnect()\n }\n createSubscription(channel, scope, callbacks = {}, additionalOptions = {}) {\n return CosmosAuth.updateToken(CosmosAuth.defaultMinValidity).then(() => {\n return this._cable.subscriptions.create(\n {\n channel,\n scope,\n token: localStorage.cosmosToken,\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# This program may also be used under the terms of a commercial or\n# enterprise edition license of COSMOS if purchased from the\n# copyright holder\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\n </v-icon>\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 data-test=\"close-graph-icon\" @click=\"$emit('close-graph')\">\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\n :id=\"`overview${id}`\"\n v-show=\"!hideOverview\"\n ></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-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 </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 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: 'cosmos',\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 clientX\n let clientY\n let canvas = u.root.querySelector('.u-over')\n canvas.addEventListener('contextmenu', (e) => {\n e.preventDefault()\n this.itemMenu = 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.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 }\n return false\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\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 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 },\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: 'COSMOS backend connection disconnected',\n time: new Date().getTime(),\n })\n },\n rejected: () => {\n this.errors.push({\n type: 'rejected',\n message: 'COSMOS 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('cosmos-nav-drawer')\n const navDrawerWidth = navDrawer.classList.contains(\n 'v-navigation-drawer--open'\n )\n ? navDrawer.clientWidth\n : 0\n const viewWidth =\n Math.max(document.documentElement.clientWidth, window.innerWidth || 0) -\n navDrawerWidth\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 CosmosAuth.updateToken(CosmosAuth.defaultMinValidity).then(() => {\n this.subscription.perform('add', {\n scope: localStorage.scope,\n mode: 'DECOM',\n token: localStorage.cosmosToken,\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 scoped>\n#chart {\n background-color: var(--v-tertiary-darken2);\n}\n#chart >>> .u-legend {\n text-align: left;\n}\n#chart >>> .u-inline {\n max-width: fit-content;\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[0].rules[0].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[0].rules[0].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=bfba4026&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=bfba4026&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 \"bfba4026\",\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# This program may also be used under the terms of a commercial or\n# enterprise edition license of COSMOS if purchased from the\n# copyright holder\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 { CosmosApi } from '../services/cosmos-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 CosmosApi()\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 Cosmos. ${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 CosmosApi().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[0].rules[0].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[0].rules[0].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=4f9dd098&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 \"4f9dd098\",\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# This program may also be used under the terms of a commercial or\n# enterprise edition license of COSMOS if purchased from the\n# copyright holder\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 { CosmosApi } from '../services/cosmos-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 CosmosApi()\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 Cosmos. ${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 CosmosApi().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[0].rules[0].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[0].rules[0].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=7685694e&\"\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,\"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,\"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# This program may also be used under the terms of a commercial or\n# enterprise edition license of COSMOS if purchased from the\n# copyright holder\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\"\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\"\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 { CosmosApi } from '../services/cosmos-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 CosmosApi()\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 = this.mode === 'tlm' ? 'get_all_telemetry_list' : 'get_all_commands_list'\n this.api[cmd](this.selectedTargetName).then((packets) => {\n this.packetNames = packets.map((packet) => {\n return {\n label: packet.packet_name,\n value: packet.packet_name,\n description: packet.description,\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 this.packetNameChanged(this.selectedPacketName)\n }\n const item = this.packetNames.find((packet) => {\n return packet.value === this.selectedPacketName\n })\n this.description = item.description\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.map((item) => {\n if (this.reduced === 'DECOM') {\n return [{\n label: item.name,\n value: item.name,\n description: item.description,\n }]\n } else {\n return this.makeReducedItems(item)\n }\n }).reduce((result, item) => { return result.concat(item) }, [])\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 (\n reducedOptions && ['UINT', 'INT', 'FLOAT'].includes(item.data_type)\n ) {\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 this.description = packet.description\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[0].rules[0].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[0].rules[0].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=1cc45128&\"\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\":\"#cosmos-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',{key:j}):_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},domProps:{\"textContent\":_vm._s(option.icon)}})],1):_vm._e(),(!option.radio && !option.checkbox)?_c('v-list-item-title',{style:('cursor: pointer;' + (option.disabled ? 'opacity: 0.2' : '')),domProps:{\"textContent\":_vm._s(option.label)}}):_vm._e()],1)]})],2)],1)],1)}),_c('v-spacer'),_c('v-toolbar-title',{domProps:{\"textContent\":_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# This program may also be used under the terms of a commercial or\n# enterprise edition license of COSMOS if purchased from the\n# copyright holder\n-->\n\n<template>\n <mounting-portal mount-to=\"#cosmos-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\" :key=\"j\" />\n <v-list-item\n v-else\n @click=\"option.command\"\n :key=\"j\"\n :disabled=\"option.disabled\"\n :data-test=\"formatDT(`${title} ${menu.label} ${option.label}`)\"\n >\n <v-list-item-action\n v-if=\"option.radio\"\n >\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\n v-if=\"option.checkbox\"\n >\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 v-text=\"option.icon\" :disabled=\"option.disabled\" />\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 v-text=\"option.label\"\n />\n </v-list-item>\n </template>\n </v-radio-group>\n </v-list>\n </v-menu>\n <v-spacer />\n <v-toolbar-title v-text=\"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[0].rules[0].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[0].rules[0].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=e3bb7458&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=e3bb7458&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 \"e3bb7458\",\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# This program may also be used under the terms of a commercial or\n# enterprise edition license of COSMOS if purchased from the\n# copyright holder\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 CosmosAuth.updateToken(CosmosAuth.defaultMinValidity)\n } catch (error) {\n CosmosAuth.login()\n }\n headers['Authorization'] = localStorage.cosmosToken\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# This program may also be used under the terms of a commercial or\n# enterprise edition license of COSMOS if purchased from the\n# copyright holder\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 '@cosmosc2/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[0].rules[0].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[0].rules[0].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=282aa6a6&\"\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# This program may also be used under the terms of a commercial or\n# enterprise edition license of COSMOS if purchased from the\n# copyright holder\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 { CosmosApi } from '@cosmosc2/tool-common/src/services/cosmos-api'\nimport Graph from '@cosmosc2/tool-common/src/components/Graph.vue'\nimport OpenConfigDialog from '@cosmosc2/tool-common/src/components/OpenConfigDialog'\nimport SaveConfigDialog from '@cosmosc2/tool-common/src/components/SaveConfigDialog'\nimport TargetPacketItemChooser from '@cosmosc2/tool-common/src/components/TargetPacketItemChooser'\nimport TopBar from '@cosmosc2/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 }\n })\n new CosmosApi()\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 CosmosApi()\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.resize()\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[0].rules[0].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[0].rules[0].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=5c3ac168&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=5c3ac168&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 \"5c3ac168\",\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, \"#chart[data-v-bfba4026]{background-color:var(--v-tertiary-darken2)}#chart[data-v-bfba4026] .u-legend{text-align:left}#chart[data-v-bfba4026] .u-inline{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}#chart[data-v-bfba4026] .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-e3bb7458] .v-label{margin-left:5px}.v-list-item__icon[data-v-e3bb7458]{margin-right:15px!important}.v-list-item__title[data-v-e3bb7458]{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-5c3ac168]{z-index:2}.theme--dark.v-navigation-drawer[data-v-5c3ac168]{background-color:var(--v-primary-darken2)}.grid[data-v-5c3ac168]{position:relative}.item[data-v-5c3ac168]{position:absolute;z-index:1}.item.muuri-item-dragging[data-v-5c3ac168]{z-index:3}.item.muuri-item-releasing[data-v-5c3ac168]{z-index:2}.item.muuri-item-hidden[data-v-5c3ac168]{z-index:0}.item-content[data-v-5c3ac168]{position:relative;cursor:pointer;border-radius:6px;margin:5px}.pulse[data-v-5c3ac168]{-webkit-animation:pulse-data-v-5c3ac168 1s infinite;animation:pulse-data-v-5c3ac168 1s infinite}@-webkit-keyframes pulse-data-v-5c3ac168{0%{opacity:1}50%{opacity:.5}}@keyframes pulse-data-v-5c3ac168{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[0].rules[0].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[0].rules[0].use[2]!../../../../node_modules/@vue/cli-service/node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12[0].rules[0].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=bfba4026&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(\"70802780\", 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[0].rules[0].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[0].rules[0].use[2]!../../../../node_modules/@vue/cli-service/node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12[0].rules[0].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=e3bb7458&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(\"a2f2c426\", 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[0].rules[0].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[0].rules[0].use[2]!../../../../../node_modules/@vue/cli-service/node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22[0].rules[0].use[3]!../../../../../node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22[0].rules[0].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=5c3ac168&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(\"2f61ee6a\", 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","cosmosToken","CosmosAuth","login","href","body","statusText","config","data","message","exception","class","$notify","serious","CosmosApi","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","log_writer_name","limits_set","target_name","packet_name","value_type","type","len","length","converted","i","decode_cosmos_type","items","item_name","command_name","parameter_name","param_list","Object","prototype","hasOwnProperty","call","encode_cosmos_type","undefined","_cmd","tool","ignored","array","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","graphMinY","graphMaxY","itemHeaders","editItems","removeItems","proxy","clearErrors","editGraphMenuX","editGraphMenuY","editGraphMenu","staticStyle","editItem","valueTypes","currentType","closeEditItem","itemMenuX","itemMenuY","itemMenu","openEditItem","selectedItem","itemName","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","window","beforeDestroy","watch","handleResize","setGraphRange","pad","subscribe","createSubscription","received","connected","disconnected","rejected","getSize","navDrawer","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","packetNames","packetNameChanged","selectedPacketName","chooseItem","buttonDisabled","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","reducedOptions","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":""}
|