@bytenew/bn-bus-ui 1.1.461 → 1.1.463

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 (167) hide show
  1. package/install.js +134 -0
  2. package/package.json +20 -4
  3. package/packages/BnAddress/index.vue +141 -0
  4. package/packages/BnAddressParse/index.vue +75 -0
  5. package/packages/BnAdvancedFilter/BnFilterView.vue +145 -0
  6. package/packages/BnAdvancedFilter/index.vue +345 -0
  7. package/packages/BnAdvancedFilter/util.js +171 -0
  8. package/packages/BnCascader/BnCascader.vue +543 -0
  9. package/packages/BnCascader/BnCascaderPanel.vue +1331 -0
  10. package/packages/BnCascader/cascaderDisplay.js +102 -0
  11. package/packages/BnCheck/BnCheck.vue +253 -0
  12. package/packages/BnColumnConfig/columnConfigDialog.vue +134 -0
  13. package/packages/BnColumnConfig/component/childrenFormSetting/assocTable.vue +143 -0
  14. package/packages/BnColumnConfig/component/childrenFormSetting/assocTableSearch.vue +314 -0
  15. package/packages/BnColumnConfig/component/childrenFormSetting/index.vue +243 -0
  16. package/packages/BnColumnConfig/component/defaultSet/defaultSet.vue +114 -0
  17. package/packages/BnColumnConfig/component/defaultSet/stringDefault.vue +210 -0
  18. package/packages/BnColumnConfig/component/funcExprDialog/funcExprDialog.vue +126 -0
  19. package/packages/BnColumnConfig/component/packageFilter/index.vue +141 -0
  20. package/packages/BnColumnConfig/component/paraExplainSet/index.vue +156 -0
  21. package/packages/BnColumnConfig/component/setOption/setOption.vue +321 -0
  22. package/packages/BnColumnConfig/component/setRelationOption/ConditionList.vue +277 -0
  23. package/packages/BnColumnConfig/component/setRelationOption/LevelHeader.vue +144 -0
  24. package/packages/BnColumnConfig/component/setRelationOption/setRelationOption.vue +642 -0
  25. package/packages/BnColumnConfig/data.js +129 -0
  26. package/packages/BnColumnConfig/index.scss +23 -0
  27. package/packages/BnColumnConfig/index.vue +309 -0
  28. package/packages/BnCondVal/BnCondVal.vue +112 -0
  29. package/packages/BnCondVal/itemVal/dateRegVal.vue +39 -0
  30. package/packages/BnCondVal/itemVal/dateVal.vue +39 -0
  31. package/packages/BnCondVal/itemVal/numRegVal.vue +67 -0
  32. package/packages/BnCondVal/itemVal/numVal.vue +44 -0
  33. package/packages/BnCondVal/itemVal/relationVal.vue +73 -0
  34. package/packages/BnCondVal/itemVal/selectColumnVal.vue +58 -0
  35. package/packages/BnCondVal/itemVal/selectVal.vue +59 -0
  36. package/packages/BnCondVal/itemVal/stringVal.vue +156 -0
  37. package/packages/BnCondition/index.vue +551 -0
  38. package/packages/BnCondition/util.js +232 -0
  39. package/packages/BnDatePicker/BnDatePicker.vue +194 -0
  40. package/packages/BnDrop/BnDrop.vue +917 -0
  41. package/packages/BnEmptyTip/BnEmptyTip.vue +107 -0
  42. package/packages/BnExportOrder/BnExportOrder.vue +241 -0
  43. package/packages/BnExportOrder/validatorCode.vue +94 -0
  44. package/packages/BnFileView/BnFileView.vue +271 -0
  45. package/packages/BnFileView/FileDetail.vue +125 -0
  46. package/packages/BnFileView/videoPreview.vue +70 -0
  47. package/packages/BnFilterOption/BnFilterOption.vue +160 -0
  48. package/packages/BnFunExpr/BnFunExpr.vue +608 -0
  49. package/packages/BnImportOrder/BnImportOrder.vue +323 -0
  50. package/packages/BnImportTemplate/BnImportTemplate.vue +866 -0
  51. package/packages/BnImportTemplate/assets/merge_tip_img.png +0 -0
  52. package/packages/BnImportTemplate/assets/sheet_tip.png +0 -0
  53. package/packages/BnImportTemplate/assets/xls.png +0 -0
  54. package/packages/BnImportTemplate/components/ImportTemplateTrigger.vue +198 -0
  55. package/packages/BnImportTemplate/components/TemplateEditDialog.vue +340 -0
  56. package/packages/BnImportTemplate/components/TemplateFieldsConfig.vue +401 -0
  57. package/packages/BnImportTemplate/components/TemplateListDialog.vue +297 -0
  58. package/packages/BnInpNum/BnInpNum.vue +165 -0
  59. package/packages/BnMenus/BnMenus.vue +502 -0
  60. package/packages/BnMenus/MenuItem.vue +321 -0
  61. package/packages/BnOrderCard/BnOrderCard.vue +389 -0
  62. package/packages/BnOrderCard/orderRemark.vue +178 -0
  63. package/packages/BnOrderCard/util.js +94 -0
  64. package/packages/BnOrderDetail/BnOrderDetail.vue +338 -0
  65. package/packages/BnOrderDetail/filterLogByUser.vue +108 -0
  66. package/packages/BnOrderDetail/orderLogs.vue +53 -0
  67. package/packages/BnOrderDetail/showSubForm/index.vue +41 -0
  68. package/packages/BnOrderDetail/showSubForm/showChildTable.vue +61 -0
  69. package/packages/BnOrderDetail/showSubForm/showTimeLine.vue +131 -0
  70. package/packages/BnOrderDetail/showSubForm/tableCellCopy.vue +84 -0
  71. package/packages/BnOrderShare/index.vue +378 -0
  72. package/packages/BnOrderShare/shareUrlInp.vue +54 -0
  73. package/packages/BnRadio/BnRadio.vue +181 -0
  74. package/packages/BnRelation/BnRelation.vue +120 -0
  75. package/packages/BnSelect/BnSelect.vue +485 -0
  76. package/packages/BnSmartForm/BnBatchForm.vue +334 -0
  77. package/packages/BnSmartForm/BnBatchFormDialog.vue +423 -0
  78. package/packages/BnSmartForm/BnSmartElf/elfLog/index.vue +57 -0
  79. package/packages/BnSmartForm/BnSmartElf/index.vue +95 -0
  80. package/packages/BnSmartForm/BnSmartFormPsychic.js +629 -0
  81. package/packages/BnSmartForm/BnSmartFormUtil.js +524 -0
  82. package/packages/BnSmartForm/addressForm/index.vue +73 -0
  83. package/packages/BnSmartForm/checkboxForm/index.vue +99 -0
  84. package/packages/BnSmartForm/childrenForm/childFormFile.vue +237 -0
  85. package/packages/BnSmartForm/childrenForm/childrenFormBody.vue +260 -0
  86. package/packages/BnSmartForm/childrenForm/index.vue +110 -0
  87. package/packages/BnSmartForm/childrenForm/searchInventory.vue +115 -0
  88. package/packages/BnSmartForm/chooseAssocTable/chooseAssocTable.vue +451 -0
  89. package/packages/BnSmartForm/chooseAssocTable/chooseChildGood.vue +229 -0
  90. package/packages/BnSmartForm/chooseAssocTable/tableCellCopy.vue +84 -0
  91. package/packages/BnSmartForm/chooseChildOrder/chooseChildOrder.vue +158 -0
  92. package/packages/BnSmartForm/chooseIPaasData/chooseIPaasData.vue +307 -0
  93. package/packages/BnSmartForm/chooseIPaasData/tableCellCopy.vue +84 -0
  94. package/packages/BnSmartForm/choosePackage/choosePackage.vue +361 -0
  95. package/packages/BnSmartForm/dateDualForm/index.vue +37 -0
  96. package/packages/BnSmartForm/dateForm/index.vue +38 -0
  97. package/packages/BnSmartForm/fileForm/fileFormData.js +50 -0
  98. package/packages/BnSmartForm/fileForm/index.vue +240 -0
  99. package/packages/BnSmartForm/formItemFooter/formItemFooter.vue +38 -0
  100. package/packages/BnSmartForm/formItemTop/formItemTop.vue +42 -0
  101. package/packages/BnSmartForm/index.vue +1201 -0
  102. package/packages/BnSmartForm/numberForm/index.vue +63 -0
  103. package/packages/BnSmartForm/radioForm/index.vue +72 -0
  104. package/packages/BnSmartForm/receiveForm/index.vue +112 -0
  105. package/packages/BnSmartForm/relationForm/index.vue +82 -0
  106. package/packages/BnSmartForm/scoreForm/index.vue +39 -0
  107. package/packages/BnSmartForm/selectForm/index.vue +55 -0
  108. package/packages/BnSmartForm/showValForm/index.vue +42 -0
  109. package/packages/BnSmartForm/showValForm/showValFormTable.vue +104 -0
  110. package/packages/BnSmartForm/smartFormsCommon.scss +43 -0
  111. package/packages/BnSmartForm/stringForm/index.vue +170 -0
  112. package/packages/BnVirtPopover/index.vue +319 -0
  113. package/packages/BnWebLog/BnWebLog.vue +140 -0
  114. package/packages/BnWorkSettingDrop/advancedOptions.js +112 -0
  115. package/packages/BnWorkSettingDrop/benBenAIUtil.js +89 -0
  116. package/packages/BnWorkSettingDrop/index.vue +292 -0
  117. package/packages/font/iconfont.css +243 -0
  118. package/packages/font/iconfont.ttf +0 -0
  119. package/packages/font/iconfont.woff +0 -0
  120. package/packages/font/iconfont.woff2 +0 -0
  121. package/utils/addressParse-old.js +645 -0
  122. package/utils/addressParse.js +735 -0
  123. package/utils/config.js +68 -0
  124. package/utils/index.js +1171 -0
  125. package/dist/assocTableSearch-C14i_zJO.js +0 -349
  126. package/dist/assocTableSearch.css +0 -1
  127. package/dist/bn-bus-ui.es.js +0 -65
  128. package/dist/bn-bus-ui.umd.js +0 -49
  129. package/dist/chooseIPaasData-Cl_5qkFA.js +0 -391
  130. package/dist/chooseIPaasData.css +0 -1
  131. package/dist/defaultSet-I4xpf8a4.js +0 -297
  132. package/dist/defaultSet.css +0 -1
  133. package/dist/fileFormData-D_Q1vylE.js +0 -53
  134. package/dist/formItemFooter-CTA7rDtV.js +0 -108
  135. package/dist/formItemFooter.css +0 -1
  136. package/dist/funcExprDialog-Cm5BiRM3.js +0 -139
  137. package/dist/funcExprDialog.css +0 -1
  138. package/dist/index-B6b4uj8v.js +0 -51
  139. package/dist/index-BWdkDTbz.js +0 -109
  140. package/dist/index-BdZ1zOap.js +0 -89
  141. package/dist/index-BdzNjjMC.js +0 -64
  142. package/dist/index-BfpZqab2.js +0 -66
  143. package/dist/index-BmkiB4hr.js +0 -66
  144. package/dist/index-Br1sqCoo.js +0 -58
  145. package/dist/index-C9qrl-yc.js +0 -183
  146. package/dist/index-CXFJXCn5.js +0 -746
  147. package/dist/index-DF114jZq.js +0 -135
  148. package/dist/index-DFPfZ_Il.js +0 -178
  149. package/dist/index-DSEtu7TN.js +0 -44
  150. package/dist/index-Did0UUWV.js +0 -221
  151. package/dist/index-DrPj-tmI.js +0 -45
  152. package/dist/index-DzDf9s2W.js +0 -89
  153. package/dist/index-LnjudNEI.js +0 -118
  154. package/dist/index-ObCfCmDT.js +0 -45
  155. package/dist/index.css +0 -1
  156. package/dist/index2.css +0 -1
  157. package/dist/index3.css +0 -1
  158. package/dist/index4.css +0 -1
  159. package/dist/index5.css +0 -1
  160. package/dist/index6.css +0 -1
  161. package/dist/index7.css +0 -1
  162. package/dist/install-C-scqkds.js +0 -23103
  163. package/dist/install.css +0 -1
  164. package/dist/setOption-CSnWzOny.js +0 -329
  165. package/dist/setOption.css +0 -1
  166. package/dist/setRelationOption-CJcHdfaa.js +0 -5217
  167. package/dist/setRelationOption.css +0 -1
@@ -0,0 +1,321 @@
1
+ <template>
2
+ <div class="setOpt">
3
+ <!-- 顶部操作栏 -->
4
+ <div class="setOpt-top w-flex-center w-flex-between">
5
+ <div class="w-flex-center">
6
+ <div class="setOpt-top-title">选项配置</div>
7
+ <div class="w-color-orange">
8
+ (共{{columnData.moduleDefinition.length}}个选项)
9
+ </div>
10
+ <div class="w-margin-left8" v-if="filedType != 'DataFields'">
11
+ <el-button link type="primary" @click="showBatchAdd=!showBatchAdd;addOptionText=''" class="w-padding0">
12
+ <span class="bnUIcon bnUIcon-batchAdd w-padding-right2 w-font14"></span>
13
+ 批量
14
+ </el-button>
15
+ <el-button link type="primary" @click="addOption()" class="w-padding0">
16
+ <span class="bnUIcon bnUIcon-addFile w-padding-right2 w-font14"></span>添加
17
+ </el-button>
18
+ </div>
19
+ </div>
20
+ <div class="w-flex-center" v-if="openDataField">
21
+ <div class="setOpt-filedType">
22
+ <el-segmented v-model="filedType" :props="{value:'id',label:'title'}" @change="changeFiledType"
23
+ :options="[{id:'',title:'选项'},{id:'DataFields',title:'数据字典'}]" />
24
+ </div>
25
+ </div>
26
+ </div>
27
+ <!-- 批量添加区域 -->
28
+ <div v-if="showBatchAdd && filedType != 'DataFields'" class="setOpt-batch">
29
+ <el-input v-model="addOptionText" type="textarea" clearable :rows="4" resize="none"
30
+ @keydown.enter="addOption('add')"
31
+ placeholder="支持换行、逗号、空格分隔,自动去重,最多添加100个,手动按回车键自动进行追加操作"></el-input>
32
+ <div class="w-flex-right w-margin-top8">
33
+ <el-button link type="warning" @click="showBatchAdd=false;addOptionText=''">收起</el-button>
34
+ <el-button link type="primary" @click="addOption('add')">追加</el-button>
35
+ <el-button link type="primary" @click="addOption('cover')">覆盖</el-button>
36
+ </div>
37
+ </div>
38
+ <div v-if="filedType != 'DataFields'">
39
+ <!-- 选项列表 -->
40
+ <el-scrollbar max-height="260px" class="setOpt-list" ref="optionList">
41
+ <draggable v-model="columnData.moduleDefinition" item-key="id"
42
+ handle=".setOpt-list-item-drag" ghost-class="ghost-item"
43
+ chosen-class="chosen-item" animation="300" tag="div">
44
+ <template #item="{element, index}">
45
+ <div class="setOpt-list-item" :class="[componentWidth>400?'two':'one']">
46
+ <div class="setOpt-list-item-drag w-default-hover">
47
+ <span class="bnUIcon bnUIcon-move"></span>
48
+ </div>
49
+ <el-input v-model.trim="element.title" clearable
50
+ :class="{ 'is-new-option': isNewOption(element.title) }"
51
+ @focus="oldTitle = element.title" maxlength="100" show-word-limit
52
+ @blur="updateOptionTitle(element.title)"></el-input>
53
+ <el-switch v-model="element.columnStatus" :active-value="1" :inactive-value="0"
54
+ class="w-padding-lr6"></el-switch>
55
+ <span class="bnUIcon bnUIcon-delete" @click="deleteOption(index, element.title)"></span>
56
+ </div>
57
+ </template>
58
+ </draggable>
59
+ </el-scrollbar>
60
+ <div class="w-empty" v-if="!columnData.moduleDefinition || columnData.moduleDefinition.length == 0">暂无选项数据</div>
61
+ </div>
62
+ <div class="w-margin-top8" v-else>
63
+ <BnSelect v-model="columnData.insideDataSourceInfo.field" clearable filterable
64
+ :labelInValue="false" placeholder="请选择你的数据字典"
65
+ :pathUrl="'/ipaas/web/enum/userList'"
66
+ :post-data="{
67
+ pageSize: 1000,
68
+ pageNum: 1,
69
+ data: {
70
+ type: 1,
71
+ }
72
+ }"
73
+ :postFunc="postFunc"
74
+ ></BnSelect>
75
+ </div>
76
+ </div>
77
+ </template>
78
+
79
+ <script>
80
+ import {cloneDeep} from "lodash";
81
+
82
+ export default {
83
+ name: "setOption",
84
+ props: {
85
+ columnData: {
86
+ type: Object,
87
+ default: () => ({}),
88
+ },
89
+ openDataField: Boolean, // 是否支持数据字典配置
90
+ postFunc: Function, // API请求函数
91
+ extendPost: Object, // 额外的请求参数
92
+ },
93
+ data() {
94
+ return {
95
+ addOptionText: "", // 批量添加输入框内容
96
+ showBatchAdd: false, // 是否显示批量添加区域
97
+ newOptions: [], // 新增选项名称数组(用于橘黄色高亮)
98
+ oldTitle: "", // 记录修改前的标题(用于更新newOptions)
99
+ componentWidth: 0, // 组件宽度
100
+ filedType: "", //是否选择数据字典 option选项 DataFields数据字典
101
+ };
102
+ },
103
+ mounted() {
104
+ this.filedType = this.columnData.insideDataSourceInfo?.type || ''
105
+ // 计算组件宽度
106
+ this.calculateWidth();
107
+ },
108
+ methods: {
109
+ /**
110
+ * 计算组件宽度
111
+ */
112
+ calculateWidth() {
113
+ this.$nextTick(() => {
114
+ const el = this.$el;
115
+ if (el) {
116
+ this.componentWidth = el.offsetWidth;
117
+ }
118
+ });
119
+ },
120
+ /**
121
+ * 切换字典还是选项
122
+ */
123
+ changeFiledType() {
124
+ this.columnData.moduleDefinition=[];
125
+ this.columnData.defaultInfo={};
126
+ this.columnData.insideDataSourceInfo = {}
127
+ if(this.filedType == 'DataFields'){
128
+ this.columnData.insideDataSourceInfo = { type: "DataFields",table:'',field:''};
129
+ }
130
+ },
131
+ /**
132
+ * 判断是否为新增选项(用于橘黄色高亮)
133
+ */
134
+ isNewOption(title) {
135
+ return this.newOptions.includes(title);
136
+ },
137
+
138
+ /**
139
+ * 更新选项标题
140
+ * 当用户修改输入框内容时,同步更新newOptions数组
141
+ */
142
+ updateOptionTitle(newTitle) {
143
+ if (this.oldTitle === newTitle) return;
144
+ const index = this.newOptions.indexOf(this.oldTitle);
145
+ if (index > -1) {
146
+ this.newOptions.splice(index, 1, newTitle);
147
+ }
148
+ this.oldTitle = "";
149
+ },
150
+
151
+ /**
152
+ * 解析批量输入文本
153
+ * 支持换行、中英文逗号、空格分隔,自动去重,最多100个
154
+ */
155
+ parseBatchText(text) {
156
+ return text.split(/[\n,,\s]+/)
157
+ .map(item => item.trim())
158
+ .filter(Boolean)
159
+ .slice(0, 100); // 限制最多100个
160
+ },
161
+
162
+ /**
163
+ * 过滤已存在的选项
164
+ * 返回需要真正新增的选项列表
165
+ */
166
+ filterExistingOptions(optionList) {
167
+ const existingTitles = this.columnData.moduleDefinition.map(item => item.title);
168
+ return optionList.filter(title => !existingTitles.includes(title));
169
+ },
170
+
171
+ /**
172
+ * 构造选项对象
173
+ */
174
+ buildOptions(optionList, idList) {
175
+ const startSeq = this.columnData.moduleDefinition.length + 1;
176
+ return optionList.map((title, index) => ({
177
+ sequence: startSeq + index,
178
+ code: idList[index],
179
+ columnStatus: 1,
180
+ id: idList[index],
181
+ title,
182
+ }));
183
+ },
184
+
185
+ /**
186
+ * 滚动到列表底部
187
+ */
188
+ scrollToBottom() {
189
+ this.$nextTick(() => {
190
+ const scrollbar = this.$refs.optionList;
191
+ if (scrollbar && scrollbar.$el) {
192
+ const wrap = scrollbar.$el.querySelector('.el-scrollbar__wrap');
193
+ if (wrap) {
194
+ wrap.scrollTop = wrap.scrollHeight;
195
+ }
196
+ }
197
+ });
198
+ },
199
+
200
+ /**
201
+ * 添加选项
202
+ * @param {String} type - 操作类型:'add'追加、'cover'覆盖、undefined单个添加
203
+ */
204
+ async addOption(type) {
205
+ let optionList = [];
206
+ // 单个添加
207
+ if (!type) {
208
+ const sort = this.newOptions.length + 1;
209
+ const title = `选项${sort}`;
210
+ optionList = [title];
211
+ this.newOptions.push(title);
212
+ }
213
+ // 批量添加
214
+ else {
215
+ // 解析并去重
216
+ optionList = [...new Set(this.parseBatchText(this.addOptionText))];
217
+ // 所有新输入的名字都加入newOptions(包括重复的,用于高亮显示)
218
+ this.newOptions.push(...optionList);
219
+
220
+ // 过滤已存在的选项
221
+ optionList = this.filterExistingOptions(optionList);
222
+
223
+ // 如果没有需要新增的选项,直接返回
224
+ if (optionList.length === 0) return;
225
+ }
226
+ // 请求生成唯一ID
227
+ const appId = this.extendPost?.appId || 'noApp';
228
+ const res = await this.postFunc(
229
+ `/v2/projects/customId/${optionList.length}/${appId}`,
230
+ null,
231
+ 'get'
232
+ );
233
+ if (!res.code) {
234
+ const options = this.buildOptions(optionList, res.data);
235
+
236
+ // 覆盖或追加
237
+ this.columnData.moduleDefinition = type === 'cover'
238
+ ? cloneDeep(options)
239
+ : [...this.columnData.moduleDefinition, ...options];
240
+
241
+ this.scrollToBottom();
242
+ }
243
+ },
244
+ /**
245
+ * 删除选项
246
+ */
247
+ deleteOption(index, title) {
248
+ this.columnData.moduleDefinition.splice(index, 1);
249
+ // 同步删除newOptions中的记录
250
+ const newOptionIndex = this.newOptions.indexOf(title);
251
+ if (newOptionIndex > -1) {
252
+ this.newOptions.splice(newOptionIndex, 1);
253
+ }
254
+ },
255
+ },
256
+ };
257
+ </script>
258
+ <style scoped lang="scss">
259
+ .setOpt {
260
+ // 顶部操作栏
261
+ &-top {
262
+ height: 32px;
263
+ font-size: 14px;
264
+
265
+ &-title {
266
+ font-weight: 500;
267
+ }
268
+ }
269
+
270
+ // 批量添加区域
271
+ &-batch {
272
+ margin-top: 10px;
273
+ }
274
+
275
+ &-filedType .el-segmented {
276
+ --el-segmented-item-selected-color: #fff;
277
+ --el-segmented-item-selected-bg-color: #409EFF;
278
+ --el-border-radius-base: 16px;
279
+ }
280
+
281
+ // 选项列表
282
+ &-list {
283
+ margin-top: 10px;
284
+ padding-right: 10px;
285
+ & .el-scrollbar__view > div {
286
+ display: flex;
287
+ flex-wrap: wrap;
288
+ gap: 10px;
289
+ }
290
+
291
+ &-item {
292
+ display: flex;
293
+ align-items: center;
294
+ cursor: pointer;
295
+
296
+ &.two {
297
+ width: calc(50% - 5px);
298
+ }
299
+
300
+ &.one {
301
+ width: 100%;
302
+ }
303
+
304
+ &-drag {
305
+ padding-right: 8px;
306
+ }
307
+
308
+ // 新增选项橘黄色高亮样式
309
+ :deep(.is-new-option) {
310
+ .el-input__wrapper {
311
+ box-shadow: 0 0 0 1px #ff9800 inset;
312
+
313
+ &:hover, &.is-focus {
314
+ box-shadow: 0 0 0 1px #ff9800 inset !important;
315
+ }
316
+ }
317
+ }
318
+ }
319
+ }
320
+ }
321
+ </style>
@@ -0,0 +1,277 @@
1
+ <template>
2
+ <div class="condition-list">
3
+ <!-- 空状态提示 -->
4
+ <div v-if="showEmpty" class="condition-list__empty">
5
+ &nbsp;&nbsp;没有设置条件,
6
+ <el-button type="text" @click="handleAdd()">新增条件</el-button>
7
+ </div>
8
+
9
+ <!-- 提示信息(仅非第一级且未选中父级时显示) -->
10
+ <div v-if="showTip" class="condition-list__tip">
11
+ 选中父级菜单,才能设置子级选项
12
+ </div>
13
+
14
+ <!-- 可拖拽的选项列表 -->
15
+ <draggable
16
+ v-if="showList"
17
+ v-model="localOptions"
18
+ item-key="id"
19
+ handle=".drag-handle"
20
+ ghost-class="ghost-item"
21
+ chosen-class="chosen-item"
22
+ animation="300"
23
+ @end="handleDragEnd"
24
+ >
25
+ <template #item="{element, index}">
26
+ <div
27
+ class="condition-item"
28
+ :class="{ 'condition-item--active': isActive(element) }"
29
+ @click="$emit('select', element)"
30
+ >
31
+ <!-- 拖拽手柄 -->
32
+ <div class="condition-item__drag drag-handle">
33
+ <span class="bnUIcon bnUIcon-move"></span>
34
+ </div>
35
+
36
+ <!-- 选项名称输入框 -->
37
+ <div class="condition-item__input">
38
+ <el-input v-model="element.title" placeholder="设置名称"/>
39
+ </div>
40
+
41
+ <!-- 操作按钮组 -->
42
+ <div class="condition-item__actions">
43
+ <!-- 添加按钮 -->
44
+ <span
45
+ class="condition-item__action-icon bnUIcon bnUIcon-add"
46
+ @click.stop="handleAdd(index)"
47
+ title="添加"
48
+ />
49
+
50
+ <!-- 启用/禁用开关 -->
51
+ <el-switch
52
+ v-model="element.columnStatus"
53
+ active-value="1"
54
+ inactive-value="0"
55
+ @click.stop
56
+ />
57
+
58
+ <!-- 删除按钮 -->
59
+ <span
60
+ class="condition-item__action-icon bnUIcon bnUIcon-delete"
61
+ @click.stop="$emit('delete', index)"
62
+ title="删除"
63
+ />
64
+ </div>
65
+ </div>
66
+ </template>
67
+ </draggable>
68
+ </div>
69
+ </template>
70
+
71
+ <script>
72
+ import draggable from 'vuedraggable';
73
+
74
+ /**
75
+ * 条件列表组件
76
+ * 用于显示和管理联动选项列表,支持拖拽排序
77
+ */
78
+ export default {
79
+ name: 'ConditionList',
80
+
81
+ components: {
82
+ draggable
83
+ },
84
+
85
+ props: {
86
+ // 选项列表数据
87
+ options: {
88
+ type: Array,
89
+ default: () => []
90
+ },
91
+
92
+ // 当前选中的选项
93
+ selectedOption: {
94
+ type: Object,
95
+ default: null
96
+ },
97
+
98
+ // 当前级别(0表示第一级)
99
+ level: {
100
+ type: Number,
101
+ required: true
102
+ },
103
+
104
+ // 是否为第一级
105
+ isFirstLevel: {
106
+ type: Boolean,
107
+ default: false
108
+ },
109
+
110
+ // 父级是否已选中(仅非第一级需要)
111
+ hasParentSelected: {
112
+ type: Boolean,
113
+ default: true
114
+ }
115
+ },
116
+
117
+ emits: ['select', 'add', 'delete', 'update:options'],
118
+
119
+ computed: {
120
+ // 本地选项列表(用于v-model)
121
+ localOptions: {
122
+ get() {
123
+ return this.options || [];
124
+ },
125
+ set(value) {
126
+ this.$emit('update:options', value);
127
+ }
128
+ },
129
+
130
+ // 是否显示提示信息(仅非第一级且未选中父级时显示)
131
+ showTip() {
132
+ return !this.isFirstLevel && !this.hasParentSelected;
133
+ },
134
+
135
+ // 是否显示空状态(有父级选中或是第一级,且列表为空时显示)
136
+ showEmpty() {
137
+ return (this.isFirstLevel || this.hasParentSelected) && this.localOptions.length === 0;
138
+ },
139
+
140
+ // 是否显示列表
141
+ showList() {
142
+ return this.localOptions.length > 0;
143
+ }
144
+ },
145
+
146
+ methods: {
147
+ /**
148
+ * 判断是否为当前选中项
149
+ */
150
+ isActive(element) {
151
+ return this.selectedOption?.id === element.id;
152
+ },
153
+
154
+ /**
155
+ * 处理添加操作
156
+ */
157
+ handleAdd(index) {
158
+ this.$emit('add', index !== undefined ? index : -1);
159
+ },
160
+
161
+ /**
162
+ * 处理拖拽结束
163
+ */
164
+ handleDragEnd() {
165
+ // 更新序号
166
+ this.localOptions.forEach((option, index) => {
167
+ option.sequence = index;
168
+ });
169
+ this.$emit('update:options', this.localOptions);
170
+ }
171
+ }
172
+ };
173
+ </script>
174
+
175
+ <style scoped lang="scss">
176
+ .condition-list {
177
+ height: 100%;
178
+ overflow-y: auto;
179
+
180
+ // 空状态
181
+ &__empty {
182
+ padding: 10px;
183
+ font-size: 12px;
184
+ color: #999;
185
+
186
+ .el-button {
187
+ font-size: 12px;
188
+ }
189
+ }
190
+
191
+ // 提示信息
192
+ &__tip {
193
+ padding: 10px;
194
+ line-height: 22px;
195
+ font-size: 12px;
196
+ color: #999;
197
+ }
198
+ }
199
+
200
+ // 条件项样式
201
+ .condition-item {
202
+ display: flex;
203
+ align-items: center;
204
+ width: 100%;
205
+ height: 34px;
206
+ transition: background-color 0.3s;
207
+ cursor: pointer;
208
+
209
+ &--active {
210
+ background-color: #e0ecfe;
211
+ }
212
+
213
+ &:hover {
214
+ background-color: #eef5fe;
215
+ }
216
+
217
+ // 拖拽手柄
218
+ &__drag {
219
+ width: 25px;
220
+ height: 34px;
221
+ line-height: 34px;
222
+ text-align: center;
223
+ cursor: move;
224
+ flex-shrink: 0;
225
+ }
226
+
227
+ // 输入框
228
+ &__input {
229
+ flex: 1;
230
+ padding: 2px 5px;
231
+ min-width: 0;
232
+ }
233
+
234
+ // 操作按钮组
235
+ &__actions {
236
+ display: flex;
237
+ align-items: center;
238
+ gap: 5px;
239
+ padding-right: 5px;
240
+ flex-shrink: 0;
241
+ }
242
+
243
+ // 操作图标
244
+ &__action-icon {
245
+ width: 20px;
246
+ height: 20px;
247
+ display: flex;
248
+ align-items: center;
249
+ justify-content: center;
250
+ cursor: pointer;
251
+ transition: opacity 0.3s;
252
+
253
+ &:hover {
254
+ opacity: 0.6;
255
+ }
256
+
257
+ &.bnUIcon-add {
258
+ color: #67c23a;
259
+ }
260
+
261
+ &.bnUIcon-delete {
262
+ color: #f56c6c;
263
+ }
264
+ }
265
+ }
266
+
267
+ // 拖拽效果
268
+ .ghost-item {
269
+ opacity: 0.5;
270
+ background: #f0f0f0;
271
+ }
272
+
273
+ .chosen-item {
274
+ opacity: 0.9;
275
+ }
276
+ </style>
277
+