wui-components-v2 1.1.64 → 1.1.66

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 (35) hide show
  1. package/components/action-popup/action-popup.vue +4 -4
  2. package/components/add-address-page/add-address-page.vue +20 -20
  3. package/components/custom-select-picker/custom-select-picker.vue +19 -27
  4. package/components/demo-block/demo-block.vue +2 -5
  5. package/components/detail-popup/detail-popup.vue +13 -6
  6. package/components/fold-card/fold-card.vue +25 -5
  7. package/components/form-control/form-control.vue +8 -0
  8. package/components/list-top-buttons/list-top-buttons.vue +1 -1
  9. package/components/login-form/login-form.vue +31 -26
  10. package/components/mulselect-picker/mulselect-picker.vue +10 -12
  11. package/components/privacy-popup/privacy-popup.vue +13 -0
  12. package/components/product-card/product-card.vue +95 -21
  13. package/components/search/search.vue +23 -22
  14. package/components/tree-select/components/index.vue +1 -1
  15. package/components/wui-edit-page/wui-edit-page-copy.vue +1 -1
  16. package/components/wui-edit-page/wui-edit-page.vue +2 -2
  17. package/components/wui-login/wui-login.vue +3 -3
  18. package/components/wui-login1/wui-login.vue +4 -4
  19. package/components/wui-menus1/components/navbar.vue +1 -1
  20. package/components/wui-menus1/components/quick-panel.vue +3 -3
  21. package/components/wui-menus1/components/section-menus.vue +4 -4
  22. package/components/wui-menus1/wui-menus-top.vue +1 -1
  23. package/components/wui-menus1/wui-menus-top1.vue +1 -1
  24. package/components/wui-menus1/wui-menus.vue +3 -3
  25. package/components/wui-notify-info/wui-notify-info.vue +65 -35
  26. package/components/wui-select-list/wui-select-list.vue +1 -1
  27. package/components/wui-select-popup/wui-select-popup.vue +27 -17
  28. package/components/wui-system-settings/wui-system-settings.vue +31 -24
  29. package/components/wui-tabbar/wui-tabbar.vue +14 -5
  30. package/components/wui-tree-page/components/tree-item.vue +51 -30
  31. package/components/wui-user/wui-user.vue +68 -57
  32. package/index.ts +5 -3
  33. package/package.json +1 -1
  34. package/store/manualThemeStore.ts +7 -7
  35. package/styles/dark-mode.scss +424 -0
@@ -72,11 +72,11 @@ async function action() {
72
72
  <template>
73
73
  <wd-popup v-model="show" position="bottom" closable :z-index="999999" @close="() => { show = false }">
74
74
  <view class="h-50vh w-100vw">
75
- <view class="h-44px .dark:bg-gray-900 .light:bg-white" />
76
- <view class="w-[calc(100%-44px)] overflow-auto .dark:bg-gray-900 .light:bg-white">
75
+ <view class="h-44px bg-white dark:bg-[var(--wot-dark-background)]" />
76
+ <view class="w-[calc(100%-44px)] overflow-auto bg-white dark:bg-[var(--wot-dark-background)]">
77
77
  <formControl v-if="props.fieldGroup" ref="formControlRef" :field-group="props.fieldGroup" :enum-column="enumColumn" />
78
- <view class="h-44px .dark:bg-gray-900 .light:bg-white" />
79
- <view class="fixed bottom-0 left-0 right-0 box-border w-100% flex p-2 .dark:bg-gray-900 .light:bg-white">
78
+ <view class="h-44px bg-white dark:bg-[var(--wot-dark-background)]" />
79
+ <view class="fixed bottom-0 left-0 right-0 box-border w-100% flex p-2 bg-white dark:bg-[var(--wot-dark-background)]">
80
80
  <wd-button :loading="btnLoading" custom-class="flex-1" @click="() => { action() }">
81
81
  提交
82
82
  </wd-button>
@@ -1,9 +1,11 @@
1
1
  <template>
2
- <view class=" rounded-md mb-3" >
3
- <view class=" rounded-md shadow-md bg-white pb-3">
4
- <wd-textarea v-model="personDetail" placeholder="「粘贴识别」或输入文本,智能拆分、姓名、电话和地址" />
5
- <view class=" flex justify-end align-center px-3">
6
- <view class=" px-3 text-white bg-[#007AFF] rounded-md py-1 text-sm box-border" @click="identifyingFn">智能识别</view>
2
+ <view class="rounded-md mb-3">
3
+ <view class="rounded-md shadow-md bg-white pb-3">
4
+ <wd-textarea v-model="personDetail" placeholder="「粘贴识别」或输入文本,智能拆分、姓名、电话和地址" />
5
+ <view class="flex justify-end align-center px-3">
6
+ <view class="px-3 text-white bg-[#007AFF] rounded-md py-1 text-sm box-border" @click="identifyingFn">
7
+ 智能识别
8
+ </view>
7
9
  </view>
8
10
  </view>
9
11
  </view>
@@ -22,16 +24,16 @@ const props = defineProps<{
22
24
  const model = defineModel<any>()
23
25
  const personDetail = ref('')
24
26
  const loading = ref(false)
25
- const form=ref(null)
27
+ const form = ref(null)
26
28
  /**
27
29
  * @description: 智能识别
28
30
  */
29
- function identifyingFn(){
30
- if(!personDetail.value){
31
- toast.info('请输入内容')
31
+ function identifyingFn() {
32
+ if (!personDetail.value) {
33
+ toast.info('请输入内容')
32
34
  return
33
35
  }
34
- const currentValue:any = parse(personDetail.value)
36
+ const currentValue: any = parse(personDetail.value)
35
37
  console.log('智能识别', currentValue)
36
38
  if (!currentValue) {
37
39
  toast.info('无法识别地址')
@@ -44,34 +46,32 @@ function identifyingFn(){
44
46
  switch (index) {
45
47
  case 0:
46
48
  model.value[item.sourceId] = currentValue.name || ''
47
- break;
49
+ break
48
50
  case 1:
49
51
  model.value[item.sourceId] = currentValue.telNumber || currentValue.phone || ''
50
- break;
52
+ break
51
53
  case 2:
52
54
  model.value[item.sourceId] = currentValue.provinceName || ''
53
- break;
55
+ break
54
56
  case 3:
55
57
  model.value[item.sourceId] = currentValue.cityName || ''
56
- break;
58
+ break
57
59
  case 4:
58
60
  model.value[item.sourceId] = currentValue.countyName || ''
59
- break;
61
+ break
60
62
  case 5:
61
63
  model.value[item.sourceId] = currentValue.address || ''
62
- break;
64
+ break
63
65
  default:
64
- break;
66
+ break
65
67
  }
66
68
  })
67
69
  console.log('智能识别', currentValue)
68
70
  }
69
-
70
-
71
71
  </script>
72
72
 
73
73
  <style scoped>
74
- .custom-border{
74
+ .custom-border {
75
75
  border-bottom: 0.6px solid #e8e8e8;
76
76
  }
77
77
  </style>
@@ -34,44 +34,36 @@ function clear() {
34
34
 
35
35
  watch(
36
36
  () => props.modelValue,
37
- (val) => {
37
+ val => {
38
38
  console.log('val', val, Array.isArray(val))
39
39
  currentValue.value = val
40
- },
40
+ }
41
41
  )
42
42
 
43
- watch(currentValue, (val) => {
43
+ watch(currentValue, val => {
44
44
  emit('update:modelValue', val)
45
45
  })
46
46
 
47
47
  const labelText = computed(() => {
48
48
  // 多选情况:currentValue 是数组
49
49
  if (Array.isArray(currentValue.value)) {
50
- const labels = currentValue.value.map((val) => {
51
- const item = props.columns.find(
52
- item => item[props.valueKey] === val,
53
- )
54
- return item ? item[props.labelKey] : ''
55
- }).filter(Boolean)
50
+ const labels = currentValue.value
51
+ .map(val => {
52
+ const item = props.columns.find(item => item[props.valueKey] === val)
53
+ return item ? item[props.labelKey] : ''
54
+ })
55
+ .filter(Boolean)
56
56
  return labels.join(', ')
57
57
  }
58
58
  // 单选情况:currentValue 是单个值
59
- const item = props.columns.find(
60
- item => item[props.valueKey] === currentValue.value,
61
- )
59
+ const item = props.columns.find(item => item[props.valueKey] === currentValue.value)
62
60
  return item ? item[props.labelKey] : ''
63
61
  })
64
62
  </script>
65
63
 
66
64
  <template>
67
65
  <div class="flex items-center justify-between">
68
- <wd-input
69
- v-model="labelText"
70
- readonly
71
- :placeholder="placeholder"
72
- class="flex-1"
73
- @click="open = true"
74
- />
66
+ <wd-input v-model="labelText" readonly :placeholder="placeholder" class="flex-1" @click="open = true" />
75
67
  <wd-icon v-if="labelText" name="close-circle" size="16px" @click="clear" />
76
68
  <wd-icon v-else name="right" size="16px" @click="clear" />
77
69
  </div>
@@ -91,13 +83,13 @@ const labelText = computed(() => {
91
83
  .custom-select-picker {
92
84
  width: 100%;
93
85
  :deep(.wd-select-picker__wrapper) {
94
- padding : 0 20px;
95
- overflow: auto;
96
- scrollbar-width: none;
97
- -ms-overflow-style: none;
98
- }
99
- :deep(.uni-scroll-view) {
100
- scrollbar-width: none;
101
- }
86
+ padding: 0 20px;
87
+ overflow: auto;
88
+ scrollbar-width: none;
89
+ -ms-overflow-style: none;
90
+ }
91
+ :deep(.uni-scroll-view) {
92
+ scrollbar-width: none;
93
+ }
102
94
  }
103
95
  </style>
@@ -51,12 +51,9 @@ export default {
51
51
  <template>
52
52
  <view
53
53
  class="mb-3 box-border w-full px-3 text-gray-500 last:mb-0 dark:text-gray-300"
54
- :class="[
55
- transparent ? '' : 'bg-white dark:bg-[var(--wot-dark-background2)]',
56
- customClass,
57
- ]"
54
+ :class="[transparent ? '' : 'bg-white dark:bg-[var(--wot-dark-background2)]', customClass]"
58
55
  >
59
- <view v-if="title" class="px-4 py-3 text-26rpx">
56
+ <view v-if="title" class="px-4 py-3 text-26rpx dark:text-gray-200">
60
57
  {{ title }}
61
58
  </view>
62
59
  <view :style="transparent ? '' : style">
@@ -3,7 +3,7 @@ import { ref } from 'vue'
3
3
  import type { Columns, Entities } from '../../type'
4
4
  import { formatItemData } from '../../utils'
5
5
  import ControlTypeSupportor from '../../utils/control-type-supportor'
6
- import { detailPageConfig, detailPageData } from '@/core-components/api/page'
6
+ import { detailPageConfig, detailPageData } from '../../api/page'
7
7
 
8
8
  defineOptions({
9
9
  name: 'DetailPopup',
@@ -54,11 +54,11 @@ function handleClose() {
54
54
  <view class="text-[#1c64fd]" @click="open">{{ text }}</view>
55
55
  <wd-popup v-model="showDetail" custom-style="border-radius: 32rpx;">
56
56
  <view class="custom-popup">
57
- <view class="text-center mb-4">详情内容</view>
57
+ <view class="text-center mb-4 text-gray-900 dark:text-gray-100">详情内容</view>
58
58
  <scroll-view scroll-y class="scroll-area">
59
- <view class="flex items-center gap-2 mb-4 text-[#6b7280]" v-for="(item, sindex) in columns" :key="sindex">
60
- <view class="break-words">{{ item.title }}:</view>
61
- <view class="text-[#1f2937] break-all">
59
+ <view class="flex items-center gap-2 mb-4 text-gray-500 dark:text-gray-400" v-for="(item, sindex) in columns" :key="sindex">
60
+ <view class="break-words dark:text-gray-400">{{ item.title }}:</view>
61
+ <view class="text-gray-800 dark:text-gray-200 break-all">
62
62
  {{ formatItemData(rowData.fieldMap[item.sourceId], isControlType(item)) }}
63
63
  </view>
64
64
  </view>
@@ -72,7 +72,7 @@ function handleClose() {
72
72
 
73
73
  <style scoped lang="scss">
74
74
  .custom-popup {
75
- color: black;
75
+ color: var(--wot-dark-color, #333);
76
76
  padding: 24rpx;
77
77
  width: 600rpx;
78
78
  max-width: 600rpx;
@@ -89,4 +89,11 @@ function handleClose() {
89
89
  margin-top: 24rpx;
90
90
  }
91
91
  }
92
+
93
+ // 暗黑模式适配
94
+ :global(.wot-theme-dark) {
95
+ .custom-popup {
96
+ color: var(--wot-dark-color2, #e0e0e0);
97
+ }
98
+ }
92
99
  </style>
@@ -90,7 +90,12 @@ function toggleCollapse(contentId: string) {
90
90
  <view>
91
91
  <view class="flex items-center gap-2">
92
92
  <view class="overflow-hidden text-ellipsis font-700">
93
- {{ formatItemData(data.fieldMap[props.primaryColumn.sourceId], props.primaryColumn.extControlType || props.primaryColumn.controlType) }}
93
+ {{
94
+ formatItemData(
95
+ data.fieldMap[props.primaryColumn.sourceId],
96
+ props.primaryColumn.extControlType || props.primaryColumn.controlType
97
+ )
98
+ }}
94
99
  </view>
95
100
  <slot name="addressInfo" />
96
101
  </view>
@@ -101,10 +106,17 @@ function toggleCollapse(contentId: string) {
101
106
  v-if="props.labelColumn"
102
107
  class="whitespace-nowrap rounded px-1 py-1 text-sm text-white font-700"
103
108
  :style="{
104
- color: labelColumns?.find(item => props.labelColumn && item.value === data.fieldMap[props.labelColumn.sourceId])?.css?.color,
109
+ color: labelColumns?.find(
110
+ item => props.labelColumn && item.value === data.fieldMap[props.labelColumn.sourceId]
111
+ )?.css?.color,
105
112
  }"
106
113
  >
107
- {{ formatItemData(data.fieldMap[props.labelColumn.sourceId], props.labelColumn.extControlType || props.labelColumn.controlType) }}
114
+ {{
115
+ formatItemData(
116
+ data.fieldMap[props.labelColumn.sourceId],
117
+ props.labelColumn.extControlType || props.labelColumn.controlType
118
+ )
119
+ }}
108
120
  </view>
109
121
  </view>
110
122
 
@@ -129,7 +141,15 @@ function toggleCollapse(contentId: string) {
129
141
  <view class="flex items-center justify-between border-t border-gray-100">
130
142
  <!-- 折叠按钮 -->
131
143
  <view>
132
- <wd-icon v-if="showCollapse" id="toggle-btn-2" name="down" size="24px" :icon="collapseIcon" class="mr-auto flex items-center px-3 py-2 text-sm text-[#6b7280] !py-1" @click.stop="toggleCollapse(data.code)" />
144
+ <wd-icon
145
+ v-if="showCollapse"
146
+ id="toggle-btn-2"
147
+ name="down"
148
+ size="24px"
149
+ :icon="collapseIcon"
150
+ class="mr-auto flex items-center px-3 py-2 text-sm text-[#6b7280] !py-1"
151
+ @click.stop="toggleCollapse(data.code)"
152
+ />
133
153
  </view>
134
154
 
135
155
  <view class="flex items-center gap-1">
@@ -146,6 +166,6 @@ function toggleCollapse(contentId: string) {
146
166
  background-color: #f9f9f9 !important;
147
167
  }
148
168
  :deep(.wot-theme-dark .wd-collapse-item__body) {
149
- background-color: #222222 !important;
169
+ background-color: #1b1b1e !important;
150
170
  }
151
171
  </style>
@@ -412,4 +412,12 @@ defineExpose({
412
412
  :deep(.disabled-input) {
413
413
  background-color: #e8e8e8 !important;
414
414
  }
415
+
416
+ /* 暗黑模式适配 */
417
+ :global(.wot-theme-dark) .custom-from-style :deep(.wd-form-item) {
418
+ border-top-color: #3d3d3d;
419
+ }
420
+ :global(.wot-theme-dark) ::deep(.disabled-input) {
421
+ background-color: #2f2f2f !important;
422
+ }
415
423
  </style>
@@ -13,7 +13,7 @@ function gotoAddPage() {
13
13
  </script>
14
14
 
15
15
  <template>
16
- <view class="flex justify-end gap-1 py-2 px-2 .light:bg-white">
16
+ <view class="flex justify-end gap-1 py-2 px-2 bg-white dark:bg-[var(--wot-dark-background)]">
17
17
  <wd-button class="flex-1" v-if="buttons.includes('dtmplAdd')" type="primary" @click="gotoAddPage" icon="plus">{{ props.config?.editBtnTitle || '新增' }}</wd-button>
18
18
  </view>
19
19
  </template>
@@ -57,8 +57,7 @@ function handleSubmit() {
57
57
  uni.setStorageSync('USER_NAME', model.name)
58
58
  uni.setStorageSync('USER_PASSWORD', model.password)
59
59
  uni.setStorageSync('REMEMBER', model.remember)
60
- }
61
- else {
60
+ } else {
62
61
  // 删除账号密码
63
62
  uni.removeStorageSync('USER_NAME')
64
63
  uni.removeStorageSync('USER_PASSWORD')
@@ -70,16 +69,13 @@ function handleSubmit() {
70
69
  setTabbarItemActive('index')
71
70
  toast.success({ msg: '登录成功!' })
72
71
  }
73
- }
74
- else {
72
+ } else {
75
73
  toast.error({ msg: res.message })
76
74
  }
77
- }
78
- catch (error: any) {
75
+ } catch (error: any) {
79
76
  console.log(error, 'error')
80
77
  }
81
- }
82
- else {
78
+ } else {
83
79
  toast.error({ msg: '请填写登录信息' })
84
80
  console.log(errors, 'errors')
85
81
  }
@@ -96,25 +92,34 @@ function handleSubmit() {
96
92
  <view class="bg-white pa-3 dark:bg-[var(--wot-dark-background2)]">
97
93
  <!-- //账号登录 -->
98
94
  <wd-form ref="form" :model="model">
99
- <wd-cell-group border>
100
- <wd-input
101
- v-model="model.name" label="用户名" label-width="100px" prop="name" clearable placeholder="请输入用户名"
102
- :rules="[{ required: true, message: '请填写用户名' }]"
103
- />
104
- <wd-input
105
- v-model="model.password" label="密码" label-width="100px" prop="password" clearable show-password
106
- placeholder="请输入密码" :rules="[{ required: true, message: '请填写密码' }]"
107
- />
108
- <view class="p-4 pb-0 pt-0">
109
- <wd-checkbox v-model="model.remember" shape="square">
110
- 记住密码
111
- </wd-checkbox>
112
- </view>
113
- </wd-cell-group>
95
+ <view class="rounded-2 overflow-hidden">
96
+ <wd-cell-group border>
97
+ <wd-input
98
+ v-model="model.name"
99
+ label="用户名"
100
+ label-width="100px"
101
+ prop="name"
102
+ clearable
103
+ placeholder="请输入用户名"
104
+ :rules="[{ required: true, message: '请填写用户名' }]"
105
+ />
106
+ <wd-input
107
+ v-model="model.password"
108
+ label="密码"
109
+ label-width="100px"
110
+ prop="password"
111
+ clearable
112
+ show-password
113
+ placeholder="请输入密码"
114
+ :rules="[{ required: true, message: '请填写密码' }]"
115
+ />
116
+ <view class="p-4 pb-0 pt-0">
117
+ <wd-checkbox v-model="model.remember" shape="square">记住密码</wd-checkbox>
118
+ </view>
119
+ </wd-cell-group>
120
+ </view>
114
121
  <view class="p-4">
115
- <wd-button block :loading="subloading" :round="false" @click="handleSubmit">
116
- 登录
117
- </wd-button>
122
+ <wd-button block :loading="subloading" :round="false" @click="handleSubmit">登录</wd-button>
118
123
  </view>
119
124
  </wd-form>
120
125
  </view>
@@ -9,13 +9,13 @@ defineOptions({
9
9
  })
10
10
 
11
11
  const props = defineProps<{
12
- extControlType: string// 选择模式,例如:单选:relselect、多选
12
+ extControlType: string // 选择模式,例如:单选:relselect、多选
13
13
  sourceId: string
14
14
  title?: string
15
15
  modelValue: string | Array<string>
16
16
  readonly: boolean
17
17
  clearable: boolean
18
- foldCardModel?: FoldCardModel// 折叠面板模式
18
+ foldCardModel?: FoldCardModel // 折叠面板模式
19
19
  }>()
20
20
  const emits = defineEmits<{
21
21
  (e: 'update:modelValue', value: string | string[]): void
@@ -32,9 +32,10 @@ const router = useRouter()
32
32
  const SELECTEVENT = generateHighResolutionID()
33
33
  const SENDSELECTEVENT = generateHighResolutionID()
34
34
  function gotoSlect() {
35
- if (props.readonly)
36
- return
37
- router.push(`/pages/select-list/index?sourceId=${props.sourceId}&title=${props.title}&selectEvent=${SELECTEVENT}&sendSelectEvent=${SENDSELECTEVENT}&extControlType=${props.extControlType}&foldCardModel=${props.foldCardModel}`)
35
+ if (props.readonly) return
36
+ router.push(
37
+ `/pages/select-list/index?sourceId=${props.sourceId}&title=${props.title}&selectEvent=${SELECTEVENT}&sendSelectEvent=${SENDSELECTEVENT}&extControlType=${props.extControlType}&foldCardModel=${props.foldCardModel}`
38
+ )
38
39
  // 发送数据给选择页面,延迟发送防止页面不刷新
39
40
  setTimeout(() => {
40
41
  uni.$emit(SENDSELECTEVENT, toRaw(selectData.value))
@@ -53,8 +54,7 @@ function clearSelect() {
53
54
  if (props.extControlType === 'relselect') {
54
55
  selectData.value = ''
55
56
  emits('update:modelValue', '')
56
- }
57
- else {
57
+ } else {
58
58
  selectData.value = []
59
59
  emits('update:modelValue', [])
60
60
  }
@@ -68,9 +68,7 @@ function clearSelect() {
68
68
  <text v-if="selectformatData">
69
69
  {{ selectformatData }}
70
70
  </text>
71
- <text v-else class="text-gray-400">
72
- 请选择{{ title }}
73
- </text>
71
+ <text v-else class="text-gray-400">请选择{{ title }}</text>
74
72
  </view>
75
73
  <view class="h-3px w-17px" />
76
74
  </view>
@@ -82,7 +80,7 @@ function clearSelect() {
82
80
  </template>
83
81
 
84
82
  <style scoped>
85
- :deep(.wd-tag__close){
86
- line-height:0.6
83
+ :deep(.wd-tag__close) {
84
+ line-height: 0.6;
87
85
  }
88
86
  </style>
@@ -175,4 +175,17 @@ export default {
175
175
  }
176
176
  }
177
177
  }
178
+
179
+ /* 暗黑模式适配 */
180
+ :global(.wot-theme-dark) {
181
+ .wd-privacy-popup {
182
+ &__header {
183
+ color: var(--wot-dark-color2, #e0e0e0);
184
+ }
185
+
186
+ &__container {
187
+ color: var(--wot-dark-color3, #a0a0a0);
188
+ }
189
+ }
190
+ }
178
191
  </style>