TheMapping.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <script setup lang="ts">
  2. import { useStore } from '@/store'
  3. const store = useStore()
  4. import { ref, shallowRef, watch } from 'vue'
  5. import VCollaps from './VCollaps.vue';
  6. //see https://github.com/imguolao/monaco-vue#vite
  7. import { loader } from "@guolao/vue-monaco-editor"
  8. import * as monaco from "monaco-editor"
  9. import editorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker"
  10. import jsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker"
  11. import cssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker"
  12. import htmlWorker from "monaco-editor/esm/vs/language/html/html.worker?worker"
  13. import tsWorker from "monaco-editor/esm/vs/language/typescript/ts.worker?worker"
  14. import { storeToRefs } from 'pinia';
  15. import type { IMappingEntry } from '@/ServerConfig';
  16. self.MonacoEnvironment = {
  17. getWorker(_, label) {
  18. if (label === "json") {
  19. return new jsonWorker()
  20. }
  21. if (label === "css" || label === "scss" || label === "less") {
  22. return new cssWorker()
  23. }
  24. if (label === "html" || label === "handlebars" || label === "razor") {
  25. return new htmlWorker()
  26. }
  27. if (label === "typescript" || label === "javascript") {
  28. return new tsWorker()
  29. }
  30. return new editorWorker()
  31. }
  32. }
  33. loader.config({ monaco })
  34. const MONACO_EDITOR_OPTIONS = {
  35. automaticLayout: true,
  36. formatOnType: true,
  37. formatOnPaste: true,
  38. }
  39. const { selectedNode } = storeToRefs(store)
  40. const code=ref("");
  41. let dirty=false;
  42. watch(selectedNode, () => {
  43. if (!selectedNode.value)
  44. return;
  45. if (!selectedNode.value.nodeId.value)
  46. return;
  47. const m = store.addressSpace?.mapping.get(selectedNode.value.nodeId.toString());
  48. code.value = m?.read || "";
  49. dirty=false;
  50. });
  51. const editorRef = shallowRef()
  52. const handleMount = (editor: any) => {
  53. editorRef.value = editor;
  54. }
  55. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  56. const onChange = (value: string | undefined, event: monaco.editor.IModelContentChangedEvent) => {
  57. if(!store.selectedNode)
  58. return;
  59. if(!value)
  60. return;
  61. code.value=value;
  62. }
  63. function formChanged(){
  64. dirty=true;
  65. }
  66. function okPressed() {
  67. if(!dirty)
  68. return;
  69. if(!selectedNode.value)
  70. return;
  71. store.addressSpace?.mapping.set(selectedNode.value.nodeId.toString(), {path: selectedNode.value.nodeId.toString(), read: code.value, write: ""} as IMappingEntry)
  72. dirty=false;
  73. }
  74. defineExpose({ okPressed })
  75. </script>
  76. <template>
  77. <VCollaps :selected=false name="Mapping" @change="formChanged()">
  78. <div class="card-text" v-if="selectedNode">
  79. <vue-monaco-editor
  80. v-model:value="code"
  81. height= "12em"
  82. theme="vs-dark"
  83. language="javascript"
  84. :options="MONACO_EDITOR_OPTIONS"
  85. @mount="handleMount"
  86. @change="onChange"
  87. />
  88. </div>
  89. </VCollaps>
  90. </template>
  91. <style scoped></style>