EmrSnippet.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <template>
  2. <div style="height: max-content">
  3. <el-input v-model="filterText" placeholder="节点过滤" @input="filterChange" clearable/>
  4. <div :style="{maxHeight : maxHeight - 50 + 'px'}"
  5. style="overflow: auto;max-width: 294px" class="down-tree">
  6. <el-tree :data="snippetData"
  7. :props="defaultProps"
  8. @node-click="handleNodeClick"
  9. node-key="_id"
  10. ref="treeRef"
  11. highlight-current
  12. :filter-node-method="filterNode"
  13. @node-contextmenu="fragmentPreview"
  14. :expand-on-click-node="false"
  15. default-expand-all>
  16. <template #default="{ node, data }">
  17. <el-icon>
  18. <Folder v-if="data.children"/>
  19. <Document v-else/>
  20. </el-icon>
  21. {{ data.name }}
  22. </template>
  23. </el-tree>
  24. </div>
  25. <el-dialog v-model="dialog" title="效果预览" top="2%" width="60%">
  26. <div>
  27. <iframe src="/emr/runtime/#/editor"
  28. style="width: 100%"
  29. :style="{height: getWindowSize.h / 1.2 + 'px'}"
  30. ref="emrRef"/>
  31. </div>
  32. </el-dialog>
  33. </div>
  34. </template>
  35. <script setup name='EmrSnippet'>
  36. import {getWindowSize} from "@/utils/window-size";
  37. import {
  38. emrConfig,
  39. EMRInteractive
  40. } from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/emr-init";
  41. import {getSnippetTree} from "@/api/zhu-yuan-yi-sheng/emr-patient";
  42. const props = defineProps({
  43. maxHeight: {
  44. type: Number
  45. }
  46. })
  47. const emit = defineEmits(['nodeClick'])
  48. let patientData = {}
  49. let snippetData = $ref([])
  50. let dialog = $ref(false)
  51. let selectedData = {}
  52. let filterText = $ref('')
  53. let treeRef = $ref('')
  54. const defaultProps = {
  55. children: 'children',
  56. label: 'name',
  57. }
  58. const editorEvents = {
  59. 'ready': (event) => {
  60. currentEmr.value.callMethod('setDocument', selectedData, true, true)
  61. }
  62. }
  63. const emrRef = ref(null)
  64. const currentEmr = ref(null)
  65. const filterChange = (val) => {
  66. treeRef.filter(val)
  67. }
  68. const filterNode = (value, data) => {
  69. if (!value) return true
  70. return data.name.includes(value)
  71. }
  72. const handleNodeClick = (node, object, event) => {
  73. if (node.content) {
  74. emit('nodeClick', node)
  75. }
  76. }
  77. const fragmentPreview = (event, data, node) => {
  78. selectedData = data
  79. dialog = true
  80. if (currentEmr.value !== null) {
  81. currentEmr.value.callMethod('setDocument', selectedData, true, true)
  82. } else {
  83. nextTick(() => {
  84. currentEmr.value = new EMRInteractive(patientData, editorEvents);
  85. emrRef.value.parentElement.emr = currentEmr.value
  86. });
  87. }
  88. }
  89. const setPatientData = (val) => {
  90. patientData = val
  91. }
  92. onMounted(() => {
  93. if (emrConfig.value.editor) {
  94. getSnippetTree().then((res) => {
  95. snippetData = res
  96. })
  97. }
  98. })
  99. defineExpose({
  100. setPatientData
  101. })
  102. </script>
  103. <style scoped lang="scss">
  104. .down-tree {
  105. :deep(.el-tree-node.is-expanded > .el-tree-node__children) {
  106. display: inline;
  107. }
  108. }
  109. </style>