@openc3/vue-common 6.5.1 → 6.6.0

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.
Files changed (183) hide show
  1. package/dist/ArrayWidget-Bb_Ldxq7.cjs.map +1 -1
  2. package/dist/ArrayWidget-Ck6pzAyW.js.map +1 -1
  3. package/dist/ArrayplotWidget-DC41cpv1.cjs.map +1 -1
  4. package/dist/ArrayplotWidget-ntRLh6-B.js.map +1 -1
  5. package/dist/AstroStatus-CILMWL6F.cjs.map +1 -1
  6. package/dist/AstroStatus-CY9VkeTN.js.map +1 -1
  7. package/dist/BarColumn-Bgz2YJ59.js.map +1 -1
  8. package/dist/BarColumn-DtRNuOpa.cjs.map +1 -1
  9. package/dist/BlockWidget-DGH3Zz5p.js.map +1 -1
  10. package/dist/BlockWidget-DOY5lVfa.cjs.map +1 -1
  11. package/dist/ButtonWidget-CFyZXGt6.cjs.map +1 -1
  12. package/dist/ButtonWidget-D_tupiPB.js.map +1 -1
  13. package/dist/CanvasWidget-C6dc7mUw.cjs.map +1 -1
  14. package/dist/CanvasWidget-CzG2jYQb.js.map +1 -1
  15. package/dist/CanvasimageWidget-CNJlzLqo.js.map +1 -1
  16. package/dist/CanvasimageWidget-DjvdDCRS.cjs.map +1 -1
  17. package/dist/CanvasimagevalueWidget-C1fI-ftP.cjs.map +1 -1
  18. package/dist/CanvasimagevalueWidget-DudwwOD6.js.map +1 -1
  19. package/dist/CanvaslabelWidget--6Sjc4E8.cjs.map +1 -1
  20. package/dist/CanvaslabelWidget-BZQp16dH.js.map +1 -1
  21. package/dist/CanvaslabelvalueWidget-CHS36Te9.js.map +1 -1
  22. package/dist/CanvaslabelvalueWidget-DZCxsIKk.cjs.map +1 -1
  23. package/dist/CanvaslineWidget-Bn83Rb10.cjs.map +1 -1
  24. package/dist/CanvaslineWidget-nhKEAGhs.js.map +1 -1
  25. package/dist/CanvaslinevalueWidget-C6x_4Gc9.cjs.map +1 -1
  26. package/dist/CanvaslinevalueWidget-DsyIDkJy.js.map +1 -1
  27. package/dist/CheckbuttonWidget-BvggsGZY.cjs.map +1 -1
  28. package/dist/CheckbuttonWidget-DCam7Jd0.js.map +1 -1
  29. package/dist/ComboboxWidget-BS5WSbrK.cjs.map +1 -1
  30. package/dist/ComboboxWidget-ZX-k-_aK.js.map +1 -1
  31. package/dist/CriticalCmdDialog-7tOK2XQk.cjs.map +1 -1
  32. package/dist/CriticalCmdDialog-Dylpoz_4.js.map +1 -1
  33. package/dist/CustomIcon-Bop2mEnu.cjs.map +1 -1
  34. package/dist/CustomIcon-h5X7369N.js.map +1 -1
  35. package/dist/DateWidget-DuJ5uC2t.js.map +1 -1
  36. package/dist/DateWidget-jejbk2-G.cjs.map +1 -1
  37. package/dist/DetailsDialog-BQE0TraI.js.map +1 -1
  38. package/dist/DetailsDialog-DmKpPDNn.cjs.map +1 -1
  39. package/dist/DynamicWidget-BWEVCUfd.cjs.map +1 -1
  40. package/dist/DynamicWidget-CfMtj7H8.js.map +1 -1
  41. package/dist/EventListDialog-CDcJcxy5.cjs.map +1 -1
  42. package/dist/EventListDialog-CGUFCrJF.js.map +1 -1
  43. package/dist/FormatvalueWidget-DYICPNcx.js.map +1 -1
  44. package/dist/FormatvalueWidget-wu7Q3sXu.cjs.map +1 -1
  45. package/dist/Graph-DCihpnT0.js.map +1 -1
  46. package/dist/Graph-mSqImgca.cjs.map +1 -1
  47. package/dist/GraphWidget-CQjKAMPR.cjs.map +1 -1
  48. package/dist/GraphWidget-cTVq29cY.js.map +1 -1
  49. package/dist/HorizontalWidget--AkRJPlL.cjs.map +1 -1
  50. package/dist/HorizontalWidget-v1pfd94Z.js.map +1 -1
  51. package/dist/HorizontalboxWidget-B06-c_n4.js.map +1 -1
  52. package/dist/HorizontalboxWidget-synL-Bar.cjs.map +1 -1
  53. package/dist/IframeWidget-ByhwW9yG.cjs.map +1 -1
  54. package/dist/IframeWidget-n8lNXrpt.js.map +1 -1
  55. package/dist/ImageLoader-CfcErydq.js.map +1 -1
  56. package/dist/ImageLoader-DBWVFtNu.cjs.map +1 -1
  57. package/dist/ImageviewerWidget-D4mU6wLX.cjs.map +1 -1
  58. package/dist/ImageviewerWidget-DE8fj06Z.js.map +1 -1
  59. package/dist/InterfacesTab-BF-Wx5gk.js.map +1 -1
  60. package/dist/InterfacesTab-DTAAIx-y.cjs.map +1 -1
  61. package/dist/LabelWidget-DQZqRxKF.cjs.map +1 -1
  62. package/dist/LabelWidget-iUIJLhdA.js.map +1 -1
  63. package/dist/LabelledWidget-9HWChRmv.cjs.map +1 -1
  64. package/dist/LabelledWidget-KI6fMlsr.js.map +1 -1
  65. package/dist/LabelprogressbarWidget-C2lzmqBH.js.map +1 -1
  66. package/dist/LabelprogressbarWidget-DwzTP73u.cjs.map +1 -1
  67. package/dist/LabelsparklineWidget-Ci6GGm29.js.map +1 -1
  68. package/dist/LabelsparklineWidget-DMjBshq8.cjs.map +1 -1
  69. package/dist/LabelvalueWidget-mAb0eLA8.cjs.map +1 -1
  70. package/dist/LabelvalueWidget-oiW-JDw6.js.map +1 -1
  71. package/dist/LabelvaluedescWidget-CZJ0kZN-.cjs.map +1 -1
  72. package/dist/LabelvaluedescWidget-Ck0AJ9g0.js.map +1 -1
  73. package/dist/LabelvaluelimitsbarWidget-DjBqYxRr.cjs.map +1 -1
  74. package/dist/LabelvaluelimitsbarWidget-aaVLaejn.js.map +1 -1
  75. package/dist/LabelvaluerangebarWidget-Bs9locqu.js.map +1 -1
  76. package/dist/LabelvaluerangebarWidget-Ci-n_hxk.cjs.map +1 -1
  77. package/dist/LedWidget-BN8IgAxJ.js.map +1 -1
  78. package/dist/LedWidget-BUTbyEBi.cjs.map +1 -1
  79. package/dist/LimitsbarWidget-BxxoKTjp.js.map +1 -1
  80. package/dist/LimitsbarWidget-Co5GAHro.cjs.map +1 -1
  81. package/dist/LimitscolorWidget-BpTcgqRC.cjs.map +1 -1
  82. package/dist/LimitscolorWidget-DFDwf4In.js.map +1 -1
  83. package/dist/LimitscolumnWidget-CdBh2mJu.js.map +1 -1
  84. package/dist/LimitscolumnWidget-CqJJKDzz.cjs.map +1 -1
  85. package/dist/MatrixbycolumnsWidget-DCwxPjwS.js.map +1 -1
  86. package/dist/MatrixbycolumnsWidget-DxRhvPGv.cjs.map +1 -1
  87. package/dist/MicroservicesTab-B-SdMwek.js.map +1 -1
  88. package/dist/MicroservicesTab-DGaTcj-y.cjs.map +1 -1
  89. package/dist/Openc3Screen-BZN0Wtrm.js.map +1 -1
  90. package/dist/Openc3Screen-dtpBWZdA.cjs.map +1 -1
  91. package/dist/OutputDialog-CcSp-Uqo.js.map +1 -1
  92. package/dist/OutputDialog-CxKDhrg6.cjs.map +1 -1
  93. package/dist/PackagesTab-B4V2n4io.cjs.map +1 -1
  94. package/dist/PackagesTab-Dx25CfF0.js.map +1 -1
  95. package/dist/PluginsTab-DHO1tK2S.cjs.map +1 -1
  96. package/dist/PluginsTab-lHDR5v6S.js.map +1 -1
  97. package/dist/ProgressbarWidget-C0AkbX_o.cjs.map +1 -1
  98. package/dist/ProgressbarWidget-Cdu5nJC3.js.map +1 -1
  99. package/dist/RadiobuttonWidget-CZZGbvdG.js.map +1 -1
  100. package/dist/RadiobuttonWidget-DslmJO31.cjs.map +1 -1
  101. package/dist/RadiogroupWidget-CQN3v8Ip.js.map +1 -1
  102. package/dist/RadiogroupWidget-DKgBAR9E.cjs.map +1 -1
  103. package/dist/RangebarWidget-Tq80I5zA.cjs.map +1 -1
  104. package/dist/RangebarWidget-dZN9WjoZ.js.map +1 -1
  105. package/dist/RedisTab-CdiSo-CO.cjs.map +1 -1
  106. package/dist/RedisTab-CkSwEwTZ.js.map +1 -1
  107. package/dist/RollupWidget-CHdZAUCb.cjs.map +1 -1
  108. package/dist/RollupWidget-i9DnNJl6.js.map +1 -1
  109. package/dist/RoutersTab-Cp8wM-mS.cjs.map +1 -1
  110. package/dist/RoutersTab-DiYEI1Nq.js.map +1 -1
  111. package/dist/ScriptChooser-BnTP6ucF.cjs.map +1 -1
  112. package/dist/ScriptChooser-Cua8ObYv.js.map +1 -1
  113. package/dist/ScrollwindowWidget-54GU96Ve.js.map +1 -1
  114. package/dist/ScrollwindowWidget-C5_X-KwQ.cjs.map +1 -1
  115. package/dist/SecretsTab-DY16usGc.cjs.map +1 -1
  116. package/dist/SecretsTab-uWRVI1EE.js.map +1 -1
  117. package/dist/SettingsTab-BVnr4OtU.js.map +1 -1
  118. package/dist/SettingsTab-BkwaDhYo.cjs.map +1 -1
  119. package/dist/SignalWidget-B_kA9eCJ.js.map +1 -1
  120. package/dist/SignalWidget-COL8kXSJ.cjs.map +1 -1
  121. package/dist/SimpleTextDialog-BWUqPlTv.cjs.map +1 -1
  122. package/dist/SimpleTextDialog-BulqUrdH.js.map +1 -1
  123. package/dist/SpacerWidget-D_Ya_b1j.cjs.map +1 -1
  124. package/dist/SpacerWidget-XoMPHak8.js.map +1 -1
  125. package/dist/SparklineWidget-CRzXTS5z.cjs.map +1 -1
  126. package/dist/SparklineWidget-DQNsvEj9.js.map +1 -1
  127. package/dist/TabbookWidget-Bh-GDBXg.cjs.map +1 -1
  128. package/dist/TabbookWidget-_HVA72t5.js.map +1 -1
  129. package/dist/TargetsTab-BfoRYnTP.js.map +1 -1
  130. package/dist/TargetsTab-CGE-jQAz.cjs.map +1 -1
  131. package/dist/TextBoxDialog-C60jmnyN.js.map +1 -1
  132. package/dist/TextBoxDialog-DWt30tB8.cjs.map +1 -1
  133. package/dist/TextboxWidget-0JXn4bMH.js.map +1 -1
  134. package/dist/TextboxWidget-uDptDK_z.cjs.map +1 -1
  135. package/dist/TextfieldWidget-B0FCskrL.cjs.map +1 -1
  136. package/dist/TextfieldWidget-BXr9MkVW.js.map +1 -1
  137. package/dist/TimeWidget-C67uwMGH.js.map +1 -1
  138. package/dist/TimeWidget-q5tUvHC6.cjs.map +1 -1
  139. package/dist/TitleWidget-REsd7MqR.cjs.map +1 -1
  140. package/dist/TitleWidget-t_YLgUMB.js.map +1 -1
  141. package/dist/ToolsTab-CGztf9_j.cjs.map +1 -1
  142. package/dist/ToolsTab-DKYeIlXu.js.map +1 -1
  143. package/dist/TopBar-B0UcAtIW.cjs.map +1 -1
  144. package/dist/TopBar-BrCfgCxc.js.map +1 -1
  145. package/dist/UpgradeToEnterpriseDialog-CGyR2v7U.js.map +1 -1
  146. package/dist/UpgradeToEnterpriseDialog-DJ3oth3I.cjs.map +1 -1
  147. package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-C_HFbtFB.cjs.map +1 -1
  148. package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-NIAkCgU6.js.map +1 -1
  149. package/dist/VWidget-BMxLXtSO.cjs.map +1 -1
  150. package/dist/VWidget-j2GIGGSX.js.map +1 -1
  151. package/dist/ValueWidget-3jNtnh5i.js.map +1 -1
  152. package/dist/ValueWidget-CjZeSiPQ.cjs.map +1 -1
  153. package/dist/ValuerangebarWidget-CpZYmUl_.cjs.map +1 -1
  154. package/dist/ValuerangebarWidget-DnZrho8S.js.map +1 -1
  155. package/dist/VerticalWidget-CcJMMaK_.cjs.map +1 -1
  156. package/dist/VerticalWidget-DJvoxqLE.js.map +1 -1
  157. package/dist/VerticalboxWidget-CJR_mOLa.cjs.map +1 -1
  158. package/dist/VerticalboxWidget-CYYyLBoO.js.map +1 -1
  159. package/dist/Widget-Bn_S-zBo.js.map +1 -1
  160. package/dist/Widget-O7wkmc39.cjs.map +1 -1
  161. package/dist/components.cjs.map +1 -1
  162. package/dist/components.js.map +1 -1
  163. package/dist/fileIcon-BduOQcTc.cjs.map +1 -1
  164. package/dist/fileIcon-DqRHb1_Z.js.map +1 -1
  165. package/dist/format-B22VpiOS.cjs.map +1 -1
  166. package/dist/format-CVeawcIv.js.map +1 -1
  167. package/dist/icons.cjs.map +1 -1
  168. package/dist/icons.js.map +1 -1
  169. package/dist/index-DcL65Mqb.cjs.map +1 -1
  170. package/dist/index-qCq0L4jN.js.map +1 -1
  171. package/dist/parse-DnkEsW-3.js.map +1 -1
  172. package/dist/parse-DwfgQboe.cjs.map +1 -1
  173. package/dist/plugins.cjs.map +1 -1
  174. package/dist/plugins.js.map +1 -1
  175. package/dist/timeFilters-BKnCM4rv.js.map +1 -1
  176. package/dist/timeFilters-CJFxfjqN.cjs.map +1 -1
  177. package/dist/tools/admin.cjs.map +1 -1
  178. package/dist/tools/admin.js.map +1 -1
  179. package/dist/tools/base.cjs.map +1 -1
  180. package/dist/tools/base.js.map +1 -1
  181. package/dist/tools/scriptrunner.cjs.map +1 -1
  182. package/dist/tools/scriptrunner.js.map +1 -1
  183. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"OutputDialog-CcSp-Uqo.js","sources":["../src/components/ace/AceEditorModes.js","../src/components/OutputDialog.vue"],"sourcesContent":["/*\n# Copyright 2024 OpenC3, Inc.\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 file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nimport * as ace from 'ace-builds'\nimport 'ace-builds/src-min-noconflict/mode-ruby'\nimport 'ace-builds/src-min-noconflict/mode-python'\nimport 'ace-builds/src-min-noconflict/mode-json'\nimport 'ace-builds/src-min-noconflict/mode-markdown'\nimport 'ace-builds/src-min-noconflict/theme-twilight'\nimport 'ace-builds/src-min-noconflict/ext-language_tools'\nimport 'ace-builds/src-min-noconflict/ext-searchbox'\nimport { OpenC3Api } from '@openc3/js-common/services'\n\nexport default {\n methods: {\n buildLanguageMode(HighlightRules, FoldMode) {\n let oop = ace.require('ace/lib/oop')\n let apis = Object.getOwnPropertyNames(OpenC3Api.prototype)\n .filter((a) => a !== 'constructor')\n .filter((a) => a !== 'exec')\n // Add the Public apis in api_shared but not in OpenC3Api\n .concat([\n 'check',\n 'check_raw',\n 'check_formatted',\n 'check_with_units',\n 'check_exception',\n 'check_tolerance',\n 'check_expression',\n 'wait',\n 'wait_tolerance',\n 'wait_expression',\n 'wait_check',\n 'wait_check_tolerance',\n 'wait_check_expression',\n 'wait_packet',\n 'wait_check_packet',\n 'disable_instrumentation',\n 'set_line_delay',\n 'get_line_delay',\n 'set_max_output',\n 'get_max_output',\n ])\n let regex = new RegExp(`(\\\\b${apis.join('\\\\b|\\\\b')}\\\\b)`)\n let OpenC3HighlightRules = function () {\n HighlightRules.call(this)\n // add openc3 rules to the rules\n for (let rule in this.$rules) {\n this.$rules[rule].unshift({\n regex: regex,\n token: 'support.function',\n })\n }\n }\n oop.inherits(OpenC3HighlightRules, HighlightRules)\n\n let MatchingBraceOutdent = ace.require(\n 'ace/mode/matching_brace_outdent',\n ).MatchingBraceOutdent\n let CstyleBehaviour = ace.require(\n 'ace/mode/behaviour/cstyle',\n ).CstyleBehaviour\n let Mode = function () {\n this.HighlightRules = OpenC3HighlightRules\n this.$outdent = new MatchingBraceOutdent()\n this.$behaviour = new CstyleBehaviour()\n this.foldingRules = new FoldMode()\n this.indentKeywords = this.foldingRules.indentKeywords\n }\n return [oop, Mode]\n },\n buildRubyMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/ruby_highlight_rules').RubyHighlightRules,\n ace.require('ace/mode/folding/ruby').FoldMode,\n )\n let RubyMode = ace.require('ace/mode/ruby').Mode\n oop.inherits(Mode, RubyMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n buildPythonMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/python_highlight_rules').PythonHighlightRules,\n ace.require('ace/mode/folding/pythonic').FoldMode,\n )\n let PythonMode = ace.require('ace/mode/python').Mode\n oop.inherits(Mode, PythonMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n buildJsonMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/json_highlight_rules').JsonHighlightRules,\n ace.require('ace/mode/folding/ruby').FoldMode,\n )\n let JsonMode = ace.require('ace/mode/json').Mode\n oop.inherits(Mode, JsonMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n buildMarkdownMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/markdown_highlight_rules').MarkdownHighlightRules,\n ace.require('ace/mode/folding/markdown').FoldMode,\n )\n let MarkdownMode = ace.require('ace/mode/markdown').Mode\n oop.inherits(Mode, MarkdownMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n },\n}\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2025, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" width=\"85vw\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span v-text=\"title\" />\n <v-spacer />\n <div class=\"mx-2\">\n <v-btn\n icon=\"mdi-download\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"downloadIcon\"\n @click=\"download\"\n />\n </div>\n </v-toolbar>\n <v-card-text>\n <pre ref=\"editor\" class=\"editor\"></pre>\n </v-card-text>\n <v-card-actions class=\"pr-6 pb-4 pt-0\">\n <v-spacer />\n <v-btn variant=\"flat\" @click=\"show = !show\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { AceEditorModes } from './ace'\n\nexport default {\n mixins: [AceEditorModes],\n props: {\n content: {\n type: String,\n required: true,\n },\n type: String,\n name: String,\n modelValue: Boolean,\n filename: {\n type: String,\n required: false,\n },\n },\n data() {\n return {\n editor: null,\n mode: null,\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n title: function () {\n return `${this.type}: ${this.name}`\n },\n },\n mounted() {\n this.editor = ace.edit(this.$refs.editor)\n this.editor.setTheme('ace/theme/twilight')\n let languageMode = null\n const fileExtension = this.filename ? this.filename.split('.').pop() : 'txt'\n switch (fileExtension) {\n case 'json':\n const JsonMode = this.buildJsonMode()\n languageMode = new JsonMode()\n this.editor.setOptions({\n useWorker: false,\n })\n break\n case 'py':\n case 'pyi':\n const PythonMode = this.buildPythonMode()\n languageMode = new PythonMode()\n break\n case 'md':\n const MarkdownMode = this.buildMarkdownMode()\n languageMode = new MarkdownMode()\n break\n default:\n // Most of the COSMOS text files are best display in Ruby\n // This includes Rakefiles, Gemfiles, etc.\n const RubyMode = this.buildRubyMode()\n languageMode = new RubyMode()\n break\n }\n this.editor.session.setMode(languageMode)\n this.editor.session.setUseWrapMode(true)\n this.editor.$blockScrolling = Infinity\n this.editor.setHighlightActiveLine(false)\n this.editor.setValue(this.content)\n this.editor.clearSelection()\n this.editor.focus()\n this.editor.setReadOnly(true)\n },\n beforeUnmount() {\n if (this.editor) {\n this.editor.destroy()\n }\n },\n methods: {\n close: function () {\n this.show = !this.show\n },\n download: function () {\n const blob = new Blob([this.editor.getValue()], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n let filename = `${this.type.toLowerCase()}_${this.name.toLowerCase()}.json`\n if (this.filename) {\n filename = this.filename\n }\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', filename)\n link.click()\n },\n },\n}\n</script>\n\n<style scoped>\n.editor {\n height: 75vh;\n position: relative;\n font-size: 16px;\n}\n\n.v-textarea :deep(textarea) {\n padding: 5px;\n}\n</style>\n"],"names":["AceEditorModes","HighlightRules","FoldMode","oop","ace.require","apis","OpenC3Api","a","regex","OpenC3HighlightRules","rule","MatchingBraceOutdent","CstyleBehaviour","Mode","RubyMode","PythonMode","JsonMode","MarkdownMode","_sfc_main","value","languageMode","blob","filename","link","_hoisted_1","_hoisted_2","_createBlock","_component_v_dialog","$options","_cache","$event","_withCtx","_createVNode","_component_v_card","_component_v_toolbar","_component_v_spacer","_createElementVNode","_toDisplayString","_component_v_btn","_component_v_card_text","_hoisted_3","_component_v_card_actions","_createTextVNode"],"mappings":"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"}
1
+ {"version":3,"file":"OutputDialog-CcSp-Uqo.js","sources":["../src/components/ace/AceEditorModes.js","../src/components/OutputDialog.vue"],"sourcesContent":["/*\n# Copyright 2024 OpenC3, Inc.\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 file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nimport * as ace from 'ace-builds'\nimport 'ace-builds/src-min-noconflict/mode-ruby'\nimport 'ace-builds/src-min-noconflict/mode-python'\nimport 'ace-builds/src-min-noconflict/mode-json'\nimport 'ace-builds/src-min-noconflict/mode-markdown'\nimport 'ace-builds/src-min-noconflict/theme-twilight'\nimport 'ace-builds/src-min-noconflict/ext-language_tools'\nimport 'ace-builds/src-min-noconflict/ext-searchbox'\nimport { OpenC3Api } from '@openc3/js-common/services'\n\nexport default {\n methods: {\n buildLanguageMode(HighlightRules, FoldMode) {\n let oop = ace.require('ace/lib/oop')\n let apis = Object.getOwnPropertyNames(OpenC3Api.prototype)\n .filter((a) => a !== 'constructor')\n .filter((a) => a !== 'exec')\n // Add the Public apis in api_shared but not in OpenC3Api\n .concat([\n 'check',\n 'check_raw',\n 'check_formatted',\n 'check_with_units',\n 'check_exception',\n 'check_tolerance',\n 'check_expression',\n 'wait',\n 'wait_tolerance',\n 'wait_expression',\n 'wait_check',\n 'wait_check_tolerance',\n 'wait_check_expression',\n 'wait_packet',\n 'wait_check_packet',\n 'disable_instrumentation',\n 'set_line_delay',\n 'get_line_delay',\n 'set_max_output',\n 'get_max_output',\n ])\n let regex = new RegExp(`(\\\\b${apis.join('\\\\b|\\\\b')}\\\\b)`)\n let OpenC3HighlightRules = function () {\n HighlightRules.call(this)\n // add openc3 rules to the rules\n for (let rule in this.$rules) {\n this.$rules[rule].unshift({\n regex: regex,\n token: 'support.function',\n })\n }\n }\n oop.inherits(OpenC3HighlightRules, HighlightRules)\n\n let MatchingBraceOutdent = ace.require(\n 'ace/mode/matching_brace_outdent',\n ).MatchingBraceOutdent\n let CstyleBehaviour = ace.require(\n 'ace/mode/behaviour/cstyle',\n ).CstyleBehaviour\n let Mode = function () {\n this.HighlightRules = OpenC3HighlightRules\n this.$outdent = new MatchingBraceOutdent()\n this.$behaviour = new CstyleBehaviour()\n this.foldingRules = new FoldMode()\n this.indentKeywords = this.foldingRules.indentKeywords\n }\n return [oop, Mode]\n },\n buildRubyMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/ruby_highlight_rules').RubyHighlightRules,\n ace.require('ace/mode/folding/ruby').FoldMode,\n )\n let RubyMode = ace.require('ace/mode/ruby').Mode\n oop.inherits(Mode, RubyMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n buildPythonMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/python_highlight_rules').PythonHighlightRules,\n ace.require('ace/mode/folding/pythonic').FoldMode,\n )\n let PythonMode = ace.require('ace/mode/python').Mode\n oop.inherits(Mode, PythonMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n buildJsonMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/json_highlight_rules').JsonHighlightRules,\n ace.require('ace/mode/folding/ruby').FoldMode,\n )\n let JsonMode = ace.require('ace/mode/json').Mode\n oop.inherits(Mode, JsonMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n buildMarkdownMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/markdown_highlight_rules').MarkdownHighlightRules,\n ace.require('ace/mode/folding/markdown').FoldMode,\n )\n let MarkdownMode = ace.require('ace/mode/markdown').Mode\n oop.inherits(Mode, MarkdownMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n },\n}\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2025, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" width=\"85vw\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span v-text=\"title\" />\n <v-spacer />\n <div class=\"mx-2\">\n <v-btn\n icon=\"mdi-download\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"downloadIcon\"\n @click=\"download\"\n />\n </div>\n </v-toolbar>\n <v-card-text>\n <pre ref=\"editor\" class=\"editor\"></pre>\n </v-card-text>\n <v-card-actions class=\"pr-6 pb-4 pt-0\">\n <v-spacer />\n <v-btn variant=\"flat\" @click=\"show = !show\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { AceEditorModes } from './ace'\n\nexport default {\n mixins: [AceEditorModes],\n props: {\n content: {\n type: String,\n required: true,\n },\n type: String,\n name: String,\n modelValue: Boolean,\n filename: {\n type: String,\n required: false,\n },\n },\n data() {\n return {\n editor: null,\n mode: null,\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n title: function () {\n return `${this.type}: ${this.name}`\n },\n },\n mounted() {\n this.editor = ace.edit(this.$refs.editor)\n this.editor.setTheme('ace/theme/twilight')\n let languageMode = null\n const fileExtension = this.filename ? this.filename.split('.').pop() : 'txt'\n switch (fileExtension) {\n case 'json':\n const JsonMode = this.buildJsonMode()\n languageMode = new JsonMode()\n this.editor.setOptions({\n useWorker: false,\n })\n break\n case 'py':\n case 'pyi':\n const PythonMode = this.buildPythonMode()\n languageMode = new PythonMode()\n break\n case 'md':\n const MarkdownMode = this.buildMarkdownMode()\n languageMode = new MarkdownMode()\n break\n default:\n // Most of the COSMOS text files are best display in Ruby\n // This includes Rakefiles, Gemfiles, etc.\n const RubyMode = this.buildRubyMode()\n languageMode = new RubyMode()\n break\n }\n this.editor.session.setMode(languageMode)\n this.editor.session.setUseWrapMode(true)\n this.editor.$blockScrolling = Infinity\n this.editor.setHighlightActiveLine(false)\n this.editor.setValue(this.content)\n this.editor.clearSelection()\n this.editor.focus()\n this.editor.setReadOnly(true)\n },\n beforeUnmount() {\n if (this.editor) {\n this.editor.destroy()\n }\n },\n methods: {\n close: function () {\n this.show = !this.show\n },\n download: function () {\n const blob = new Blob([this.editor.getValue()], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n let filename = `${this.type.toLowerCase()}_${this.name.toLowerCase()}.json`\n if (this.filename) {\n filename = this.filename\n }\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', filename)\n link.click()\n },\n },\n}\n</script>\n\n<style scoped>\n.editor {\n height: 75vh;\n position: relative;\n font-size: 16px;\n}\n\n.v-textarea :deep(textarea) {\n padding: 5px;\n}\n</style>\n"],"names":["AceEditorModes","HighlightRules","FoldMode","oop","ace.require","apis","OpenC3Api","a","regex","OpenC3HighlightRules","rule","MatchingBraceOutdent","CstyleBehaviour","Mode","RubyMode","PythonMode","JsonMode","MarkdownMode","_sfc_main","value","languageMode","blob","filename","link","_hoisted_1","_hoisted_2","_createBlock","_component_v_dialog","$options","_cache","$event","_withCtx","_createVNode","_component_v_card","_component_v_toolbar","_component_v_spacer","_createElementVNode","_toDisplayString","_component_v_btn","_component_v_card_text","_hoisted_3","_component_v_card_actions","_createTextVNode"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"OutputDialog-CxKDhrg6.cjs","sources":["../src/components/ace/AceEditorModes.js","../src/components/OutputDialog.vue"],"sourcesContent":["/*\n# Copyright 2024 OpenC3, Inc.\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 file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nimport * as ace from 'ace-builds'\nimport 'ace-builds/src-min-noconflict/mode-ruby'\nimport 'ace-builds/src-min-noconflict/mode-python'\nimport 'ace-builds/src-min-noconflict/mode-json'\nimport 'ace-builds/src-min-noconflict/mode-markdown'\nimport 'ace-builds/src-min-noconflict/theme-twilight'\nimport 'ace-builds/src-min-noconflict/ext-language_tools'\nimport 'ace-builds/src-min-noconflict/ext-searchbox'\nimport { OpenC3Api } from '@openc3/js-common/services'\n\nexport default {\n methods: {\n buildLanguageMode(HighlightRules, FoldMode) {\n let oop = ace.require('ace/lib/oop')\n let apis = Object.getOwnPropertyNames(OpenC3Api.prototype)\n .filter((a) => a !== 'constructor')\n .filter((a) => a !== 'exec')\n // Add the Public apis in api_shared but not in OpenC3Api\n .concat([\n 'check',\n 'check_raw',\n 'check_formatted',\n 'check_with_units',\n 'check_exception',\n 'check_tolerance',\n 'check_expression',\n 'wait',\n 'wait_tolerance',\n 'wait_expression',\n 'wait_check',\n 'wait_check_tolerance',\n 'wait_check_expression',\n 'wait_packet',\n 'wait_check_packet',\n 'disable_instrumentation',\n 'set_line_delay',\n 'get_line_delay',\n 'set_max_output',\n 'get_max_output',\n ])\n let regex = new RegExp(`(\\\\b${apis.join('\\\\b|\\\\b')}\\\\b)`)\n let OpenC3HighlightRules = function () {\n HighlightRules.call(this)\n // add openc3 rules to the rules\n for (let rule in this.$rules) {\n this.$rules[rule].unshift({\n regex: regex,\n token: 'support.function',\n })\n }\n }\n oop.inherits(OpenC3HighlightRules, HighlightRules)\n\n let MatchingBraceOutdent = ace.require(\n 'ace/mode/matching_brace_outdent',\n ).MatchingBraceOutdent\n let CstyleBehaviour = ace.require(\n 'ace/mode/behaviour/cstyle',\n ).CstyleBehaviour\n let Mode = function () {\n this.HighlightRules = OpenC3HighlightRules\n this.$outdent = new MatchingBraceOutdent()\n this.$behaviour = new CstyleBehaviour()\n this.foldingRules = new FoldMode()\n this.indentKeywords = this.foldingRules.indentKeywords\n }\n return [oop, Mode]\n },\n buildRubyMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/ruby_highlight_rules').RubyHighlightRules,\n ace.require('ace/mode/folding/ruby').FoldMode,\n )\n let RubyMode = ace.require('ace/mode/ruby').Mode\n oop.inherits(Mode, RubyMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n buildPythonMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/python_highlight_rules').PythonHighlightRules,\n ace.require('ace/mode/folding/pythonic').FoldMode,\n )\n let PythonMode = ace.require('ace/mode/python').Mode\n oop.inherits(Mode, PythonMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n buildJsonMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/json_highlight_rules').JsonHighlightRules,\n ace.require('ace/mode/folding/ruby').FoldMode,\n )\n let JsonMode = ace.require('ace/mode/json').Mode\n oop.inherits(Mode, JsonMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n buildMarkdownMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/markdown_highlight_rules').MarkdownHighlightRules,\n ace.require('ace/mode/folding/markdown').FoldMode,\n )\n let MarkdownMode = ace.require('ace/mode/markdown').Mode\n oop.inherits(Mode, MarkdownMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n },\n}\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2025, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" width=\"85vw\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span v-text=\"title\" />\n <v-spacer />\n <div class=\"mx-2\">\n <v-btn\n icon=\"mdi-download\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"downloadIcon\"\n @click=\"download\"\n />\n </div>\n </v-toolbar>\n <v-card-text>\n <pre ref=\"editor\" class=\"editor\"></pre>\n </v-card-text>\n <v-card-actions class=\"pr-6 pb-4 pt-0\">\n <v-spacer />\n <v-btn variant=\"flat\" @click=\"show = !show\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { AceEditorModes } from './ace'\n\nexport default {\n mixins: [AceEditorModes],\n props: {\n content: {\n type: String,\n required: true,\n },\n type: String,\n name: String,\n modelValue: Boolean,\n filename: {\n type: String,\n required: false,\n },\n },\n data() {\n return {\n editor: null,\n mode: null,\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n title: function () {\n return `${this.type}: ${this.name}`\n },\n },\n mounted() {\n this.editor = ace.edit(this.$refs.editor)\n this.editor.setTheme('ace/theme/twilight')\n let languageMode = null\n const fileExtension = this.filename ? this.filename.split('.').pop() : 'txt'\n switch (fileExtension) {\n case 'json':\n const JsonMode = this.buildJsonMode()\n languageMode = new JsonMode()\n this.editor.setOptions({\n useWorker: false,\n })\n break\n case 'py':\n case 'pyi':\n const PythonMode = this.buildPythonMode()\n languageMode = new PythonMode()\n break\n case 'md':\n const MarkdownMode = this.buildMarkdownMode()\n languageMode = new MarkdownMode()\n break\n default:\n // Most of the COSMOS text files are best display in Ruby\n // This includes Rakefiles, Gemfiles, etc.\n const RubyMode = this.buildRubyMode()\n languageMode = new RubyMode()\n break\n }\n this.editor.session.setMode(languageMode)\n this.editor.session.setUseWrapMode(true)\n this.editor.$blockScrolling = Infinity\n this.editor.setHighlightActiveLine(false)\n this.editor.setValue(this.content)\n this.editor.clearSelection()\n this.editor.focus()\n this.editor.setReadOnly(true)\n },\n beforeUnmount() {\n if (this.editor) {\n this.editor.destroy()\n }\n },\n methods: {\n close: function () {\n this.show = !this.show\n },\n download: function () {\n const blob = new Blob([this.editor.getValue()], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n let filename = `${this.type.toLowerCase()}_${this.name.toLowerCase()}.json`\n if (this.filename) {\n filename = this.filename\n }\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', filename)\n link.click()\n },\n },\n}\n</script>\n\n<style scoped>\n.editor {\n height: 75vh;\n position: relative;\n font-size: 16px;\n}\n\n.v-textarea :deep(textarea) {\n padding: 5px;\n}\n</style>\n"],"names":["AceEditorModes","HighlightRules","FoldMode","oop","ace.require","apis","OpenC3Api","a","regex","OpenC3HighlightRules","rule","MatchingBraceOutdent","CstyleBehaviour","Mode","RubyMode","PythonMode","JsonMode","MarkdownMode","_sfc_main","value","languageMode","blob","filename","link","_hoisted_1","_hoisted_2","_createBlock","_component_v_dialog","$options","_cache","$event","_withCtx","_createVNode","_component_v_card","_component_v_toolbar","_component_v_spacer","_createElementVNode","_toDisplayString","_component_v_btn","_component_v_card_text","_hoisted_3","_component_v_card_actions","_createTextVNode"],"mappings":"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"}
1
+ {"version":3,"file":"OutputDialog-CxKDhrg6.cjs","sources":["../src/components/ace/AceEditorModes.js","../src/components/OutputDialog.vue"],"sourcesContent":["/*\n# Copyright 2024 OpenC3, Inc.\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 file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nimport * as ace from 'ace-builds'\nimport 'ace-builds/src-min-noconflict/mode-ruby'\nimport 'ace-builds/src-min-noconflict/mode-python'\nimport 'ace-builds/src-min-noconflict/mode-json'\nimport 'ace-builds/src-min-noconflict/mode-markdown'\nimport 'ace-builds/src-min-noconflict/theme-twilight'\nimport 'ace-builds/src-min-noconflict/ext-language_tools'\nimport 'ace-builds/src-min-noconflict/ext-searchbox'\nimport { OpenC3Api } from '@openc3/js-common/services'\n\nexport default {\n methods: {\n buildLanguageMode(HighlightRules, FoldMode) {\n let oop = ace.require('ace/lib/oop')\n let apis = Object.getOwnPropertyNames(OpenC3Api.prototype)\n .filter((a) => a !== 'constructor')\n .filter((a) => a !== 'exec')\n // Add the Public apis in api_shared but not in OpenC3Api\n .concat([\n 'check',\n 'check_raw',\n 'check_formatted',\n 'check_with_units',\n 'check_exception',\n 'check_tolerance',\n 'check_expression',\n 'wait',\n 'wait_tolerance',\n 'wait_expression',\n 'wait_check',\n 'wait_check_tolerance',\n 'wait_check_expression',\n 'wait_packet',\n 'wait_check_packet',\n 'disable_instrumentation',\n 'set_line_delay',\n 'get_line_delay',\n 'set_max_output',\n 'get_max_output',\n ])\n let regex = new RegExp(`(\\\\b${apis.join('\\\\b|\\\\b')}\\\\b)`)\n let OpenC3HighlightRules = function () {\n HighlightRules.call(this)\n // add openc3 rules to the rules\n for (let rule in this.$rules) {\n this.$rules[rule].unshift({\n regex: regex,\n token: 'support.function',\n })\n }\n }\n oop.inherits(OpenC3HighlightRules, HighlightRules)\n\n let MatchingBraceOutdent = ace.require(\n 'ace/mode/matching_brace_outdent',\n ).MatchingBraceOutdent\n let CstyleBehaviour = ace.require(\n 'ace/mode/behaviour/cstyle',\n ).CstyleBehaviour\n let Mode = function () {\n this.HighlightRules = OpenC3HighlightRules\n this.$outdent = new MatchingBraceOutdent()\n this.$behaviour = new CstyleBehaviour()\n this.foldingRules = new FoldMode()\n this.indentKeywords = this.foldingRules.indentKeywords\n }\n return [oop, Mode]\n },\n buildRubyMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/ruby_highlight_rules').RubyHighlightRules,\n ace.require('ace/mode/folding/ruby').FoldMode,\n )\n let RubyMode = ace.require('ace/mode/ruby').Mode\n oop.inherits(Mode, RubyMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n buildPythonMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/python_highlight_rules').PythonHighlightRules,\n ace.require('ace/mode/folding/pythonic').FoldMode,\n )\n let PythonMode = ace.require('ace/mode/python').Mode\n oop.inherits(Mode, PythonMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n buildJsonMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/json_highlight_rules').JsonHighlightRules,\n ace.require('ace/mode/folding/ruby').FoldMode,\n )\n let JsonMode = ace.require('ace/mode/json').Mode\n oop.inherits(Mode, JsonMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n buildMarkdownMode() {\n const [oop, Mode] = this.buildLanguageMode(\n ace.require('ace/mode/markdown_highlight_rules').MarkdownHighlightRules,\n ace.require('ace/mode/folding/markdown').FoldMode,\n )\n let MarkdownMode = ace.require('ace/mode/markdown').Mode\n oop.inherits(Mode, MarkdownMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n },\n}\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2025, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" width=\"85vw\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span v-text=\"title\" />\n <v-spacer />\n <div class=\"mx-2\">\n <v-btn\n icon=\"mdi-download\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"downloadIcon\"\n @click=\"download\"\n />\n </div>\n </v-toolbar>\n <v-card-text>\n <pre ref=\"editor\" class=\"editor\"></pre>\n </v-card-text>\n <v-card-actions class=\"pr-6 pb-4 pt-0\">\n <v-spacer />\n <v-btn variant=\"flat\" @click=\"show = !show\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { AceEditorModes } from './ace'\n\nexport default {\n mixins: [AceEditorModes],\n props: {\n content: {\n type: String,\n required: true,\n },\n type: String,\n name: String,\n modelValue: Boolean,\n filename: {\n type: String,\n required: false,\n },\n },\n data() {\n return {\n editor: null,\n mode: null,\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n title: function () {\n return `${this.type}: ${this.name}`\n },\n },\n mounted() {\n this.editor = ace.edit(this.$refs.editor)\n this.editor.setTheme('ace/theme/twilight')\n let languageMode = null\n const fileExtension = this.filename ? this.filename.split('.').pop() : 'txt'\n switch (fileExtension) {\n case 'json':\n const JsonMode = this.buildJsonMode()\n languageMode = new JsonMode()\n this.editor.setOptions({\n useWorker: false,\n })\n break\n case 'py':\n case 'pyi':\n const PythonMode = this.buildPythonMode()\n languageMode = new PythonMode()\n break\n case 'md':\n const MarkdownMode = this.buildMarkdownMode()\n languageMode = new MarkdownMode()\n break\n default:\n // Most of the COSMOS text files are best display in Ruby\n // This includes Rakefiles, Gemfiles, etc.\n const RubyMode = this.buildRubyMode()\n languageMode = new RubyMode()\n break\n }\n this.editor.session.setMode(languageMode)\n this.editor.session.setUseWrapMode(true)\n this.editor.$blockScrolling = Infinity\n this.editor.setHighlightActiveLine(false)\n this.editor.setValue(this.content)\n this.editor.clearSelection()\n this.editor.focus()\n this.editor.setReadOnly(true)\n },\n beforeUnmount() {\n if (this.editor) {\n this.editor.destroy()\n }\n },\n methods: {\n close: function () {\n this.show = !this.show\n },\n download: function () {\n const blob = new Blob([this.editor.getValue()], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n let filename = `${this.type.toLowerCase()}_${this.name.toLowerCase()}.json`\n if (this.filename) {\n filename = this.filename\n }\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', filename)\n link.click()\n },\n },\n}\n</script>\n\n<style scoped>\n.editor {\n height: 75vh;\n position: relative;\n font-size: 16px;\n}\n\n.v-textarea :deep(textarea) {\n padding: 5px;\n}\n</style>\n"],"names":["AceEditorModes","HighlightRules","FoldMode","oop","ace.require","apis","OpenC3Api","a","regex","OpenC3HighlightRules","rule","MatchingBraceOutdent","CstyleBehaviour","Mode","RubyMode","PythonMode","JsonMode","MarkdownMode","_sfc_main","value","languageMode","blob","filename","link","_hoisted_1","_hoisted_2","_createBlock","_component_v_dialog","$options","_cache","$event","_withCtx","_createVNode","_component_v_card","_component_v_toolbar","_component_v_spacer","_createElementVNode","_toDisplayString","_component_v_btn","_component_v_card_text","_hoisted_3","_component_v_card_actions","_createTextVNode"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PackagesTab-B4V2n4io.cjs","sources":["../src/tools/admin/tabs/PackagesTab.vue"],"sourcesContent":["<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2025, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-row no-gutters align=\"center\" class=\"px-2\">\n <v-col class=\"pa-2 mt-2\">\n <v-btn @click=\"selectFile\">Install Package</v-btn>\n <input\n ref=\"fileInput\"\n style=\"display: none\"\n type=\"file\"\n @change=\"fileChange\"\n />\n </v-col>\n <v-col class=\"ml-4 mr-2\" cols=\"4\">\n <rux-progress :value=\"progress\"></rux-progress>\n </v-col>\n </v-row>\n <v-list\n v-if=\"Object.keys(processes).length > 0\"\n class=\"list\"\n data-test=\"process-list\"\n >\n <v-row no-gutters class=\"px-4\">\n <v-col class=\"text-h6\">Process List</v-col>\n <v-col align=\"right\">\n <!-- See openc3/lib/openc3/utilities/process_manager.rb CLEANUP_CYCLE_SECONDS -->\n <div>Showing last 10 min of activity</div>\n </v-col>\n </v-row>\n <div v-for=\"process in processes\" :key=\"process.name\">\n <v-list-item>\n <v-list-item-title>\n <span\n :class=\"process.state.toLowerCase()\"\n v-text=\"\n `Processing ${process.process_type}: ${process.detail} - ${process.state}`\n \"\n />\n </v-list-item-title>\n <v-list-item-subtitle>\n <span v-text=\"' Updated At: ' + formatDate(process.updated_at)\" />\n </v-list-item-subtitle>\n\n <template v-if=\"process.state !== 'Running'\" #append>\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n icon=\"mdi-eye\"\n variant=\"text\"\n aria-label=\"Show Output\"\n @click=\"showOutput(process)\"\n />\n </template>\n <span>Show Output</span>\n </v-tooltip>\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <v-list class=\"list\" data-test=\"packageList\">\n <v-row class=\"px-4\"><v-col class=\"text-h6\">Ruby Gems</v-col></v-row>\n <div v-for=\"(gem, index) in gems\" :key=\"index\">\n <v-list-item>\n <v-list-item-title>{{ gem }}</v-list-item-title>\n\n <template #append>\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Delete Ruby Gem\"\n @click=\"deletePackage(gem)\"\n />\n </template>\n </v-list-item>\n <v-divider />\n </div>\n <v-row class=\"px-4\"><v-col class=\"text-h6\">Python Packages</v-col></v-row>\n <div v-for=\"(pkg, index) in python\" :key=\"index\">\n <v-list-item>\n <v-list-item-title>{{ pkg }}</v-list-item-title>\n\n <template #append>\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Delete Python Package\"\n @click=\"deletePackage(pkg)\"\n />\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <download-dialog v-model=\"showDownloadDialog\" />\n <simple-text-dialog\n v-model=\"showProcessOutput\"\n title=\"Process Output\"\n :text=\"processOutput\"\n />\n </div>\n</template>\n\n<script>\nimport { toDate, format } from 'date-fns'\nimport { Api } from '@openc3/js-common/services'\nimport { SimpleTextDialog } from '@/components'\nimport { DownloadDialog } from '@/tools/admin'\n\nexport default {\n components: {\n DownloadDialog,\n SimpleTextDialog,\n },\n data() {\n return {\n showDownloadDialog: false,\n showProcessOutput: false,\n processOutput: '',\n files: [],\n loadingPackage: false,\n progress: 0,\n gems: [],\n python: [],\n processes: {},\n }\n },\n mounted() {\n this.update()\n this.updateProcesses()\n },\n methods: {\n showOutput: function (process) {\n this.processOutput = process.output\n this.showProcessOutput = true\n },\n update() {\n Api.get('/openc3-api/packages').then((response) => {\n this.gems = response.data.ruby\n this.python = response.data.python\n })\n },\n updateProcesses: function () {\n Api.get('/openc3-api/process_status/package_?substr=true').then(\n (response) => {\n this.processes = response.data\n if (Object.keys(this.processes).length > 0) {\n // process_manager.rb script operates on a 5 second cycle\n setTimeout(() => {\n this.updateProcesses()\n this.update()\n }, 2500)\n }\n },\n )\n },\n formatDate(nanoSecs) {\n return format(\n toDate(parseInt(nanoSecs) / 1000000),\n 'yyyy-MM-dd HH:mm:ss.SSS',\n )\n },\n selectFile() {\n this.progress = 0\n this.$refs.fileInput.click()\n },\n fileChange(event) {\n const files = event.target.files\n if (files.length > 0) {\n this.loadingPackage = true\n let self = this\n const promises = [...files].map((file) => {\n const formData = new FormData()\n formData.append('package', file, file.name)\n return Api.post('/openc3-api/packages', {\n data: formData,\n headers: { 'Content-Type': 'multipart/form-data' },\n onUploadProgress: function (progressEvent) {\n let percentCompleted = Math.round(\n (progressEvent.loaded * 100) / progressEvent.total,\n )\n self.progress = percentCompleted\n },\n })\n })\n Promise.all(promises)\n .then((responses) => {\n this.$notify.normal({\n body: `Uploaded ${responses.length} package${\n responses.length > 1 ? 's' : ''\n }`,\n })\n this.loadingPackage = false\n this.files = []\n setTimeout(() => {\n this.updateProcesses()\n }, 2500)\n })\n .catch((error) => {\n this.loadingPackage = false\n })\n }\n },\n deletePackage(pkg) {\n this.$dialog\n .confirm(`Are you sure you want to remove: ${pkg}`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n return Api.delete(`/openc3-api/packages/${pkg}`)\n })\n .then((response) => {\n this.$notify.normal({\n body: `Removed package ${pkg}`,\n })\n setTimeout(() => {\n this.updateProcesses()\n }, 2500)\n })\n // Error will probably never happen because we spawn the package removal\n // and then wait for the response which happens in the background\n .catch((error) => {\n this.$notify.serious({\n body: `Failed to remove package ${pkg}`,\n })\n })\n },\n },\n}\n</script>\n\n<style scoped>\n.v-subheader {\n font-size: 1rem;\n}\n.list {\n background-color: var(--color-background-surface-default) !important;\n overflow-x: hidden;\n}\n.v-theme--cosmosDark.v-list div:nth-child(odd) .v-list-item {\n background-color: var(--color-background-base-selected) !important;\n}\n</style>\n"],"names":["_sfc_main","DownloadDialog","SimpleTextDialog","process","Api","response","nanoSecs","format","toDate","event","files","self","promises","file","formData","progressEvent","percentCompleted","responses","error","pkg","dialog","_hoisted_1","_hoisted_2","_createElementBlock","_createVNode","_component_v_row","_withCtx","_component_v_col","_component_v_btn","$options","_cache","_createTextVNode","_createElementVNode","args","_component_rux_progress","$data","_createBlock","_component_v_list","_openBlock","_Fragment","_renderList","_component_v_list_item","_createSlots","_component_v_list_item_title","_normalizeClass","_toDisplayString","_component_v_list_item_subtitle","_component_v_tooltip","props","_mergeProps","$event","_component_v_divider","_createCommentVNode","gem","index","_component_download_dialog","_component_simple_text_dialog"],"mappings":"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"}
1
+ {"version":3,"file":"PackagesTab-B4V2n4io.cjs","sources":["../src/tools/admin/tabs/PackagesTab.vue"],"sourcesContent":["<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2025, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-row no-gutters align=\"center\" class=\"px-2\">\n <v-col class=\"pa-2 mt-2\">\n <v-btn @click=\"selectFile\">Install Package</v-btn>\n <input\n ref=\"fileInput\"\n style=\"display: none\"\n type=\"file\"\n @change=\"fileChange\"\n />\n </v-col>\n <v-col class=\"ml-4 mr-2\" cols=\"4\">\n <rux-progress :value=\"progress\"></rux-progress>\n </v-col>\n </v-row>\n <v-list\n v-if=\"Object.keys(processes).length > 0\"\n class=\"list\"\n data-test=\"process-list\"\n >\n <v-row no-gutters class=\"px-4\">\n <v-col class=\"text-h6\">Process List</v-col>\n <v-col align=\"right\">\n <!-- See openc3/lib/openc3/utilities/process_manager.rb CLEANUP_CYCLE_SECONDS -->\n <div>Showing last 10 min of activity</div>\n </v-col>\n </v-row>\n <div v-for=\"process in processes\" :key=\"process.name\">\n <v-list-item>\n <v-list-item-title>\n <span\n :class=\"process.state.toLowerCase()\"\n v-text=\"\n `Processing ${process.process_type}: ${process.detail} - ${process.state}`\n \"\n />\n </v-list-item-title>\n <v-list-item-subtitle>\n <span v-text=\"' Updated At: ' + formatDate(process.updated_at)\" />\n </v-list-item-subtitle>\n\n <template v-if=\"process.state !== 'Running'\" #append>\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n icon=\"mdi-eye\"\n variant=\"text\"\n aria-label=\"Show Output\"\n @click=\"showOutput(process)\"\n />\n </template>\n <span>Show Output</span>\n </v-tooltip>\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <v-list class=\"list\" data-test=\"packageList\">\n <v-row class=\"px-4\"><v-col class=\"text-h6\">Ruby Gems</v-col></v-row>\n <div v-for=\"(gem, index) in gems\" :key=\"index\">\n <v-list-item>\n <v-list-item-title>{{ gem }}</v-list-item-title>\n\n <template #append>\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Delete Ruby Gem\"\n @click=\"deletePackage(gem)\"\n />\n </template>\n </v-list-item>\n <v-divider />\n </div>\n <v-row class=\"px-4\"><v-col class=\"text-h6\">Python Packages</v-col></v-row>\n <div v-for=\"(pkg, index) in python\" :key=\"index\">\n <v-list-item>\n <v-list-item-title>{{ pkg }}</v-list-item-title>\n\n <template #append>\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Delete Python Package\"\n @click=\"deletePackage(pkg)\"\n />\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <download-dialog v-model=\"showDownloadDialog\" />\n <simple-text-dialog\n v-model=\"showProcessOutput\"\n title=\"Process Output\"\n :text=\"processOutput\"\n />\n </div>\n</template>\n\n<script>\nimport { toDate, format } from 'date-fns'\nimport { Api } from '@openc3/js-common/services'\nimport { SimpleTextDialog } from '@/components'\nimport { DownloadDialog } from '@/tools/admin'\n\nexport default {\n components: {\n DownloadDialog,\n SimpleTextDialog,\n },\n data() {\n return {\n showDownloadDialog: false,\n showProcessOutput: false,\n processOutput: '',\n files: [],\n loadingPackage: false,\n progress: 0,\n gems: [],\n python: [],\n processes: {},\n }\n },\n mounted() {\n this.update()\n this.updateProcesses()\n },\n methods: {\n showOutput: function (process) {\n this.processOutput = process.output\n this.showProcessOutput = true\n },\n update() {\n Api.get('/openc3-api/packages').then((response) => {\n this.gems = response.data.ruby\n this.python = response.data.python\n })\n },\n updateProcesses: function () {\n Api.get('/openc3-api/process_status/package_?substr=true').then(\n (response) => {\n this.processes = response.data\n if (Object.keys(this.processes).length > 0) {\n // process_manager.rb script operates on a 5 second cycle\n setTimeout(() => {\n this.updateProcesses()\n this.update()\n }, 2500)\n }\n },\n )\n },\n formatDate(nanoSecs) {\n return format(\n toDate(parseInt(nanoSecs) / 1000000),\n 'yyyy-MM-dd HH:mm:ss.SSS',\n )\n },\n selectFile() {\n this.progress = 0\n this.$refs.fileInput.click()\n },\n fileChange(event) {\n const files = event.target.files\n if (files.length > 0) {\n this.loadingPackage = true\n let self = this\n const promises = [...files].map((file) => {\n const formData = new FormData()\n formData.append('package', file, file.name)\n return Api.post('/openc3-api/packages', {\n data: formData,\n headers: { 'Content-Type': 'multipart/form-data' },\n onUploadProgress: function (progressEvent) {\n let percentCompleted = Math.round(\n (progressEvent.loaded * 100) / progressEvent.total,\n )\n self.progress = percentCompleted\n },\n })\n })\n Promise.all(promises)\n .then((responses) => {\n this.$notify.normal({\n body: `Uploaded ${responses.length} package${\n responses.length > 1 ? 's' : ''\n }`,\n })\n this.loadingPackage = false\n this.files = []\n setTimeout(() => {\n this.updateProcesses()\n }, 2500)\n })\n .catch((error) => {\n this.loadingPackage = false\n })\n }\n },\n deletePackage(pkg) {\n this.$dialog\n .confirm(`Are you sure you want to remove: ${pkg}`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n return Api.delete(`/openc3-api/packages/${pkg}`)\n })\n .then((response) => {\n this.$notify.normal({\n body: `Removed package ${pkg}`,\n })\n setTimeout(() => {\n this.updateProcesses()\n }, 2500)\n })\n // Error will probably never happen because we spawn the package removal\n // and then wait for the response which happens in the background\n .catch((error) => {\n this.$notify.serious({\n body: `Failed to remove package ${pkg}`,\n })\n })\n },\n },\n}\n</script>\n\n<style scoped>\n.v-subheader {\n font-size: 1rem;\n}\n.list {\n background-color: var(--color-background-surface-default) !important;\n overflow-x: hidden;\n}\n.v-theme--cosmosDark.v-list div:nth-child(odd) .v-list-item {\n background-color: var(--color-background-base-selected) !important;\n}\n</style>\n"],"names":["_sfc_main","DownloadDialog","SimpleTextDialog","process","Api","response","nanoSecs","format","toDate","event","files","self","promises","file","formData","progressEvent","percentCompleted","responses","error","pkg","dialog","_hoisted_1","_hoisted_2","_createElementBlock","_createVNode","_component_v_row","_withCtx","_component_v_col","_component_v_btn","$options","_cache","_createTextVNode","_createElementVNode","args","_component_rux_progress","$data","_createBlock","_component_v_list","_openBlock","_Fragment","_renderList","_component_v_list_item","_createSlots","_component_v_list_item_title","_normalizeClass","_toDisplayString","_component_v_list_item_subtitle","_component_v_tooltip","props","_mergeProps","$event","_component_v_divider","_createCommentVNode","gem","index","_component_download_dialog","_component_simple_text_dialog"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PackagesTab-Dx25CfF0.js","sources":["../src/tools/admin/tabs/PackagesTab.vue"],"sourcesContent":["<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2025, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-row no-gutters align=\"center\" class=\"px-2\">\n <v-col class=\"pa-2 mt-2\">\n <v-btn @click=\"selectFile\">Install Package</v-btn>\n <input\n ref=\"fileInput\"\n style=\"display: none\"\n type=\"file\"\n @change=\"fileChange\"\n />\n </v-col>\n <v-col class=\"ml-4 mr-2\" cols=\"4\">\n <rux-progress :value=\"progress\"></rux-progress>\n </v-col>\n </v-row>\n <v-list\n v-if=\"Object.keys(processes).length > 0\"\n class=\"list\"\n data-test=\"process-list\"\n >\n <v-row no-gutters class=\"px-4\">\n <v-col class=\"text-h6\">Process List</v-col>\n <v-col align=\"right\">\n <!-- See openc3/lib/openc3/utilities/process_manager.rb CLEANUP_CYCLE_SECONDS -->\n <div>Showing last 10 min of activity</div>\n </v-col>\n </v-row>\n <div v-for=\"process in processes\" :key=\"process.name\">\n <v-list-item>\n <v-list-item-title>\n <span\n :class=\"process.state.toLowerCase()\"\n v-text=\"\n `Processing ${process.process_type}: ${process.detail} - ${process.state}`\n \"\n />\n </v-list-item-title>\n <v-list-item-subtitle>\n <span v-text=\"' Updated At: ' + formatDate(process.updated_at)\" />\n </v-list-item-subtitle>\n\n <template v-if=\"process.state !== 'Running'\" #append>\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n icon=\"mdi-eye\"\n variant=\"text\"\n aria-label=\"Show Output\"\n @click=\"showOutput(process)\"\n />\n </template>\n <span>Show Output</span>\n </v-tooltip>\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <v-list class=\"list\" data-test=\"packageList\">\n <v-row class=\"px-4\"><v-col class=\"text-h6\">Ruby Gems</v-col></v-row>\n <div v-for=\"(gem, index) in gems\" :key=\"index\">\n <v-list-item>\n <v-list-item-title>{{ gem }}</v-list-item-title>\n\n <template #append>\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Delete Ruby Gem\"\n @click=\"deletePackage(gem)\"\n />\n </template>\n </v-list-item>\n <v-divider />\n </div>\n <v-row class=\"px-4\"><v-col class=\"text-h6\">Python Packages</v-col></v-row>\n <div v-for=\"(pkg, index) in python\" :key=\"index\">\n <v-list-item>\n <v-list-item-title>{{ pkg }}</v-list-item-title>\n\n <template #append>\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Delete Python Package\"\n @click=\"deletePackage(pkg)\"\n />\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <download-dialog v-model=\"showDownloadDialog\" />\n <simple-text-dialog\n v-model=\"showProcessOutput\"\n title=\"Process Output\"\n :text=\"processOutput\"\n />\n </div>\n</template>\n\n<script>\nimport { toDate, format } from 'date-fns'\nimport { Api } from '@openc3/js-common/services'\nimport { SimpleTextDialog } from '@/components'\nimport { DownloadDialog } from '@/tools/admin'\n\nexport default {\n components: {\n DownloadDialog,\n SimpleTextDialog,\n },\n data() {\n return {\n showDownloadDialog: false,\n showProcessOutput: false,\n processOutput: '',\n files: [],\n loadingPackage: false,\n progress: 0,\n gems: [],\n python: [],\n processes: {},\n }\n },\n mounted() {\n this.update()\n this.updateProcesses()\n },\n methods: {\n showOutput: function (process) {\n this.processOutput = process.output\n this.showProcessOutput = true\n },\n update() {\n Api.get('/openc3-api/packages').then((response) => {\n this.gems = response.data.ruby\n this.python = response.data.python\n })\n },\n updateProcesses: function () {\n Api.get('/openc3-api/process_status/package_?substr=true').then(\n (response) => {\n this.processes = response.data\n if (Object.keys(this.processes).length > 0) {\n // process_manager.rb script operates on a 5 second cycle\n setTimeout(() => {\n this.updateProcesses()\n this.update()\n }, 2500)\n }\n },\n )\n },\n formatDate(nanoSecs) {\n return format(\n toDate(parseInt(nanoSecs) / 1000000),\n 'yyyy-MM-dd HH:mm:ss.SSS',\n )\n },\n selectFile() {\n this.progress = 0\n this.$refs.fileInput.click()\n },\n fileChange(event) {\n const files = event.target.files\n if (files.length > 0) {\n this.loadingPackage = true\n let self = this\n const promises = [...files].map((file) => {\n const formData = new FormData()\n formData.append('package', file, file.name)\n return Api.post('/openc3-api/packages', {\n data: formData,\n headers: { 'Content-Type': 'multipart/form-data' },\n onUploadProgress: function (progressEvent) {\n let percentCompleted = Math.round(\n (progressEvent.loaded * 100) / progressEvent.total,\n )\n self.progress = percentCompleted\n },\n })\n })\n Promise.all(promises)\n .then((responses) => {\n this.$notify.normal({\n body: `Uploaded ${responses.length} package${\n responses.length > 1 ? 's' : ''\n }`,\n })\n this.loadingPackage = false\n this.files = []\n setTimeout(() => {\n this.updateProcesses()\n }, 2500)\n })\n .catch((error) => {\n this.loadingPackage = false\n })\n }\n },\n deletePackage(pkg) {\n this.$dialog\n .confirm(`Are you sure you want to remove: ${pkg}`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n return Api.delete(`/openc3-api/packages/${pkg}`)\n })\n .then((response) => {\n this.$notify.normal({\n body: `Removed package ${pkg}`,\n })\n setTimeout(() => {\n this.updateProcesses()\n }, 2500)\n })\n // Error will probably never happen because we spawn the package removal\n // and then wait for the response which happens in the background\n .catch((error) => {\n this.$notify.serious({\n body: `Failed to remove package ${pkg}`,\n })\n })\n },\n },\n}\n</script>\n\n<style scoped>\n.v-subheader {\n font-size: 1rem;\n}\n.list {\n background-color: var(--color-background-surface-default) !important;\n overflow-x: hidden;\n}\n.v-theme--cosmosDark.v-list div:nth-child(odd) .v-list-item {\n background-color: var(--color-background-base-selected) !important;\n}\n</style>\n"],"names":["_sfc_main","DownloadDialog","SimpleTextDialog","process","Api","response","nanoSecs","format","toDate","event","files","self","promises","file","formData","progressEvent","percentCompleted","responses","error","pkg","dialog","_hoisted_1","_hoisted_2","_createElementBlock","_createVNode","_component_v_row","_withCtx","_component_v_col","_component_v_btn","$options","_cache","_createTextVNode","_createElementVNode","args","_component_rux_progress","$data","_createBlock","_component_v_list","_openBlock","_Fragment","_renderList","_component_v_list_item","_createSlots","_component_v_list_item_title","_normalizeClass","_toDisplayString","_component_v_list_item_subtitle","_component_v_tooltip","props","_mergeProps","$event","_component_v_divider","_createCommentVNode","gem","index","_component_download_dialog","_component_simple_text_dialog"],"mappings":"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"}
1
+ {"version":3,"file":"PackagesTab-Dx25CfF0.js","sources":["../src/tools/admin/tabs/PackagesTab.vue"],"sourcesContent":["<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2025, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-row no-gutters align=\"center\" class=\"px-2\">\n <v-col class=\"pa-2 mt-2\">\n <v-btn @click=\"selectFile\">Install Package</v-btn>\n <input\n ref=\"fileInput\"\n style=\"display: none\"\n type=\"file\"\n @change=\"fileChange\"\n />\n </v-col>\n <v-col class=\"ml-4 mr-2\" cols=\"4\">\n <rux-progress :value=\"progress\"></rux-progress>\n </v-col>\n </v-row>\n <v-list\n v-if=\"Object.keys(processes).length > 0\"\n class=\"list\"\n data-test=\"process-list\"\n >\n <v-row no-gutters class=\"px-4\">\n <v-col class=\"text-h6\">Process List</v-col>\n <v-col align=\"right\">\n <!-- See openc3/lib/openc3/utilities/process_manager.rb CLEANUP_CYCLE_SECONDS -->\n <div>Showing last 10 min of activity</div>\n </v-col>\n </v-row>\n <div v-for=\"process in processes\" :key=\"process.name\">\n <v-list-item>\n <v-list-item-title>\n <span\n :class=\"process.state.toLowerCase()\"\n v-text=\"\n `Processing ${process.process_type}: ${process.detail} - ${process.state}`\n \"\n />\n </v-list-item-title>\n <v-list-item-subtitle>\n <span v-text=\"' Updated At: ' + formatDate(process.updated_at)\" />\n </v-list-item-subtitle>\n\n <template v-if=\"process.state !== 'Running'\" #append>\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n icon=\"mdi-eye\"\n variant=\"text\"\n aria-label=\"Show Output\"\n @click=\"showOutput(process)\"\n />\n </template>\n <span>Show Output</span>\n </v-tooltip>\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <v-list class=\"list\" data-test=\"packageList\">\n <v-row class=\"px-4\"><v-col class=\"text-h6\">Ruby Gems</v-col></v-row>\n <div v-for=\"(gem, index) in gems\" :key=\"index\">\n <v-list-item>\n <v-list-item-title>{{ gem }}</v-list-item-title>\n\n <template #append>\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Delete Ruby Gem\"\n @click=\"deletePackage(gem)\"\n />\n </template>\n </v-list-item>\n <v-divider />\n </div>\n <v-row class=\"px-4\"><v-col class=\"text-h6\">Python Packages</v-col></v-row>\n <div v-for=\"(pkg, index) in python\" :key=\"index\">\n <v-list-item>\n <v-list-item-title>{{ pkg }}</v-list-item-title>\n\n <template #append>\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Delete Python Package\"\n @click=\"deletePackage(pkg)\"\n />\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <download-dialog v-model=\"showDownloadDialog\" />\n <simple-text-dialog\n v-model=\"showProcessOutput\"\n title=\"Process Output\"\n :text=\"processOutput\"\n />\n </div>\n</template>\n\n<script>\nimport { toDate, format } from 'date-fns'\nimport { Api } from '@openc3/js-common/services'\nimport { SimpleTextDialog } from '@/components'\nimport { DownloadDialog } from '@/tools/admin'\n\nexport default {\n components: {\n DownloadDialog,\n SimpleTextDialog,\n },\n data() {\n return {\n showDownloadDialog: false,\n showProcessOutput: false,\n processOutput: '',\n files: [],\n loadingPackage: false,\n progress: 0,\n gems: [],\n python: [],\n processes: {},\n }\n },\n mounted() {\n this.update()\n this.updateProcesses()\n },\n methods: {\n showOutput: function (process) {\n this.processOutput = process.output\n this.showProcessOutput = true\n },\n update() {\n Api.get('/openc3-api/packages').then((response) => {\n this.gems = response.data.ruby\n this.python = response.data.python\n })\n },\n updateProcesses: function () {\n Api.get('/openc3-api/process_status/package_?substr=true').then(\n (response) => {\n this.processes = response.data\n if (Object.keys(this.processes).length > 0) {\n // process_manager.rb script operates on a 5 second cycle\n setTimeout(() => {\n this.updateProcesses()\n this.update()\n }, 2500)\n }\n },\n )\n },\n formatDate(nanoSecs) {\n return format(\n toDate(parseInt(nanoSecs) / 1000000),\n 'yyyy-MM-dd HH:mm:ss.SSS',\n )\n },\n selectFile() {\n this.progress = 0\n this.$refs.fileInput.click()\n },\n fileChange(event) {\n const files = event.target.files\n if (files.length > 0) {\n this.loadingPackage = true\n let self = this\n const promises = [...files].map((file) => {\n const formData = new FormData()\n formData.append('package', file, file.name)\n return Api.post('/openc3-api/packages', {\n data: formData,\n headers: { 'Content-Type': 'multipart/form-data' },\n onUploadProgress: function (progressEvent) {\n let percentCompleted = Math.round(\n (progressEvent.loaded * 100) / progressEvent.total,\n )\n self.progress = percentCompleted\n },\n })\n })\n Promise.all(promises)\n .then((responses) => {\n this.$notify.normal({\n body: `Uploaded ${responses.length} package${\n responses.length > 1 ? 's' : ''\n }`,\n })\n this.loadingPackage = false\n this.files = []\n setTimeout(() => {\n this.updateProcesses()\n }, 2500)\n })\n .catch((error) => {\n this.loadingPackage = false\n })\n }\n },\n deletePackage(pkg) {\n this.$dialog\n .confirm(`Are you sure you want to remove: ${pkg}`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n return Api.delete(`/openc3-api/packages/${pkg}`)\n })\n .then((response) => {\n this.$notify.normal({\n body: `Removed package ${pkg}`,\n })\n setTimeout(() => {\n this.updateProcesses()\n }, 2500)\n })\n // Error will probably never happen because we spawn the package removal\n // and then wait for the response which happens in the background\n .catch((error) => {\n this.$notify.serious({\n body: `Failed to remove package ${pkg}`,\n })\n })\n },\n },\n}\n</script>\n\n<style scoped>\n.v-subheader {\n font-size: 1rem;\n}\n.list {\n background-color: var(--color-background-surface-default) !important;\n overflow-x: hidden;\n}\n.v-theme--cosmosDark.v-list div:nth-child(odd) .v-list-item {\n background-color: var(--color-background-base-selected) !important;\n}\n</style>\n"],"names":["_sfc_main","DownloadDialog","SimpleTextDialog","process","Api","response","nanoSecs","format","toDate","event","files","self","promises","file","formData","progressEvent","percentCompleted","responses","error","pkg","dialog","_hoisted_1","_hoisted_2","_createElementBlock","_createVNode","_component_v_row","_withCtx","_component_v_col","_component_v_btn","$options","_cache","_createTextVNode","_createElementVNode","args","_component_rux_progress","$data","_createBlock","_component_v_list","_openBlock","_Fragment","_renderList","_component_v_list_item","_createSlots","_component_v_list_item_title","_normalizeClass","_toDisplayString","_component_v_list_item_subtitle","_component_v_tooltip","props","_mergeProps","$event","_component_v_divider","_createCommentVNode","gem","index","_component_download_dialog","_component_simple_text_dialog"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PluginsTab-DHO1tK2S.cjs","sources":["../src/tools/admin/tabs/PluginsTab.vue"],"sourcesContent":["<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2024, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-row no-gutters align=\"center\" class=\"px-2\">\n <v-col class=\"pa-2 mt-2\">\n <v-btn @click=\"selectFile\">Install New Plugin</v-btn>\n <input\n ref=\"fileInput\"\n style=\"display: none\"\n type=\"file\"\n @change=\"fileChange\"\n />\n &nbsp;Note: Use <v-icon>mdi-update</v-icon> to upgrade existing plugins\n </v-col>\n <v-col class=\"ml-4 mr-2\" cols=\"4\">\n <rux-progress :value=\"progress\"></rux-progress>\n </v-col>\n </v-row>\n <v-row no-gutters class=\"px-2\">\n <v-col>\n <v-checkbox\n v-model=\"showDefaultTools\"\n label=\"Show Default Tools\"\n class=\"mt-0\"\n data-test=\"show-default-tools\"\n />\n </v-col>\n <v-col align=\"right\" class=\"mr-2\">\n <div>* indicates a modified plugin</div>\n <div>Click target link to download modifications</div>\n </v-col>\n </v-row>\n <v-divider />\n <!-- TODO This alert shows both success and failure. Make consistent with rest of OpenC3. -->\n <v-alert\n v-model=\"showAlert\"\n closable\n :type=\"alertType\"\n data-test=\"plugin-alert\"\n >{{ alert }}</v-alert\n >\n <v-list\n v-if=\"Object.keys(processes).length > 0\"\n class=\"list\"\n data-test=\"process-list\"\n >\n <v-row no-gutters class=\"px-4\"\n ><v-col class=\"text-h6\">Process List</v-col>\n <v-col align=\"right\">\n <!-- See openc3/lib/openc3/utilities/process_manager.rb CLEANUP_CYCLE_SECONDS -->\n <div>Showing last 10 min of activity</div>\n </v-col>\n </v-row>\n <div v-for=\"process in processes\" :key=\"process.name\">\n <v-list-item>\n <v-list-item-title>\n <span\n :class=\"process.state.toLowerCase()\"\n v-text=\"\n `Processing ${process.process_type}: ${process.detail} - ${process.state}`\n \"\n />\n </v-list-item-title>\n <v-list-item-subtitle>\n <span v-text=\"' Updated At: ' + formatDate(process.updated_at)\" />\n </v-list-item-subtitle>\n\n <template #append>\n <v-progress-circular\n v-if=\"process.state === 'Running'\"\n indeterminate\n color=\"primary\"\n />\n <v-tooltip v-else :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n icon=\"mdi-eye\"\n variant=\"text\"\n aria-label=\"Show Output\"\n data-test=\"show-output\"\n @click=\"showOutput(process)\"\n />\n </template>\n <span>Show Output</span>\n </v-tooltip>\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <v-list class=\"list\" data-test=\"plugin-list\">\n <v-row class=\"px-4\"><v-col class=\"text-h6\">Plugin List</v-col></v-row>\n <div v-for=\"(plugin, index) in shownPlugins\" :key=\"index\">\n <v-list-item data-test=\"plugin-list-item\">\n <v-list-item-title\n ><span v-if=\"isModified(plugin)\">* </span\n >{{ plugin }}</v-list-item-title\n >\n <v-list-item-subtitle v-if=\"pluginTargets(plugin).length !== 0\">\n <span\n v-for=\"(target, index) in pluginTargets(plugin)\"\n :key=\"index\"\n class=\"mr-2\"\n >\n <a\n v-if=\"target.modified\"\n @click.prevent=\"downloadTarget(target.name)\"\n >{{ target.name }}\n </a>\n <span v-else>{{ target.name }} </span>\n </span>\n </v-list-item-subtitle>\n\n <template #append>\n <v-btn\n icon=\"mdi-download\"\n variant=\"text\"\n aria-label=\"Download Plugin\"\n data-test=\"download-plugin\"\n @click=\"downloadPlugin(plugin)\"\n />\n <v-btn\n icon=\"mdi-pencil\"\n variant=\"text\"\n aria-label=\"Edit Plugin\"\n data-test=\"edit-plugin\"\n @click=\"editPlugin(plugin)\"\n />\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n icon=\"mdi-update\"\n variant=\"text\"\n aria-label=\"Upgrade Plugin\"\n data-test=\"upgrade-plugin\"\n @click=\"upgradePlugin(plugin)\"\n />\n </template>\n <span>Upgrade Plugin</span>\n </v-tooltip>\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Delete Plugin\"\n data-test=\"delete-plugin\"\n @click=\"deletePrompt(plugin)\"\n />\n </template>\n </v-list-item>\n <v-divider v-if=\"index < plugins.length - 1\" :key=\"index\" />\n </div>\n </v-list>\n <plugin-dialog\n v-if=\"showPluginDialog\"\n v-model=\"showPluginDialog\"\n :plugin-name=\"pluginName\"\n :variables=\"variables\"\n :plugin-txt=\"pluginTxt\"\n :existing-plugin-txt=\"existingPluginTxt\"\n @callback=\"pluginCallback\"\n />\n <modified-plugin-dialog\n v-if=\"showModifiedPluginDialog\"\n v-model=\"showModifiedPluginDialog\"\n :plugin-name=\"currentPlugin\"\n :targets=\"pluginTargets(currentPlugin)\"\n :plugin-delete=\"pluginDelete\"\n @submit=\"modifiedSubmit\"\n />\n <!-- <download-dialog v-model=\"showDownloadDialog\" /> -->\n <simple-text-dialog\n v-model=\"showProcessOutput\"\n title=\"Process Output\"\n :text=\"processOutput\"\n />\n </div>\n</template>\n\n<script>\nimport { toDate, format } from 'date-fns'\nimport { Api } from '@openc3/js-common/services'\nimport { SimpleTextDialog } from '@/components'\nimport { ModifiedPluginDialog, PluginDialog } from '@/tools/admin'\n\nexport default {\n components: {\n PluginDialog,\n ModifiedPluginDialog,\n SimpleTextDialog,\n },\n data() {\n return {\n file: null,\n currentPlugin: null,\n plugins: [],\n targets: [],\n processes: {},\n alert: '',\n alertType: 'success',\n showAlert: false,\n pluginName: null,\n variables: {},\n pluginTxt: '',\n pluginHashTmp: null,\n existingPluginTxt: null,\n showDownloadDialog: false,\n showProcessOutput: false,\n processOutput: '',\n showPluginDialog: false,\n showModifiedPluginDialog: false,\n showDefaultTools: false,\n progress: 0,\n pluginDelete: false,\n // When updating update local_mode.rb, local_mode.py, plugins.spec.ts\n defaultPlugins: [\n 'openc3-cosmos-tool-admin',\n 'openc3-cosmos-tool-bucketexplorer',\n 'openc3-cosmos-tool-cmdsender',\n 'openc3-cosmos-tool-cmdhistory', // Enterprise only\n 'openc3-cosmos-tool-cmdtlmserver',\n 'openc3-cosmos-tool-dataextractor',\n 'openc3-cosmos-tool-dataviewer',\n 'openc3-cosmos-tool-docs',\n 'openc3-cosmos-tool-handbooks',\n 'openc3-cosmos-tool-iframe',\n 'openc3-cosmos-tool-limitsmonitor',\n 'openc3-cosmos-tool-packetviewer',\n 'openc3-cosmos-tool-scriptrunner',\n 'openc3-cosmos-tool-tablemanager',\n 'openc3-cosmos-tool-tlmgrapher',\n 'openc3-cosmos-tool-tlmviewer',\n 'openc3-cosmos-enterprise-tool-admin', // Enterprise only\n 'openc3-cosmos-tool-autonomic', // Enterprise only\n 'openc3-cosmos-tool-calendar', // Enterprise only\n 'openc3-cosmos-tool-grafana', // Enterprise only\n 'openc3-cosmos-tool-systemhealth', // Enterprise only\n 'openc3-enterprise-tool-base', // Enterprise only\n 'openc3-tool-base',\n ],\n }\n },\n computed: {\n shownPlugins() {\n let result = []\n for (let plugin of this.plugins) {\n let pluginNameFirst = plugin.split('__')[0]\n let pluginNameSplit = pluginNameFirst.split('-')\n pluginNameSplit = pluginNameSplit.slice(0, -1)\n let pluginName = pluginNameSplit.join('-')\n if (\n !this.defaultPlugins.includes(pluginName) ||\n this.showDefaultTools\n ) {\n result.push(plugin)\n }\n }\n return result\n },\n pluginTargets() {\n return (plugin) => {\n let result = []\n for (const target in this.targets) {\n if (this.targets[target]['plugin'] === plugin) {\n result.push(this.targets[target])\n }\n }\n return result\n }\n },\n isModified() {\n return (plugin) => {\n let result = false\n for (const target in this.targets) {\n if (\n this.targets[target]['plugin'] === plugin &&\n this.targets[target]['modified'] === true\n ) {\n result = true\n break\n }\n }\n return result\n }\n },\n },\n watch: {\n // watcher to reset the file input when the dialog is closed\n showPluginDialog: function (newValue, oldValue) {\n if (newValue === false) {\n this.file = null\n this.$refs.fileInput.value = null\n }\n },\n },\n mounted() {\n this.update()\n this.updateProcesses()\n },\n methods: {\n showOutput: function (process) {\n this.processOutput = process.output\n this.showProcessOutput = true\n },\n update: function () {\n Api.get('/openc3-api/plugins').then((response) => {\n this.plugins = response.data\n })\n Api.get('/openc3-api/targets_modified').then((response) => {\n this.targets = response.data\n })\n },\n updateProcesses: function () {\n Api.get('openc3-api/process_status/plugin_?substr=true').then(\n (response) => {\n this.processes = response.data\n if (Object.keys(this.processes).length > 0) {\n setTimeout(() => {\n this.updateProcesses()\n this.update()\n }, 5000)\n }\n },\n )\n },\n formatDate(nanoSecs) {\n return format(\n toDate(parseInt(nanoSecs) / 1000000),\n 'yyyy-MM-dd HH:mm:ss.SSS',\n )\n },\n upload: function (existing = null) {\n const method = existing ? 'put' : 'post'\n const path = existing\n ? `/openc3-api/plugins/${existing}`\n : '/openc3-api/plugins'\n const formData = new FormData()\n formData.append('plugin', this.file, this.file.name)\n let self = this\n const promise = Api[method](path, {\n data: formData,\n headers: { 'Content-Type': 'multipart/form-data' },\n onUploadProgress: function (progressEvent) {\n let percentCompleted = Math.round(\n (progressEvent.loaded * 100) / progressEvent.total,\n )\n self.progress = percentCompleted\n },\n })\n promise\n .then((response) => {\n this.progress = 100\n this.alert = 'Uploaded file'\n this.alertType = 'success'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n this.update()\n let existingPluginTxt = null\n if (response.data.existing_plugin_txt_lines !== undefined) {\n existingPluginTxt =\n response.data.existing_plugin_txt_lines.join('\\n')\n }\n let pluginTxt = response.data.plugin_txt_lines.join('\\n')\n ;(this.pluginName = response.data.name),\n (this.variables = response.data.variables),\n (this.pluginTxt = pluginTxt),\n (this.existingPluginTxt = existingPluginTxt)\n this.showPluginDialog = true\n this.file = undefined\n })\n .catch((error) => {\n this.currentPlugin = null\n this.file = undefined\n })\n },\n pluginCallback: function (pluginHash) {\n this.showPluginDialog = false\n if (this.currentPlugin !== null) {\n pluginHash['name'] = this.currentPlugin\n }\n this.pluginHashTmp = pluginHash\n if (this.isModified(this.currentPlugin)) {\n this.pluginDelete = false\n this.showModifiedPluginDialog = true\n } else {\n this.pluginInstall()\n }\n },\n modifiedSubmit: async function (deleteModified) {\n if (deleteModified === true) {\n for (let target of this.pluginTargets(this.currentPlugin)) {\n if (target.modified == true) {\n await Api.post(`/openc3-api/targets/${target.name}/delete_modified`)\n }\n }\n }\n if (this.pluginDelete) {\n this.deletePlugin(this.currentPlugin)\n } else {\n this.pluginInstall()\n }\n },\n pluginInstall: function () {\n Api.post(`/openc3-api/plugins/install/${this.pluginName}`, {\n data: {\n plugin_hash: JSON.stringify(this.pluginHashTmp),\n },\n }).then((response) => {\n this.alert = `Started installing plugin ${this.pluginName} ...`\n this.alertType = 'success'\n this.showAlert = true\n this.currentPlugin = null\n this.file = undefined\n this.variables = {}\n this.pluginTxt = ''\n this.existingPluginTxt = null\n setTimeout(() => {\n this.showAlert = false\n this.updateProcesses()\n }, 5000)\n this.update()\n })\n },\n downloadTarget: function (name) {\n Api.post(`/openc3-api/targets/${name}/download`).then((response) => {\n // Decode Base64 string\n const decodedData = window.atob(response.data.contents)\n // Create UNIT8ARRAY of size same as row data length\n const uInt8Array = new Uint8Array(decodedData.length)\n // Insert all character code into uInt8Array\n for (let i = 0; i < decodedData.length; ++i) {\n uInt8Array[i] = decodedData.charCodeAt(i)\n }\n const blob = new Blob([uInt8Array], { type: 'application/zip' })\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', response.data.filename)\n link.click()\n })\n },\n downloadPlugin: function (plugin) {\n Api.post(`/openc3-api/packages/${plugin}/download`).then((response) => {\n // Decode Base64 string\n const decodedData = window.atob(response.data.contents)\n // Create UNIT8ARRAY of size same as row data length\n const uInt8Array = new Uint8Array(decodedData.length)\n // Insert all character code into uInt8Array\n for (let i = 0; i < decodedData.length; ++i) {\n uInt8Array[i] = decodedData.charCodeAt(i)\n }\n const blob = new Blob([uInt8Array], { type: 'application/zip' })\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', response.data.filename)\n link.click()\n })\n },\n editPlugin: function (plugin) {\n Api.get(`/openc3-api/plugins/${plugin}`).then((response) => {\n let existingPluginTxt = null\n if (response.data.existing_plugin_txt_lines !== undefined) {\n existingPluginTxt = response.data.existing_plugin_txt_lines.join('\\n')\n }\n let pluginTxt = response.data.plugin_txt_lines.join('\\n')\n ;(this.pluginName = response.data.name),\n (this.variables = response.data.variables),\n (this.pluginTxt = pluginTxt),\n (this.existingPluginTxt = existingPluginTxt)\n this.showPluginDialog = true\n })\n },\n deletePrompt: function (plugin) {\n this.$dialog\n .confirm(`Are you sure you want to remove: ${plugin}`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n if (this.isModified(plugin)) {\n this.currentPlugin = plugin\n this.pluginDelete = true\n this.showModifiedPluginDialog = true\n } else {\n this.deletePlugin(plugin)\n }\n })\n },\n deletePlugin: function (plugin) {\n this.alert = `Removing plugin ${plugin} ...`\n this.alertType = 'success'\n this.showAlert = true\n Api.delete(`/openc3-api/plugins/${plugin}`).then((response) => {\n setTimeout(() => {\n this.showAlert = false\n this.updateProcesses()\n }, 5000)\n })\n this.update()\n },\n upgradePlugin(plugin) {\n this.file = null\n this.currentPlugin = plugin\n this.progress = 0\n this.$refs.fileInput.click()\n },\n selectFile() {\n this.file = null\n this.currentPlugin = null\n this.progress = 0\n this.$refs.fileInput.click()\n },\n fileChange(event) {\n const files = event.target.files\n if (files.length > 0) {\n this.file = files[0]\n if (this.currentPlugin !== null) {\n if (\n this.file.name.split('.gem')[0] ==\n this.currentPlugin.split('.gem')[0]\n ) {\n this.$dialog\n .confirm(\n `The new gem ${this.file.name} appears to be identical to the existing ${this.currentPlugin}. Install?`,\n {\n okText: 'Ok',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n this.upload(this.currentPlugin)\n })\n .catch((error) => {\n // do nothing\n })\n } else {\n // Split up the gem name to determine if this is an upgrade\n // or mistakenly trying to install a different gem\n // Gems are named like openc3-cosmos-demo-5.3.2.gem or\n // openc3-cosmos-pw-test-1.0.0.20230213074527.gem\n // So split on - and match everything until the first .\n let parts = this.file.name.split('-')\n let i = parts.findIndex((x) => x.includes('.'))\n let newName = parts.slice(0, i).join('-')\n parts = this.currentPlugin.split('-')\n i = parts.findIndex((x) => x.includes('.'))\n let existingName = parts.slice(0, i).join('-')\n if (newName !== existingName) {\n this.$dialog\n .confirm(\n `The new gem base name ${newName} doesn't match the existing ${existingName}. Install?`,\n {\n okText: 'Ok',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n this.upload(this.currentPlugin)\n })\n } else {\n this.upload(this.currentPlugin)\n }\n }\n } else {\n this.upload()\n }\n } else {\n // Reset the input element\n this.$refs.fileInput.value = null\n }\n },\n },\n}\n</script>\n\n<style scoped>\n.crashed {\n color: red;\n}\n.list {\n background-color: var(--color-background-surface-default) !important;\n overflow-x: hidden;\n}\n.v-theme--cosmosDark.v-list div:nth-child(odd) .v-list-item {\n background-color: var(--color-background-base-selected) !important;\n}\n</style>\n"],"names":["_sfc_main","PluginDialog","ModifiedPluginDialog","SimpleTextDialog","result","plugin","pluginNameSplit","pluginName","target","newValue","oldValue","process","Api","response","nanoSecs","format","toDate","existing","method","path","formData","self","progressEvent","percentCompleted","existingPluginTxt","pluginTxt","error","pluginHash","deleteModified","name","decodedData","uInt8Array","blob","link","dialog","event","files","parts","i","x","newName","existingName","_hoisted_1","_hoisted_2","_hoisted_4","_createElementBlock","_createVNode","_component_v_row","_withCtx","_component_v_col","_component_v_btn","$options","_cache","_createTextVNode","_createElementVNode","args","_component_v_icon","_component_rux_progress","$data","_component_v_checkbox","$event","_component_v_divider","_component_v_alert","_toDisplayString","_createBlock","_component_v_list","_openBlock","_Fragment","_renderList","_component_v_list_item","_component_v_progress_circular","_component_v_tooltip","props","_mergeProps","_component_v_list_item_title","_normalizeClass","_component_v_list_item_subtitle","_createCommentVNode","index","_hoisted_3","_withModifiers","_hoisted_5","_component_plugin_dialog","_component_modified_plugin_dialog","_component_simple_text_dialog"],"mappings":"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"}
1
+ {"version":3,"file":"PluginsTab-DHO1tK2S.cjs","sources":["../src/tools/admin/tabs/PluginsTab.vue"],"sourcesContent":["<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2024, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-row no-gutters align=\"center\" class=\"px-2\">\n <v-col class=\"pa-2 mt-2\">\n <v-btn @click=\"selectFile\">Install New Plugin</v-btn>\n <input\n ref=\"fileInput\"\n style=\"display: none\"\n type=\"file\"\n @change=\"fileChange\"\n />\n &nbsp;Note: Use <v-icon>mdi-update</v-icon> to upgrade existing plugins\n </v-col>\n <v-col class=\"ml-4 mr-2\" cols=\"4\">\n <rux-progress :value=\"progress\"></rux-progress>\n </v-col>\n </v-row>\n <v-row no-gutters class=\"px-2\">\n <v-col>\n <v-checkbox\n v-model=\"showDefaultTools\"\n label=\"Show Default Tools\"\n class=\"mt-0\"\n data-test=\"show-default-tools\"\n />\n </v-col>\n <v-col align=\"right\" class=\"mr-2\">\n <div>* indicates a modified plugin</div>\n <div>Click target link to download modifications</div>\n </v-col>\n </v-row>\n <v-divider />\n <!-- TODO This alert shows both success and failure. Make consistent with rest of OpenC3. -->\n <v-alert\n v-model=\"showAlert\"\n closable\n :type=\"alertType\"\n data-test=\"plugin-alert\"\n >{{ alert }}</v-alert\n >\n <v-list\n v-if=\"Object.keys(processes).length > 0\"\n class=\"list\"\n data-test=\"process-list\"\n >\n <v-row no-gutters class=\"px-4\"\n ><v-col class=\"text-h6\">Process List</v-col>\n <v-col align=\"right\">\n <!-- See openc3/lib/openc3/utilities/process_manager.rb CLEANUP_CYCLE_SECONDS -->\n <div>Showing last 10 min of activity</div>\n </v-col>\n </v-row>\n <div v-for=\"process in processes\" :key=\"process.name\">\n <v-list-item>\n <v-list-item-title>\n <span\n :class=\"process.state.toLowerCase()\"\n v-text=\"\n `Processing ${process.process_type}: ${process.detail} - ${process.state}`\n \"\n />\n </v-list-item-title>\n <v-list-item-subtitle>\n <span v-text=\"' Updated At: ' + formatDate(process.updated_at)\" />\n </v-list-item-subtitle>\n\n <template #append>\n <v-progress-circular\n v-if=\"process.state === 'Running'\"\n indeterminate\n color=\"primary\"\n />\n <v-tooltip v-else :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n icon=\"mdi-eye\"\n variant=\"text\"\n aria-label=\"Show Output\"\n data-test=\"show-output\"\n @click=\"showOutput(process)\"\n />\n </template>\n <span>Show Output</span>\n </v-tooltip>\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <v-list class=\"list\" data-test=\"plugin-list\">\n <v-row class=\"px-4\"><v-col class=\"text-h6\">Plugin List</v-col></v-row>\n <div v-for=\"(plugin, index) in shownPlugins\" :key=\"index\">\n <v-list-item data-test=\"plugin-list-item\">\n <v-list-item-title\n ><span v-if=\"isModified(plugin)\">* </span\n >{{ plugin }}</v-list-item-title\n >\n <v-list-item-subtitle v-if=\"pluginTargets(plugin).length !== 0\">\n <span\n v-for=\"(target, index) in pluginTargets(plugin)\"\n :key=\"index\"\n class=\"mr-2\"\n >\n <a\n v-if=\"target.modified\"\n @click.prevent=\"downloadTarget(target.name)\"\n >{{ target.name }}\n </a>\n <span v-else>{{ target.name }} </span>\n </span>\n </v-list-item-subtitle>\n\n <template #append>\n <v-btn\n icon=\"mdi-download\"\n variant=\"text\"\n aria-label=\"Download Plugin\"\n data-test=\"download-plugin\"\n @click=\"downloadPlugin(plugin)\"\n />\n <v-btn\n icon=\"mdi-pencil\"\n variant=\"text\"\n aria-label=\"Edit Plugin\"\n data-test=\"edit-plugin\"\n @click=\"editPlugin(plugin)\"\n />\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n icon=\"mdi-update\"\n variant=\"text\"\n aria-label=\"Upgrade Plugin\"\n data-test=\"upgrade-plugin\"\n @click=\"upgradePlugin(plugin)\"\n />\n </template>\n <span>Upgrade Plugin</span>\n </v-tooltip>\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Delete Plugin\"\n data-test=\"delete-plugin\"\n @click=\"deletePrompt(plugin)\"\n />\n </template>\n </v-list-item>\n <v-divider v-if=\"index < plugins.length - 1\" :key=\"index\" />\n </div>\n </v-list>\n <plugin-dialog\n v-if=\"showPluginDialog\"\n v-model=\"showPluginDialog\"\n :plugin-name=\"pluginName\"\n :variables=\"variables\"\n :plugin-txt=\"pluginTxt\"\n :existing-plugin-txt=\"existingPluginTxt\"\n @callback=\"pluginCallback\"\n />\n <modified-plugin-dialog\n v-if=\"showModifiedPluginDialog\"\n v-model=\"showModifiedPluginDialog\"\n :plugin-name=\"currentPlugin\"\n :targets=\"pluginTargets(currentPlugin)\"\n :plugin-delete=\"pluginDelete\"\n @submit=\"modifiedSubmit\"\n />\n <!-- <download-dialog v-model=\"showDownloadDialog\" /> -->\n <simple-text-dialog\n v-model=\"showProcessOutput\"\n title=\"Process Output\"\n :text=\"processOutput\"\n />\n </div>\n</template>\n\n<script>\nimport { toDate, format } from 'date-fns'\nimport { Api } from '@openc3/js-common/services'\nimport { SimpleTextDialog } from '@/components'\nimport { ModifiedPluginDialog, PluginDialog } from '@/tools/admin'\n\nexport default {\n components: {\n PluginDialog,\n ModifiedPluginDialog,\n SimpleTextDialog,\n },\n data() {\n return {\n file: null,\n currentPlugin: null,\n plugins: [],\n targets: [],\n processes: {},\n alert: '',\n alertType: 'success',\n showAlert: false,\n pluginName: null,\n variables: {},\n pluginTxt: '',\n pluginHashTmp: null,\n existingPluginTxt: null,\n showDownloadDialog: false,\n showProcessOutput: false,\n processOutput: '',\n showPluginDialog: false,\n showModifiedPluginDialog: false,\n showDefaultTools: false,\n progress: 0,\n pluginDelete: false,\n // When updating update local_mode.rb, local_mode.py, plugins.spec.ts\n defaultPlugins: [\n 'openc3-cosmos-tool-admin',\n 'openc3-cosmos-tool-bucketexplorer',\n 'openc3-cosmos-tool-cmdsender',\n 'openc3-cosmos-tool-cmdhistory', // Enterprise only\n 'openc3-cosmos-tool-cmdtlmserver',\n 'openc3-cosmos-tool-dataextractor',\n 'openc3-cosmos-tool-dataviewer',\n 'openc3-cosmos-tool-docs',\n 'openc3-cosmos-tool-handbooks',\n 'openc3-cosmos-tool-iframe',\n 'openc3-cosmos-tool-limitsmonitor',\n 'openc3-cosmos-tool-packetviewer',\n 'openc3-cosmos-tool-scriptrunner',\n 'openc3-cosmos-tool-tablemanager',\n 'openc3-cosmos-tool-tlmgrapher',\n 'openc3-cosmos-tool-tlmviewer',\n 'openc3-cosmos-enterprise-tool-admin', // Enterprise only\n 'openc3-cosmos-tool-autonomic', // Enterprise only\n 'openc3-cosmos-tool-calendar', // Enterprise only\n 'openc3-cosmos-tool-grafana', // Enterprise only\n 'openc3-cosmos-tool-systemhealth', // Enterprise only\n 'openc3-enterprise-tool-base', // Enterprise only\n 'openc3-tool-base',\n ],\n }\n },\n computed: {\n shownPlugins() {\n let result = []\n for (let plugin of this.plugins) {\n let pluginNameFirst = plugin.split('__')[0]\n let pluginNameSplit = pluginNameFirst.split('-')\n pluginNameSplit = pluginNameSplit.slice(0, -1)\n let pluginName = pluginNameSplit.join('-')\n if (\n !this.defaultPlugins.includes(pluginName) ||\n this.showDefaultTools\n ) {\n result.push(plugin)\n }\n }\n return result\n },\n pluginTargets() {\n return (plugin) => {\n let result = []\n for (const target in this.targets) {\n if (this.targets[target]['plugin'] === plugin) {\n result.push(this.targets[target])\n }\n }\n return result\n }\n },\n isModified() {\n return (plugin) => {\n let result = false\n for (const target in this.targets) {\n if (\n this.targets[target]['plugin'] === plugin &&\n this.targets[target]['modified'] === true\n ) {\n result = true\n break\n }\n }\n return result\n }\n },\n },\n watch: {\n // watcher to reset the file input when the dialog is closed\n showPluginDialog: function (newValue, oldValue) {\n if (newValue === false) {\n this.file = null\n this.$refs.fileInput.value = null\n }\n },\n },\n mounted() {\n this.update()\n this.updateProcesses()\n },\n methods: {\n showOutput: function (process) {\n this.processOutput = process.output\n this.showProcessOutput = true\n },\n update: function () {\n Api.get('/openc3-api/plugins').then((response) => {\n this.plugins = response.data\n })\n Api.get('/openc3-api/targets_modified').then((response) => {\n this.targets = response.data\n })\n },\n updateProcesses: function () {\n Api.get('openc3-api/process_status/plugin_?substr=true').then(\n (response) => {\n this.processes = response.data\n if (Object.keys(this.processes).length > 0) {\n setTimeout(() => {\n this.updateProcesses()\n this.update()\n }, 5000)\n }\n },\n )\n },\n formatDate(nanoSecs) {\n return format(\n toDate(parseInt(nanoSecs) / 1000000),\n 'yyyy-MM-dd HH:mm:ss.SSS',\n )\n },\n upload: function (existing = null) {\n const method = existing ? 'put' : 'post'\n const path = existing\n ? `/openc3-api/plugins/${existing}`\n : '/openc3-api/plugins'\n const formData = new FormData()\n formData.append('plugin', this.file, this.file.name)\n let self = this\n const promise = Api[method](path, {\n data: formData,\n headers: { 'Content-Type': 'multipart/form-data' },\n onUploadProgress: function (progressEvent) {\n let percentCompleted = Math.round(\n (progressEvent.loaded * 100) / progressEvent.total,\n )\n self.progress = percentCompleted\n },\n })\n promise\n .then((response) => {\n this.progress = 100\n this.alert = 'Uploaded file'\n this.alertType = 'success'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n this.update()\n let existingPluginTxt = null\n if (response.data.existing_plugin_txt_lines !== undefined) {\n existingPluginTxt =\n response.data.existing_plugin_txt_lines.join('\\n')\n }\n let pluginTxt = response.data.plugin_txt_lines.join('\\n')\n ;(this.pluginName = response.data.name),\n (this.variables = response.data.variables),\n (this.pluginTxt = pluginTxt),\n (this.existingPluginTxt = existingPluginTxt)\n this.showPluginDialog = true\n this.file = undefined\n })\n .catch((error) => {\n this.currentPlugin = null\n this.file = undefined\n })\n },\n pluginCallback: function (pluginHash) {\n this.showPluginDialog = false\n if (this.currentPlugin !== null) {\n pluginHash['name'] = this.currentPlugin\n }\n this.pluginHashTmp = pluginHash\n if (this.isModified(this.currentPlugin)) {\n this.pluginDelete = false\n this.showModifiedPluginDialog = true\n } else {\n this.pluginInstall()\n }\n },\n modifiedSubmit: async function (deleteModified) {\n if (deleteModified === true) {\n for (let target of this.pluginTargets(this.currentPlugin)) {\n if (target.modified == true) {\n await Api.post(`/openc3-api/targets/${target.name}/delete_modified`)\n }\n }\n }\n if (this.pluginDelete) {\n this.deletePlugin(this.currentPlugin)\n } else {\n this.pluginInstall()\n }\n },\n pluginInstall: function () {\n Api.post(`/openc3-api/plugins/install/${this.pluginName}`, {\n data: {\n plugin_hash: JSON.stringify(this.pluginHashTmp),\n },\n }).then((response) => {\n this.alert = `Started installing plugin ${this.pluginName} ...`\n this.alertType = 'success'\n this.showAlert = true\n this.currentPlugin = null\n this.file = undefined\n this.variables = {}\n this.pluginTxt = ''\n this.existingPluginTxt = null\n setTimeout(() => {\n this.showAlert = false\n this.updateProcesses()\n }, 5000)\n this.update()\n })\n },\n downloadTarget: function (name) {\n Api.post(`/openc3-api/targets/${name}/download`).then((response) => {\n // Decode Base64 string\n const decodedData = window.atob(response.data.contents)\n // Create UNIT8ARRAY of size same as row data length\n const uInt8Array = new Uint8Array(decodedData.length)\n // Insert all character code into uInt8Array\n for (let i = 0; i < decodedData.length; ++i) {\n uInt8Array[i] = decodedData.charCodeAt(i)\n }\n const blob = new Blob([uInt8Array], { type: 'application/zip' })\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', response.data.filename)\n link.click()\n })\n },\n downloadPlugin: function (plugin) {\n Api.post(`/openc3-api/packages/${plugin}/download`).then((response) => {\n // Decode Base64 string\n const decodedData = window.atob(response.data.contents)\n // Create UNIT8ARRAY of size same as row data length\n const uInt8Array = new Uint8Array(decodedData.length)\n // Insert all character code into uInt8Array\n for (let i = 0; i < decodedData.length; ++i) {\n uInt8Array[i] = decodedData.charCodeAt(i)\n }\n const blob = new Blob([uInt8Array], { type: 'application/zip' })\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', response.data.filename)\n link.click()\n })\n },\n editPlugin: function (plugin) {\n Api.get(`/openc3-api/plugins/${plugin}`).then((response) => {\n let existingPluginTxt = null\n if (response.data.existing_plugin_txt_lines !== undefined) {\n existingPluginTxt = response.data.existing_plugin_txt_lines.join('\\n')\n }\n let pluginTxt = response.data.plugin_txt_lines.join('\\n')\n ;(this.pluginName = response.data.name),\n (this.variables = response.data.variables),\n (this.pluginTxt = pluginTxt),\n (this.existingPluginTxt = existingPluginTxt)\n this.showPluginDialog = true\n })\n },\n deletePrompt: function (plugin) {\n this.$dialog\n .confirm(`Are you sure you want to remove: ${plugin}`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n if (this.isModified(plugin)) {\n this.currentPlugin = plugin\n this.pluginDelete = true\n this.showModifiedPluginDialog = true\n } else {\n this.deletePlugin(plugin)\n }\n })\n },\n deletePlugin: function (plugin) {\n this.alert = `Removing plugin ${plugin} ...`\n this.alertType = 'success'\n this.showAlert = true\n Api.delete(`/openc3-api/plugins/${plugin}`).then((response) => {\n setTimeout(() => {\n this.showAlert = false\n this.updateProcesses()\n }, 5000)\n })\n this.update()\n },\n upgradePlugin(plugin) {\n this.file = null\n this.currentPlugin = plugin\n this.progress = 0\n this.$refs.fileInput.click()\n },\n selectFile() {\n this.file = null\n this.currentPlugin = null\n this.progress = 0\n this.$refs.fileInput.click()\n },\n fileChange(event) {\n const files = event.target.files\n if (files.length > 0) {\n this.file = files[0]\n if (this.currentPlugin !== null) {\n if (\n this.file.name.split('.gem')[0] ==\n this.currentPlugin.split('.gem')[0]\n ) {\n this.$dialog\n .confirm(\n `The new gem ${this.file.name} appears to be identical to the existing ${this.currentPlugin}. Install?`,\n {\n okText: 'Ok',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n this.upload(this.currentPlugin)\n })\n .catch((error) => {\n // do nothing\n })\n } else {\n // Split up the gem name to determine if this is an upgrade\n // or mistakenly trying to install a different gem\n // Gems are named like openc3-cosmos-demo-5.3.2.gem or\n // openc3-cosmos-pw-test-1.0.0.20230213074527.gem\n // So split on - and match everything until the first .\n let parts = this.file.name.split('-')\n let i = parts.findIndex((x) => x.includes('.'))\n let newName = parts.slice(0, i).join('-')\n parts = this.currentPlugin.split('-')\n i = parts.findIndex((x) => x.includes('.'))\n let existingName = parts.slice(0, i).join('-')\n if (newName !== existingName) {\n this.$dialog\n .confirm(\n `The new gem base name ${newName} doesn't match the existing ${existingName}. Install?`,\n {\n okText: 'Ok',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n this.upload(this.currentPlugin)\n })\n } else {\n this.upload(this.currentPlugin)\n }\n }\n } else {\n this.upload()\n }\n } else {\n // Reset the input element\n this.$refs.fileInput.value = null\n }\n },\n },\n}\n</script>\n\n<style scoped>\n.crashed {\n color: red;\n}\n.list {\n background-color: var(--color-background-surface-default) !important;\n overflow-x: hidden;\n}\n.v-theme--cosmosDark.v-list div:nth-child(odd) .v-list-item {\n background-color: var(--color-background-base-selected) !important;\n}\n</style>\n"],"names":["_sfc_main","PluginDialog","ModifiedPluginDialog","SimpleTextDialog","result","plugin","pluginNameSplit","pluginName","target","newValue","oldValue","process","Api","response","nanoSecs","format","toDate","existing","method","path","formData","self","progressEvent","percentCompleted","existingPluginTxt","pluginTxt","error","pluginHash","deleteModified","name","decodedData","uInt8Array","blob","link","dialog","event","files","parts","i","x","newName","existingName","_hoisted_1","_hoisted_2","_hoisted_4","_createElementBlock","_createVNode","_component_v_row","_withCtx","_component_v_col","_component_v_btn","$options","_cache","_createTextVNode","_createElementVNode","args","_component_v_icon","_component_rux_progress","$data","_component_v_checkbox","$event","_component_v_divider","_component_v_alert","_toDisplayString","_createBlock","_component_v_list","_openBlock","_Fragment","_renderList","_component_v_list_item","_component_v_progress_circular","_component_v_tooltip","props","_mergeProps","_component_v_list_item_title","_normalizeClass","_component_v_list_item_subtitle","_createCommentVNode","index","_hoisted_3","_withModifiers","_hoisted_5","_component_plugin_dialog","_component_modified_plugin_dialog","_component_simple_text_dialog"],"mappings":"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"}