hookehuyr

fix(plan): 修复提取期弹窗嵌套被遮挡问题

- PeriodInput 集成 GlobalPopupManager 系统
- PlanPopupNew 添加动态 overflow 控制避免子弹窗裁剪
- 调整 PeriodInput 弹窗高度为 40% 适配屏幕显示

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
...@@ -3,6 +3,118 @@ ...@@ -3,6 +3,118 @@
3 记录项目开发过程中的重要变更和完成任务。 3 记录项目开发过程中的重要变更和完成任务。
4 4
5 ## 2026-02-28 5 ## 2026-02-28
6 +### 17:11:05 - fix
7 +
8 +- 删除 if/else 块外部的重复 mv 命令
9 +- TEMP_FILE 变量只在块内有效,外部无法访问
10 +
11 +Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>(husky
12 +
13 +- 删除 if/else 块外部的重复 mv 命令
14 +- TEMP_FILE 变量只在块内有效,外部无法访问
15 +
16 +Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>): 修复 CHANGELOG 脚本重复 mv 命令错误
17 +
18 +- 删除 if/else 块外部的重复 mv 命令
19 +- TEMP_FILE 变量只在块内有效,外部无法访问
20 +
21 +Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
22 +
23 +**影响文件**:
24 +- `CHANGELOG.md`
25 +
26 +**变更摘要**:
27 +- 修复 CHANGELOG 脚本重复 mv 命令错误
28 +
29 +- 删除 if/else 块外部的重复 mv 命令
30 +- TEMP_FILE 变量只在块内有效,外部无法访问
31 +
32 +Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
33 +
34 +**相关提交**:
35 +- `04f7261` - fix
36 +
37 +- 删除 if/else 块外部的重复 mv 命令
38 +- TEMP_FILE 变量只在块内有效,外部无法访问
39 +
40 +Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>(husky
41 +
42 +- 删除 if/else 块外部的重复 mv 命令
43 +- TEMP_FILE 变量只在块内有效,外部无法访问
44 +
45 +Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>): 修复 CHANGELOG 脚本重复 mv 命令错误
46 +
47 +- 删除 if/else 块外部的重复 mv 命令
48 +- TEMP_FILE 变量只在块内有效,外部无法访问
49 +
50 +Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
51 +
52 +---
53 +
54 +
55 +### 17:10:43 - refactor
56 +
57 +- 检测逻辑:从 "## [日期] - 标题" 改为 "^## 日期"
58 +- 生成格式:匹配根目录格式(时间 + commit hash + 文件列表)
59 +- 插入逻辑:追加到日期下,而非文件开头
60 +- 解决误判问题,现在能正确识别今日已有条目
61 +
62 +Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>(husky
63 +
64 +- 检测逻辑:从 "## [日期] - 标题" 改为 "^## 日期"
65 +- 生成格式:匹配根目录格式(时间 + commit hash + 文件列表)
66 +- 插入逻辑:追加到日期下,而非文件开头
67 +- 解决误判问题,现在能正确识别今日已有条目
68 +
69 +Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>): 重写 CHANGELOG 自动更新格式匹配根目录
70 +
71 +- 检测逻辑:从 "## [日期] - 标题" 改为 "^## 日期"
72 +- 生成格式:匹配根目录格式(时间 + commit hash + 文件列表)
73 +- 插入逻辑:追加到日期下,而非文件开头
74 +- 解决误判问题,现在能正确识别今日已有条目
75 +
76 +Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
77 +
78 +**影响文件**:
79 +- `无`
80 +
81 +**变更摘要**:
82 +- 重写 CHANGELOG 自动更新格式匹配根目录
83 +
84 +- 检测逻辑:从 "## [日期] - 标题" 改为 "^## 日期"
85 +- 生成格式:匹配根目录格式(时间 + commit hash + 文件列表)
86 +- 插入逻辑:追加到日期下,而非文件开头
87 +- 解决误判问题,现在能正确识别今日已有条目
88 +
89 +Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
90 +
91 +**相关提交**:
92 +- `06fe556` - refactor
93 +
94 +- 检测逻辑:从 "## [日期] - 标题" 改为 "^## 日期"
95 +- 生成格式:匹配根目录格式(时间 + commit hash + 文件列表)
96 +- 插入逻辑:追加到日期下,而非文件开头
97 +- 解决误判问题,现在能正确识别今日已有条目
98 +
99 +Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>(husky
100 +
101 +- 检测逻辑:从 "## [日期] - 标题" 改为 "^## 日期"
102 +- 生成格式:匹配根目录格式(时间 + commit hash + 文件列表)
103 +- 插入逻辑:追加到日期下,而非文件开头
104 +- 解决误判问题,现在能正确识别今日已有条目
105 +
106 +Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>): 重写 CHANGELOG 自动更新格式匹配根目录
107 +
108 +- 检测逻辑:从 "## [日期] - 标题" 改为 "^## 日期"
109 +- 生成格式:匹配根目录格式(时间 + commit hash + 文件列表)
110 +- 插入逻辑:追加到日期下,而非文件开头
111 +- 解决误判问题,现在能正确识别今日已有条目
112 +
113 +Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
114 +
115 +---
116 +
117 +
6 118
7 ### 17:02:37 - feat(plan): 年缴保费显示添加千分位分隔符 119 ### 17:02:37 - feat(plan): 年缴保费显示添加千分位分隔符
8 120
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
23 position="bottom" 23 position="bottom"
24 :overlay="true" 24 :overlay="true"
25 :close-on-click-overlay="false" 25 :close-on-click-overlay="false"
26 - :style="{ padding: '0', borderRadius: '24rpx', overflow: 'hidden' }" 26 + :style="{ padding: '0', borderRadius: '24rpx 24rpx 0 0', overflow: 'hidden', height: '40%' }"
27 :overlay-style="{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }" 27 :overlay-style="{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }"
28 > 28 >
29 <view class="flex flex-col bg-white"> 29 <view class="flex flex-col bg-white">
...@@ -116,8 +116,9 @@ ...@@ -116,8 +116,9 @@
116 * @confirm="handlePeriodConfirm" 116 * @confirm="handlePeriodConfirm"
117 * /> 117 * />
118 */ 118 */
119 -import { ref, computed, watch } from 'vue' 119 +import { ref, computed, watch, onMounted, onUnmounted } from 'vue'
120 import IconFont from '@/components/icons/IconFont.vue' 120 import IconFont from '@/components/icons/IconFont.vue'
121 +import { useGlobalPopup } from './GlobalPopupManager.js'
121 122
122 /** 123 /**
123 * 组件属性 124 * 组件属性
...@@ -238,6 +239,34 @@ const emit = defineEmits([ ...@@ -238,6 +239,34 @@ const emit = defineEmits([
238 ]) 239 ])
239 240
240 /** 241 /**
242 + * 使用全局弹窗管理器
243 + * @description 当弹窗打开时,通知父弹窗隐藏底部按钮
244 + */
245 +const { registerPopup, activatePopup, deactivatePopup } = useGlobalPopup()
246 +
247 +/**
248 + * 输入弹窗 ID
249 + * @type {Ref<string|null>}
250 + */
251 +const inputPopupId = ref(null)
252 +
253 +/**
254 + * 组件挂载时注册弹窗
255 + */
256 +onMounted(() => {
257 + inputPopupId.value = registerPopup()
258 +})
259 +
260 +/**
261 + * 组件卸载时取消注册
262 + */
263 +onUnmounted(() => {
264 + if (inputPopupId.value) {
265 + deactivatePopup(inputPopupId.value)
266 + }
267 +})
268 +
269 +/**
241 * 弹窗显示状态 270 * 弹窗显示状态
242 */ 271 */
243 const showInputModal = ref(false) 272 const showInputModal = ref(false)
...@@ -298,7 +327,16 @@ watch(() => props.visible, (newVal) => { ...@@ -298,7 +327,16 @@ watch(() => props.visible, (newVal) => {
298 * 监听弹窗状态变化,同步到父组件 327 * 监听弹窗状态变化,同步到父组件
299 */ 328 */
300 watch(showInputModal, (newVal) => { 329 watch(showInputModal, (newVal) => {
301 - if (!newVal) { 330 + if (newVal) {
331 + // 弹窗打开:激活全局弹窗,通知父弹窗隐藏 footer
332 + if (inputPopupId.value) {
333 + activatePopup(inputPopupId.value)
334 + }
335 + } else {
336 + // 弹窗关闭:停用全局弹窗,通知父弹窗恢复 footer
337 + if (inputPopupId.value) {
338 + deactivatePopup(inputPopupId.value)
339 + }
302 emit('update:visible', false) 340 emit('update:visible', false)
303 } 341 }
304 }) 342 })
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
12 :safe-area-inset-bottom="true" 12 :safe-area-inset-bottom="true"
13 @update:visible="handleVisibleChange" 13 @update:visible="handleVisibleChange"
14 > 14 >
15 - <div class="h-full flex flex-col bg-gray-50 overflow-hidden rounded-t-2xl"> 15 + <div :class="containerClasses">
16 <!-- Header --> 16 <!-- Header -->
17 <div class="flex justify-between items-center px-5 py-4 bg-white border-b border-gray-100 flex-shrink-0"> 17 <div class="flex justify-between items-center px-5 py-4 bg-white border-b border-gray-100 flex-shrink-0">
18 <span class="text-lg font-bold text-gray-900">{{ title }}</span> 18 <span class="text-lg font-bold text-gray-900">{{ title }}</span>
...@@ -82,7 +82,7 @@ ...@@ -82,7 +82,7 @@
82 * @author Claude Code 82 * @author Claude Code
83 * @version 2.0.0 - 支持全局弹窗管理器 83 * @version 2.0.0 - 支持全局弹窗管理器
84 */ 84 */
85 -import { ref, watch, onMounted, onUnmounted } from 'vue' 85 +import { ref, computed, watch, onMounted, onUnmounted } from 'vue'
86 import IconFont from '@/components/icons/IconFont.vue' 86 import IconFont from '@/components/icons/IconFont.vue'
87 import { useParentPopup } from './PlanFields/GlobalPopupManager.js' 87 import { useParentPopup } from './PlanFields/GlobalPopupManager.js'
88 88
...@@ -115,6 +115,19 @@ const emit = defineEmits(['update:visible', 'close', 'submit']) ...@@ -115,6 +115,19 @@ const emit = defineEmits(['update:visible', 'close', 'submit'])
115 const showFooter = ref(true) 115 const showFooter = ref(true)
116 116
117 /** 117 /**
118 + * 容器动态类名
119 + * @description 当有子弹窗时,移除 overflow-hidden 避免裁剪
120 + * @type {ComputedRef<string>}
121 + */
122 +const containerClasses = computed(() => {
123 + const baseClasses = 'h-full flex flex-col bg-gray-50 rounded-t-2xl'
124 + // 当有活动子弹窗时,使用 overflow-visible 允许子弹窗溢出
125 + return hasActiveChildPopup.value
126 + ? `${baseClasses} overflow-visible`
127 + : `${baseClasses} overflow-hidden`
128 +})
129 +
130 +/**
118 * 使用父弹窗管理器 131 * 使用父弹窗管理器
119 */ 132 */
120 const { registerFooterCallback, hasActiveChildPopup } = useParentPopup() 133 const { registerFooterCallback, hasActiveChildPopup } = useParentPopup()
......