TheParent.vue 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <script setup lang="ts">
  2. import { useStore } from '@/store'
  3. import { computed, ref, watch } from 'vue';
  4. import TheTreeDialog from './TheTreeDialog.vue';
  5. import VCollaps from './VCollaps.vue';
  6. import { UABaseNode } from '@/ua/UABaseNode';
  7. import { ReferenceTypeIds } from '@/ua/opcua_node_ids';
  8. import type { UAReferenceType } from '@/ua/UAReferenceType';
  9. import { storeToRefs } from 'pinia';
  10. const store = useStore()
  11. const parentDialogOpen = ref(false);
  12. const { selectedNode } = storeToRefs(store)
  13. const selectedRefType = ref('')
  14. const selectedParent = ref(UABaseNode.nullBaseNode);
  15. let dirty = false;
  16. function clickNode(clickedNode: UABaseNode) {
  17. selectedParent.value=clickedNode;
  18. parentDialogOpen.value=false;
  19. }
  20. watch(selectedNode, async (newNode, _oldNode) => {
  21. selectedRefType.value=newNode?.getParentRef()?.referenceType||"";
  22. selectedParent.value=newNode?.getParent()||UABaseNode.nullBaseNode;
  23. dirty=false;
  24. })
  25. function formChanged(){
  26. dirty=true;
  27. }
  28. function okPressed() {
  29. if(!dirty)
  30. return;
  31. //TODO: check if valid
  32. selectedNode.value?.setParent(selectedParent.value, selectedRefType.value);
  33. }
  34. defineExpose({ okPressed })
  35. function filter(fnode: UABaseNode) {
  36. if(selectedNode.value?.nodeClass==="Variable") {
  37. if(fnode.nodeClass!="Object")
  38. return true;
  39. }
  40. return false;
  41. }
  42. const refTypes = computed(():UABaseNode[] => {
  43. const list=(store.addressSpace?.getSubTreeAsList("ns=0;i="+ReferenceTypeIds.HierarchicalReferences)) as UAReferenceType[];
  44. return list.filter((node) => node.isAbstract==false);
  45. })
  46. </script>
  47. <template>
  48. <VCollaps :selected=false name="Parent" @change="formChanged()">
  49. <div class="card-text" v-if="selectedNode">
  50. <div class="input-group mb-3">
  51. <div class="input-group-prepend">
  52. <span class="input-group-text" id="inputGroup-sizing-default">Name</span>
  53. </div>
  54. <input readonly type="text" class="form-control" aria-label="Default"
  55. aria-describedby="inputGroup-sizing-default" :value="selectedParent.browseName">
  56. <button class="btn btn-light" @click="parentDialogOpen = true">...</button>
  57. </div>
  58. <div class="input-group mb-3">
  59. <div class="input-group-prepend">
  60. <span class="input-group-text" id="inputGroup-sizing-default">Reference</span>
  61. </div>
  62. <select class="form-select" aria-label="Selected ref. type" v-model="selectedRefType" >
  63. <option v-for="option in refTypes" :value="option.browseName" v-bind:key="option.browseName">
  64. {{ option.browseName }}
  65. </option>
  66. </select>
  67. </div>
  68. </div>
  69. </VCollaps>
  70. <TheTreeDialog
  71. :open="parentDialogOpen"
  72. :filter-func="(node: UABaseNode) => filter(node)"
  73. @cancel="parentDialogOpen = false"
  74. :markSelected="false"
  75. @select-node="(node) => clickNode(node)">
  76. </TheTreeDialog>
  77. </template>
  78. <style scoped></style>