af-mobile-client-vue3 1.3.12 → 1.3.13

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 (270) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/.cursorrules +60 -60
  3. package/.editorconfig +9 -9
  4. package/.env +10 -10
  5. package/.env.development +1 -1
  6. package/.env.production +1 -1
  7. package/.node-version +1 -1
  8. package/.vscode/extensions.json +12 -12
  9. package/.vscode/settings.json +66 -66
  10. package/CLAUDE.md +189 -184
  11. package/README.md +182 -181
  12. package/af-example-mobile-vue-web.iml +9 -9
  13. package/build/vite/index.ts +98 -98
  14. package/build/vite/optimize.ts +34 -34
  15. package/build/vite/vconsole.ts +47 -47
  16. package/commitlint.config.ts +32 -32
  17. package/compress.js +36 -36
  18. package/eslint.config.ts +30 -30
  19. package/index.html +23 -23
  20. package/mock/data.ts +20 -20
  21. package/mock/index.ts +7 -7
  22. package/mock/modules/prose.mock.ts +13 -13
  23. package/mock/modules/user.mock.ts +152 -152
  24. package/mock/util.ts +19 -19
  25. package/netlify.toml +12 -12
  26. package/package.json +114 -114
  27. package/postcss.config.ts +27 -27
  28. package/public/favicon.svg +4 -4
  29. package/public/safari-pinned-tab.svg +4 -4
  30. package/scripts/verifyCommit.js +19 -19
  31. package/src/App.vue +79 -79
  32. package/src/api/mock/index.ts +30 -30
  33. package/src/api/user/index.ts +40 -40
  34. package/src/assets/img/user/login/background-shadow-1.svg +20 -20
  35. package/src/assets/img/user/login/logo-background.svg +20 -20
  36. package/src/bootstrap.ts +26 -26
  37. package/src/components/core/BeautifulLoading/index.vue +52 -52
  38. package/src/components/core/ImageUploader/index.vue +244 -244
  39. package/src/components/core/NavBar/index.vue +53 -53
  40. package/src/components/core/Tabbar/index.vue +32 -32
  41. package/src/components/core/Uploader/index.vue +124 -124
  42. package/src/components/core/XGridDropOption/index.vue +154 -156
  43. package/src/components/core/XMultiSelect/index.vue +183 -183
  44. package/src/components/core/XSelect/index.vue +149 -149
  45. package/src/components/data/InfoDisplay/index.vue +132 -0
  46. package/src/components/data/UserDetail/api.ts +24 -0
  47. package/src/components/data/UserDetail/index.vue +539 -0
  48. package/src/components/data/UserDetail/recordEntries.ts +159 -0
  49. package/src/components/data/UserDetail/types.ts +26 -0
  50. package/src/components/data/XBadge/index.vue +82 -82
  51. package/src/components/data/XCellDetail/index.vue +105 -105
  52. package/src/components/data/XCellList/XCellList.md +313 -313
  53. package/src/components/data/XCellList/index.vue +1075 -1075
  54. package/src/components/data/XCellListFilter/QrScanner/index.vue +207 -207
  55. package/src/components/data/XCellListFilter/QrScanner/startScanAnimation.ts +53 -53
  56. package/src/components/data/XCellListFilter/VpnRecognition/index.vue +119 -119
  57. package/src/components/data/XCellListFilter/index.vue +705 -705
  58. package/src/components/data/XForm/index.vue +659 -659
  59. package/src/components/data/XFormGroup/doc/DeviceForm.vue +122 -122
  60. package/src/components/data/XFormGroup/doc/FormGroupDemo.vue +56 -56
  61. package/src/components/data/XFormGroup/doc/README.md +286 -273
  62. package/src/components/data/XFormGroup/doc/UserForm.vue +102 -102
  63. package/src/components/data/XFormGroup/index.vue +240 -240
  64. package/src/components/data/XFormItem/index.vue +1310 -1310
  65. package/src/components/data/XOlMap/README.md +227 -227
  66. package/src/components/data/XOlMap/XLocationPicker/index.vue +226 -225
  67. package/src/components/data/XOlMap/index.vue +1490 -1490
  68. package/src/components/data/XOlMap/types.ts +149 -149
  69. package/src/components/data/XOlMap/utils/wgs84ToGcj02.js +154 -154
  70. package/src/components/data/XReportForm/DateTimeSecondsPicker.vue +208 -208
  71. package/src/components/data/XReportForm/XReportFormJsonRender.vue +220 -220
  72. package/src/components/data/XReportForm/index.vue +1393 -1393
  73. package/src/components/data/XReportGrid/XAddReport/XAddReport.vue +198 -198
  74. package/src/components/data/XReportGrid/XAddReport/index.js +3 -3
  75. package/src/components/data/XReportGrid/XAddReport/index.md +53 -52
  76. package/src/components/data/XReportGrid/XAddReport/index.ts +10 -10
  77. package/src/components/data/XReportGrid/XReport.vue +960 -960
  78. package/src/components/data/XReportGrid/XReportDemo.vue +33 -33
  79. package/src/components/data/XReportGrid/XReportDesign.vue +597 -597
  80. package/src/components/data/XReportGrid/XReportDrawer/XReportDrawer.vue +148 -148
  81. package/src/components/data/XReportGrid/XReportDrawer/index.js +3 -3
  82. package/src/components/data/XReportGrid/XReportDrawer/index.ts +10 -10
  83. package/src/components/data/XReportGrid/XReportJsonRender.vue +399 -399
  84. package/src/components/data/XReportGrid/XReportTrGroup.vue +592 -592
  85. package/src/components/data/XReportGrid/index.md +46 -42
  86. package/src/components/data/XReportGrid/print.js +184 -184
  87. package/src/components/data/XSignature/index.vue +284 -285
  88. package/src/components/data/XTag/index.vue +10 -10
  89. package/src/components/layout/NormalDataLayout/index.vue +69 -69
  90. package/src/components/layout/TabBarLayout/index.vue +40 -40
  91. package/src/composables/dark.ts +5 -5
  92. package/src/config/routes.ts +9 -9
  93. package/src/constants/index.ts +2 -2
  94. package/src/enums/requestEnum.ts +25 -25
  95. package/src/expression/ExpressionRunner.ts +28 -28
  96. package/src/expression/TestExpression.ts +510 -510
  97. package/src/expression/core/Delegate.ts +116 -116
  98. package/src/expression/core/Expression.ts +1359 -1359
  99. package/src/expression/core/Program.ts +985 -985
  100. package/src/expression/core/Token.ts +29 -29
  101. package/src/expression/enums/ExpressionType.ts +81 -81
  102. package/src/expression/enums/TokenType.ts +11 -11
  103. package/src/expression/exception/BreakWayException.ts +2 -2
  104. package/src/expression/exception/ContinueWayException.ts +2 -2
  105. package/src/expression/exception/ExpressionException.ts +29 -29
  106. package/src/expression/exception/ReturnWayException.ts +14 -14
  107. package/src/expression/exception/ServiceException.ts +22 -22
  108. package/src/expression/instances/JSONArray.ts +52 -52
  109. package/src/expression/instances/JSONObject.ts +118 -118
  110. package/src/expression/instances/LogicConsole.ts +31 -31
  111. package/src/font-style/font.css +4 -4
  112. package/src/hooks/useBoolean.ts +26 -0
  113. package/src/hooks/useCommon.ts +9 -9
  114. package/src/hooks/useLogin.ts +97 -97
  115. package/src/icons/svg/check-in.svg +32 -32
  116. package/src/icons/svg/dark.svg +4 -4
  117. package/src/icons/svg/github.svg +4 -4
  118. package/src/icons/svg/light.svg +4 -4
  119. package/src/icons/svg/link.svg +4 -4
  120. package/src/icons/svgo.yml +22 -22
  121. package/src/layout/GridView/index.vue +16 -16
  122. package/src/layout/PageLayout.vue +9 -9
  123. package/src/layout/SingleLayout.vue +9 -9
  124. package/src/locales/en-US.json +128 -128
  125. package/src/locales/zh-CN.json +128 -128
  126. package/src/logic/LogicRunner.ts +67 -67
  127. package/src/logic/TestLogic.ts +13 -13
  128. package/src/logic/plugins/common/DateTools.ts +35 -35
  129. package/src/logic/plugins/common/VueTools.ts +30 -30
  130. package/src/logic/plugins/index.ts +7 -7
  131. package/src/main.ts +44 -44
  132. package/src/plugins/AppData.ts +38 -38
  133. package/src/plugins/GetLoginInfoService.ts +10 -10
  134. package/src/plugins/collectIcons.ts +10 -0
  135. package/src/plugins/index.ts +11 -11
  136. package/src/router/README.md +8 -8
  137. package/src/router/guards.ts +59 -59
  138. package/src/router/index.ts +35 -35
  139. package/src/router/invoiceRoutes.ts +33 -33
  140. package/src/router/routes.ts +341 -177
  141. package/src/router/types.ts +7 -7
  142. package/src/services/api/Login.ts +6 -6
  143. package/src/services/api/common.ts +109 -109
  144. package/src/services/api/index.ts +7 -7
  145. package/src/services/api/manage.ts +8 -8
  146. package/src/services/api/search.ts +16 -16
  147. package/src/services/api/user.ts +17 -17
  148. package/src/services/restTools.ts +56 -56
  149. package/src/services/v3Api.ts +147 -147
  150. package/src/stores/index.ts +11 -11
  151. package/src/stores/modules/counter.ts +19 -19
  152. package/src/stores/modules/routeCache.ts +23 -23
  153. package/src/stores/modules/setting.ts +76 -76
  154. package/src/stores/modules/user.ts +235 -235
  155. package/src/stores/mutation-type.ts +7 -7
  156. package/src/styles/app.less +36 -36
  157. package/src/styles/login.less +109 -109
  158. package/src/styles/var.less +16 -16
  159. package/src/types/env.d.ts +16 -16
  160. package/src/types/settings.ts +1 -1
  161. package/src/types/vue-router.d.ts +9 -9
  162. package/src/utils/Storage.ts +124 -124
  163. package/src/utils/authority-utils.ts +84 -84
  164. package/src/utils/common.ts +41 -41
  165. package/src/utils/crypto.ts +39 -39
  166. package/src/utils/dataUtil.ts +42 -42
  167. package/src/utils/dictUtil.ts +52 -52
  168. package/src/utils/http/index.ts +199 -199
  169. package/src/utils/i18n.ts +72 -72
  170. package/src/utils/indexedDB.ts +195 -195
  171. package/src/utils/inline-px-to-vw.ts +28 -28
  172. package/src/utils/mobileUtil.ts +34 -34
  173. package/src/utils/progress.ts +19 -19
  174. package/src/utils/routerUtil.ts +271 -271
  175. package/src/utils/runEvalFunction.ts +13 -13
  176. package/src/utils/secureStorage.ts +71 -71
  177. package/src/utils/set-page-title.ts +5 -5
  178. package/src/utils/validate.ts +6 -6
  179. package/src/utils/wechatUtil.ts +9 -9
  180. package/src/views/chat/index.vue +153 -153
  181. package/src/views/common/LoadError.vue +63 -63
  182. package/src/views/common/NotFound.vue +67 -67
  183. package/src/views/component/EvaluateRecordView/index.vue +40 -40
  184. package/src/views/component/IconifyView/index.vue +504 -507
  185. package/src/views/component/UserDetailView/UserDetailPage.vue +77 -0
  186. package/src/views/component/UserDetailView/index.vue +224 -0
  187. package/src/views/component/XCellDetailView/index.vue +217 -217
  188. package/src/views/component/XCellListView/index.vue +108 -157
  189. package/src/views/component/XFormAppraiseView/index.vue +174 -174
  190. package/src/views/component/XFormGroupView/index.vue +78 -82
  191. package/src/views/component/XFormView/index.vue +27 -27
  192. package/src/views/component/XOlMapView/XLocationPicker/index.vue +118 -118
  193. package/src/views/component/XOlMapView/index.vue +434 -434
  194. package/src/views/component/XOlMapView/testData.ts +64 -64
  195. package/src/views/component/XReportFormIframeView/index.vue +47 -47
  196. package/src/views/component/XReportFormView/index.vue +13 -13
  197. package/src/views/component/XReportGridView/index.vue +17 -17
  198. package/src/views/component/XRequestView/index.vue +234 -234
  199. package/src/views/component/XSignatureView/index.vue +50 -50
  200. package/src/views/component/index.vue +181 -177
  201. package/src/views/component/menu.vue +117 -117
  202. package/src/views/component/notice.vue +46 -46
  203. package/src/views/component/topNav.vue +36 -36
  204. package/src/views/invoiceShow/index.vue +61 -61
  205. package/src/views/user/login/ForgetPasswordForm.vue +94 -94
  206. package/src/views/user/login/LoginForm.vue +346 -346
  207. package/src/views/user/login/LoginTitle.vue +76 -76
  208. package/src/views/user/login/LoginWave.vue +109 -109
  209. package/src/views/user/login/index.vue +22 -22
  210. package/src/views/user/my/comm/ModifyPassword.vue +346 -346
  211. package/src/views/user/my/index.vue +340 -340
  212. package/src/views/userRecords/AbnormalAlarmRecords.vue +21 -0
  213. package/src/views/userRecords/CardReplacementRecords.vue +21 -0
  214. package/src/views/userRecords/ChangeRecords.vue +19 -0
  215. package/src/views/userRecords/CommandViewRecords.vue +20 -0
  216. package/src/views/userRecords/GasCompensationRecords.vue +20 -0
  217. package/src/views/userRecords/InstrumentCollectionRecords.vue +21 -0
  218. package/src/views/userRecords/MeterRecords.vue +20 -0
  219. package/src/views/userRecords/OperateRecords.vue +51 -0
  220. package/src/views/userRecords/OtherChargeRecords.vue +19 -0
  221. package/src/views/userRecords/PaymentRecords.vue +28 -0
  222. package/src/views/userRecords/PriceAdjustmentRecords.vue +19 -0
  223. package/src/views/userRecords/ReplacementRecords.vue +19 -0
  224. package/src/views/userRecords/SafetyRecords.vue +19 -0
  225. package/src/views/userRecords/TransactionRecords.vue +21 -0
  226. package/src/views/userRecords/TransferRecords.vue +19 -0
  227. package/src/views/userRecords/operateRecordDetail/index.vue +316 -0
  228. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AddUserDetail.vue +124 -0
  229. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AdvanceDeliveryDetail.vue +88 -0
  230. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsCancelDetail.vue +205 -0
  231. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsDetail.vue +192 -0
  232. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankDkDetail.vue +192 -0
  233. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankPayDetail.vue +192 -0
  234. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BlacklistDetail.vue +153 -0
  235. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CancellationDetail.vue +101 -0
  236. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterCancelDetail.vue +127 -0
  237. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterDetail.vue +153 -0
  238. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardOverUserDetail.vue +153 -0
  239. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterCancelDetail.vue +166 -0
  240. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterDetail.vue +205 -0
  241. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/DisableManageDetail.vue +127 -0
  242. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/EnableManageDetail.vue +114 -0
  243. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FaZheChangeDetail.vue +124 -0
  244. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FeeDeductionDetail.vue +153 -0
  245. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/GasPriceChangeDetail.vue +126 -0
  246. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/InputtorChangeDetail.vue +126 -0
  247. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterCancelDetail.vue +114 -0
  248. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterDetail.vue +127 -0
  249. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotOpenDetail.vue +88 -0
  250. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineCardDetail.vue +101 -0
  251. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterCancelDetail.vue +218 -0
  252. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterDetail.vue +153 -0
  253. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OffGasAddGasDetail.vue +140 -0
  254. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeCancelDetail.vue +127 -0
  255. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeDetail.vue +114 -0
  256. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OverUserChangeDetail.vue +127 -0
  257. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReBillDetail.vue +127 -0
  258. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/RefundDetail.vue +114 -0
  259. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageCancelDetail.vue +127 -0
  260. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageDetail.vue +114 -0
  261. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/SaleCardGasDetail.vue +140 -0
  262. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageCancelDetail.vue +152 -0
  263. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageDetail.vue +178 -0
  264. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/UserChangeDetail.vue +123 -0
  265. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/WechatPayDetail.vue +192 -0
  266. package/src/views/userRecords/types.ts +66 -0
  267. package/tsconfig.json +39 -39
  268. package/uno.config.ts +82 -78
  269. package/vite.config.ts +118 -118
  270. package/src/views/component/XFormGroupView/xformgroup222.vue +0 -97
@@ -1,183 +1,183 @@
1
- <script setup lang="ts">
2
- import {
3
- Cell as VanCell,
4
- CellGroup as VanCellGroup,
5
- Checkbox as VanCheckbox,
6
- CheckboxGroup as VanCheckboxGroup,
7
- Field as VanField,
8
- Popup as VanPopup,
9
- Search as VanSearch,
10
- } from 'vant'
11
- import { computed, defineEmits, defineModel, defineProps, ref, watch } from 'vue'
12
-
13
- const props = defineProps({
14
- columns: {
15
- type: Array,
16
- default() {
17
- return []
18
- },
19
- },
20
- selectValue: {
21
- type: Array,
22
- default() {
23
- return []
24
- },
25
- },
26
- option: {
27
- type: Object,
28
- default() {
29
- return { text: 'label', value: 'value' }
30
- },
31
- },
32
- // 是否支持搜索
33
- isSearch: {
34
- type: Boolean,
35
- default: true,
36
- },
37
- })
38
- const emits = defineEmits(['input', 'confirm', 'change', 'cancel'])
39
- const show = ref(false)
40
- const searchVal = ref('')
41
- const columnsData = ref([])
42
- const checkboxValue = ref(JSON.parse(JSON.stringify(props.selectValue)))
43
- const checkedAll = ref(false)
44
- const resultValue = defineModel()
45
- const checkboxGroup = ref()
46
- const checkboxes = ref()
47
- function search(val) {
48
- if (val) {
49
- columnsData.value = props.columns.filter((item) => {
50
- return item[props.option.text].includes(val)
51
- })
52
- }
53
- else {
54
- columnsData.value = JSON.parse(JSON.stringify(props.columns))
55
- }
56
- }
57
- function getData(val) {
58
- const res = props.columns.filter((item) => {
59
- return val.includes(item[props.option.value])
60
- })
61
- return res
62
- }
63
- function onConfirm() {
64
- resultValue.value = checkboxValue.value
65
- show.value = !show.value
66
- emits('confirm', resultValue.value, getData(resultValue.value))
67
- }
68
- function change(val) {
69
- emits('change', val, getData(resultValue.value))
70
- }
71
- function cancel() {
72
- show.value = !show.value
73
- emits('cancel', resultValue.value)
74
- }
75
- function toggle(item, _index) {
76
- // 假设 checkboxValue 是一个对象,我们通过 index 来切换对应 checkbox 的值
77
- const idx = checkboxValue.value.indexOf(item[props.option.value])
78
- if (idx !== -1)
79
- checkboxValue.value.splice(idx, 1)
80
- else
81
- checkboxValue.value.push(item[props.option.value])
82
- }
83
- function toggleAll() {
84
- // 遍历 checkboxValue 并设置所有 checkbox 的值为 checkedAll 的值
85
- if (checkedAll.value)
86
- checkboxValue.value = columnsData.value.map(item => item[props.option.value])
87
-
88
- else
89
- checkboxValue.value = []
90
- }
91
- function showPopu(disabled) {
92
- columnsData.value = JSON.parse(JSON.stringify(props.columns))
93
- if (disabled !== undefined && disabled !== false)
94
- return false
95
- else
96
- show.value = !show.value
97
- }
98
- watch(() => columnsData.value, (newVal, _oldVal) => {
99
- checkedAll.value = newVal.length && newVal.length === checkboxValue.value.length
100
- })
101
- watch(() => checkboxValue.value.length, (newVal, _oldVal) => {
102
- checkedAll.value = newVal && newVal === columnsData.value.length
103
- })
104
- const resultLabel = computed(() => {
105
- const res = props.columns.filter((item) => {
106
- return (resultValue.value as unknown as string[]).includes(item[props.option.value])
107
- }).map(item => item[props.option.text])
108
- return res.join(',')
109
- })
110
- </script>
111
-
112
- <template>
113
- <div class="dh-field">
114
- <VanField
115
- v-model="resultLabel"
116
- v-bind="$attrs"
117
- readonly
118
- :border="false"
119
- :is-link="$attrs.disabled === undefined"
120
- error-message-align="right"
121
- @click="showPopu($attrs.readonly)"
122
- />
123
- <VanPopup v-model:show="show" position="bottom">
124
- <div class="van-picker__toolbar">
125
- <button type="button" class="van-picker__cancel" @click="cancel">
126
- 取消
127
- </button>
128
- <div class="van-ellipsis van-picker__title">
129
- {{ $attrs.label }}
130
- </div>
131
- <button type="button" class="van-picker__confirm" @click="onConfirm">
132
- 确认
133
- </button>
134
- </div>
135
- <div style="max-height:264px; overflow-y:auto;">
136
- <VanSearch
137
- v-if="props.isSearch"
138
- v-model="searchVal"
139
- placeholder="搜索"
140
- @update:model-value="search"
141
- @cancel="search"
142
- />
143
- <VanCell title="全选">
144
- <template #right-icon>
145
- <VanCheckbox v-model="checkedAll" name="all" @click="toggleAll" />
146
- </template>
147
- </VanCell>
148
- <VanCheckboxGroup ref="checkboxGroup" v-model="checkboxValue" @change="change">
149
- <VanCellGroup>
150
- <VanCell
151
- v-for="(item, index) in columnsData"
152
- :key="item[props.option.value]"
153
- :title="item[props.option.text]"
154
- clickable
155
- @click="toggle(item, index)"
156
- >
157
- <template #right-icon>
158
- <VanCheckbox ref="checkboxes" :name="item[props.option.value]" @click.stop />
159
- </template>
160
- </VanCell>
161
- </VanCellGroup>
162
- </VanCheckboxGroup>
163
- </div>
164
- </VanPopup>
165
- </div>
166
- </template>
167
-
168
- <style lang="less" scoped>
169
- .dh-field {
170
- width: 100%;
171
- padding: 0;
172
- background:#fff;
173
- .dh-cell.van-cell {
174
- padding: 10px 0;
175
- }
176
- .dh-cell.van-cell--required::before {
177
- left: -8px;
178
- }
179
- .van-popup {
180
- border-radius: 20px 20px 0 0;
181
- }
182
- }
183
- </style>
1
+ <script setup lang="ts">
2
+ import {
3
+ Cell as VanCell,
4
+ CellGroup as VanCellGroup,
5
+ Checkbox as VanCheckbox,
6
+ CheckboxGroup as VanCheckboxGroup,
7
+ Field as VanField,
8
+ Popup as VanPopup,
9
+ Search as VanSearch,
10
+ } from 'vant'
11
+ import { computed, defineEmits, defineModel, defineProps, ref, watch } from 'vue'
12
+
13
+ const props = defineProps({
14
+ columns: {
15
+ type: Array,
16
+ default() {
17
+ return []
18
+ },
19
+ },
20
+ selectValue: {
21
+ type: Array,
22
+ default() {
23
+ return []
24
+ },
25
+ },
26
+ option: {
27
+ type: Object,
28
+ default() {
29
+ return { text: 'label', value: 'value' }
30
+ },
31
+ },
32
+ // 是否支持搜索
33
+ isSearch: {
34
+ type: Boolean,
35
+ default: true,
36
+ },
37
+ })
38
+ const emits = defineEmits(['input', 'confirm', 'change', 'cancel'])
39
+ const show = ref(false)
40
+ const searchVal = ref('')
41
+ const columnsData = ref([])
42
+ const checkboxValue = ref(JSON.parse(JSON.stringify(props.selectValue)))
43
+ const checkedAll = ref(false)
44
+ const resultValue = defineModel()
45
+ const checkboxGroup = ref()
46
+ const checkboxes = ref()
47
+ function search(val) {
48
+ if (val) {
49
+ columnsData.value = props.columns.filter((item) => {
50
+ return item[props.option.text].includes(val)
51
+ })
52
+ }
53
+ else {
54
+ columnsData.value = JSON.parse(JSON.stringify(props.columns))
55
+ }
56
+ }
57
+ function getData(val) {
58
+ const res = props.columns.filter((item) => {
59
+ return val.includes(item[props.option.value])
60
+ })
61
+ return res
62
+ }
63
+ function onConfirm() {
64
+ resultValue.value = checkboxValue.value
65
+ show.value = !show.value
66
+ emits('confirm', resultValue.value, getData(resultValue.value))
67
+ }
68
+ function change(val) {
69
+ emits('change', val, getData(resultValue.value))
70
+ }
71
+ function cancel() {
72
+ show.value = !show.value
73
+ emits('cancel', resultValue.value)
74
+ }
75
+ function toggle(item, _index) {
76
+ // 假设 checkboxValue 是一个对象,我们通过 index 来切换对应 checkbox 的值
77
+ const idx = checkboxValue.value.indexOf(item[props.option.value])
78
+ if (idx !== -1)
79
+ checkboxValue.value.splice(idx, 1)
80
+ else
81
+ checkboxValue.value.push(item[props.option.value])
82
+ }
83
+ function toggleAll() {
84
+ // 遍历 checkboxValue 并设置所有 checkbox 的值为 checkedAll 的值
85
+ if (checkedAll.value)
86
+ checkboxValue.value = columnsData.value.map(item => item[props.option.value])
87
+
88
+ else
89
+ checkboxValue.value = []
90
+ }
91
+ function showPopu(disabled) {
92
+ columnsData.value = JSON.parse(JSON.stringify(props.columns))
93
+ if (disabled !== undefined && disabled !== false)
94
+ return false
95
+ else
96
+ show.value = !show.value
97
+ }
98
+ watch(() => columnsData.value, (newVal, _oldVal) => {
99
+ checkedAll.value = newVal.length && newVal.length === checkboxValue.value.length
100
+ })
101
+ watch(() => checkboxValue.value.length, (newVal, _oldVal) => {
102
+ checkedAll.value = newVal && newVal === columnsData.value.length
103
+ })
104
+ const resultLabel = computed(() => {
105
+ const res = props.columns.filter((item) => {
106
+ return (resultValue.value as unknown as string[]).includes(item[props.option.value])
107
+ }).map(item => item[props.option.text])
108
+ return res.join(',')
109
+ })
110
+ </script>
111
+
112
+ <template>
113
+ <div class="dh-field">
114
+ <VanField
115
+ v-model="resultLabel"
116
+ v-bind="$attrs"
117
+ readonly
118
+ :border="false"
119
+ :is-link="$attrs.disabled === undefined"
120
+ error-message-align="right"
121
+ @click="showPopu($attrs.readonly)"
122
+ />
123
+ <VanPopup v-model:show="show" position="bottom">
124
+ <div class="van-picker__toolbar">
125
+ <button type="button" class="van-picker__cancel" @click="cancel">
126
+ 取消
127
+ </button>
128
+ <div class="van-ellipsis van-picker__title">
129
+ {{ $attrs.label }}
130
+ </div>
131
+ <button type="button" class="van-picker__confirm" @click="onConfirm">
132
+ 确认
133
+ </button>
134
+ </div>
135
+ <div style="max-height:264px; overflow-y:auto;">
136
+ <VanSearch
137
+ v-if="props.isSearch"
138
+ v-model="searchVal"
139
+ placeholder="搜索"
140
+ @update:model-value="search"
141
+ @cancel="search"
142
+ />
143
+ <VanCell title="全选">
144
+ <template #right-icon>
145
+ <VanCheckbox v-model="checkedAll" name="all" @click="toggleAll" />
146
+ </template>
147
+ </VanCell>
148
+ <VanCheckboxGroup ref="checkboxGroup" v-model="checkboxValue" @change="change">
149
+ <VanCellGroup>
150
+ <VanCell
151
+ v-for="(item, index) in columnsData"
152
+ :key="item[props.option.value]"
153
+ :title="item[props.option.text]"
154
+ clickable
155
+ @click="toggle(item, index)"
156
+ >
157
+ <template #right-icon>
158
+ <VanCheckbox ref="checkboxes" :name="item[props.option.value]" @click.stop />
159
+ </template>
160
+ </VanCell>
161
+ </VanCellGroup>
162
+ </VanCheckboxGroup>
163
+ </div>
164
+ </VanPopup>
165
+ </div>
166
+ </template>
167
+
168
+ <style lang="less" scoped>
169
+ .dh-field {
170
+ width: 100%;
171
+ padding: 0;
172
+ background: #fff;
173
+ .dh-cell.van-cell {
174
+ padding: 10px 0;
175
+ }
176
+ .dh-cell.van-cell--required::before {
177
+ left: -8px;
178
+ }
179
+ .van-popup {
180
+ border-radius: 20px 20px 0 0;
181
+ }
182
+ }
183
+ </style>
@@ -1,149 +1,149 @@
1
- <script setup lang="ts">
2
- import {
3
- Field as VanField,
4
- Picker as VanPicker,
5
- Popup as VanPopup,
6
- } from 'vant'
7
- import { computed, defineEmits, defineModel, defineProps, onBeforeMount, ref, watch } from 'vue'
8
-
9
- const props = defineProps({
10
- columns: {
11
- type: Array,
12
- default() {
13
- return []
14
- },
15
- },
16
- option: {
17
- type: Object,
18
- default() {
19
- return { text: 'label', value: 'value', children: 'children' }
20
- },
21
- },
22
- isSearch: {
23
- type: Boolean,
24
- default: false,
25
- },
26
- offOption: { // 关闭option配置key-value;当数据是非集合的数组的时候,开启
27
- type: Boolean,
28
- default: false,
29
- },
30
- border: { // 是否展示边框
31
- type: Boolean,
32
- default: false,
33
- },
34
- })
35
- const emits = defineEmits(['confirm', 'change', 'cancel', 'input'])
36
- const show = ref(false)
37
- const searchVal = ref('')
38
- const resultValue = defineModel()
39
- const columnsData = ref([])
40
- const selectedOption = ref([])
41
-
42
- // 转换空children为空字符串
43
- function transformColumns(data) {
44
- return data.map((item) => {
45
- if (item.children && item.children.length === 0) {
46
- return {
47
- ...item,
48
- children: '',
49
- }
50
- }
51
- else if (item.children && item.children.length !== 0) {
52
- return { ...item, children: transformColumns(item.children) }
53
- }
54
- else {
55
- return { ...item }
56
- }
57
- })
58
- }
59
-
60
- onBeforeMount(() => {
61
- columnsData.value = transformColumns(props.columns)
62
- })
63
-
64
- const resultLabel = computed({
65
- get() {
66
- if (!resultValue.value)
67
- return ''
68
- const res = props.columns.filter((item) => {
69
- const data = props.offOption ? item : item[props.option.value]
70
- return data === resultValue.value
71
- })
72
- return res.length ? (props.offOption ? res[0] : res[0][props.option.text]) : ''
73
- },
74
- set() {
75
-
76
- },
77
- })
78
-
79
- function search(val) {
80
- if (val) {
81
- columnsData.value = transformColumns(columnsData.value).filter((item) => {
82
- const data = props.offOption ? item : item[props.option.text]
83
- return data.includes(val)
84
- })
85
- }
86
- else {
87
- columnsData.value = transformColumns(props.columns)
88
- }
89
- }
90
-
91
- function onConfirm(value, _index) {
92
- resultValue.value = props.offOption ? value.selectedValues : value.selectedValues[0]
93
- // resultValue.value = value.selectedValues
94
- selectedOption.value = value.selectedOptions
95
- show.value = !show.value
96
- emits('confirm', value.selectedValues[0], value.selectedOptions)
97
- }
98
-
99
- function change(val, index) {
100
- emits('change', val, index, resultValue.value)
101
- }
102
-
103
- function cancel(val, index) {
104
- show.value = !show.value
105
- emits('cancel', val, index, resultValue.value)
106
- }
107
-
108
- function showPopu(disabled) {
109
- if (disabled !== undefined && disabled !== false)
110
- return false
111
- columnsData.value = transformColumns(props.columns)
112
- show.value = !show.value
113
- }
114
-
115
- watch(() => resultValue, (newVal, _oldVal) => {
116
- searchVal.value = ''
117
- columnsData.value = transformColumns(props.columns)
118
- emits('input', newVal)
119
- })
120
- </script>
121
-
122
- <template>
123
- <VanField
124
- v-model="resultLabel"
125
- v-bind="$attrs"
126
- readonly
127
- :is-link="true"
128
- :border="props.border"
129
- error-message-align="right"
130
- @click="showPopu($attrs.readonly)"
131
- />
132
- <VanPopup v-model:show="show" position="bottom">
133
- <VanField v-if="props.isSearch" v-model="searchVal" input-align="left" placeholder="搜索" @input="search" />
134
- <VanPicker
135
- v-bind="$attrs"
136
- :columns="columnsData"
137
- :columns-field-names="props.option"
138
- show-toolbar
139
- :value-key="props.option.text"
140
- @cancel="cancel"
141
- @confirm="onConfirm"
142
- @change="change"
143
- />
144
- </VanPopup>
145
- </template>
146
-
147
- <style scoped>
148
- /* 样式定义 */
149
- </style>
1
+ <script setup lang="ts">
2
+ import {
3
+ Field as VanField,
4
+ Picker as VanPicker,
5
+ Popup as VanPopup,
6
+ } from 'vant'
7
+ import { computed, defineEmits, defineModel, defineProps, onBeforeMount, ref, watch } from 'vue'
8
+
9
+ const props = defineProps({
10
+ columns: {
11
+ type: Array,
12
+ default() {
13
+ return []
14
+ },
15
+ },
16
+ option: {
17
+ type: Object,
18
+ default() {
19
+ return { text: 'label', value: 'value', children: 'children' }
20
+ },
21
+ },
22
+ isSearch: {
23
+ type: Boolean,
24
+ default: false,
25
+ },
26
+ offOption: { // 关闭option配置key-value;当数据是非集合的数组的时候,开启
27
+ type: Boolean,
28
+ default: false,
29
+ },
30
+ border: { // 是否展示边框
31
+ type: Boolean,
32
+ default: false,
33
+ },
34
+ })
35
+ const emits = defineEmits(['confirm', 'change', 'cancel', 'input'])
36
+ const show = ref(false)
37
+ const searchVal = ref('')
38
+ const resultValue = defineModel()
39
+ const columnsData = ref([])
40
+ const selectedOption = ref([])
41
+
42
+ // 转换空children为空字符串
43
+ function transformColumns(data) {
44
+ return data.map((item) => {
45
+ if (item.children && item.children.length === 0) {
46
+ return {
47
+ ...item,
48
+ children: '',
49
+ }
50
+ }
51
+ else if (item.children && item.children.length !== 0) {
52
+ return { ...item, children: transformColumns(item.children) }
53
+ }
54
+ else {
55
+ return { ...item }
56
+ }
57
+ })
58
+ }
59
+
60
+ onBeforeMount(() => {
61
+ columnsData.value = transformColumns(props.columns)
62
+ })
63
+
64
+ const resultLabel = computed({
65
+ get() {
66
+ if (!resultValue.value)
67
+ return ''
68
+ const res = props.columns.filter((item) => {
69
+ const data = props.offOption ? item : item[props.option.value]
70
+ return data === resultValue.value
71
+ })
72
+ return res.length ? (props.offOption ? res[0] : res[0][props.option.text]) : ''
73
+ },
74
+ set() {
75
+
76
+ },
77
+ })
78
+
79
+ function search(val) {
80
+ if (val) {
81
+ columnsData.value = transformColumns(columnsData.value).filter((item) => {
82
+ const data = props.offOption ? item : item[props.option.text]
83
+ return data.includes(val)
84
+ })
85
+ }
86
+ else {
87
+ columnsData.value = transformColumns(props.columns)
88
+ }
89
+ }
90
+
91
+ function onConfirm(value, _index) {
92
+ resultValue.value = props.offOption ? value.selectedValues : value.selectedValues[0]
93
+ // resultValue.value = value.selectedValues
94
+ selectedOption.value = value.selectedOptions
95
+ show.value = !show.value
96
+ emits('confirm', value.selectedValues[0], value.selectedOptions)
97
+ }
98
+
99
+ function change(val, index) {
100
+ emits('change', val, index, resultValue.value)
101
+ }
102
+
103
+ function cancel(val, index) {
104
+ show.value = !show.value
105
+ emits('cancel', val, index, resultValue.value)
106
+ }
107
+
108
+ function showPopu(disabled) {
109
+ if (disabled !== undefined && disabled !== false)
110
+ return false
111
+ columnsData.value = transformColumns(props.columns)
112
+ show.value = !show.value
113
+ }
114
+
115
+ watch(() => resultValue, (newVal, _oldVal) => {
116
+ searchVal.value = ''
117
+ columnsData.value = transformColumns(props.columns)
118
+ emits('input', newVal)
119
+ })
120
+ </script>
121
+
122
+ <template>
123
+ <VanField
124
+ v-model="resultLabel"
125
+ v-bind="$attrs"
126
+ readonly
127
+ :is-link="true"
128
+ :border="props.border"
129
+ error-message-align="right"
130
+ @click="showPopu($attrs.readonly)"
131
+ />
132
+ <VanPopup v-model:show="show" position="bottom">
133
+ <VanField v-if="props.isSearch" v-model="searchVal" input-align="left" placeholder="搜索" @input="search" />
134
+ <VanPicker
135
+ v-bind="$attrs"
136
+ :columns="columnsData"
137
+ :columns-field-names="props.option"
138
+ show-toolbar
139
+ :value-key="props.option.text"
140
+ @cancel="cancel"
141
+ @confirm="onConfirm"
142
+ @change="change"
143
+ />
144
+ </VanPopup>
145
+ </template>
146
+
147
+ <style scoped>
148
+ /* 样式定义 */
149
+ </style>