@cloudbase/weda-ui-mp 3.6.3 → 3.7.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.
Files changed (74) hide show
  1. package/components/form/form/wd-form.wxss +15 -0
  2. package/components/form/uploader/index.js +3 -3
  3. package/components/form/uploader/weui-uploader.wxml +1 -1
  4. package/components/form/uploader/weui-uploader.wxss +4 -0
  5. package/components/form-field-behavior/form-field-behavior.js +38 -7
  6. package/components/form-field-behavior/validator.js +3 -2
  7. package/components/form-phone/index.wxml +1 -1
  8. package/components/formdetail/wd-form-detail.wxss +5 -0
  9. package/components/tooltip/wd-tooltip.wxss +6 -0
  10. package/components/wd-button/wd-button.wxss +6 -0
  11. package/components/wd-card/wd-card.wxss +6 -0
  12. package/components/wd-cascader/index.js +198 -0
  13. package/components/wd-cascader/index.json +12 -0
  14. package/components/wd-cascader/index.wxml +59 -0
  15. package/components/wd-cascader/index.wxss +2 -0
  16. package/components/wd-cascader/utils.js +70 -0
  17. package/components/wd-cascader/wd-cascader.wxss +284 -0
  18. package/components/wd-checkbox-list/wd-checkbox-list.wxss +6 -0
  19. package/components/wd-date/modal/index.js +4 -1
  20. package/components/wd-date/modal/index.wxml +1 -1
  21. package/components/wd-date/wd-date.wxss +5 -0
  22. package/components/wd-date-range/wd-date-range.wxss +5 -0
  23. package/components/wd-divider/wd-divider.wxss +6 -0
  24. package/components/wd-form/form-utils.js +4 -0
  25. package/components/wd-form/wd-form.wxss +15 -0
  26. package/components/wd-form-arr/index.js +330 -0
  27. package/components/wd-form-arr/index.json +7 -0
  28. package/components/wd-form-arr/index.wxml +5 -0
  29. package/components/wd-form-arr/index.wxss +2 -0
  30. package/components/wd-form-arr/wd-form-obj.wxss +51 -0
  31. package/components/wd-form-item/wd-form-item.wxss +15 -0
  32. package/components/wd-form-item-obj/index.js +113 -0
  33. package/components/wd-form-item-obj/index.json +8 -0
  34. package/components/wd-form-item-obj/index.wxml +51 -0
  35. package/components/wd-form-item-obj/index.wxss +2 -0
  36. package/components/wd-form-item-obj/wd-form-item.wxss +1106 -0
  37. package/components/wd-form-obj/index.js +305 -0
  38. package/components/wd-form-obj/index.json +7 -0
  39. package/components/wd-form-obj/index.wxml +5 -0
  40. package/components/wd-form-obj/index.wxss +2 -0
  41. package/components/wd-form-obj/wd-form-obj.wxss +51 -0
  42. package/components/wd-icon/index.json +1 -1
  43. package/components/wd-icon/wd-icon.wxss +6 -0
  44. package/components/wd-image/wd-image.wxss +6 -0
  45. package/components/wd-input/inner-input/wd-input.wxss +15 -0
  46. package/components/wd-input-group/wd-input-group.wxss +6 -0
  47. package/components/wd-input-number/wd-input-number.wxss +6 -0
  48. package/components/wd-input-wrap/wd-input-wrap.wxss +6 -0
  49. package/components/wd-layout/wd-layout.wxss +6 -0
  50. package/components/wd-menu-layout/wd-menu-layout.wxss +5 -0
  51. package/components/wd-menu-list/wd-menu-list.wxss +5 -0
  52. package/components/wd-modal/wd-modal.wxss +6 -0
  53. package/components/wd-progress/wd-progress.wxss +15 -0
  54. package/components/wd-radio-list/wd-radio-list.wxss +6 -0
  55. package/components/wd-rating/wd-rating.wxss +15 -0
  56. package/components/wd-select/select.wxss +14 -3
  57. package/components/wd-switch/wd-switch.wxss +15 -0
  58. package/components/wd-tabbar/wd-tabbar.wxss +6 -0
  59. package/components/wd-tabs/wd-tabs.wxss +6 -0
  60. package/components/wd-tag/wd-tag.wxss +6 -0
  61. package/components/wd-tag-select/wd-tag-select.wxss +15 -0
  62. package/components/wd-text/wd-text.wxss +5 -0
  63. package/components/wd-textarea/wd-textarea.wxss +6 -0
  64. package/components/wd-time/wd-time.wxss +5 -0
  65. package/components/wd-unified-link/wd-link.wxss +6 -0
  66. package/components/web-view/index.js +3 -0
  67. package/index.json +2 -0
  68. package/package.json +1 -1
  69. package/style/utils.wxss +5 -0
  70. package/style/wd-design.wxss +5 -0
  71. package/utils/enum.js +13 -0
  72. package/components/dataView/index.wxss +0 -0
  73. package/components/wd-audio/index.wxss +0 -0
  74. package/components/wd-date/calendar/index.wxss +0 -0
@@ -1,4 +1,9 @@
1
1
  @charset "UTF-8";
2
+ ._B00_Xa {
3
+ /* 如果生成的wxss 为空文件似乎会导致IDE编译报错, 所以这里给他弄个占位 */
4
+ word-break: inherit;
5
+ }
6
+
2
7
  .wd-form,
3
8
  .wd-form-item,
4
9
  .gsd-h5-react-formitem {
@@ -1088,4 +1093,14 @@ textarea {
1088
1093
  }
1089
1094
  .wd-form.size-width-hundred {
1090
1095
  width: 100%;
1096
+ }
1097
+
1098
+ .wd-mp-form-item-obj .wd-form-obj-card-header {
1099
+ display: flex;
1100
+ }
1101
+ .wd-mp-form-item-obj .wd-form-obj-item-wrap__control-wrap {
1102
+ flex-direction: column;
1103
+ }
1104
+ .wd-mp-form-item-obj .wd-form-item--weui.wd-form-item {
1105
+ width: 100%;
1091
1106
  }
@@ -227,14 +227,14 @@ Component({
227
227
  urls: newUrls,
228
228
  });
229
229
  }
230
- this.handleChange(newUrls);
230
+ this.handleChange(newUrls, true);
231
231
  },
232
- handleChange: function (values) {
232
+ handleChange: function (values, isDelete = false) {
233
233
  let value = values;
234
234
  if (this.properties.single) {
235
235
  value = values[0] ?? '';
236
236
  }
237
- this.triggerEvent('change', { value });
237
+ this.triggerEvent('change', { value, isDelete });
238
238
  },
239
239
  },
240
240
  observers: {
@@ -40,7 +40,7 @@
40
40
  <view wx:if="{{currentFiles.length < maxCount && !readOnly}}" class="weui-uploader__input-box {{shapeClass}}" hover-class="weui-active">
41
41
  <view wx:if="{{!disabled&&!isChooseAvatar}}" class="weui-uploader__input" bindtap="chooseImage"></view>
42
42
 
43
- <button class="weui-uploader__input" wx:if="{{!disabled&&isChooseAvatar}}" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar"></button>
43
+ <button class="weui-uploader__input weui-uploader__input—button" wx:if="{{!disabled&&isChooseAvatar}}" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar"></button>
44
44
 
45
45
  <view wx:if="{{disabled}}" class="weui-uploader__uploader_disabled"></view>
46
46
  </view>
@@ -17,3 +17,7 @@
17
17
  .weui-uploader__files .img-shape-rounded-tectangle::before {
18
18
  border-radius: 6px;
19
19
  }
20
+
21
+ .weui-uploader__files .weui-uploader__input-box .weui-uploader__input—button {
22
+ width: 100%;
23
+ }
@@ -210,7 +210,7 @@ export default Behavior({
210
210
  Promise.resolve().then(() => {
211
211
  this._reaction = autorun(() => {
212
212
  const form = untracked(() => {
213
- return this.$widget.closest(
213
+ return this.$widget?.closest(
214
214
  (w) => w.getConfig?.()?.componentType === 'form'
215
215
  );
216
216
  });
@@ -253,6 +253,8 @@ export default Behavior({
253
253
  },
254
254
  detached() {
255
255
  this._removeFormItem && this._removeFormItem();
256
+ // 清空嵌套表单
257
+ this._removeFormObjItem?.();
256
258
  if (this.$widget) {
257
259
  const form = this.$widget.closest(
258
260
  (w) => w.getConfig?.()?.componentType === 'form'
@@ -320,6 +322,9 @@ export default Behavior({
320
322
  if (newName === this.data._oldName) return;
321
323
  Promise.resolve().then(() => {
322
324
  this._removeFormItem?.();
325
+ // 清空嵌套表单
326
+ this._removeFormObjItem?.();
327
+
323
328
  // this.$instanceRef.current = this.$instanceRef.current ?? {};
324
329
  this.setReadonlyAttributes?.({ name: newName });
325
330
  // this.$instanceRef.current.name = newName;
@@ -336,6 +341,18 @@ export default Behavior({
336
341
  form?.updateFormContext(this.data.name, this.data.value);
337
342
  }
338
343
  }
344
+
345
+ const formObj = this.$widget?.closest?.(
346
+ (w) => w.getConfig?.()?.componentType === 'formObj'
347
+ );
348
+
349
+ if (formObj) {
350
+ // 添加子组件到嵌套表单里面
351
+ this._removeFormObjItem = formObj.addFormItem(
352
+ this.data.name,
353
+ this.$widget
354
+ );
355
+ }
339
356
  });
340
357
  },
341
358
  value: function (value) {
@@ -353,8 +370,17 @@ export default Behavior({
353
370
  const form = this.$widget.closest(
354
371
  (w) => w.getConfig?.()?.componentType === 'form'
355
372
  );
356
-
357
- form?.updateFormContext(this.data.name, value);
373
+ const formObj = this.$widget.closest(
374
+ (w) => w.getConfig?.()?.componentType === 'formObj'
375
+ );
376
+ // 有父级嵌套表单的不更新form值,父级嵌套表单会去更新
377
+ !formObj && form?.updateFormContext(this.data.name, value);
378
+ formObj?.valueChangeFromChild?.({
379
+ name: `${formObj?.formObjName ? `${formObj.formObjName}.` : ''}${
380
+ this.data.name
381
+ }`,
382
+ value,
383
+ });
358
384
  }
359
385
 
360
386
  // console.log(this.data.name, this.data.valueHistory, 'VALUE history');
@@ -390,11 +416,16 @@ export default Behavior({
390
416
  if (status === this.data._status) return;
391
417
  this.data._status = status;
392
418
  const { disabled: _disabled, readOnly: _readOnly } = this.data;
393
- const { disabled, readOnly } = convertStatus(
394
- status,
395
- _disabled,
396
- _readOnly
419
+ const statusParams = convertStatus(status, _disabled, _readOnly);
420
+ const form = this.$widget.closest(
421
+ (w) => w.getConfig?.()?.componentType === 'form'
397
422
  );
423
+ let disabled = statusParams.disabled;
424
+ let readOnly = statusParams.readOnly;
425
+ if (form) {
426
+ disabled = statusParams.disabled || form.formType === 'read';
427
+ readOnly = statusParams.readOnly || form.formType === 'read';
428
+ }
398
429
  this.setData({ disabled, readOnly });
399
430
  },
400
431
  'required,before,after,requiredMsg,isUnionValue': function (
@@ -13,8 +13,9 @@ const pattern = {
13
13
  userName: /^[\da-zA-Z\u2E80-\uFE4F \s]{2,}$/,
14
14
  carId:
15
15
  /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/,
16
- mobile: /^1[3456789]\d{9}$/,
17
- tel: /^(0\d{2,3}-)?(\d{7,8})$/,
16
+ mobile:
17
+ /^(\+\d{1,4}[\s-]?)?(\(?\d{1,4}\)?[\s-]?)?(\d{1,4}[\s-]?)?(\d{1,4})?\d{1,9}(\s?(x|ext)\s?\d{1,6})?$/,
18
+ tel: /^(\+\d{1,4}[\s-]?)?(\(?\d{1,4}\)?[\s-]?)?(\d{1,4}[\s-]?)?(\d{1,4})?\d{1,9}(\s?(x|ext)\s?\d{1,6})?$/,
18
19
  address: /^[\da-zA-Z\u2E80-\uFE4F \s-]{4,400}$/,
19
20
  date: /((^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(0?2)([-\/\._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([3579][26]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))/,
20
21
  numVcode: /^[0-9]{4,8}$/,
@@ -10,7 +10,7 @@
10
10
  layout="{{actualLayout}}"
11
11
  labelVisible="{{labelVisible}}"
12
12
  clearable="{{clearable}}"
13
- maxLength="{{11}}"
13
+ maxLength="{{20}}"
14
14
  password="{{false}}"
15
15
  defaultValue="{{value}}"
16
16
  placeholder="{{placeholder}}"
@@ -1,4 +1,9 @@
1
1
  @charset "UTF-8";
2
+ ._B00_Xa {
3
+ /* 如果生成的wxss 为空文件似乎会导致IDE编译报错, 所以这里给他弄个占位 */
4
+ word-break: inherit;
5
+ }
6
+
2
7
  .wd-g-text-default {
3
8
  color: var(--wd-color-text-default);
4
9
  }
@@ -1,3 +1,9 @@
1
+ @charset "UTF-8";
2
+ ._B00_Xa {
3
+ /* 如果生成的wxss 为空文件似乎会导致IDE编译报错, 所以这里给他弄个占位 */
4
+ word-break: inherit;
5
+ }
6
+
1
7
  .wd-bubble {
2
8
  --wd-bubble-top: 0px;
3
9
  --wd-bubble-inner-horizontal-padding: 12px;
@@ -1,3 +1,9 @@
1
+ @charset "UTF-8";
2
+ ._B00_Xa {
3
+ /* 如果生成的wxss 为空文件似乎会导致IDE编译报错, 所以这里给他弄个占位 */
4
+ word-break: inherit;
5
+ }
6
+
1
7
  .wd-btn {
2
8
  --wd-btn-sm-padding: 0.0625rem calc(var(--wd-space-base) * 2);
3
9
  --wd-btn-md-padding: 0.25rem calc(var(--wd-space-base) * 4);
@@ -1,3 +1,9 @@
1
+ @charset "UTF-8";
2
+ ._B00_Xa {
3
+ /* 如果生成的wxss 为空文件似乎会导致IDE编译报错, 所以这里给他弄个占位 */
4
+ word-break: inherit;
5
+ }
6
+
1
7
  .wd-card-root {
2
8
  --wd-card-border-radius: var(--wd-border-radius-md);
3
9
  --wd-card-border-color: var(--wd-color-gray-3);
@@ -0,0 +1,198 @@
1
+ /* eslint-disable @typescript-eslint/no-magic-numbers */
2
+
3
+ import { commonCompBehavior } from '../../utils/common-behavior';
4
+ import formFieldBehavior from '../form-field-behavior/form-field-behavior';
5
+ import itemBehavior from '../form-field-behavior/item-behavior';
6
+ import { convertFixedIcon, SELECT_ICON_H5 } from '../../utils/getFormLegacy';
7
+ import debounce from '../../utils/debounce';
8
+ import {
9
+ getSelectedOptions,
10
+ transformTabData,
11
+ setSelectedValue,
12
+ initTabData,
13
+ initListOptions,
14
+ placeholderItem,
15
+ } from './utils';
16
+ Component({
17
+ options: {
18
+ virtualHost: true,
19
+ },
20
+ behaviors: [itemBehavior, commonCompBehavior, formFieldBehavior],
21
+ properties: {
22
+ classRoot: {
23
+ type: String,
24
+ value: 'cascader',
25
+ },
26
+ data: {
27
+ type: Array,
28
+ value: [],
29
+ },
30
+ className: {
31
+ type: String,
32
+ value: '',
33
+ },
34
+ style: {
35
+ type: String,
36
+ value: '',
37
+ },
38
+ id: {
39
+ type: String,
40
+ value: '',
41
+ },
42
+ },
43
+ data: {
44
+ initData: [],
45
+ tabData: [],
46
+ listOptions: [],
47
+ _suffixType: '',
48
+ _suffixIcon: '',
49
+ modalVisible: false,
50
+ searchable: false,
51
+ selectedOptions: [],
52
+ displayValue: '',
53
+ },
54
+ methods: {
55
+ finalUpdateWidgetAPI: function () {
56
+ const { selectedOptions } = this.data;
57
+ this.setReadonlyAttributes &&
58
+ this.setReadonlyAttributes({
59
+ selectedOptions,
60
+ });
61
+ this.updateWidgetAPI();
62
+ },
63
+ search: function (e) {
64
+ this.debouncedTriggerSearchEvent(e.detail.value);
65
+ },
66
+ debouncedTriggerSearchEvent: debounce(function (value) {
67
+ this.triggerEvent('search', {
68
+ value,
69
+ });
70
+ }),
71
+
72
+ // tab 展示值
73
+ updateTabData: function (newTabData, activeItem) {
74
+ let _activeItem = activeItem;
75
+ // 当前选中值是否存在子选项
76
+ const hasChildItem = newTabData[newTabData.length - 1]?.children?.length;
77
+
78
+ let tabData = [...newTabData];
79
+ if (hasChildItem) {
80
+ _activeItem = placeholderItem;
81
+ tabData = [...tabData, placeholderItem];
82
+ }
83
+ const _tabData = setSelectedValue(tabData, _activeItem.value);
84
+ this.setData({
85
+ tabData: _tabData,
86
+ });
87
+ },
88
+
89
+ // 点击列表选项
90
+ handleListOptionsClick: function (itemInfo) {
91
+ const item = itemInfo?.currentTarget?.dataset?.item;
92
+ if (item.disabled) return;
93
+ const { listOptions, tabData } = this.data;
94
+ if (item.children) {
95
+ this.setData({
96
+ listOptions: [...item.children],
97
+ });
98
+ } else {
99
+ const _listOptions = setSelectedValue(listOptions, item.value);
100
+ this.setData({
101
+ listOptions: _listOptions,
102
+ });
103
+ }
104
+ // 更新tab数据
105
+ const newTabData = [...tabData.filter((i) => i.level < item.level), item];
106
+ this.updateTabData(newTabData, item);
107
+ },
108
+
109
+ // 点击tab项,更新列表选项
110
+ handleTabClick: function (e) {
111
+ const selectedIndex = e?.detail;
112
+ const { tabData, initData } = this.data;
113
+ const selectedItem = tabData[selectedIndex];
114
+ this.updateTabData(tabData, selectedItem);
115
+ let listOptions =
116
+ selectedItem.level === 0
117
+ ? initData
118
+ : tabData.find((i) => i.level === selectedIndex - 1)?.children;
119
+
120
+ listOptions = setSelectedValue(listOptions, selectedItem?.value);
121
+ this.setData({
122
+ listOptions: listOptions,
123
+ });
124
+ },
125
+ init: function () {
126
+ const { data, value } = this.data;
127
+ const _value = Array.isArray(value) ? value : [];
128
+ const initData = transformTabData(data);
129
+ const tabData = initTabData(initData, _value || [], placeholderItem);
130
+ const listOptions = initListOptions(initData, _value || []);
131
+ const selectedOptions = _value?.map((i) => getSelectedOptions(data, i));
132
+ const displayValue =
133
+ selectedOptions?.map((i) => i.label)?.join(' / ') || _value.join(' / ');
134
+ this.setData({
135
+ tabData,
136
+ listOptions,
137
+ initData,
138
+ selectedOptions,
139
+ displayValue,
140
+ });
141
+ },
142
+ handleClick: function () {
143
+ if (this.data.disabled) return;
144
+ this.setData({
145
+ modalVisible: true,
146
+ });
147
+ },
148
+ handleClose: function () {
149
+ this.setData({
150
+ modalVisible: false,
151
+ });
152
+ this.init();
153
+ },
154
+ handleOk: function () {
155
+ const { tabData, data } = this.data;
156
+ const value = tabData
157
+ .map((item) => item.value)
158
+ .filter((i) => i !== '__placeholderItem');
159
+ const selectedOptions = value.map((i) => getSelectedOptions(data, i));
160
+ this.setData({
161
+ modalVisible: false,
162
+ value,
163
+ selectedOptions,
164
+ displayValue: selectedOptions?.map((i) => i.label)?.join(' / '),
165
+ });
166
+ this.triggerEvent('change', {
167
+ value,
168
+ });
169
+ },
170
+ },
171
+ observers: {
172
+ 'name, value, label, required, visible, disabled, readOnly, before, after, selectedOptions':
173
+ function () {
174
+ this.finalUpdateWidgetAPI();
175
+ },
176
+ 'suffixType,suffixIcon': function (suffixType, suffixIcon) {
177
+ const [_suffixType, _suffixIcon] = convertFixedIcon(
178
+ suffixType,
179
+ suffixIcon,
180
+ SELECT_ICON_H5
181
+ );
182
+ this.setData({
183
+ _suffixType,
184
+ _suffixIcon,
185
+ });
186
+ },
187
+ 'data, value': function () {
188
+ this.init();
189
+ },
190
+ },
191
+ lifetimes: {
192
+ attached: function () {
193
+ this.finalUpdateWidgetAPI();
194
+ this.init();
195
+ this.setData({ id: this.id });
196
+ },
197
+ },
198
+ });
@@ -0,0 +1,12 @@
1
+ {
2
+ "component": true,
3
+ "styleIsolation": "shared",
4
+ "usingComponents": {
5
+ "wd-form-item": "../wd-form-item/index",
6
+ "wd-input-group": "../wd-input-group/index",
7
+ "wd-input-wrap": "../wd-input-wrap/index",
8
+ "wd-modal": "../wd-date/modal",
9
+ "wd-tabs": "../wd-tabs",
10
+ "wd-icon": "../wd-icon"
11
+ }
12
+ }
@@ -0,0 +1,59 @@
1
+ <block wx:if="{{visible}}">
2
+ <wd-form-item
3
+ id="{{id}}"
4
+ className="{{className}}"
5
+ style="{{style}}"
6
+ label="{{label}}"
7
+ labelVisible="{{labelVisible}}"
8
+ labelTips="{{labelTips}}"
9
+ labelWidth="{{labelWidth}}"
10
+ labelAlign="{{labelAlign}}"
11
+ labelWrap="{{labelWrap}}"
12
+ layout="{{actualLayout}}"
13
+ extra="{{extra}}"
14
+ required="{{required}}"
15
+ requiredFlag="{{requiredFlag}}"
16
+ validateState="{{validateState}}"
17
+ validateErrorMsg="{{validateErrorMsg}}"
18
+ classRoot="{{classRoot}}"
19
+ size="{{size}}"
20
+ borderedH5="{{borderedH5}}"
21
+ >
22
+ <wd-input-group before="{{before}}" after="{{after}}" block="{{true}}" size="{{_size}}" classRoot="{{classRoot}}" readOnly="{{readOnly}}">
23
+ <wd-input-wrap block="{{block}}" classRoot="{{classRoot}}" before="{{before}}" after="{{after}}" disabled="{{disabled}}" prefixType="{{prefixType}}" prefixIcon="{{prefixIcon}}" prefixSrc="{{prefixSrc}}" suffixType="{{_suffixType}}" suffixIcon="{{_suffixIcon}}" suffixSrc="{{suffixSrc}}" hasClearIcon="{{hasClearIcon}}" bind:onClear="handleClear" readOnly="{{readOnly}}">
24
+ <view class="weui-cell__bd">
25
+ <view bindtap="handleClick" class="weui-picker__group weui-input">
26
+ <label class="wd-form-select_input {{displayValue ? '' : 'weui-input__placeholder'}}">{{displayValue || placeholder}}</label>
27
+ </view>
28
+ </view>
29
+ </wd-input-wrap>
30
+ </wd-input-group>
31
+ </wd-form-item>
32
+ <wd-modal visible="{{modalVisible}}" bind:onClose="handleClose" bind:onOk="handleOk" header="{{focus}}" className="{{classPrefix + '-cascader-modal'}}">
33
+ <block wx:if="{{searchable}}">
34
+ <view class="wd-custom-search {{focus?'is-focused':''}}" style="{{focus? 'margin: 34rpx 32rpx 16rpx 32rpx':'margin: 20rpx 32rpx'}}">
35
+ <view class="wd-custom-search-box" bindtap="onFocus">
36
+ <input class="wd-input" focus="{{focus}}" bindfocus="onFocus" bindblur="onBlur" bindinput="bindinput" value="{{searchValue}}" hold-keyboard="true" bindconfirm="bindconfirm" />
37
+ <view class="wd-custom-search-box__label">
38
+ <span class="wd-custom-search-box__search-icon"></span>
39
+ <span class="wd-custom-search-box__search-placeholder"> 搜索 </span>
40
+ </view>
41
+ <span wx:if="{{focus && searchValue !== ''}}" class="wd-custom-search-box__dismiss-icon" bindtap="clear"></span>
42
+ </view>
43
+ <text class="wd-custom-search__btn-cancle" bindtap="shrink">取消</text>
44
+ </view>
45
+ </block>
46
+ <view class="wd-custom-view-content">
47
+ <wd-tabs list="{{tabData}}" bind:onCurrent="handleTabClick" direction="horizontal">
48
+ <scroll-view scroll-y="true" class="{{classPrefix + '-cascader-h5-view-list'}}" enable-flex="true">
49
+ <view wx:for="{{listOptions}}" class="{{classPrefix + '-cascader-h5-view-list__menu'}} {{item.selected?'is-selected':''}} {{item.isDisabled?'is-disabled':''}}" wx:for-index="index" wx:for-item="item" wx:key="{{item.value}}" id="{{'cell-'+index}}" bindtap="handleListOptionsClick" data-value="{{item.value}}" data-item="{{item}}">
50
+ <view class="{{classPrefix + '-cascader-h5-view-list__menu__text'}}"> {{item.label}} </view>
51
+ <view wx-if="{{item.selected}}">
52
+ <wd-icon name="td:check" size="md" />
53
+ </view>
54
+ </view>
55
+ </scroll-view>
56
+ </wd-tabs>
57
+ </view>
58
+ </wd-modal>
59
+ </block>
@@ -0,0 +1,2 @@
1
+ @import '../../style/wd-design.wxss';
2
+ @import './wd-cascader.wxss';
@@ -0,0 +1,70 @@
1
+ /* eslint-disable @typescript-eslint/no-magic-numbers */
2
+
3
+ import { deepClone } from '../../utils/lodash';
4
+
5
+ // 获取选中项
6
+ export const getSelectedOptions = (data, value) => {
7
+ for (const i of data) {
8
+ if (i.value === value) return i;
9
+ if (i.children) {
10
+ const res = getSelectedOptions(i.children, value);
11
+ if (res) return res;
12
+ }
13
+ }
14
+ };
15
+
16
+ // 组装tab数据
17
+ export const transformTabData = (data, pid = 'root', level = 0) => {
18
+ if (!Array.isArray(data)) return [];
19
+ return data.map((_item) => {
20
+ const item = deepClone(_item);
21
+ if (item.children) {
22
+ item.children = transformTabData(item.children, item.value, level + 1);
23
+ }
24
+ return { ...item, level, selected: false, pid };
25
+ });
26
+ };
27
+ // 设置选中值
28
+ export const setSelectedValue = (data, value) => {
29
+ if (!Array.isArray(data)) return [];
30
+ const _value = [].concat(value);
31
+ return data.map((item) => {
32
+ item.selected = !!_value.find((i) => i === item?.value);
33
+ if (item.children) {
34
+ item.children = setSelectedValue(item.children, value);
35
+ }
36
+ return item;
37
+ });
38
+ };
39
+
40
+ export const initTabData = (data, value, placeholderItem) => {
41
+ if (!Array.isArray(data)) return [];
42
+ let tabDataRes = [placeholderItem];
43
+ if (value.length) {
44
+ const selectedOptions =
45
+ value?.map((i) => getSelectedOptions(data, i)) || [];
46
+ const selectedItem = selectedOptions[selectedOptions.length - 1];
47
+
48
+ tabDataRes = setSelectedValue(selectedOptions, selectedItem?.value);
49
+ }
50
+ return tabDataRes;
51
+ };
52
+
53
+ export const initListOptions = (data, value) => {
54
+ if (!Array.isArray(data)) return [];
55
+ let listOptionsRes = deepClone(data);
56
+ if (value.length) {
57
+ const selectedOptions =
58
+ value?.map((i) => getSelectedOptions(data, i)) || [];
59
+ const selectedItem = selectedOptions[selectedOptions.length - 1];
60
+ listOptionsRes =
61
+ getSelectedOptions(data, selectedItem.pid)?.children || data;
62
+ }
63
+ return listOptionsRes;
64
+ };
65
+
66
+ export const placeholderItem = {
67
+ label: '请选择',
68
+ value: '__placeholderItem',
69
+ selected: true,
70
+ };