@bytenew/bn-bus-ui 1.1.463 → 1.1.464

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/dist/assocTableSearch-Bfe96864.js +349 -0
  2. package/dist/assocTableSearch.css +1 -0
  3. package/dist/bn-bus-ui.es.js +65 -0
  4. package/dist/bn-bus-ui.umd.js +49 -0
  5. package/dist/chooseIPaasData-COrrvQKZ.js +391 -0
  6. package/dist/chooseIPaasData.css +1 -0
  7. package/dist/defaultSet-CzN1ec_d.js +297 -0
  8. package/dist/defaultSet.css +1 -0
  9. package/dist/fileFormData-D_Q1vylE.js +53 -0
  10. package/dist/formItemFooter-BvptZj_u.js +108 -0
  11. package/dist/formItemFooter.css +1 -0
  12. package/dist/funcExprDialog-BguNs9fl.js +139 -0
  13. package/dist/funcExprDialog.css +1 -0
  14. package/dist/index-0oB7QocU.js +44 -0
  15. package/dist/index-69fRP0M8.js +89 -0
  16. package/dist/index-BdklTJtF.js +66 -0
  17. package/dist/index-Bu3jHlby.js +45 -0
  18. package/dist/index-BxWx5kpG.js +89 -0
  19. package/dist/index-C5LQ0OSs.js +183 -0
  20. package/dist/index-C8YhrrUN.js +51 -0
  21. package/dist/index-COuPCIzB.js +45 -0
  22. package/dist/index-CSvVyjxx.js +178 -0
  23. package/dist/index-DCv51EXX.js +109 -0
  24. package/dist/index-DUSI6MuC.js +135 -0
  25. package/dist/index-DVzxs2vR.js +58 -0
  26. package/dist/index-Dd4b8zNb.js +746 -0
  27. package/dist/index-Md-ZlkCW.js +66 -0
  28. package/dist/index-hsSIY2FP.js +221 -0
  29. package/dist/index-n13-H3_Y.js +118 -0
  30. package/dist/index-wUl5aPUD.js +64 -0
  31. package/dist/index.css +1 -0
  32. package/dist/index2.css +1 -0
  33. package/dist/index3.css +1 -0
  34. package/dist/index4.css +1 -0
  35. package/dist/index5.css +1 -0
  36. package/dist/index6.css +1 -0
  37. package/dist/index7.css +1 -0
  38. package/dist/install-CNjs0u5x.js +23299 -0
  39. package/dist/install.css +1 -0
  40. package/dist/setOption-CXOifQcx.js +329 -0
  41. package/dist/setOption.css +1 -0
  42. package/dist/setRelationOption-C7VDhej7.js +5217 -0
  43. package/dist/setRelationOption.css +1 -0
  44. package/package.json +4 -20
  45. package/install.js +0 -134
  46. package/packages/BnAddress/index.vue +0 -141
  47. package/packages/BnAddressParse/index.vue +0 -75
  48. package/packages/BnAdvancedFilter/BnFilterView.vue +0 -145
  49. package/packages/BnAdvancedFilter/index.vue +0 -345
  50. package/packages/BnAdvancedFilter/util.js +0 -171
  51. package/packages/BnCascader/BnCascader.vue +0 -543
  52. package/packages/BnCascader/BnCascaderPanel.vue +0 -1331
  53. package/packages/BnCascader/cascaderDisplay.js +0 -102
  54. package/packages/BnCheck/BnCheck.vue +0 -253
  55. package/packages/BnColumnConfig/columnConfigDialog.vue +0 -134
  56. package/packages/BnColumnConfig/component/childrenFormSetting/assocTable.vue +0 -143
  57. package/packages/BnColumnConfig/component/childrenFormSetting/assocTableSearch.vue +0 -314
  58. package/packages/BnColumnConfig/component/childrenFormSetting/index.vue +0 -243
  59. package/packages/BnColumnConfig/component/defaultSet/defaultSet.vue +0 -114
  60. package/packages/BnColumnConfig/component/defaultSet/stringDefault.vue +0 -210
  61. package/packages/BnColumnConfig/component/funcExprDialog/funcExprDialog.vue +0 -126
  62. package/packages/BnColumnConfig/component/packageFilter/index.vue +0 -141
  63. package/packages/BnColumnConfig/component/paraExplainSet/index.vue +0 -156
  64. package/packages/BnColumnConfig/component/setOption/setOption.vue +0 -321
  65. package/packages/BnColumnConfig/component/setRelationOption/ConditionList.vue +0 -277
  66. package/packages/BnColumnConfig/component/setRelationOption/LevelHeader.vue +0 -144
  67. package/packages/BnColumnConfig/component/setRelationOption/setRelationOption.vue +0 -642
  68. package/packages/BnColumnConfig/data.js +0 -129
  69. package/packages/BnColumnConfig/index.scss +0 -23
  70. package/packages/BnColumnConfig/index.vue +0 -309
  71. package/packages/BnCondVal/BnCondVal.vue +0 -112
  72. package/packages/BnCondVal/itemVal/dateRegVal.vue +0 -39
  73. package/packages/BnCondVal/itemVal/dateVal.vue +0 -39
  74. package/packages/BnCondVal/itemVal/numRegVal.vue +0 -67
  75. package/packages/BnCondVal/itemVal/numVal.vue +0 -44
  76. package/packages/BnCondVal/itemVal/relationVal.vue +0 -73
  77. package/packages/BnCondVal/itemVal/selectColumnVal.vue +0 -58
  78. package/packages/BnCondVal/itemVal/selectVal.vue +0 -59
  79. package/packages/BnCondVal/itemVal/stringVal.vue +0 -156
  80. package/packages/BnCondition/index.vue +0 -551
  81. package/packages/BnCondition/util.js +0 -232
  82. package/packages/BnDatePicker/BnDatePicker.vue +0 -194
  83. package/packages/BnDrop/BnDrop.vue +0 -917
  84. package/packages/BnEmptyTip/BnEmptyTip.vue +0 -107
  85. package/packages/BnExportOrder/BnExportOrder.vue +0 -241
  86. package/packages/BnExportOrder/validatorCode.vue +0 -94
  87. package/packages/BnFileView/BnFileView.vue +0 -271
  88. package/packages/BnFileView/FileDetail.vue +0 -125
  89. package/packages/BnFileView/videoPreview.vue +0 -70
  90. package/packages/BnFilterOption/BnFilterOption.vue +0 -160
  91. package/packages/BnFunExpr/BnFunExpr.vue +0 -608
  92. package/packages/BnImportOrder/BnImportOrder.vue +0 -323
  93. package/packages/BnImportTemplate/BnImportTemplate.vue +0 -866
  94. package/packages/BnImportTemplate/assets/merge_tip_img.png +0 -0
  95. package/packages/BnImportTemplate/assets/sheet_tip.png +0 -0
  96. package/packages/BnImportTemplate/assets/xls.png +0 -0
  97. package/packages/BnImportTemplate/components/ImportTemplateTrigger.vue +0 -198
  98. package/packages/BnImportTemplate/components/TemplateEditDialog.vue +0 -340
  99. package/packages/BnImportTemplate/components/TemplateFieldsConfig.vue +0 -401
  100. package/packages/BnImportTemplate/components/TemplateListDialog.vue +0 -297
  101. package/packages/BnInpNum/BnInpNum.vue +0 -165
  102. package/packages/BnMenus/BnMenus.vue +0 -502
  103. package/packages/BnMenus/MenuItem.vue +0 -321
  104. package/packages/BnOrderCard/BnOrderCard.vue +0 -389
  105. package/packages/BnOrderCard/orderRemark.vue +0 -178
  106. package/packages/BnOrderCard/util.js +0 -94
  107. package/packages/BnOrderDetail/BnOrderDetail.vue +0 -338
  108. package/packages/BnOrderDetail/filterLogByUser.vue +0 -108
  109. package/packages/BnOrderDetail/orderLogs.vue +0 -53
  110. package/packages/BnOrderDetail/showSubForm/index.vue +0 -41
  111. package/packages/BnOrderDetail/showSubForm/showChildTable.vue +0 -61
  112. package/packages/BnOrderDetail/showSubForm/showTimeLine.vue +0 -131
  113. package/packages/BnOrderDetail/showSubForm/tableCellCopy.vue +0 -84
  114. package/packages/BnOrderShare/index.vue +0 -378
  115. package/packages/BnOrderShare/shareUrlInp.vue +0 -54
  116. package/packages/BnRadio/BnRadio.vue +0 -181
  117. package/packages/BnRelation/BnRelation.vue +0 -120
  118. package/packages/BnSelect/BnSelect.vue +0 -485
  119. package/packages/BnSmartForm/BnBatchForm.vue +0 -334
  120. package/packages/BnSmartForm/BnBatchFormDialog.vue +0 -423
  121. package/packages/BnSmartForm/BnSmartElf/elfLog/index.vue +0 -57
  122. package/packages/BnSmartForm/BnSmartElf/index.vue +0 -95
  123. package/packages/BnSmartForm/BnSmartFormPsychic.js +0 -629
  124. package/packages/BnSmartForm/BnSmartFormUtil.js +0 -524
  125. package/packages/BnSmartForm/addressForm/index.vue +0 -73
  126. package/packages/BnSmartForm/checkboxForm/index.vue +0 -99
  127. package/packages/BnSmartForm/childrenForm/childFormFile.vue +0 -237
  128. package/packages/BnSmartForm/childrenForm/childrenFormBody.vue +0 -260
  129. package/packages/BnSmartForm/childrenForm/index.vue +0 -110
  130. package/packages/BnSmartForm/childrenForm/searchInventory.vue +0 -115
  131. package/packages/BnSmartForm/chooseAssocTable/chooseAssocTable.vue +0 -451
  132. package/packages/BnSmartForm/chooseAssocTable/chooseChildGood.vue +0 -229
  133. package/packages/BnSmartForm/chooseAssocTable/tableCellCopy.vue +0 -84
  134. package/packages/BnSmartForm/chooseChildOrder/chooseChildOrder.vue +0 -158
  135. package/packages/BnSmartForm/chooseIPaasData/chooseIPaasData.vue +0 -307
  136. package/packages/BnSmartForm/chooseIPaasData/tableCellCopy.vue +0 -84
  137. package/packages/BnSmartForm/choosePackage/choosePackage.vue +0 -361
  138. package/packages/BnSmartForm/dateDualForm/index.vue +0 -37
  139. package/packages/BnSmartForm/dateForm/index.vue +0 -38
  140. package/packages/BnSmartForm/fileForm/fileFormData.js +0 -50
  141. package/packages/BnSmartForm/fileForm/index.vue +0 -240
  142. package/packages/BnSmartForm/formItemFooter/formItemFooter.vue +0 -38
  143. package/packages/BnSmartForm/formItemTop/formItemTop.vue +0 -42
  144. package/packages/BnSmartForm/index.vue +0 -1201
  145. package/packages/BnSmartForm/numberForm/index.vue +0 -63
  146. package/packages/BnSmartForm/radioForm/index.vue +0 -72
  147. package/packages/BnSmartForm/receiveForm/index.vue +0 -112
  148. package/packages/BnSmartForm/relationForm/index.vue +0 -82
  149. package/packages/BnSmartForm/scoreForm/index.vue +0 -39
  150. package/packages/BnSmartForm/selectForm/index.vue +0 -55
  151. package/packages/BnSmartForm/showValForm/index.vue +0 -42
  152. package/packages/BnSmartForm/showValForm/showValFormTable.vue +0 -104
  153. package/packages/BnSmartForm/smartFormsCommon.scss +0 -43
  154. package/packages/BnSmartForm/stringForm/index.vue +0 -170
  155. package/packages/BnVirtPopover/index.vue +0 -319
  156. package/packages/BnWebLog/BnWebLog.vue +0 -140
  157. package/packages/BnWorkSettingDrop/advancedOptions.js +0 -112
  158. package/packages/BnWorkSettingDrop/benBenAIUtil.js +0 -89
  159. package/packages/BnWorkSettingDrop/index.vue +0 -292
  160. package/packages/font/iconfont.css +0 -243
  161. package/packages/font/iconfont.ttf +0 -0
  162. package/packages/font/iconfont.woff +0 -0
  163. package/packages/font/iconfont.woff2 +0 -0
  164. package/utils/addressParse-old.js +0 -645
  165. package/utils/addressParse.js +0 -735
  166. package/utils/config.js +0 -68
  167. package/utils/index.js +0 -1171
@@ -1,917 +0,0 @@
1
- <template>
2
- <el-popover ref="popover" :placement="placement" trigger="click" :show-arrow="false" :hide-after="0"
3
- popper-class="bnDrop" @show="open" :disabled="disabled">
4
- <!-- 触发下拉的内容 -->
5
- <template #reference>
6
- <slot v-if="$slots.default"></slot>
7
- <div v-else class="bnDrop-select" :class="{'simple':!border,'disabled':disabled,'is-multiple-tags':multiple && collapseTags && val.length > 0}">
8
- <!--multiple && value.length == 0:判断多选情况下是否value长度为0
9
- !multiple && (!labelInValue && value === '') || (labelInValue && !value[optionProps.value]):单选情况下value有数值 0 字符 ‘’ 和对象 {} 两种形态。判断value是否为空并且不等0 -->
10
- <span class="bnDrop-placeholder"
11
- v-if="(multiple && val.length == 0) || (!multiple && ((!labelInValue && val === '') || (labelInValue && !val[optionProps.value])))">
12
- {{ placeholder }}
13
- </span>
14
- <!--value不为空-->
15
- <template v-else>
16
- <!--单选-->
17
- <span v-if="!multiple" :title="singleTitle">{{ singleTitle }}</span>
18
- <!--多选:collapseTags 展示 tag 列表-->
19
- <div v-else-if="collapseTags" class="bnDrop-tags">
20
- <span v-for="tag in visibleTags" :key="tag.index" class="bnDrop-tag">
21
- <span class="bnDrop-tag-text" :title="tag.label">{{ tag.label }}</span>
22
- <span
23
- v-if="!disabled"
24
- class="bnDrop-tag-close bnUIcon bnUIcon-close"
25
- @click.stop="removeTag(tag.index)"
26
- ></span>
27
- </span>
28
- <el-tooltip
29
- v-if="collapsedCount > 0"
30
- :disabled="!collapseTagsTooltip"
31
- effect="dark"
32
- placement="top"
33
- >
34
- <template #content>
35
- <div class="bnDrop-collapse-tooltip">
36
- <div v-for="tag in collapsedTags" :key="tag.index">{{ tag.label }}</div>
37
- </div>
38
- </template>
39
- <span class="bnDrop-tag bnDrop-tag--collapse">+ {{ collapsedCount }}</span>
40
- </el-tooltip>
41
- </div>
42
- <!--多选:默认逗号分隔-->
43
- <span v-else :title="multipleTitle">{{ multipleTitle }}</span>
44
- <span class="bnUIcon bnUIcon-clear bnDrop-select-clear" v-if="clearable" @click.stop="clear"></span>
45
- </template>
46
- <span class="bnUIcon bnUIcon-down bnDrop-select-down" v-loading="loading"></span>
47
- </div>
48
- </template>
49
- <div class="bnDrop-body" :style="{width:width+'px'}">
50
- <el-input v-model="queryValue" ref="searchInput" class="bnDrop-body-input" placeholder="输入名称搜索"
51
- v-show="pathUrl || options.length > 10"
52
- @input="filterMethod" clearable></el-input>
53
- <!-- 下拉内容 -->
54
- <el-scrollbar max-height="260px" class="bnDrop-body-list" @end-reached="scrollMore">
55
- <!-- 下拉弹窗选项 -->
56
- <div class="bnDrop-body-list-item w-flex-center w-flex-column-gap6"
57
- @click="chooseItem(item)" v-for="(item,index) in optionList" :key="index">
58
- <BnCheck v-if="multiple" v-model="val" :key="item[optionProps.value]" stop
59
- :true-data="item[optionProps.value]" :is-checked="isChecked"/>
60
- <span :title="item[optionProps.label]">{{ item[optionProps.label] }}</span>
61
- </div>
62
- <div class="bnDrop-body-list-empty" v-if="optionList.length == 0 && !loading">
63
- {{ noDataText }}
64
- </div>
65
- <div class="bnDrop-body-list-empty" v-if="loading">加载中</div>
66
- </el-scrollbar>
67
- <div v-if="multiple && checkedAll"
68
- class="bnDrop-body-footer w-flex-center w-padding-lr10 w-padding-tb8 w-border-solid-top">
69
- <BnCheck :true-data="999" :is-checked="isCheckedAll" @click="checkAll">
70
- <div class="w-flex-center w-flex-column-gap4 w-text-over">
71
- <span class="w-margin-left4">{{ val.length == 0 ? '全选' : `已选${val.length-fixedFrontOptions.length}项` }}</span>
72
- <span class="">已加载{{ optionList.length }}/{{ total }}项</span>
73
- </div>
74
- </BnCheck>
75
- </div>
76
- <!-- 自有扩展插槽 -->
77
- <slot name="dropdown-bottom"></slot>
78
- </div>
79
- </el-popover>
80
- </template>
81
-
82
- <script>
83
- import {cloneDeep, debounce} from "lodash";
84
-
85
- export default {
86
- name: "BnDrop",
87
- props: {
88
- //最终选中的value
89
- modelValue: {
90
- type: [String, Array, Number, Object],
91
- default() {
92
- return {}
93
- }
94
- },
95
- //选项列表
96
- options: {
97
- type: Array,
98
- default: function () {
99
- return []
100
- }
101
- },
102
- // 占位符
103
- placeholder: {
104
- type: String,
105
- default: "请选择"
106
- },
107
- // option基础结构
108
- optionProps: {
109
- default() {
110
- return {
111
- value: 'id',
112
- label: 'title'
113
- };
114
- }
115
- },
116
- // 数据结构
117
- valueProps: {
118
- type: Array,
119
- },
120
- // 位置
121
- placement: {
122
- type: String,
123
- default: 'bottom-start'
124
- },
125
- width: {default: 200},
126
- // 是否禁用
127
- disabled: Boolean,
128
- // 是否显示边框
129
- border: Boolean,
130
- // 是否可以清空选项
131
- clearable: Boolean,
132
- // 支持外部查询的方法,使用者传进来
133
- postFunc: Function,
134
- // 搜索的请求参数
135
- postData: {
136
- type: Object,
137
- },
138
- // 通过外部传入的链接进行参数请求
139
- pathUrl: {
140
- type: String,
141
- default: ''
142
- },
143
- // 查询条件列表的key名 内部数据源且分页情况下才有用
144
- searchKey: {
145
- type: String,
146
- default: 'title'
147
- },
148
- // 无数据提示
149
- noDataText: {
150
- type: String,
151
- default: '无数据'
152
- },
153
- // 搜索是否是分页
154
- isPage: {
155
- type: Boolean,
156
- default: true
157
- },
158
- // 分页器参数配置
159
- pageProps: {
160
- default() {
161
- return {
162
- pageNum: 'pageNum',
163
- pageSize: 'pageSize',
164
- };
165
- }
166
- },
167
- // 是否多选
168
- multiple: Boolean,
169
- // 多选 tag 是否折叠超出部分(对齐 Element Plus collapse-tags)
170
- collapseTags: Boolean,
171
- // 折叠 tag 的 +N 是否启用 tooltip 展示全部
172
- collapseTagsTooltip: {
173
- type: Boolean,
174
- default: true
175
- },
176
- // collapseTags 为 true 时,收起时默认展示几个 tag
177
- maxCollapseTags: {
178
- type: Number,
179
- default: 1
180
- },
181
- // 单选模式 是否允许取消选中
182
- canUncheck: {
183
- type: Boolean,
184
- default: true
185
- },
186
- // 多选时用户最多可以选择的项目数,为 0 则不限制
187
- multipleLimit: {
188
- type: Number,
189
- default: 0
190
- },
191
- checkedAll: {// 是否支持全选
192
- type: Boolean,
193
- default: true
194
- },
195
- // 在返回选项时,是否将 label 和 value 一并返回
196
- labelInValue: {
197
- type: Boolean,
198
- default: true
199
- },
200
- // 是否在组件初始化的时候加载options,反之在打开弹框时加载
201
- isInitOptions: {
202
- type: Boolean,
203
- default: true
204
- },
205
- // 不绑定v-model,仅在点击的时候回传点击事件
206
- noValue: {
207
- type: Boolean,
208
- default: false
209
- },
210
- // 固定在可选项前面,value全选的时候和清空的时候都会在value前面加上去
211
- fixedFrontOptions: {
212
- type: Array,
213
- default(){
214
- return []
215
- }
216
- },
217
- // 是否将value以json字符串形式与外部交互
218
- valueToJson: {
219
- type: Boolean,
220
- default: false
221
- },
222
- },
223
- data() {
224
- return {
225
- // 是否加载过options
226
- isInit: false,
227
- // 加载动画
228
- loading: false,
229
- // 查询
230
- queryValue: '',
231
- // 分页信息
232
- pageData: {
233
- pageNum: 1,
234
- pageSize: 20
235
- },
236
- // 总长度
237
- total: 0,
238
- // 接口远程获取的options
239
- remoteOptions: [],
240
- // 静态下拉列表,前端分页
241
- staticOptions: [],
242
- };
243
- },
244
- watch: {
245
- // 监控选项变化
246
- options: {
247
- handler(newVal) {
248
- // 重新计算总数
249
- this.total = newVal.length;
250
-
251
- // 如果总数大于 40,进行分页
252
- if (this.total > 40 && !this.pathUrl) {
253
- this.pageData.pageNum = 1; // 重置页码
254
- this.staticOptions = this.catchPage(); // 重新计算分页
255
- } else {
256
- // 否则直接赋值
257
- this.staticOptions = [...newVal];
258
- }
259
- },
260
- deep: true, // 深度监听
261
- immediate: true, // 组件初始化时立即执行
262
- },
263
- },
264
- mounted() {
265
- if (this.isInitOptions) {
266
- this.initRemote();
267
- }
268
- },
269
- methods: {
270
- /**
271
- * 初始化远程数据
272
- * */
273
- initRemote() {
274
- if (this.pathUrl) {
275
- this.pageData.pageNum = 1;
276
- this.isInit = true;
277
- this.loadOptions()
278
- }
279
- },
280
- /**
281
- * 下拉框打开关闭
282
- * */
283
- open(e) {
284
- // 打开弹框时
285
- // 设置了远程获取选项
286
- // 并且设置了点击弹框再初始化选项
287
- // 并且没有被初始化过,
288
- if (e && this.pathUrl && (!this.isInit || !this.isInitOptions)) {
289
- // 初始化远程数据
290
- this.initRemote()
291
- }
292
- },
293
- /**
294
- * 清空value
295
- * */
296
- clear() {
297
- if (this.multiple) {
298
- this.val = []
299
- } else {
300
- this.val = this.labelInValue ? {} : ''
301
- }
302
- },
303
- /**
304
- * 滚动加载
305
- * */
306
- scrollMore: debounce(function () {
307
- if (this.optionList.length < this.total && !this.loading) {
308
- // 远程获取
309
- if (this.pathUrl) {
310
- if (this.isPage) {
311
- this.pageData.pageNum++;
312
- this.loadOptions();
313
- }
314
- } else {
315
- // 本地分页
316
- this.pageData.pageNum++;
317
- this.staticOptions = [...this.staticOptions, ...this.catchPage()]
318
- }
319
- }
320
- }, 400),
321
- /**
322
- * 快速搜索选项
323
- * @param {String} val 搜索的值
324
- */
325
- filterMethod: debounce(function (val) {
326
- this.queryValue = val;
327
- // 选项列表被初始化过
328
- if (this.pathUrl && this.isPage) {
329
- this.pageData.pageNum = 1;
330
- this.loadOptions();
331
- }
332
- }, 400),
333
- /**
334
- * 多选时判断全部选中
335
- * */
336
- isCheckedAll() {
337
- let val = this.val || []
338
- let option = this.optionList.map(i => i[this.optionProps.value])
339
- let fixedFrontOptions = this.fixedFrontOptions || []
340
-
341
- if (this.labelInValue) {
342
- val = this.val.map(i => i[this.optionProps.value])
343
- fixedFrontOptions = this.fixedFrontOptions.map(i => i[this.optionProps.value])
344
- }
345
- if(fixedFrontOptions.length>0){
346
- val = val.filter(i=>!fixedFrontOptions.includes(i))
347
- }
348
- // 长度不同或为空,直接返回 false
349
- if (option.length !== val.length || option.length === 0) {
350
- return false;
351
- }
352
-
353
- // 使用 Set 优化性能:将 val 转为 Set,has() 查找是 O(1),比 includes() 的 O(n) 快很多
354
- const valSet = new Set(val);
355
- return option.every(item => valSet.has(item));
356
- },
357
- /**
358
- * 全选/取消全选
359
- * */
360
- checkAll() {
361
- // 判断当前是否全选
362
- const isAllChecked = this.isCheckedAll();
363
- let value = cloneDeep(this.val)
364
-
365
- if (isAllChecked) {
366
- // 如果已经全选,则取消全选
367
- value = [...this.fixedFrontOptions];
368
- } else {
369
- // 如果未全选,则全选当前已加载的所有选项
370
- if (this.labelInValue) {
371
- // labelInValue 为 true 时,返回完整的对象数组
372
- value = [...this.fixedFrontOptions,...this.optionList];
373
- } else {
374
- // labelInValue 为 false 时,只返回 value 数组
375
- value = [...this.fixedFrontOptions,...this.optionList.map(i => i[this.optionProps.value])];
376
- }
377
- }
378
- // 不绑定value
379
- if (!this.noValue) {
380
- this.val = value;
381
- }
382
- this.$emit('change', value, isAllChecked);
383
- },
384
- /**
385
- * 多选判断是否选中 选中返回true,未选中返回false
386
- * @param {Object} item 选项的对象数据
387
- * */
388
- isChecked({trueData}) {
389
- let check = false;
390
- if (this.labelInValue) {
391
- check = this.val.find(i => i[this.optionProps.value] == trueData) != undefined
392
- } else {
393
- check = this.val && this.val.includes(trueData);
394
- }
395
- return check;
396
- },
397
- /**
398
- * 单选判断是否选中 选中返回true,未选中返回false
399
- * @param {Object} item 选项的对象数据
400
- * */
401
- isChoose(item) {
402
- let check = false;
403
- // value是对象时
404
- if (this.labelInValue) {
405
- check = this.val[this.optionProps.value] == item[this.optionProps.value]
406
- } else {
407
- check = this.val == item[this.optionProps.value]
408
- }
409
- return check;
410
- },
411
- /**
412
- * 点击下拉菜单中的某一项,选中或取消选中
413
- * @param {Object} item 选项的对象数据
414
- * */
415
- chooseItem(item) {
416
- let value = this.val;
417
- this.$emit("checkItem", item)
418
- // 多选模式
419
- if (this.multiple) {
420
- if (this.labelInValue) {
421
- let flag = false;
422
- for (let i in this.val) {
423
- if (this.val[i][this.optionProps.value] == item[this.optionProps.value]) {
424
- // 如果之前已经选中,则取消掉
425
- value.splice(i, 1)
426
- flag = true;
427
- break;
428
- }
429
- }
430
- // 如果之前没有选中 并且目前数量小于最大多选数量,则选中
431
- if (!flag && (!this.multipleLimit || this.multipleLimit < value.length)) {
432
- value.push(item)
433
- }
434
- } else {
435
- let index = this.val && this.val.indexOf(item[this.optionProps.value])
436
- if (index && index == -1 && (!this.multipleLimit || this.multipleLimit < value.length)) {
437
- value.push(item[this.optionProps.value])
438
- } else {
439
- value.splice(index, 1)
440
- }
441
- }
442
- }
443
- // 单选模式
444
- else {
445
- this.$refs.popover.hide()
446
- let choose = this.isChoose(item);
447
- // 如果不能取消选中,并且当前是选中状态 直接return
448
- if (choose && !this.canUncheck) {
449
- return;
450
- }
451
- // 如果要返回整个对象
452
- if (this.labelInValue) {
453
- if (this.val[this.optionProps.value] == item[this.optionProps.value]) {
454
- // 取消选中
455
- value = {}
456
- } else {
457
- // 选中
458
- value = item;
459
- }
460
- } else {
461
- if (this.val == item[this.optionProps.value]) {
462
- // 取消选中
463
- value = ''
464
- } else {
465
- // 选中
466
- value = item[this.optionProps.value]
467
- }
468
- }
469
- }
470
- // 不绑定value
471
- if (!this.noValue) {
472
- this.val = value;
473
- }
474
- this.$emit('change', value)
475
- },
476
- /**
477
- * 远程加载options
478
- * */
479
- loadOptions(post) {
480
- if (!this.postFunc) {
481
- console.log("selectPro:没有远程调用的方法")
482
- this.loading = false;
483
- return false;
484
- }
485
- this.loading = true;
486
- let postData = post || this.postParams;
487
- // 查询条件列表的key名 内部数据源且分页情况下才有用
488
- postData[this.searchKey] = this.queryValue;
489
- if (this.isPage) {
490
- postData[this.pageProps.pageNum] = this.pageData.pageNum;
491
- postData[this.pageProps.pageSize] = this.pageData.pageSize;
492
- }
493
- this.postFunc(this.pathUrl, postData).then(res => {
494
- this.loading = false;
495
- if (!res.code) {
496
- // 计算静态列表搜索后的长度
497
- let staticLength = 0
498
- if (this.queryValue && this.options?.length > 0) {
499
- let s = this.options.filter(item => item[this.optionProps.label].indexOf(this.queryValue) > -1);
500
- staticLength = s ? s.length : 0
501
- }
502
- if (this.isPage) {
503
- this.total = res.data.total + this.options.length + staticLength;
504
- let arr = res.data.results || [];
505
- if (this.pageData.pageNum == 1) {
506
- this.remoteOptions = [...arr]
507
- } else {
508
- this.remoteOptions = [...this.remoteOptions, ...arr]
509
- }
510
- } else {
511
- this.remoteOptions = res.data || [];
512
- this.total = this.remoteOptions.length + staticLength;
513
- }
514
- }
515
- })
516
- },
517
- /**
518
- * 前端手动分页
519
- * */
520
- catchPage(page) {
521
- this.pageData.pageNum = page || this.pageData.pageNum;
522
- return this.options.slice((this.pageData.pageNum - 1) * this.pageData.pageSize, this.pageData.pageNum * this.pageData.pageSize)
523
- },
524
- /**
525
- * 如果value是对象,然会value的时候把对象组装好再返回。
526
- * */
527
- getValObj(val) {
528
- if (this.valueProps) {
529
- let obj = {};
530
- this.valueProps.forEach(key => {
531
- obj[key] = val[key];
532
- });
533
- return obj
534
- } else {
535
- return val;
536
- }
537
- },
538
- /**
539
- * 从一个数组中通过id找到名字,并返回给调用者
540
- * @param {Array} list 数组
541
- * @param {String} id 需要匹配的id
542
- * */
543
- foundTitle(list, id) {
544
- let title = ''
545
- for (let i in list) {
546
- if (list[i][this.optionProps.value] == id) {
547
- title = list[i][this.optionProps.label]
548
- break;
549
- }
550
- }
551
- return title;
552
- },
553
- /**
554
- * 从一个数组中通过id和ids数组的匹配找到标题,并返回给调用者
555
- * @param {Array} list 数组
556
- * @param {String} ids 需要匹配的id数组[1,2,3]
557
- * @return {Array} values 返回所有匹配项组成的数组
558
- * */
559
- foundValue(list, ids) {
560
- let value = [];
561
- for (let i in list) {
562
- if (ids.includes(list[i][this.optionProps.value])) {
563
- value.push(list[i][this.optionProps.label])
564
- }
565
- }
566
- return value;
567
- },
568
- /**
569
- * 手动关闭
570
- * */
571
- close() {
572
- this.$refs.popover.hide()
573
- },
574
- /** 删除多选 tag */
575
- removeTag(index) {
576
- if (this.disabled || !this.multiple || !Array.isArray(this.val)) {
577
- return;
578
- }
579
- const next = [...this.val];
580
- next.splice(index, 1);
581
- this.val = next;
582
- }
583
- },
584
- computed: {
585
- // select的value
586
- val: {
587
- get() {
588
- let value = this.modelValue;
589
- if (this.valueToJson && value != null && value !== '') {
590
- try {
591
- value = typeof value === 'string' ? JSON.parse(value) : value;
592
- } catch (e) {
593
- value = this.multiple ? [] : (this.labelInValue ? {} : '');
594
- }
595
- }
596
- if (this.multiple && (!value || !Array.isArray(value))) {
597
- return []
598
- } else {
599
- return value;
600
- }
601
- },
602
- set(val) {
603
- let result;
604
- if (this.labelInValue) {
605
- if (this.multiple) {
606
- result = val.map(item => {
607
- return this.getValObj(item)
608
- })
609
- } else {
610
- result = this.getValObj(val)
611
- }
612
- } else {
613
- result = val;
614
- }
615
- this.$emit("update:modelValue", this.valueToJson ? JSON.stringify(result) : result);
616
- },
617
- },
618
- // 远程搜索时,入参的拼接
619
- postParams: {
620
- get() {
621
- if (this.pathUrl) {
622
- let post = {...this.postData};
623
- // 每当参数变化,重置初始化options的开关
624
- this.isInit = false;
625
- return post;
626
- } else {
627
- return {...this.pageData}
628
- }
629
- },
630
- set(val) {
631
- return val;
632
- }
633
- },
634
- // 最终展示的下拉列表
635
- optionList: {
636
- get() {
637
- let options = [...this.staticOptions, ...this.remoteOptions];
638
- if (this.queryValue && !(this.pathUrl && this.isPage)) {
639
- options = [...this.options, ...this.remoteOptions].filter(item => item[this.optionProps.label].indexOf(this.queryValue) > -1)
640
- }
641
- return options;
642
- },
643
- set(val) {
644
- return val;
645
- }
646
- },
647
- // 单选时,展示value的值
648
- singleTitle() {
649
- let title = ''
650
- if (this.labelInValue) {
651
- title = this.val[this.optionProps.label]
652
- } else {
653
- title = this.foundTitle(this.options, this.val) || this.val;
654
- }
655
- return title
656
- },
657
- // 多选时的 tag 列表
658
- multipleTags() {
659
- const value = this.val;
660
- if (!Array.isArray(value) || !value.length) {
661
- return [];
662
- }
663
- if (this.labelInValue) {
664
- return value.map((v, index) => ({
665
- index,
666
- label: v[this.optionProps.label] || ''
667
- }));
668
- }
669
- return value.map((id, index) => ({
670
- index,
671
- label: this.foundTitle(this.options, id) || id
672
- }));
673
- },
674
- // 多选时的 value 展示文本
675
- multipleTitle() {
676
- return this.multipleTags.map(tag => tag.label).join(',');
677
- },
678
- // 多选 collapseTags 模式下可见 tag
679
- visibleTags() {
680
- if (!this.collapseTags || this.multipleTags.length <= this.maxCollapseTags) {
681
- return this.multipleTags;
682
- }
683
- return this.multipleTags.slice(0, this.maxCollapseTags);
684
- },
685
- // 多选 collapseTags 模式下被折叠的 tag
686
- collapsedTags() {
687
- if (!this.collapseTags || this.multipleTags.length <= this.maxCollapseTags) {
688
- return [];
689
- }
690
- return this.multipleTags.slice(this.maxCollapseTags);
691
- },
692
- collapsedCount() {
693
- return this.collapsedTags.length;
694
- },
695
- },
696
- }
697
- </script>
698
- <style>
699
- .bnDrop.el-popover {
700
- padding: 0 !important;
701
- width: auto !important;
702
- }
703
- </style>
704
- <style scoped lang="scss">
705
- @import "./../font/iconfont.css";
706
-
707
- .bnDrop {
708
- &-select {
709
- display: inline-block;
710
- position: relative;
711
- max-width: 100%;
712
- min-width: 110px;
713
- height: 32px;
714
- line-height: 32px;
715
- padding-right: 28px;
716
- padding-left: 12px;
717
- font-size: 14px;
718
- color: rgba(0, 0, 0, .85);
719
- border: 1px solid rgba(0, 0, 0, .15);
720
- border-radius: 2px;
721
- cursor: pointer;
722
- white-space: nowrap;
723
- overflow: hidden;
724
- text-overflow: ellipsis;
725
-
726
- &-clear {
727
- background: #fff;
728
- display: none;
729
- position: absolute;
730
- font-size: 14px;
731
- right: 8px;
732
- color: #888;
733
- cursor: pointer;
734
- }
735
-
736
- &-down {
737
- position: absolute;
738
- font-size: 12px;
739
- right: 8px;
740
- color: #888;
741
-
742
- :deep(.el-loading-mask) {
743
- .el-loading-spinner {
744
- padding-top: 6px;
745
- }
746
-
747
- svg {
748
- width: 17px;
749
- height: 17px;
750
- }
751
- }
752
- }
753
-
754
- &.disabled {
755
- color: rgba(0, 0, 0, .25);
756
- background: rgba(0, 0, 0, .04);
757
- border-color: rgba(0, 0, 0, .15) !important;
758
- cursor: not-allowed;
759
-
760
- .bnDrop-select-clear {
761
- display: none !important;
762
- }
763
- }
764
-
765
- &:hover {
766
- border-color: #1890ff;
767
-
768
- .bnDrop-select-clear {
769
- z-index: 1;
770
- display: inline-block;
771
- }
772
- }
773
-
774
- &.simple {
775
- padding-left: 0;
776
- color: #1890ff;
777
- border: 1px solid rgba(0, 0, 0, 0) !important;
778
-
779
- &.disabled {
780
- color: rgba(24, 144, 255, 0.35);
781
- background: none;
782
- }
783
- }
784
-
785
- &.is-multiple-tags {
786
- display: inline-flex;
787
- align-items: center;
788
- height: auto;
789
- min-height: 32px;
790
- line-height: normal;
791
- padding-top: 1px;
792
- padding-bottom: 1px;
793
- white-space: normal;
794
- overflow: visible;
795
- }
796
- }
797
-
798
- &-tags {
799
- display: flex;
800
- flex-wrap: wrap;
801
- align-items: center;
802
- gap: 6px;
803
- padding: 2px 0;
804
- flex: 1;
805
- min-width: 0;
806
- }
807
-
808
- &-tag {
809
- display: inline-flex;
810
- align-items: center;
811
- max-width: 100%;
812
- height: 24px;
813
- padding: 0 8px;
814
- font-size: 12px;
815
- color: #909399;
816
- background: #f0f2f5;
817
- border-radius: 4px;
818
- box-sizing: border-box;
819
-
820
- &--collapse {
821
- cursor: default;
822
- }
823
- }
824
-
825
- &-tag-text {
826
- overflow: hidden;
827
- text-overflow: ellipsis;
828
- white-space: nowrap;
829
- }
830
-
831
- &-tag-close {
832
- margin-left: 4px;
833
- font-size: 12px;
834
- color: #909399;
835
- cursor: pointer;
836
- border-radius: 50%;
837
- flex-shrink: 0;
838
-
839
- &:hover {
840
- color: #409eff;
841
- background: #ecf5ff;
842
- }
843
- }
844
-
845
- &-collapse-tooltip {
846
- max-width: 280px;
847
- line-height: 1.6;
848
- }
849
-
850
- &-placeholder {
851
- color: rgba(0, 0, 0, .25);
852
- }
853
-
854
- &-body {
855
- position: relative;
856
-
857
- &-input {
858
- padding: 8px;
859
-
860
- :deep(.el-input__wrapper) {
861
- border-radius: 0;
862
- }
863
- }
864
-
865
- &-list {
866
- position: relative;
867
- width: 100%;
868
- background: #fff;
869
- min-height: 68px;
870
- //max-height: 260px;
871
- //overflow-y: auto;
872
-
873
- &-item {
874
- position: relative;
875
- height: 36px;
876
- font-size: 14px;
877
- padding: 0 10px;
878
- color: rgba(0, 0, 0, .85);
879
- cursor: pointer;
880
- white-space: nowrap;
881
- overflow: hidden;
882
- text-overflow: ellipsis;
883
-
884
- &.disabled {
885
- color: rgba(0, 0, 0, .25);
886
- background: rgba(0, 0, 0, .04);
887
- border-color: rgba(0, 0, 0, .15) !important;
888
- cursor: not-allowed;
889
- }
890
-
891
- &:hover {
892
- color: #2783F2;
893
- background-color: rgba(0, 0, 0, 0.04);
894
- }
895
- }
896
-
897
- &-empty {
898
- height: 48px;
899
- line-height: 48px;
900
- text-align: center;
901
- font-size: 12px;
902
- color: #999;
903
- }
904
- }
905
-
906
- &-footer {
907
- width: 100%;
908
- overflow: hidden;
909
-
910
- :deep(.bnChecked) {
911
- width: 100%;
912
- max-width: 100%;
913
- }
914
- }
915
- }
916
- }
917
- </style>