vue2-client 1.14.81 → 1.14.82

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 (115) hide show
  1. package/docs/Logic/345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +0 -1
  2. package/docs//345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +1 -2
  3. package/package.json +1 -1
  4. package/src/base-client/components/common/Upload/Upload.vue +0 -1
  5. package/src/base-client/components/common/XTab/XTab.vue +8 -0
  6. package/src/base-client/components/common/XUploadFilesView/index.vue +485 -485
  7. package/src/base-client/components/his/XTextCard/XTextCard.vue +207 -207
  8. package/src/base-client/components/his/XTreeRows/TreeNode.vue +100 -100
  9. package/src/base-client/components/his/XTreeRows/XTreeRows.vue +197 -197
  10. package/src/base-client/components/his/threeTestOrders/editor.vue +111 -111
  11. package/src/components/FileImageItem/FileItem.vue +1 -1
  12. package/src/pages/WorkflowDetail/WorkFlowDemo.vue +1 -1
  13. package/src/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue +388 -388
  14. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +26 -56
  15. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowPreview.vue +98 -0
  16. package/src/router/async/router.map.js +1 -3
  17. package/src/utils/axios-interceptors.js +19 -1
  18. package/src/utils/request.js +5 -0
  19. package/.history/public/his/editor/editor_20250606134713.html +0 -51
  20. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527173925.vue +0 -509
  21. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174316.vue +0 -524
  22. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174419.vue +0 -524
  23. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174422.vue +0 -524
  24. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611172825.vue +0 -207
  25. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611172945.vue +0 -211
  26. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611172949.vue +0 -212
  27. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611173010.vue +0 -212
  28. package/.history/src/base-client/components/common/XForm/XFormItem_20250508134122.vue +0 -1320
  29. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171604.vue +0 -1332
  30. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171613.vue +0 -1331
  31. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171703.vue +0 -1331
  32. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171720.vue +0 -1331
  33. package/.history/src/base-client/components/common/XForm/XFormItem_20250527174327.vue +0 -1339
  34. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20250612092804.vue +0 -731
  35. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20250612112546.vue +0 -748
  36. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20250612113808.vue +0 -748
  37. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115237.vue +0 -1071
  38. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115346.vue +0 -1078
  39. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115350.vue +0 -1077
  40. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115415.vue +0 -1077
  41. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115429.vue +0 -1077
  42. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611091619.vue +0 -442
  43. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092547.vue +0 -442
  44. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092552.vue +0 -442
  45. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092744.vue +0 -475
  46. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092955.vue +0 -475
  47. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092957.vue +0 -475
  48. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611095652.vue +0 -477
  49. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611095701.vue +0 -477
  50. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611095704.vue +0 -477
  51. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100005.vue +0 -473
  52. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100011.vue +0 -473
  53. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100014.vue +0 -473
  54. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100833.vue +0 -473
  55. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100853.vue +0 -473
  56. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100940.vue +0 -473
  57. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101011.vue +0 -473
  58. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101013.vue +0 -473
  59. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101014.vue +0 -473
  60. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101159.vue +0 -473
  61. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101238.vue +0 -474
  62. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101240.vue +0 -474
  63. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101242.vue +0 -474
  64. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101404.vue +0 -472
  65. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101410.vue +0 -472
  66. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101459.vue +0 -472
  67. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101500.vue +0 -472
  68. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101502.vue +0 -472
  69. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101504.vue +0 -472
  70. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101610.vue +0 -501
  71. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101700.vue +0 -501
  72. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101702.vue +0 -501
  73. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101741.vue +0 -504
  74. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101749.vue +0 -504
  75. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101759.vue +0 -504
  76. package/.history/src/base-client/components/his/XHisEditor/dome_20250611091349.vue +0 -131
  77. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105854.vue +0 -160
  78. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105902.vue +0 -160
  79. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105924.vue +0 -160
  80. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105932.vue +0 -158
  81. package/.history/src/base-client/components/his/XList/XList_20250609135848.vue +0 -173
  82. package/.history/src/base-client/components/his/XList/XList_20250609141026.vue +0 -222
  83. package/.history/src/base-client/components/his/XList/XList_20250609141035.vue +0 -229
  84. package/.history/src/base-client/components/his/XList/XList_20250609141103.vue +0 -229
  85. package/.history/src/base-client/components/his/XList/XList_20250609141105.vue +0 -229
  86. package/.history/src/base-client/components/his/XList/XList_20250609141334.vue +0 -241
  87. package/.history/src/base-client/components/his/XList/XList_20250609141404.vue +0 -241
  88. package/.history/src/base-client/components/his/XList/XList_20250609141406.vue +0 -241
  89. package/.history/src/base-client/components/his/XList/XList_20250609141801.vue +0 -245
  90. package/.history/src/base-client/components/his/XList/XList_20250609142033.vue +0 -245
  91. package/.history/src/base-client/components/his/XList/XList_20250609142038.vue +0 -245
  92. package/.history/src/base-client/components/his/XList/XList_20250609142435.vue +0 -255
  93. package/.history/src/base-client/components/his/XList/XList_20250609142503.vue +0 -255
  94. package/.history/src/base-client/components/his/XList/XList_20250609142504.vue +0 -255
  95. package/.history/src/base-client/components/his/XList/XList_20250609143012.vue +0 -270
  96. package/.history/src/base-client/components/his/XList/XList_20250609143044.vue +0 -270
  97. package/.history/src/base-client/components/his/XList/XList_20250609143046.vue +0 -270
  98. package/.history/src/base-client/components/his/XList/XList_20250609143210.vue +0 -270
  99. package/.history/src/base-client/components/his/XList/XList_20250609144339.vue +0 -294
  100. package/.history/src/base-client/components/his/XList/XList_20250609144410.vue +0 -294
  101. package/.history/src/base-client/components/his/XList/XList_20250609144412.vue +0 -294
  102. package/.history/src/base-client/components/his/XList/XList_20250609144647.vue +0 -303
  103. package/.history/src/base-client/components/his/XList/XList_20250609144716.vue +0 -303
  104. package/.history/src/base-client/components/his/XList/XList_20250609144729.vue +0 -303
  105. package/.history/src/base-client/components/his/XList/XList_20250609151232.vue +0 -288
  106. package/.history/src/base-client/components/his/XList/XList_20250609151247.vue +0 -288
  107. package/.history/src/base-client/components/his/XList/XList_20250609151252.vue +0 -288
  108. package/.history/src/base-client/components/his/XList/XList_20250609161220.vue +0 -317
  109. package/.history/src/base-client/components/his/XList/XList_20250609161258.vue +0 -306
  110. package/.history/src/base-client/components/his/XList/XList_20250609161319.vue +0 -306
  111. package/.history/src/base-client/components/his/XList/XList_20250609161320.vue +0 -306
  112. package/Users/objecrt/af-vue2-client/src/base-client/components/his/XShiftSchedule/XShiftSchedule.vue +0 -36
  113. package/src/base-client/components/TreeList/TreeList.vue +0 -91
  114. package/src/base-client/components/TreeList/TreeNode.vue +0 -81
  115. package/src/base-client/components/common/XCardSet/XTiltle.vue +0 -191
@@ -1,207 +1,207 @@
1
- <template>
2
- <div>
3
- <div class="text-card">
4
- <div
5
- v-for="(item, index) in displayItems"
6
- :key="index"
7
- class="text-item"
8
- @click="handleItemClick(index, item.id)"
9
- @contextmenu.prevent="handleContextMenu(index, item.id)">
10
- <div class="text-content" :class="{ 'is-empty': !item.content }">
11
- {{ item.content || '+' }}
12
- </div>
13
- </div>
14
- <!-- 编辑弹出框 -->
15
- <div
16
- v-if="showEdit"
17
- class="edit-overlay"
18
- @click.self="handleOverlayClick">
19
- <div class="edit-card">
20
- <a-textarea
21
- v-model="editingContent"
22
- :autoSize="{ minRows: 3 }"
23
- @keyup.enter="handleSave"
24
- ref="textarea"/>
25
- </div>
26
- </div>
27
- <!-- 删除确认弹框 -->
28
- <a-modal
29
- v-model="showDeleteModal"
30
- title="确认删除"
31
- okText="确认"
32
- cancelText="取消"
33
- @ok="handleDeleteConfirm">
34
- <p>确定要删除这条内容吗?</p>
35
- </a-modal>
36
- </div>
37
- </div>
38
- </template>
39
-
40
- <script>
41
- import { runLogic } from '@vue2-client/services/api/common'
42
-
43
- export default {
44
- name: 'XTextCard',
45
- props: {
46
- // logic配置名,要求返回一个数组[{ id: , content: }]
47
- queryParamsName: {
48
- type: String,
49
- default: 'memorandumLOGIC'
50
- },
51
- queryParams: {
52
- type: Object,
53
- default: () => { return {} }
54
- },
55
- // 请求参数
56
- parameter: {
57
- type: Object,
58
- default: () => { return {} }
59
- }
60
- },
61
- data () {
62
- return {
63
- localItems: [], // 本地数据
64
- showEdit: false, // 是否显示编辑框
65
- editingIndex: -1, // 当前编辑的索引
66
- editingContent: '', // 编辑框的内容
67
- showDeleteModal: false, // 是否显示删除确认框
68
- deleteIndex: -1, // 要删除的项目索引
69
- ID: 0
70
- }
71
- },
72
- computed: {
73
- // 显示的列表,始终保持一个空行
74
- displayItems () {
75
- const items = [...this.localItems]
76
- // 如果最后一项不是空的,添加一个空项
77
- if (!items.length || items[items.length - 1].content) {
78
- items.push({ content: '' })
79
- }
80
- return items
81
- }
82
- },
83
- methods: {
84
- // 点击项目
85
- handleItemClick (index, id) {
86
- this.ID = id
87
- this.editingIndex = index
88
- this.editingContent = this.displayItems[index].content
89
- this.showEdit = true
90
- this.$nextTick(() => {
91
- this.$refs.textarea?.focus()
92
- })
93
- },
94
- // 点击遮罩层保存
95
- handleOverlayClick () {
96
- this.handleSave()
97
- },
98
- // 保存内容
99
- handleSave () {
100
- if (this.editingContent.trim()) {
101
- if (this.editingIndex === this.localItems.length) {
102
- // 如果是在最后一个空行添加,push新内容
103
- this.localItems.push({ content: this.editingContent.trim() })
104
- } else {
105
- // 否则更新现有内容
106
- this.localItems[this.editingIndex].content = this.editingContent.trim()
107
- }
108
- const addData = { data: this.editingContent.trim(), ID: this.ID }
109
- // 触发更新事件
110
- this.$emit('add', addData)
111
- }
112
- this.showEdit = false
113
- this.editingIndex = -1
114
- this.editingContent = ''
115
- },
116
- // 初始化数据
117
- async initData (data, parameter) {
118
- // 从配置中获取数据
119
- const resData = await runLogic(data, parameter, 'af-his')
120
- this.localItems = resData
121
- return resData
122
- },
123
- // 处理右键菜单
124
- handleContextMenu (index, id) {
125
- // 如果是最后一个空行,不显示删除框
126
- if (index === this.localItems.length) {
127
- return
128
- }
129
- this.ID = id
130
- this.deleteIndex = index
131
- this.showDeleteModal = true
132
- },
133
- // 确认删除
134
- handleDeleteConfirm () {
135
- if (this.deleteIndex > -1) {
136
- this.localItems.splice(this.deleteIndex, 1)
137
- const deleteData = { data: [...this.localItems][this.deleteIndex], ID: this.ID }
138
- this.$emit('deleteData', deleteData)
139
- this.deleteIndex = -1
140
- }
141
- this.showDeleteModal = false
142
- }
143
- },
144
- watch: {
145
- queryParamsName: {
146
- immediate: true,
147
- handler (newVal) {
148
- this.initData(newVal, this.parameter)
149
- },
150
- deep: true
151
- }
152
- }
153
- }
154
- </script>
155
-
156
- <style scoped lang="less">
157
- .text-card {
158
- position: relative;
159
- width: 100%;
160
- .text-item {
161
- padding: 8px 12px;
162
- border-bottom: 1px solid #f0f0f0;
163
- cursor: pointer;
164
- transition: all 0.3s;
165
- user-select: none;
166
-
167
- &:hover {
168
- background-color: #f5f5f5;
169
- }
170
-
171
- .text-content {
172
- white-space: nowrap;
173
- overflow: hidden;
174
- text-overflow: ellipsis;
175
- line-height: 1.5;
176
-
177
- &.is-empty {
178
- color: #5D5C5C;
179
- font-weight: 400;
180
- }
181
- }
182
- }
183
- .edit-overlay {
184
- position: fixed;
185
- top: 0;
186
- left: 0;
187
- right: 0;
188
- bottom: 0;
189
- background-color: rgba(0, 0, 0, 0.45);
190
- z-index: 1000;
191
- display: flex;
192
- align-items: center;
193
- justify-content: center;
194
- .edit-card {
195
- background: white;
196
- padding: 16px;
197
- border-radius: 8px;
198
- width: 90%;
199
- max-width: 500px;
200
- box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12);
201
- .ant-input {
202
- width: 100%;
203
- }
204
- }
205
- }
206
- }
207
- </style>
1
+ <template>
2
+ <div>
3
+ <div class="text-card">
4
+ <div
5
+ v-for="(item, index) in displayItems"
6
+ :key="index"
7
+ class="text-item"
8
+ @click="handleItemClick(index, item.id)"
9
+ @contextmenu.prevent="handleContextMenu(index, item.id)">
10
+ <div class="text-content" :class="{ 'is-empty': !item.content }">
11
+ {{ item.content || '+' }}
12
+ </div>
13
+ </div>
14
+ <!-- 编辑弹出框 -->
15
+ <div
16
+ v-if="showEdit"
17
+ class="edit-overlay"
18
+ @click.self="handleOverlayClick">
19
+ <div class="edit-card">
20
+ <a-textarea
21
+ v-model="editingContent"
22
+ :autoSize="{ minRows: 3 }"
23
+ @keyup.enter="handleSave"
24
+ ref="textarea"/>
25
+ </div>
26
+ </div>
27
+ <!-- 删除确认弹框 -->
28
+ <a-modal
29
+ v-model="showDeleteModal"
30
+ title="确认删除"
31
+ okText="确认"
32
+ cancelText="取消"
33
+ @ok="handleDeleteConfirm">
34
+ <p>确定要删除这条内容吗?</p>
35
+ </a-modal>
36
+ </div>
37
+ </div>
38
+ </template>
39
+
40
+ <script>
41
+ import { runLogic } from '@vue2-client/services/api/common'
42
+
43
+ export default {
44
+ name: 'XTextCard',
45
+ props: {
46
+ // logic配置名,要求返回一个数组[{ id: , content: }]
47
+ queryParamsName: {
48
+ type: String,
49
+ default: 'memorandumLOGIC'
50
+ },
51
+ queryParams: {
52
+ type: Object,
53
+ default: () => { return {} }
54
+ },
55
+ // 请求参数
56
+ parameter: {
57
+ type: Object,
58
+ default: () => { return {} }
59
+ }
60
+ },
61
+ data () {
62
+ return {
63
+ localItems: [], // 本地数据
64
+ showEdit: false, // 是否显示编辑框
65
+ editingIndex: -1, // 当前编辑的索引
66
+ editingContent: '', // 编辑框的内容
67
+ showDeleteModal: false, // 是否显示删除确认框
68
+ deleteIndex: -1, // 要删除的项目索引
69
+ ID: 0
70
+ }
71
+ },
72
+ computed: {
73
+ // 显示的列表,始终保持一个空行
74
+ displayItems () {
75
+ const items = [...this.localItems]
76
+ // 如果最后一项不是空的,添加一个空项
77
+ if (!items.length || items[items.length - 1].content) {
78
+ items.push({ content: '' })
79
+ }
80
+ return items
81
+ }
82
+ },
83
+ methods: {
84
+ // 点击项目
85
+ handleItemClick (index, id) {
86
+ this.ID = id
87
+ this.editingIndex = index
88
+ this.editingContent = this.displayItems[index].content
89
+ this.showEdit = true
90
+ this.$nextTick(() => {
91
+ this.$refs.textarea?.focus()
92
+ })
93
+ },
94
+ // 点击遮罩层保存
95
+ handleOverlayClick () {
96
+ this.handleSave()
97
+ },
98
+ // 保存内容
99
+ handleSave () {
100
+ if (this.editingContent.trim()) {
101
+ if (this.editingIndex === this.localItems.length) {
102
+ // 如果是在最后一个空行添加,push新内容
103
+ this.localItems.push({ content: this.editingContent.trim() })
104
+ } else {
105
+ // 否则更新现有内容
106
+ this.localItems[this.editingIndex].content = this.editingContent.trim()
107
+ }
108
+ const addData = { data: this.editingContent.trim(), ID: this.ID }
109
+ // 触发更新事件
110
+ this.$emit('add', addData)
111
+ }
112
+ this.showEdit = false
113
+ this.editingIndex = -1
114
+ this.editingContent = ''
115
+ },
116
+ // 初始化数据
117
+ async initData (data, parameter) {
118
+ // 从配置中获取数据
119
+ const resData = await runLogic(data, parameter, 'af-his')
120
+ this.localItems = resData
121
+ return resData
122
+ },
123
+ // 处理右键菜单
124
+ handleContextMenu (index, id) {
125
+ // 如果是最后一个空行,不显示删除框
126
+ if (index === this.localItems.length) {
127
+ return
128
+ }
129
+ this.ID = id
130
+ this.deleteIndex = index
131
+ this.showDeleteModal = true
132
+ },
133
+ // 确认删除
134
+ handleDeleteConfirm () {
135
+ if (this.deleteIndex > -1) {
136
+ this.localItems.splice(this.deleteIndex, 1)
137
+ const deleteData = { data: [...this.localItems][this.deleteIndex], ID: this.ID }
138
+ this.$emit('deleteData', deleteData)
139
+ this.deleteIndex = -1
140
+ }
141
+ this.showDeleteModal = false
142
+ }
143
+ },
144
+ watch: {
145
+ queryParamsName: {
146
+ immediate: true,
147
+ handler (newVal) {
148
+ this.initData(newVal, this.parameter)
149
+ },
150
+ deep: true
151
+ }
152
+ }
153
+ }
154
+ </script>
155
+
156
+ <style scoped lang="less">
157
+ .text-card {
158
+ position: relative;
159
+ width: 100%;
160
+ .text-item {
161
+ padding: 8px 12px;
162
+ border-bottom: 1px solid #f0f0f0;
163
+ cursor: pointer;
164
+ transition: all 0.3s;
165
+ user-select: none;
166
+
167
+ &:hover {
168
+ background-color: #f5f5f5;
169
+ }
170
+
171
+ .text-content {
172
+ white-space: nowrap;
173
+ overflow: hidden;
174
+ text-overflow: ellipsis;
175
+ line-height: 1.5;
176
+
177
+ &.is-empty {
178
+ color: #5D5C5C;
179
+ font-weight: 400;
180
+ }
181
+ }
182
+ }
183
+ .edit-overlay {
184
+ position: fixed;
185
+ top: 0;
186
+ left: 0;
187
+ right: 0;
188
+ bottom: 0;
189
+ background-color: rgba(0, 0, 0, 0.45);
190
+ z-index: 1000;
191
+ display: flex;
192
+ align-items: center;
193
+ justify-content: center;
194
+ .edit-card {
195
+ background: white;
196
+ padding: 16px;
197
+ border-radius: 8px;
198
+ width: 90%;
199
+ max-width: 500px;
200
+ box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12);
201
+ .ant-input {
202
+ width: 100%;
203
+ }
204
+ }
205
+ }
206
+ }
207
+ </style>
@@ -1,100 +1,100 @@
1
- <template>
2
- <div class="tree-node">
3
- <div class="node-content" @click="handleClick">
4
- <span v-if="hasChildren" class="toggle-icon">
5
- {{ node.expanded ? '-' : '+' }}
6
- </span>
7
- <span v-else class="empty-space"></span>
8
- <span class="node-title" :title="node.title">{{ node.title }}</span>
9
- </div>
10
- <div v-if="hasChildren && node.expanded" class="node-children">
11
- <tree-node
12
- v-for="child in node.children"
13
- :key="child.id"
14
- :node="child"
15
- @toggle="handleToggle"
16
- :level="level + 1"/>
17
- </div>
18
- </div>
19
- </template>
20
-
21
- <script>
22
- export default {
23
- name: 'TreeNode',
24
- props: {
25
- node: {
26
- type: Object,
27
- required: true
28
- },
29
- level: {
30
- type: Number,
31
- default: 0
32
- }
33
- },
34
- computed: {
35
- hasChildren () {
36
- return this.node.children && this.node.children.length > 0
37
- }
38
- },
39
- methods: {
40
- handleClick () {
41
- if (this.hasChildren) {
42
- this.$emit('toggle', this.node)
43
- }
44
- },
45
- handleToggle (childNode) {
46
- this.$emit('toggle', childNode)
47
- }
48
- }
49
- }
50
- </script>
51
-
52
- <style scoped>
53
- .tree-node {
54
- margin: 1px 0;
55
- white-space: nowrap;
56
- }
57
-
58
- .node-content {
59
- display: flex;
60
- align-items: center;
61
- padding: 3px 2px;
62
- user-select: none;
63
- border-radius: 2px;
64
- overflow: hidden;
65
- }
66
-
67
- .toggle-icon {
68
- width: 12px;
69
- text-align: center;
70
- font-size: 14px;
71
- color:#5D5C5C;
72
- font-weight: 400;
73
- margin-right: 3px;
74
- cursor: pointer;
75
- flex-shrink: 0;
76
- }
77
-
78
- .empty-space {
79
- width: 12px;
80
- margin-right: 3px;
81
- flex-shrink: 0;
82
- }
83
-
84
- .node-title {
85
- flex: 1;
86
- cursor: default;
87
- white-space: nowrap;
88
- overflow: hidden;
89
- text-overflow: ellipsis;
90
- min-width: 0;
91
- }
92
-
93
- .node-content:hover {
94
- background-color: #f5f5f5;
95
- }
96
-
97
- .node-children {
98
- padding-left: 15px;
99
- }
100
- </style>
1
+ <template>
2
+ <div class="tree-node">
3
+ <div class="node-content" @click="handleClick">
4
+ <span v-if="hasChildren" class="toggle-icon">
5
+ {{ node.expanded ? '-' : '+' }}
6
+ </span>
7
+ <span v-else class="empty-space"></span>
8
+ <span class="node-title" :title="node.title">{{ node.title }}</span>
9
+ </div>
10
+ <div v-if="hasChildren && node.expanded" class="node-children">
11
+ <tree-node
12
+ v-for="child in node.children"
13
+ :key="child.id"
14
+ :node="child"
15
+ @toggle="handleToggle"
16
+ :level="level + 1"/>
17
+ </div>
18
+ </div>
19
+ </template>
20
+
21
+ <script>
22
+ export default {
23
+ name: 'TreeNode',
24
+ props: {
25
+ node: {
26
+ type: Object,
27
+ required: true
28
+ },
29
+ level: {
30
+ type: Number,
31
+ default: 0
32
+ }
33
+ },
34
+ computed: {
35
+ hasChildren () {
36
+ return this.node.children && this.node.children.length > 0
37
+ }
38
+ },
39
+ methods: {
40
+ handleClick () {
41
+ if (this.hasChildren) {
42
+ this.$emit('toggle', this.node)
43
+ }
44
+ },
45
+ handleToggle (childNode) {
46
+ this.$emit('toggle', childNode)
47
+ }
48
+ }
49
+ }
50
+ </script>
51
+
52
+ <style scoped>
53
+ .tree-node {
54
+ margin: 1px 0;
55
+ white-space: nowrap;
56
+ }
57
+
58
+ .node-content {
59
+ display: flex;
60
+ align-items: center;
61
+ padding: 3px 2px;
62
+ user-select: none;
63
+ border-radius: 2px;
64
+ overflow: hidden;
65
+ }
66
+
67
+ .toggle-icon {
68
+ width: 12px;
69
+ text-align: center;
70
+ font-size: 14px;
71
+ color:#5D5C5C;
72
+ font-weight: 400;
73
+ margin-right: 3px;
74
+ cursor: pointer;
75
+ flex-shrink: 0;
76
+ }
77
+
78
+ .empty-space {
79
+ width: 12px;
80
+ margin-right: 3px;
81
+ flex-shrink: 0;
82
+ }
83
+
84
+ .node-title {
85
+ flex: 1;
86
+ cursor: default;
87
+ white-space: nowrap;
88
+ overflow: hidden;
89
+ text-overflow: ellipsis;
90
+ min-width: 0;
91
+ }
92
+
93
+ .node-content:hover {
94
+ background-color: #f5f5f5;
95
+ }
96
+
97
+ .node-children {
98
+ padding-left: 15px;
99
+ }
100
+ </style>