w-ui-v1 1.0.7 → 1.0.9

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "w-ui-v1",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "w-ui",
5
5
  "author": "wgxshh",
6
6
  "license": "ISC",
package/utils/http.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  // 用promise 封装uni.request
2
2
  export default function request(options: any): Promise<any> {
3
- const baseUrl = uni.getStorageSync('baseUrl') || '/'
3
+ const baseUrl = 'http://1.94.178.181:8082'
4
4
  const hydrocarbonProgramToken = uni.getStorageSync('hydrocarbonProgramToken') || ''
5
- const token = uni.getStorageSync('token') || 'http://1.94.178.181:8082'
5
+ const token = uni.getStorageSync('token') || ''
6
6
  const header = options.header || {}
7
7
  return new Promise((resolve, reject) => {
8
8
  uni.request({
@@ -14,6 +14,10 @@ const props = defineProps({
14
14
  type: Object,
15
15
  required: true,
16
16
  },
17
+ carIndex: {
18
+ type: Number,
19
+ required: true,
20
+ },
17
21
  })
18
22
 
19
23
  // 处理单项数据、配置
@@ -157,6 +161,11 @@ function toggleExpand() {
157
161
  v-if="getValue(item.content, item.title)?.type === '图片'" width="100rpx" height="100rpx"
158
162
  :src="getValue(item.content, item.title).url" :enable-preview="true"
159
163
  />
164
+ <view v-else-if="item.title === '序号'">
165
+ {{
166
+ carIndex + 1
167
+ }}
168
+ </view>
160
169
  <view v-else class="value">
161
170
  {{ getValue(item.content, item.title) }}
162
171
  </view>
@@ -0,0 +1,185 @@
1
+ @import 'wot-design-uni/components/common/abstracts/variable';
2
+ @import 'wot-design-uni/components/common/abstracts/mixin';
3
+
4
+ .wot-theme-dark {
5
+ @include b(select-picker) {
6
+ @include when(border) {
7
+ .wd-select-picker__cell {
8
+ @include halfPixelBorder('top', $-cell-padding, $-dark-border-color);
9
+ }
10
+ }
11
+
12
+ @include e(cell) {
13
+ background-color: $-dark-background2;
14
+ color: $-dark-color;
15
+ @include when(disabled) {
16
+ .wd-select-picker__value {
17
+ color: $-dark-color3;
18
+ }
19
+ }
20
+ }
21
+
22
+ @include e(label) {
23
+ color: $-dark-color;
24
+ }
25
+ @include e(value) {
26
+ color: $-dark-color;
27
+ @include m(placeholder) {
28
+ color: $-dark-color-gray;
29
+ }
30
+ }
31
+
32
+ :deep(.wd-select-picker__arrow),
33
+ :deep(.wd-select-picker__close),
34
+ :deep(.wd-select-picker__clear) {
35
+ color: $-dark-color;
36
+ }
37
+
38
+ }
39
+
40
+ }
41
+
42
+ @include b(select-picker) {
43
+ @include when(border) {
44
+ .wd-select-picker__cell {
45
+ @include halfPixelBorder('top', $-cell-padding);
46
+ }
47
+ }
48
+ @include e(cell) {
49
+ position: relative;
50
+ display: flex;
51
+ padding: $-cell-wrapper-padding $-cell-padding;
52
+ align-items: flex-start;
53
+ background-color: $-color-white;
54
+ text-decoration: none;
55
+ color: $-cell-title-color;
56
+ font-size: $-cell-title-fs;
57
+ overflow: hidden;
58
+ line-height: $-cell-line-height;
59
+ }
60
+ @include e(cell) {
61
+ @include when(disabled) {
62
+ .wd-select-picker__value {
63
+ color: $-input-disabled-color;
64
+ }
65
+ }
66
+ @include when(align-right) {
67
+ .wd-select-picker__value {
68
+ text-align: right;
69
+ }
70
+ }
71
+ @include when(error) {
72
+ .wd-select-picker__value {
73
+ color: $-input-error-color;
74
+ }
75
+ :deep(.wd-select-picker__arrow) {
76
+ color: $-input-error-color;
77
+ }
78
+ }
79
+ @include when(large) {
80
+ font-size: $-cell-title-fs-large;
81
+
82
+ :deep(.wd-select-picker__arrow),
83
+ :deep(.wd-select-picker__clear) {
84
+ font-size: $-cell-icon-size-large;
85
+ }
86
+ }
87
+ }
88
+ @include e(error-message){
89
+ color: $-form-item-error-message-color;
90
+ font-size: $-form-item-error-message-font-size;
91
+ line-height: $-form-item-error-message-line-height;
92
+ text-align: left;
93
+ vertical-align: middle;
94
+ }
95
+ @include e(label) {
96
+ position: relative;
97
+ width: $-input-cell-label-width;
98
+ color: $-cell-title-color;
99
+ margin-right: $-cell-padding;
100
+ box-sizing: border-box;
101
+
102
+ @include when(required) {
103
+ padding-left: 12px;
104
+
105
+ &::after {
106
+ position: absolute;
107
+ left: 0;
108
+ top: 2px;
109
+ content: '*';
110
+ font-size: $-cell-required-size;
111
+ line-height: 1.1;
112
+ color: $-cell-required-color;
113
+ }
114
+ }
115
+ }
116
+ @include e(value-wraper) {
117
+ display: flex;
118
+ }
119
+ @include e(value) {
120
+ flex: 1;
121
+ margin-right: 10px;
122
+ color: $-cell-value-color;
123
+
124
+ @include when(ellipsis) {
125
+ @include lineEllipsis;
126
+ }
127
+ @include m(placeholder) {
128
+ color: $-input-placeholder-color;
129
+ }
130
+ }
131
+ @include e(body) {
132
+ flex: 1;
133
+ }
134
+ @include edeep(arrow, clear) {
135
+ display: block;
136
+ font-size: $-cell-icon-size;
137
+ color: $-cell-arrow-color;
138
+ line-height: $-cell-line-height;
139
+ }
140
+
141
+ @include edeep(clear) {
142
+ color: $-cell-clear-color;
143
+ }
144
+
145
+ @include e(loading) {
146
+ position: absolute;
147
+ display: flex;
148
+ top: 0;
149
+ right: 0;
150
+ bottom: 0;
151
+ left: 0;
152
+ align-items: center;
153
+ justify-content: center;
154
+ z-index: 3;
155
+ background: $-picker-loading-bg;
156
+ }
157
+ // selectPiceker多出的样式
158
+ @include edeep(header) {
159
+ height: 72px;
160
+ line-height: 72px;
161
+ }
162
+ @include e(wrapper) {
163
+ padding: 0 10px;
164
+ position: relative;
165
+ max-height: 356px;
166
+ box-sizing: border-box;
167
+ overflow: auto;
168
+
169
+ @include when(filterable) {
170
+ height: 314px;
171
+ max-height: 314px;
172
+ }
173
+
174
+ @include when(loading) {
175
+ overflow: hidden;
176
+ }
177
+ }
178
+ @include e(text-active) {
179
+ color: $-color-theme;
180
+ }
181
+
182
+ @include e(footer) {
183
+ padding: 24px 15px;
184
+ }
185
+ }
@@ -0,0 +1,105 @@
1
+ import type { ComponentPublicInstance, ExtractPropTypes, PropType } from 'vue'
2
+ import { baseProps, makeArrayProp, makeBooleanProp, makeNumberProp, makeRequiredProp, makeStringProp } from 'wot-design-uni/components/common/props'
3
+ import type { FormItemRule } from 'wot-design-uni/components/wd-form/types'
4
+
5
+ export type SelectPickerType = 'checkbox' | 'radio'
6
+
7
+ export const selectPickerProps = {
8
+ ...baseProps,
9
+ /** 选择器左侧文案 */
10
+ label: String,
11
+ /** 设置左侧标题宽度 */
12
+ labelWidth: makeStringProp('33%'),
13
+ /** 禁用 */
14
+ disabled: makeBooleanProp(false),
15
+ /** 只读 */
16
+ readonly: Boolean,
17
+ /** 选择器占位符 */
18
+ placeholder: String,
19
+ /** 弹出层标题 */
20
+ title: String,
21
+ /** 选择器的值靠右展示 */
22
+ alignRight: makeBooleanProp(false),
23
+ /** 是否为错误状态,错误状态时右侧内容为红色 */
24
+ error: makeBooleanProp(false),
25
+ /** 必填样式 */
26
+ required: makeBooleanProp(false),
27
+ /** 使用 label 插槽时设置该选项 */
28
+ useLabelSlot: makeBooleanProp(false),
29
+ /** 使用默认插槽时设置该选项 */
30
+ useDefaultSlot: makeBooleanProp(false),
31
+ /** 设置选择器大小 */
32
+ size: String,
33
+ /** 选中的颜色(单/复选框) */
34
+ checkedColor: String,
35
+ /** 最小选中的数量(仅在复选框类型下生效,`type`类型为`checkbox`) */
36
+ min: makeNumberProp(0),
37
+ /** 最大选中的数量,0 为无限数量,默认为 0(仅在复选框类型下生效,`type`类型为`checkbox`) */
38
+ max: makeNumberProp(0),
39
+ /** 设置 picker 内部的选项组尺寸大小 (单/复选框) */
40
+ selectSize: String,
41
+ /** 加载中 */
42
+ loading: makeBooleanProp(false),
43
+ /** 加载的颜色,只能使用十六进制的色值写法,且不能使用缩写 */
44
+ loadingColor: makeStringProp('#4D80F0'),
45
+ /** 点击遮罩是否关闭 */
46
+ closeOnClickModal: makeBooleanProp(true),
47
+ /** 选中项,`type`类型为`checkbox`时,类型为 array;`type`为`radio` 时 ,类型为 number / boolean / string */
48
+ modelValue: makeRequiredProp([String, Number, Boolean, Array] as PropType<string | number | boolean | (string | number | boolean)[]>),
49
+ /** 选择器数据,一维数组 */
50
+ columns: makeArrayProp<Record<string, any>>(),
51
+ /** 单复选选择器类型 */
52
+ type: makeStringProp<SelectPickerType>('checkbox'),
53
+ /** 选项对象中,value 对应的 key */
54
+ valueKey: makeStringProp('value'),
55
+ /** 选项对象中,展示的文本对应的 key */
56
+ labelKey: makeStringProp('label'),
57
+ /** 确认按钮文案 */
58
+ confirmButtonText: String,
59
+ /** 自定义展示文案的格式化函数,返回一个字符串 */
60
+ displayFormat: Function as PropType<SelectPickerDisplayFormat>,
61
+ /** 确定前校验函数,接收 (value, resolve) 参数,通过 resolve 继续执行 picker,resolve 接收 1 个 boolean 参数 */
62
+ beforeConfirm: Function as PropType<SelectPickerBeforeConfirm>,
63
+ /** 弹窗层级 */
64
+ zIndex: makeNumberProp(15),
65
+ /** 弹出面板是否设置底部安全距离(iphone X 类型的机型) */
66
+ safeAreaInsetBottom: makeBooleanProp(true),
67
+ /** 可搜索(目前只支持本地搜索) */
68
+ filterable: makeBooleanProp(false),
69
+ /** 搜索框占位符 */
70
+ filterPlaceholder: String,
71
+ /** 是否超出隐藏 */
72
+ ellipsis: makeBooleanProp(false),
73
+ /** 重新打开是否滚动到选中项 */
74
+ scrollIntoView: makeBooleanProp(true),
75
+ /** 表单域 `model` 字段名,在使用表单校验功能的情况下,该属性是必填的 */
76
+ prop: String,
77
+ /** 表单验证规则,结合`wd-form`组件使用 */
78
+ rules: makeArrayProp<FormItemRule>(),
79
+ /** 自定义内容样式类 */
80
+ customContentClass: makeStringProp(''),
81
+ /** 自定义标签样式类 */
82
+ customLabelClass: makeStringProp(''),
83
+ /** 自定义值样式类 */
84
+ customValueClass: makeStringProp(''),
85
+ /** 是否显示确认按钮(radio类型生效),默认值为:true */
86
+ showConfirm: makeBooleanProp(true),
87
+ /**
88
+ * 显示清空按钮
89
+ */
90
+ clearable: makeBooleanProp(false)
91
+ }
92
+ export type SelectPickerProps = ExtractPropTypes<typeof selectPickerProps>
93
+
94
+ export type SelectPickerDisplayFormat = (items: string | number | boolean | (string | number | boolean)[], columns: Record<string, any>[]) => string
95
+
96
+ export type SelectPickerBeforeConfirm = (value: string | number | boolean | (string | number | boolean)[], resolve: (isPass: boolean) => void) => void
97
+
98
+ export type SelectPickerExpose = {
99
+ // 打开picker弹框
100
+ open: () => void
101
+ // 关闭picker弹框
102
+ close: () => void
103
+ }
104
+
105
+ export type SelectPickerInstance = ComponentPublicInstance<SelectPickerExpose, SelectPickerProps>
@@ -0,0 +1,440 @@
1
+ <template>
2
+ <view :class="`wd-select-picker ${cell.border.value ? 'is-border' : ''} ${customClass}`" :style="customStyle">
3
+ <view class="wd-select-picker__field" @click="open">
4
+ <slot v-if="useDefaultSlot"></slot>
5
+ <view
6
+ v-else
7
+ :class="`wd-select-picker__cell ${disabled && 'is-disabled'} ${readonly && 'is-readonly'} ${alignRight && 'is-align-right'} ${
8
+ error && 'is-error'
9
+ } ${size && 'is-' + size}`"
10
+ >
11
+ <view
12
+ v-if="label || useLabelSlot"
13
+ :class="`wd-select-picker__label ${isRequired && 'is-required'} ${customLabelClass}`"
14
+ :style="labelWidth ? 'min-width:' + labelWidth + ';max-width:' + labelWidth + ';' : ''"
15
+ >
16
+ <block v-if="label">{{ label }}</block>
17
+ <slot v-else name="label"></slot>
18
+ </view>
19
+ <view class="wd-select-picker__body">
20
+ <view class="wd-select-picker__value-wraper">
21
+ <view
22
+ :class="`wd-select-picker__value ${ellipsis && 'is-ellipsis'} ${customValueClass} ${
23
+ showValue ? '' : 'wd-select-picker__value--placeholder'
24
+ }`"
25
+ >
26
+ {{ showValue || placeholder || translate('placeholder') }}
27
+ </view>
28
+ <wd-icon v-if="showArrow" custom-class="wd-select-picker__arrow" name="arrow-right" />
29
+ <view v-else-if="showClear" @click.stop="handleClear">
30
+ <wd-icon custom-class="wd-select-picker__clear" name="error-fill" />
31
+ </view>
32
+ </view>
33
+
34
+ <view v-if="errorMessage" class="wd-select-picker__error-message">{{ errorMessage }}</view>
35
+ </view>
36
+ </view>
37
+ </view>
38
+ <wd-action-sheet
39
+ v-model="pickerShow"
40
+ :duration="250"
41
+ :title="title || translate('title')"
42
+ :close-on-click-modal="closeOnClickModal"
43
+ :z-index="zIndex"
44
+ :safe-area-inset-bottom="safeAreaInsetBottom"
45
+ @close="close"
46
+ @opened="scrollIntoView ? setScrollIntoView() : ''"
47
+ custom-header-class="wd-select-picker__header"
48
+ >
49
+ <wd-search
50
+ v-if="filterable"
51
+ v-model="filterVal"
52
+ :placeholder="filterPlaceholder || translate('filterPlaceholder')"
53
+ hide-cancel
54
+ placeholder-left
55
+ @change="handleFilterChange"
56
+ />
57
+ <scroll-view
58
+ :class="`wd-select-picker__wrapper ${filterable ? 'is-filterable' : ''} ${loading ? 'is-loading' : ''} ${customContentClass}`"
59
+ :scroll-y="!loading"
60
+ :scroll-top="scrollTop"
61
+ :scroll-with-animation="true"
62
+ @scrolltolower="scrolltolower"
63
+ >
64
+ <!-- 多选 -->
65
+ <view v-if="type === 'checkbox' && isArray(selectList)" id="wd-checkbox-group">
66
+ <wd-checkbox-group v-model="selectList" cell :size="selectSize" :checked-color="checkedColor" :min="min" :max="max" @change="handleChange">
67
+ <view v-for="item in filterColumns" :key="item[valueKey]" :id="'check' + item[valueKey]">
68
+ <wd-checkbox :modelValue="item[valueKey]" :disabled="item.disabled">
69
+ <block v-if="filterable && filterVal">
70
+ <block v-for="text in item[labelKey]" :key="text.label">
71
+ <text v-if="text.type === 'active'" class="wd-select-picker__text-active">{{ text.label }}</text>
72
+ <block v-else>{{ text.label }}</block>
73
+ </block>
74
+ </block>
75
+ <block v-else>
76
+ {{ item[labelKey] }}
77
+ </block>
78
+ </wd-checkbox>
79
+ </view>
80
+ </wd-checkbox-group>
81
+ </view>
82
+ <!-- 单选 -->
83
+ <view v-if="type === 'radio' && !isArray(selectList)" id="wd-radio-group">
84
+ <wd-radio-group v-model="selectList" cell :size="selectSize" :checked-color="checkedColor" @change="handleChange">
85
+ <view v-for="(item, index) in filterColumns" :key="index" :id="'radio' + item[valueKey]">
86
+ <wd-radio :value="item[valueKey]" :disabled="item.disabled">
87
+ <block v-if="filterable && filterVal">
88
+ <block v-for="text in item[labelKey]" :key="text.label">
89
+ <text :class="`${text.type === 'active' ? 'wd-select-picker__text-active' : ''}`">{{ text.label }}</text>
90
+ </block>
91
+ </block>
92
+ <block v-else>
93
+ {{ item[labelKey] }}
94
+ </block>
95
+ </wd-radio>
96
+ </view>
97
+ </wd-radio-group>
98
+ </view>
99
+ <view v-if="loading" class="wd-select-picker__loading" @touchmove="noop">
100
+ <wd-loading :color="loadingColor" />
101
+ </view>
102
+ </scroll-view>
103
+ <!-- 确认按钮 -->
104
+ <view v-if="showConfirm" class="wd-select-picker__footer">
105
+ <wd-button block size="large" @click="onConfirm" :disabled="loading">{{ confirmButtonText || translate('confirm') }}</wd-button>
106
+ </view>
107
+ </wd-action-sheet>
108
+ </view>
109
+ </template>
110
+ <script lang="ts" setup>
111
+
112
+ import { getCurrentInstance, onBeforeMount, ref, watch, nextTick, computed } from 'vue'
113
+ import { useCell } from 'wot-design-uni/components/composables/useCell'
114
+ import { getRect, isArray, isDef, isFunction, pause } from 'wot-design-uni/components/common/util'
115
+ import { useParent } from 'wot-design-uni/components/composables/useParent'
116
+ import { FORM_KEY, type FormItemRule } from 'wot-design-uni/components/wd-form/types'
117
+ import { useTranslate } from 'wot-design-uni/components/composables/useTranslate'
118
+ import { selectPickerProps, type SelectPickerExpose } from './types'
119
+
120
+ const { translate } = useTranslate('select-picker')
121
+
122
+ const props = defineProps(selectPickerProps)
123
+ const emit = defineEmits(['change', 'cancel', 'confirm', 'clear', 'update:modelValue', 'open', 'close'])
124
+
125
+ const pickerShow = ref<boolean>(false)
126
+ const selectList = ref<Array<number | boolean | string> | number | boolean | string>([])
127
+ const isConfirm = ref<boolean>(false)
128
+ const lastSelectList = ref<Array<number | boolean | string> | number | boolean | string>([])
129
+ const filterVal = ref<string>('')
130
+ const filterColumns = ref<Array<Record<string, any>>>([])
131
+ const scrollTop = ref<number>(0) // 滚动位置
132
+ const cell = useCell()
133
+
134
+ const showValue = computed(() => {
135
+ const value = valueFormat(props.modelValue)
136
+ let showValueTemp: string = ''
137
+
138
+ if (props.displayFormat) {
139
+ showValueTemp = props.displayFormat(value, props.columns)
140
+ } else {
141
+ const { type, labelKey } = props
142
+ if (type === 'checkbox') {
143
+ const selectedItems = (isArray(value) ? value : []).map((item) => {
144
+ return getSelectedItem(item)
145
+ })
146
+ showValueTemp = selectedItems
147
+ .map((item) => {
148
+ return item[labelKey]
149
+ })
150
+ .join(', ')
151
+ } else if (type === 'radio') {
152
+ const selectedItem = getSelectedItem(value as string | number | boolean)
153
+ showValueTemp = selectedItem[labelKey]
154
+ } else {
155
+ showValueTemp = value as string
156
+ }
157
+ }
158
+ return showValueTemp
159
+ })
160
+
161
+ watch(
162
+ () => props.modelValue,
163
+ (newValue) => {
164
+ if (newValue === selectList.value) return
165
+ selectList.value = valueFormat(newValue)
166
+ lastSelectList.value = valueFormat(newValue)
167
+ },
168
+ {
169
+ deep: true,
170
+ immediate: true
171
+ }
172
+ )
173
+
174
+ watch(
175
+ () => props.columns,
176
+ (newValue) => {
177
+ if (props.filterable && filterVal.value) {
178
+ formatFilterColumns(newValue, filterVal.value)
179
+ } else {
180
+ filterColumns.value = newValue
181
+ }
182
+ },
183
+ {
184
+ deep: true,
185
+ immediate: true
186
+ }
187
+ )
188
+
189
+ watch(
190
+ () => props.displayFormat,
191
+ (fn) => {
192
+ if (fn && !isFunction(fn)) {
193
+ console.error('The type of displayFormat must be Function')
194
+ }
195
+ },
196
+ {
197
+ deep: true,
198
+ immediate: true
199
+ }
200
+ )
201
+
202
+ watch(
203
+ () => props.beforeConfirm,
204
+ (fn) => {
205
+ if (fn && !isFunction(fn)) {
206
+ console.error('The type of beforeConfirm must be Function')
207
+ }
208
+ },
209
+ {
210
+ deep: true,
211
+ immediate: true
212
+ }
213
+ )
214
+
215
+ const { parent: form } = useParent(FORM_KEY)
216
+
217
+ // 表单校验错误信息
218
+ const errorMessage = computed(() => {
219
+ if (form && props.prop && form.errorMessages && form.errorMessages[props.prop]) {
220
+ return form.errorMessages[props.prop]
221
+ } else {
222
+ return ''
223
+ }
224
+ })
225
+
226
+ // 是否展示必填
227
+ const isRequired = computed(() => {
228
+ let formRequired = false
229
+ if (form && form.props.rules) {
230
+ const rules = form.props.rules
231
+ for (const key in rules) {
232
+ if (Object.prototype.hasOwnProperty.call(rules, key) && key === props.prop && Array.isArray(rules[key])) {
233
+ formRequired = rules[key].some((rule: FormItemRule) => rule.required)
234
+ }
235
+ }
236
+ }
237
+ return props.required || props.rules.some((rule) => rule.required) || formRequired
238
+ })
239
+
240
+ onBeforeMount(() => {
241
+ selectList.value = valueFormat(props.modelValue)
242
+ filterColumns.value = props.columns
243
+ })
244
+
245
+ const { proxy } = getCurrentInstance() as any
246
+
247
+ async function setScrollIntoView() {
248
+ let wraperSelector: string = ''
249
+ let selectorPromise: Promise<UniApp.NodeInfo>[] = []
250
+ if (isDef(selectList.value) && selectList.value !== '' && !isArray(selectList.value)) {
251
+ wraperSelector = '#wd-radio-group'
252
+ selectorPromise = [getRect(`#radio${selectList.value}`, false, proxy)]
253
+ } else if (isArray(selectList.value) && selectList.value.length > 0) {
254
+ selectList.value.forEach((value) => {
255
+ selectorPromise.push(getRect(`#check${value}`, false, proxy))
256
+ })
257
+ wraperSelector = '#wd-checkbox-group'
258
+ }
259
+ if (wraperSelector) {
260
+ await pause(2000 / 30)
261
+ Promise.all([getRect('.wd-select-picker__wrapper', false, proxy), getRect(wraperSelector, false, proxy), ...selectorPromise]).then((res) => {
262
+ if (isDef(res) && isArray(res)) {
263
+ const scrollView = res[0]
264
+ const wraper = res[1]
265
+ const target = res.slice(2) || []
266
+ if (isDef(wraper) && isDef(scrollView)) {
267
+ const index = target.findIndex((item) => {
268
+ return item.bottom! > scrollView.top! && item.top! < scrollView.bottom!
269
+ })
270
+ if (index < 0) {
271
+ scrollTop.value = -1
272
+ nextTick(() => {
273
+ scrollTop.value = Math.max(0, target[0].top! - wraper.top! - scrollView.height! / 2)
274
+ })
275
+ }
276
+ }
277
+ }
278
+ })
279
+ }
280
+ }
281
+
282
+ function noop() {}
283
+
284
+ function getSelectedItem(value: string | number | boolean) {
285
+ const { valueKey, labelKey, columns } = props
286
+
287
+ const selecteds = columns.filter((item) => {
288
+ return item[valueKey] === value
289
+ })
290
+
291
+ if (selecteds.length > 0) {
292
+ return selecteds[0]
293
+ }
294
+
295
+ return {
296
+ [valueKey]: value,
297
+ [labelKey]: ''
298
+ }
299
+ }
300
+
301
+ function valueFormat(value: string | number | boolean | (string | number | boolean)[]) {
302
+ return props.type === 'checkbox' ? (isArray(value) ? value : []) : value
303
+ }
304
+
305
+ function handleChange({ value }: { value: string | number | boolean | (string | number | boolean)[] }) {
306
+ selectList.value = value
307
+ emit('change', { value })
308
+ if (props.type === 'radio' && !props.showConfirm) {
309
+ onConfirm()
310
+ }
311
+ }
312
+
313
+ function close() {
314
+ pickerShow.value = false
315
+ // 未确定选项时,数据还原复位
316
+ if (!isConfirm.value) {
317
+ selectList.value = valueFormat(lastSelectList.value)
318
+ }
319
+ emit('cancel')
320
+ emit('close')
321
+ }
322
+
323
+ function open() {
324
+ if (props.disabled || props.readonly) return
325
+ selectList.value = valueFormat(props.modelValue)
326
+ pickerShow.value = true
327
+ isConfirm.value = false
328
+ emit('open')
329
+ }
330
+
331
+ function onConfirm() {
332
+ if (props.loading) {
333
+ pickerShow.value = false
334
+ emit('confirm')
335
+ emit('close')
336
+ return
337
+ }
338
+ if (props.beforeConfirm) {
339
+ props.beforeConfirm(selectList.value, (isPass: boolean) => {
340
+ isPass && handleConfirm()
341
+ })
342
+ } else {
343
+ handleConfirm()
344
+ }
345
+ }
346
+
347
+ function handleConfirm() {
348
+ isConfirm.value = true
349
+ pickerShow.value = false
350
+ lastSelectList.value = valueFormat(selectList.value)
351
+ let selectedItems: Record<string, any> = {}
352
+ if (props.type === 'checkbox') {
353
+ selectedItems = (isArray(lastSelectList.value) ? lastSelectList.value : []).map((item) => {
354
+ return getSelectedItem(item)
355
+ })
356
+ } else {
357
+ selectedItems = getSelectedItem(lastSelectList.value as string | number | boolean)
358
+ }
359
+ emit('update:modelValue', lastSelectList.value)
360
+ emit('confirm', {
361
+ value: lastSelectList.value,
362
+ selectedItems
363
+ })
364
+ emit('close')
365
+ }
366
+
367
+ function getFilterText(label: string, filterVal: string) {
368
+ const reg = new RegExp(`(${filterVal})`, 'g')
369
+
370
+ return label.split(reg).map((text) => {
371
+ return {
372
+ type: text === filterVal ? 'active' : 'normal',
373
+ label: text
374
+ }
375
+ })
376
+ }
377
+
378
+ function handleFilterChange({ value }: { value: string }) {
379
+ if (value === '') {
380
+ filterColumns.value = []
381
+ filterVal.value = value
382
+ nextTick(() => {
383
+ filterColumns.value = props.columns
384
+ })
385
+ } else {
386
+ filterVal.value = value
387
+ formatFilterColumns(props.columns, value)
388
+ }
389
+ }
390
+
391
+ function formatFilterColumns(columns: Record<string, any>[], filterVal: string) {
392
+ const filterColumnsTemp = columns.filter((item) => {
393
+ return item[props.labelKey].indexOf(filterVal) > -1
394
+ })
395
+
396
+ const formatFilterColumns = filterColumnsTemp.map((item) => {
397
+ return {
398
+ ...item,
399
+ [props.labelKey]: getFilterText(item[props.labelKey], filterVal)
400
+ }
401
+ })
402
+ filterColumns.value = []
403
+ nextTick(() => {
404
+ filterColumns.value = formatFilterColumns
405
+ })
406
+ }
407
+
408
+ const showConfirm = computed(() => {
409
+ return (props.type === 'radio' && props.showConfirm) || props.type === 'checkbox'
410
+ })
411
+
412
+ // 是否展示清除按钮
413
+ const showClear = computed(() => {
414
+ return props.clearable && !props.disabled && !props.readonly && showValue.value.length
415
+ })
416
+
417
+ function handleClear() {
418
+ emit('update:modelValue', props.type === 'checkbox' ? [] : '')
419
+ emit('clear')
420
+ }
421
+
422
+ // 是否展示箭头
423
+ const showArrow = computed(() => {
424
+ return !props.disabled && !props.readonly && !showClear.value
425
+ })
426
+
427
+ //滚动事件
428
+ const scrolltolower = ()=>{
429
+ console.log('scrolltolower')
430
+ }
431
+
432
+ defineExpose<SelectPickerExpose>({
433
+ close,
434
+ open
435
+ })
436
+ </script>
437
+ <style lang="scss" scoped>
438
+ @import './index.scss';
439
+ </style>
440
+
@@ -9,7 +9,8 @@ import {
9
9
  getPageKey,
10
10
  pageConfig,
11
11
  } from '../utils/apis/pageConfig'
12
- import foldCardTemplate from './components/foldCardTemplate.vue'
12
+ import wCard from '../w-card/w-card.vue'
13
+ import wSelectPicker from '../w-select-picker/w-select-picker.vue'
13
14
 
14
15
  defineOptions({
15
16
  name: 'WTable',
@@ -26,7 +27,7 @@ const pageData = ref<{
26
27
  buttons: string[]
27
28
  }>({ criterias: [], buttons: [] })
28
29
  onLoad((option: any) => {
29
- sourceId.value = option.sourceId || '405889315156828169'
30
+ sourceId.value = option.sourceId || '405888563537551369'
30
31
  getPageConfig()
31
32
  })
32
33
  // 获取页面配置
@@ -36,28 +37,32 @@ function getPageConfig() {
36
37
  })
37
38
  }
38
39
  // 搜索菜单数据
39
- const menu = computed(() => {
40
- const menulist = pageData.value.criterias?.map((item: any) => {
41
- return {
42
- content: item.title,
43
- id: item.id,
44
- mstrucId: item.mstrucId,
45
- sourceId: item.sourceId,
46
- }
47
- }) || []
48
- menulist.unshift({
49
- content: '全部',
50
- id: '',
51
- mstrucId: '',
52
- sourceId: '',
53
- })
54
- return menulist
55
- })
56
-
57
- // 搜索类型切换
58
- function changeSearchType({ item }: any) {
59
- searchType.value = item.content
60
- searchParams.value = `c_${item.id}=`
40
+ // const menu = computed(() => {
41
+ // const menulist = pageData.value.criterias?.map((item: any) => {
42
+ // return {
43
+ // content: item.title,
44
+ // id: item.id,
45
+ // mstrucId: item.mstrucId,
46
+ // sourceId: item.sourceId,
47
+ // }
48
+ // }) || []
49
+ // menulist.unshift({
50
+ // content: '全部',
51
+ // id: '',
52
+ // mstrucId: '',
53
+ // sourceId: '',
54
+ // })
55
+ // return menulist
56
+ // })
57
+
58
+ const slider = ref()
59
+ const dropMenu = ref()
60
+
61
+ function handleOpened() {
62
+ slider.value?.initSlider()
63
+ }
64
+ function confirm() {
65
+ dropMenu.value.close()
61
66
  }
62
67
 
63
68
  // z-paging实例
@@ -107,6 +112,62 @@ function add() {
107
112
  url: `/pages/dynamic/dynamic?sourceId=${sourceId.value}&pageType=新增列表数据&pageTitle=`,
108
113
  })
109
114
  }
115
+ const value = ref()
116
+ const columns = ref([
117
+ {
118
+ value: '101',
119
+ label: '男装',
120
+ disabled: true
121
+ },
122
+ {
123
+ value: '102',
124
+ label: '奢侈品'
125
+ },
126
+ {
127
+ value: '103',
128
+ label: '女装'
129
+ },
130
+ {
131
+ value: '103',
132
+ label: '女装'
133
+ },
134
+ {
135
+ value: '103',
136
+ label: '女装'
137
+ },
138
+ {
139
+ value: '103',
140
+ label: '女装'
141
+ },
142
+ {
143
+ value: '103',
144
+ label: '女装'
145
+ },
146
+ {
147
+ value: '103',
148
+ label: '女装'
149
+ },
150
+ {
151
+ value: '103',
152
+ label: '女装'
153
+ },
154
+ {
155
+ value: '103',
156
+ label: '女装'
157
+ },
158
+ {
159
+ value: '103',
160
+ label: '女装'
161
+ },
162
+ {
163
+ value: '103',
164
+ label: '女装'
165
+ },
166
+ {
167
+ value: '103',
168
+ label: '女装'
169
+ }
170
+ ])
110
171
  </script>
111
172
 
112
173
  <template>
@@ -116,14 +177,18 @@ function add() {
116
177
  <!-- 搜索框 -->
117
178
  <wd-search v-model="searchVal" cancel-txt="搜索" @cancel="search">
118
179
  <template #prefix>
119
- <wd-popover mode="menu" :content="menu" @menuclick="changeSearchType">
120
- <view class="search-type">
121
- <text class="searchType">
122
- {{ searchType }}
123
- </text>
124
- <wd-icon custom-class="icon-arrow" name="fill-arrow-down" />
125
- </view>
126
- </wd-popover>
180
+ <wd-drop-menu>
181
+ <wd-drop-menu-item ref="dropMenu" title="筛选" icon-size="40rpx" @opened="handleOpened">
182
+ <view>
183
+ <wSelectPicker v-model="value" label="基本用法" :columns="columns" />
184
+ <wd-cell title="标题文字" value="内容" />
185
+ <wd-cell title="标题文字" label="描述信息" value="内容" />
186
+ <wd-button block size="large" suck @click="confirm">
187
+ 主要按钮
188
+ </wd-button>
189
+ </view>
190
+ </wd-drop-menu-item>
191
+ </wd-drop-menu>
127
192
  </template>
128
193
  </wd-search>
129
194
  <view class="buttons-box">
@@ -133,7 +198,7 @@ function add() {
133
198
  </view>
134
199
  </template>
135
200
  <!-- 卡片 -->
136
- <foldCardTemplate v-for="(item, index) in dataList" :key="index" :page="pageData" :item-data="item" />
201
+ <w-card v-for="(item, index) in dataList" :key="index" :car-index="index" :page="pageData" :item-data="item" />
137
202
  </z-paging>
138
203
  </template>
139
204