hookehuyr

fix(plan): 防止计划弹窗选择器点击遮罩关闭

- 为所有 PlanFields 选择器添加 close-on-click-overlay="false"
- 添加 catch-move 防止触摸事件穿透
- 优化弹窗交互体验,避免误操作关闭

影响文件:
- src/components/PlanFields/AgePicker.vue
- src/components/PlanFields/AgePickerGlobal.vue
- src/components/PlanFields/DatePicker.vue
- src/components/PlanFields/DatePickerGlobal.vue
- src/components/PlanFields/SelectPicker.vue
- src/components/PlanFields/SelectPickerGlobal.vue
- src/components/PlanPopup/index.vue

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
...@@ -9,7 +9,6 @@ declare module 'vue' { ...@@ -9,7 +9,6 @@ declare module 'vue' {
9 export interface GlobalComponents { 9 export interface GlobalComponents {
10 AgePicker: typeof import('./src/components/PlanFields/AgePicker.vue')['default'] 10 AgePicker: typeof import('./src/components/PlanFields/AgePicker.vue')['default']
11 AgePickerGlobal: typeof import('./src/components/PlanFields/AgePickerGlobal.vue')['default'] 11 AgePickerGlobal: typeof import('./src/components/PlanFields/AgePickerGlobal.vue')['default']
12 - AmountInput: typeof import('./src/components/PlanFields/AmountInput.vue')['default']
13 AmountKeyboard: typeof import('./src/components/PlanFields/AmountKeyboard.vue')['default'] 12 AmountKeyboard: typeof import('./src/components/PlanFields/AmountKeyboard.vue')['default']
14 CriticalIllnessTemplate: typeof import('./src/components/PlanTemplates/CriticalIllnessTemplate.vue')['default'] 13 CriticalIllnessTemplate: typeof import('./src/components/PlanTemplates/CriticalIllnessTemplate.vue')['default']
15 DatePicker: typeof import('./src/components/PlanFields/DatePicker.vue')['default'] 14 DatePicker: typeof import('./src/components/PlanFields/DatePicker.vue')['default']
...@@ -18,7 +17,6 @@ declare module 'vue' { ...@@ -18,7 +17,6 @@ declare module 'vue' {
18 FilterTabs: typeof import('./src/components/FilterTabs.vue')['default'] 17 FilterTabs: typeof import('./src/components/FilterTabs.vue')['default']
19 'FilterTabs.example': typeof import('./src/components/FilterTabs.example.vue')['default'] 18 'FilterTabs.example': typeof import('./src/components/FilterTabs.example.vue')['default']
20 IconFont: typeof import('./src/components/IconFont.vue')['default'] 19 IconFont: typeof import('./src/components/IconFont.vue')['default']
21 - IndexNav: typeof import('./src/components/indexNav.vue')['default']
22 LifeInsuranceTemplate: typeof import('./src/components/PlanTemplates/LifeInsuranceTemplate.vue')['default'] 20 LifeInsuranceTemplate: typeof import('./src/components/PlanTemplates/LifeInsuranceTemplate.vue')['default']
23 ListItemActions: typeof import('./src/components/ListItemActions/index.vue')['default'] 21 ListItemActions: typeof import('./src/components/ListItemActions/index.vue')['default']
24 LoadMoreList: typeof import('./src/components/LoadMoreList/index.vue')['default'] 22 LoadMoreList: typeof import('./src/components/LoadMoreList/index.vue')['default']
...@@ -38,20 +36,15 @@ declare module 'vue' { ...@@ -38,20 +36,15 @@ declare module 'vue' {
38 NutTabs: typeof import('@nutui/nutui-taro')['Tabs'] 36 NutTabs: typeof import('@nutui/nutui-taro')['Tabs']
39 OfficeViewer: typeof import('./src/components/OfficeViewer.vue')['default'] 37 OfficeViewer: typeof import('./src/components/OfficeViewer.vue')['default']
40 PdfPreview: typeof import('./src/components/PdfPreview.vue')['default'] 38 PdfPreview: typeof import('./src/components/PdfPreview.vue')['default']
41 - Picker: typeof import('./src/components/time-picker-data/picker.vue')['default']
42 PlanFormContainer: typeof import('./src/components/PlanFormContainer.vue')['default'] 39 PlanFormContainer: typeof import('./src/components/PlanFormContainer.vue')['default']
43 - PlanPopup: typeof import('./src/components/PlanSchemes/PlanPopup.vue')['default'] 40 + PlanPopup: typeof import('./src/components/PlanPopup/index.vue')['default']
44 PlanPopupNew: typeof import('./src/components/PlanPopupNew.vue')['default'] 41 PlanPopupNew: typeof import('./src/components/PlanPopupNew.vue')['default']
45 - PosterBuilder: typeof import('./src/components/PosterBuilder/index.vue')['default']
46 ProductCard: typeof import('./src/components/ProductCard.vue')['default'] 42 ProductCard: typeof import('./src/components/ProductCard.vue')['default']
47 QrCode: typeof import('./src/components/qrCode.vue')['default'] 43 QrCode: typeof import('./src/components/qrCode.vue')['default']
48 - QrCodeSearch: typeof import('./src/components/qrCodeSearch.vue')['default']
49 RadioGroup: typeof import('./src/components/PlanFields/RadioGroup.vue')['default'] 44 RadioGroup: typeof import('./src/components/PlanFields/RadioGroup.vue')['default']
50 RouterLink: typeof import('vue-router')['RouterLink'] 45 RouterLink: typeof import('vue-router')['RouterLink']
51 RouterView: typeof import('vue-router')['RouterView'] 46 RouterView: typeof import('vue-router')['RouterView']
52 - SavingsTemplate: typeof import('./src/components/SavingsTemplate.vue')['default'] 47 + SavingsTemplate: typeof import('./src/components/PlanTemplates/SavingsTemplate.vue')['default']
53 - SchemeA: typeof import('./src/components/PlanSchemes/SchemeA.vue')['default']
54 - SchemeB: typeof import('./src/components/PlanSchemes/SchemeB.vue')['default']
55 SearchBar: typeof import('./src/components/SearchBar.vue')['default'] 48 SearchBar: typeof import('./src/components/SearchBar.vue')['default']
56 SectionCard: typeof import('./src/components/SectionCard.vue')['default'] 49 SectionCard: typeof import('./src/components/SectionCard.vue')['default']
57 SectionItem: typeof import('./src/components/SectionItem.vue')['default'] 50 SectionItem: typeof import('./src/components/SectionItem.vue')['default']
......
...@@ -22,7 +22,9 @@ ...@@ -22,7 +22,9 @@
22 position="bottom" 22 position="bottom"
23 v-model:visible="showPicker" 23 v-model:visible="showPicker"
24 :z-index="9999" 24 :z-index="9999"
25 - :overlay="true" 25 + :overlay="false"
26 + :close-on-click-overlay="false"
27 + :catch-move="true"
26 > 28 >
27 <nut-picker 29 <nut-picker
28 v-model="pickerValue" 30 v-model="pickerValue"
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
23 v-model:visible="showPicker" 23 v-model:visible="showPicker"
24 :z-index="9999" 24 :z-index="9999"
25 :overlay="true" 25 :overlay="true"
26 + :close-on-click-overlay="false"
26 > 27 >
27 <nut-picker 28 <nut-picker
28 v-model="pickerValue" 29 v-model="pickerValue"
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
18 </div> 18 </div>
19 19
20 <!-- DatePicker 弹窗 --> 20 <!-- DatePicker 弹窗 -->
21 - <nut-popup position="bottom" v-model:visible="showDatePicker"> 21 + <nut-popup position="bottom" v-model:visible="showDatePicker" :close-on-click-overlay="false">
22 <nut-date-picker 22 <nut-date-picker
23 v-model="currentDate" 23 v-model="currentDate"
24 :min-date="minDate" 24 :min-date="minDate"
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
18 </div> 18 </div>
19 19
20 <!-- DatePicker 弹窗 --> 20 <!-- DatePicker 弹窗 -->
21 - <nut-popup position="bottom" v-model:visible="showDatePicker"> 21 + <nut-popup position="bottom" v-model:visible="showDatePicker" :close-on-click-overlay="false">
22 <nut-date-picker 22 <nut-date-picker
23 v-model="currentDate" 23 v-model="currentDate"
24 :min-date="minDate" 24 :min-date="minDate"
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
23 v-model:visible="showPicker" 23 v-model:visible="showPicker"
24 :z-index="9999" 24 :z-index="9999"
25 :overlay="true" 25 :overlay="true"
26 + :close-on-click-overlay="false"
26 > 27 >
27 <nut-picker 28 <nut-picker
28 :columns="pickerColumns" 29 :columns="pickerColumns"
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
22 position="bottom" 22 position="bottom"
23 v-model:visible="showPicker" 23 v-model:visible="showPicker"
24 :overlay="true" 24 :overlay="true"
25 + :close-on-click-overlay="false"
25 > 26 >
26 <nut-picker 27 <nut-picker
27 :columns="pickerColumns" 28 :columns="pickerColumns"
......
1 <!-- 1 <!--
2 * @Date: 2026-01-31 12:49:11 2 * @Date: 2026-01-31 12:49:11
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2026-02-06 21:40:34 4 + * @LastEditTime: 2026-02-09 20:22:23
5 * @FilePath: /manulife-weapp/src/components/PlanPopup/index.vue 5 * @FilePath: /manulife-weapp/src/components/PlanPopup/index.vue
6 * @Description: 文件描述 6 * @Description: 文件描述
7 --> 7 -->
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
13 :style="{ height: '90%' }" 13 :style="{ height: '90%' }"
14 :close-on-click-overlay="true" 14 :close-on-click-overlay="true"
15 :safe-area-inset-bottom="true" 15 :safe-area-inset-bottom="true"
16 + :catch-move="true"
16 @update:visible="handleVisibleChange" 17 @update:visible="handleVisibleChange"
17 > 18 >
18 <div class="h-full flex flex-col bg-gray-50 overflow-hidden rounded-t-2xl"> 19 <div class="h-full flex flex-col bg-gray-50 overflow-hidden rounded-t-2xl">
......