vue2-client 1.19.0 → 1.19.1

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.
@@ -12,7 +12,7 @@
12
12
  <div class="title-content">
13
13
  <div class="title-dot"></div>
14
14
  <a-icon v-if="attrs.icon && !attrs.customIcon" :type="attrs.icon" class="title-icon" />
15
- <XIcon v-if="attrs.customIcon" :name="attrs.customIcon" class="title-icon" />
15
+ <XIcon v-if="attrs.customIcon" :name="attrs.customIcon" class="title-icon"/>
16
16
  <span>{{ config.label }}</span>
17
17
  </div>
18
18
  <div
@@ -33,7 +33,7 @@
33
33
  </template>
34
34
 
35
35
  <script setup>
36
- import { ref, computed, onMounted, useAttrs } from 'vue'
36
+ import {ref, computed, onMounted, useAttrs} from 'vue'
37
37
  import XIcon from '../XIcon/XIcon.vue'
38
38
 
39
39
  const props = defineProps({
@@ -101,11 +101,36 @@ const isShowTopLine = computed(() => {
101
101
  const isShowBottomLine = computed(() => {
102
102
  return attrs.showBottomLine === 'true' || attrs.showBottomLine === true
103
103
  })
104
+ // 暴露方法供外部调用,动态修改标题
105
+ const updateTitle = (newTitle) => {
106
+ if (newTitle !== undefined && newTitle !== null) {
107
+ config.value.label = String(newTitle)
108
+ config.value.type = 'title'
109
+ config.value.line = ''
110
+ config.value.color = ''
111
+ config.value.lineLength = ''
112
+ config.value.clickName = ''
113
+ // 强制更新(以防万一)
114
+ config.value = {...config.value}
115
+ }
116
+ }
117
+
118
+ // 暴露方法供外部调用,动态修改 queryParamsName
119
+ const updateQueryParamsName = (newParams) => {
120
+ parseConfig(newParams)
121
+ }
122
+
104
123
  const handleClick = () => {
105
124
  if (config.value.clickName) {
106
125
  emit(config.value.clickName)
107
126
  }
108
127
  }
128
+
129
+ // 暴露组件方法
130
+ defineExpose({
131
+ updateTitle,
132
+ updateQueryParamsName
133
+ })
109
134
  const parseConfig = (data) => {
110
135
  // 如果设置了title属性,直接使用title作为标签
111
136
  if (props.title) {
@@ -156,6 +181,7 @@ const parseConfig = (data) => {
156
181
  }
157
182
  }
158
183
 
184
+
159
185
  onMounted(() => {
160
186
  parseConfig(props.queryParamsName)
161
187
  })
@@ -181,6 +207,7 @@ onMounted(() => {
181
207
  overflow: hidden;
182
208
  text-overflow: ellipsis;
183
209
  }
210
+
184
211
  .underline {
185
212
  position: absolute;
186
213
  bottom: 0;
@@ -193,6 +220,7 @@ onMounted(() => {
193
220
  .x-button-container {
194
221
  text-align: right;
195
222
  }
223
+
196
224
  .x-title-center {
197
225
  &.x-title-container,
198
226
  .x-title-container {
@@ -201,6 +229,7 @@ onMounted(() => {
201
229
  }
202
230
  }
203
231
  }
232
+
204
233
  .x-title-littlefont {
205
234
  &.x-title-container,
206
235
  .x-title-container {
@@ -239,6 +268,7 @@ onMounted(() => {
239
268
  align-items: baseline;
240
269
  }
241
270
  }
271
+
242
272
  // 顶部分割线
243
273
  .top-line {
244
274
  width: 100%;
@@ -248,6 +278,7 @@ onMounted(() => {
248
278
  margin: 8px 0;
249
279
  opacity: 1;
250
280
  }
281
+
251
282
  .x-title-dot,
252
283
  .x-title-nodot {
253
284
  &.x-title-container,
@@ -271,12 +302,14 @@ onMounted(() => {
271
302
  }
272
303
  }
273
304
  }
305
+
274
306
  .x-title-yizhu-title {
275
307
  &.x-title-container,
276
308
  .x-title-container {
277
309
  margin-top: 3px;
278
310
  margin-left: 6px;
279
311
  margin-bottom: 7px;
312
+
280
313
  :deep(.x-title) {
281
314
  height: 26px;
282
315
  opacity: 1;
@@ -290,10 +323,12 @@ onMounted(() => {
290
323
  }
291
324
  }
292
325
  }
326
+
293
327
  .x-title-left-title {
294
328
  &.x-title-container,
295
329
  .x-title-container {
296
330
  margin: 15px auto 15px 6px;
331
+
297
332
  :deep(.x-title) {
298
333
  height: 26px;
299
334
  opacity: 1;
@@ -304,6 +339,7 @@ onMounted(() => {
304
339
  }
305
340
  }
306
341
  }
342
+
307
343
  // nodot 样式特有部分
308
344
  .x-title-nodot {
309
345
  &.x-title-container,
@@ -314,12 +350,14 @@ onMounted(() => {
314
350
  }
315
351
  }
316
352
  }
353
+
317
354
  .x-title-line-style {
318
355
  background: #0057FE;
319
356
  height: 2px;
320
357
  }
358
+
321
359
  .x-title-compact {
322
- :deep(.x-title){
360
+ :deep(.x-title) {
323
361
  height: 23px;
324
362
  opacity: 1;
325
363
  font-family: "Source Han Sans";
@@ -1,113 +1,113 @@
1
- <template>
2
- <!-- 根据实际部署环境修改 editor.html 的路径 -->
3
- <iframe
4
- src="/his/editor/editor.html"
5
- width="100%"
6
- height="800"
7
- frameborder="0"
8
- @load="onIframeLoad"
9
- ref="editorIframe">
10
- </iframe>
11
- </template>
12
-
13
- <script setup>
14
-
15
- import { ref, onBeforeUnmount } from 'vue'
16
-
17
- const editorIframe = ref(null)
18
- const checkEditorTimer = ref(null)
19
- const checkCount = ref(0)
20
- const editor = ref(null)
21
- const iframeWindow = ref(null)
22
- // 对外暴露的获取editor方法
23
- const getEditor = () => {
24
- if (editor.value) {
25
- return editor.value
26
- }
27
- if (iframeWindow.value && iframeWindow.value.editor) {
28
- editor.value = iframeWindow.value.editor
29
- return editor.value
30
- }
31
- if (editorIframe.value && editorIframe.value.contentWindow && editorIframe.value.contentWindow.editor) {
32
- editor.value = editorIframe.value.contentWindow.editor
33
- return editor.value
34
- }
35
- return null
36
- }
37
- // 创建体温单方法
38
- const createVitalSigns = (data) => {
39
- const editorObj = getEditor()
40
- if (!editorObj) {
41
- throw new Error('editor对象未初始化,无法创建体温单')
42
- }
43
- if (typeof editorObj.createVitalSigns === 'function') {
44
- return editorObj.createVitalSigns(data)
45
- } else {
46
- throw new Error('editor对象未包含createVitalSigns方法')
47
- }
48
- }
49
-
50
- // 检查editor对象是否已初始化
51
- const startEditorCheck = (frameWindow, iframe) => {
52
- if (checkEditorTimer.value) {
53
- clearInterval(checkEditorTimer.value)
54
- }
55
- checkCount.value = 0
56
- checkEditorTimer.value = setInterval(() => {
57
- checkCount.value++
58
- try {
59
- const editorObj = frameWindow.editor
60
- if (editorObj && typeof editorObj.createVitalSigns === 'function') {
61
- clearInterval(checkEditorTimer.value)
62
- editor.value = editorObj
63
- // 将editor对象暴露到全局
64
- window.iframeEditor = editorObj
65
- window.iframeWindow = frameWindow
66
- // 触发事件
67
- emit('editor-ready', editorObj)
68
- emit('load', { target: iframe, editor: editorObj })
69
- // 发送消息通知
70
- window.parent.postMessage({ type: 'editorReady' }, '*')
71
- }
72
- } catch (err) {
73
- console.error('检查editor对象时出错:', err)
74
- }
75
- if (checkCount.value >= 20) {
76
- clearInterval(checkEditorTimer.value)
77
- console.error('Editor 对象加载失败')
78
- }
79
- }, 500)
80
- }
81
- // iframe加载完成的处理
82
- const onIframeLoad = (e) => {
83
- const iframe = e.target
84
- const frameWindow = iframe.contentWindow
85
- iframeWindow.value = frameWindow
86
- if (!frameWindow) {
87
- console.error('无法访问 iframe 内容')
88
- return
89
- }
90
- // 关闭文书工具栏
91
- iframe.contentWindow.editor.option.toolbar = false
92
- startEditorCheck(frameWindow, iframe)
93
- }
94
- // 组件销毁前清理
95
- onBeforeUnmount(() => {
96
- if (checkEditorTimer.value) {
97
- clearInterval(checkEditorTimer.value)
98
- }
99
- })
100
- // 暴露方法给父组件
101
- defineExpose({ getEditor, createVitalSigns })
102
-
103
- // 定义事件
104
- const emit = defineEmits(['editor-ready', 'load'])
105
- </script>
106
-
107
- <style scoped>
108
- iframe {
109
- border: none;
110
- width: 100%;
111
- min-height: 800px;
112
- }
113
- </style>
1
+ <template>
2
+ <!-- 根据实际部署环境修改 editor.html 的路径 -->
3
+ <iframe
4
+ src="/his/editor/editor.html"
5
+ width="100%"
6
+ height="800"
7
+ frameborder="0"
8
+ @load="onIframeLoad"
9
+ ref="editorIframe">
10
+ </iframe>
11
+ </template>
12
+
13
+ <script setup>
14
+
15
+ import { ref, onBeforeUnmount } from 'vue'
16
+
17
+ const editorIframe = ref(null)
18
+ const checkEditorTimer = ref(null)
19
+ const checkCount = ref(0)
20
+ const editor = ref(null)
21
+ const iframeWindow = ref(null)
22
+ // 对外暴露的获取editor方法
23
+ const getEditor = () => {
24
+ if (editor.value) {
25
+ return editor.value
26
+ }
27
+ if (iframeWindow.value && iframeWindow.value.editor) {
28
+ editor.value = iframeWindow.value.editor
29
+ return editor.value
30
+ }
31
+ if (editorIframe.value && editorIframe.value.contentWindow && editorIframe.value.contentWindow.editor) {
32
+ editor.value = editorIframe.value.contentWindow.editor
33
+ return editor.value
34
+ }
35
+ return null
36
+ }
37
+ // 创建体温单方法
38
+ const createVitalSigns = (data) => {
39
+ const editorObj = getEditor()
40
+ if (!editorObj) {
41
+ throw new Error('editor对象未初始化,无法创建体温单')
42
+ }
43
+ if (typeof editorObj.createVitalSigns === 'function') {
44
+ return editorObj.createVitalSigns(data)
45
+ } else {
46
+ throw new Error('editor对象未包含createVitalSigns方法')
47
+ }
48
+ }
49
+
50
+ // 检查editor对象是否已初始化
51
+ const startEditorCheck = (frameWindow, iframe) => {
52
+ if (checkEditorTimer.value) {
53
+ clearInterval(checkEditorTimer.value)
54
+ }
55
+ checkCount.value = 0
56
+ checkEditorTimer.value = setInterval(() => {
57
+ checkCount.value++
58
+ try {
59
+ const editorObj = frameWindow.editor
60
+ if (editorObj && typeof editorObj.createVitalSigns === 'function') {
61
+ clearInterval(checkEditorTimer.value)
62
+ editor.value = editorObj
63
+ // 将editor对象暴露到全局
64
+ window.iframeEditor = editorObj
65
+ window.iframeWindow = frameWindow
66
+ // 触发事件
67
+ emit('editor-ready', editorObj)
68
+ emit('load', { target: iframe, editor: editorObj })
69
+ // 发送消息通知
70
+ window.parent.postMessage({ type: 'editorReady' }, '*')
71
+ }
72
+ } catch (err) {
73
+ console.error('检查editor对象时出错:', err)
74
+ }
75
+ if (checkCount.value >= 20) {
76
+ clearInterval(checkEditorTimer.value)
77
+ console.error('Editor 对象加载失败')
78
+ }
79
+ }, 500)
80
+ }
81
+ // iframe加载完成的处理
82
+ const onIframeLoad = (e) => {
83
+ const iframe = e.target
84
+ const frameWindow = iframe.contentWindow
85
+ iframeWindow.value = frameWindow
86
+ if (!frameWindow) {
87
+ console.error('无法访问 iframe 内容')
88
+ return
89
+ }
90
+ // 关闭文书工具栏
91
+ iframe.contentWindow.editor.option.toolbar = false
92
+ startEditorCheck(frameWindow, iframe)
93
+ }
94
+ // 组件销毁前清理
95
+ onBeforeUnmount(() => {
96
+ if (checkEditorTimer.value) {
97
+ clearInterval(checkEditorTimer.value)
98
+ }
99
+ })
100
+ // 暴露方法给父组件
101
+ defineExpose({ getEditor, createVitalSigns })
102
+
103
+ // 定义事件
104
+ const emit = defineEmits(['editor-ready', 'load'])
105
+ </script>
106
+
107
+ <style scoped>
108
+ iframe {
109
+ border: none;
110
+ width: 100%;
111
+ min-height: 800px;
112
+ }
113
+ </style>
@@ -1,45 +1,45 @@
1
- <script>
2
- export default {
3
- name: 'ExceptionQuery',
4
- components: {
5
- XFormTable: () => import('@vue2-client/base-client/components/common/XFormTable/XFormTable.vue')
6
- },
7
- props: {
8
- currUserInfo: {
9
- type: Object,
10
- default: () => undefined
11
- }
12
- },
13
- mounted () {
14
- this.$refs.xFormTable.refresh(true)
15
- },
16
- data () {
17
- return {
18
- // 查询配置名称
19
- queryParamsName: 'ExceptionRecordQueryCRUD',
20
- fixedQueryForm: { ex_f_userfiles_id: this.currUserInfo.f_userfiles_id },
21
- // 新增表单固定值
22
- fixedAddForm: {},
23
- // 是否显示详情抽屉
24
- detailVisible: false,
25
- // 当前记录
26
- record: {}
27
- }
28
- }
29
- }
30
- </script>
31
-
32
- <template>
33
- <a-card :bordered="false">
34
- <x-form-table
35
- title="异常查询"
36
- :queryParamsName="queryParamsName"
37
- :fixedQueryForm="fixedQueryForm"
38
- ref="xFormTable">
39
- </x-form-table>
40
- </a-card>
41
- </template>
42
-
43
- <style scoped>
44
-
45
- </style>
1
+ <script>
2
+ export default {
3
+ name: 'ExceptionQuery',
4
+ components: {
5
+ XFormTable: () => import('@vue2-client/base-client/components/common/XFormTable/XFormTable.vue')
6
+ },
7
+ props: {
8
+ currUserInfo: {
9
+ type: Object,
10
+ default: () => undefined
11
+ }
12
+ },
13
+ mounted () {
14
+ this.$refs.xFormTable.refresh(true)
15
+ },
16
+ data () {
17
+ return {
18
+ // 查询配置名称
19
+ queryParamsName: 'ExceptionRecordQueryCRUD',
20
+ fixedQueryForm: { ex_f_userfiles_id: this.currUserInfo.f_userfiles_id },
21
+ // 新增表单固定值
22
+ fixedAddForm: {},
23
+ // 是否显示详情抽屉
24
+ detailVisible: false,
25
+ // 当前记录
26
+ record: {}
27
+ }
28
+ }
29
+ }
30
+ </script>
31
+
32
+ <template>
33
+ <a-card :bordered="false">
34
+ <x-form-table
35
+ title="异常查询"
36
+ :queryParamsName="queryParamsName"
37
+ :fixedQueryForm="fixedQueryForm"
38
+ ref="xFormTable">
39
+ </x-form-table>
40
+ </a-card>
41
+ </template>
42
+
43
+ <style scoped>
44
+
45
+ </style>