diff --git a/shared/src/commonMain/kotlin/plus/rua/project/CalendarViewModel.kt b/shared/src/commonMain/kotlin/plus/rua/project/CalendarViewModel.kt index d81438a..e02108d 100644 --- a/shared/src/commonMain/kotlin/plus/rua/project/CalendarViewModel.kt +++ b/shared/src/commonMain/kotlin/plus/rua/project/CalendarViewModel.kt @@ -90,6 +90,12 @@ class CalendarViewModel( fun shiftKindAt(date: LocalDate): ShiftKind? = shiftPattern?.kindAt(date) + /** + * 是否在右上角显示法定调休角标。默认禁用,此时右上角让位给个人排班。 + * 开启后回到旧版布局:左上角=排班,右上角=法定调休。后续接入设置页持久化。 + */ + var showLegalHoliday by mutableStateOf(false) + /** * 选中指定日期。 * diff --git a/shared/src/commonMain/kotlin/plus/rua/project/ui/CalendarMonthPage.kt b/shared/src/commonMain/kotlin/plus/rua/project/ui/CalendarMonthPage.kt index 1ecd531..5aac5f4 100644 --- a/shared/src/commonMain/kotlin/plus/rua/project/ui/CalendarMonthPage.kt +++ b/shared/src/commonMain/kotlin/plus/rua/project/ui/CalendarMonthPage.kt @@ -38,6 +38,8 @@ import plus.rua.project.ShiftKind * @param collapseProgress 折叠进度,0f=展开,1f=折叠 * @param rowHeightPx 从外层传入的锁定行高(像素),折叠过程中不变 * @param effectiveWeeks 当前有效行数(含翻页插值),用于计算总高度 + * @param shiftKindAt 日期 → 个人轮班类型的查询闭包 + * @param showLegalHoliday 是否显示法定调休角标。详见 [DayCell] 的同名参数。 * @param onRowHeightMeasured 首次行高测量回调,外层据此锁定行高 * @param modifier 外部布局修饰符 */ @@ -52,6 +54,7 @@ fun CalendarMonthPage( rowHeightPx: Int, effectiveWeeks: Float, shiftKindAt: (LocalDate) -> ShiftKind?, + showLegalHoliday: Boolean, onRowHeightMeasured: ((Int) -> Unit)? = null, modifier: Modifier = Modifier ) { @@ -155,6 +158,7 @@ fun CalendarMonthPage( isSelected = dayData.date == selectedDate, isToday = dayData.date == today, shiftKind = shiftKindAt(dayData.date), + showLegalHoliday = showLegalHoliday, onClick = { onDateClick(dayData.date) }, modifier = Modifier.weight(1f) ) diff --git a/shared/src/commonMain/kotlin/plus/rua/project/ui/CalendarMonthView.kt b/shared/src/commonMain/kotlin/plus/rua/project/ui/CalendarMonthView.kt index 787bb0f..e4ed8cb 100644 --- a/shared/src/commonMain/kotlin/plus/rua/project/ui/CalendarMonthView.kt +++ b/shared/src/commonMain/kotlin/plus/rua/project/ui/CalendarMonthView.kt @@ -260,6 +260,7 @@ fun CalendarMonthView( viewModel.selectDate(date) }, shiftKindAt = { date -> viewModel.shiftKindAt(date) }, + showLegalHoliday = viewModel.showLegalHoliday, modifier = pagerModifier ) } else { @@ -277,6 +278,7 @@ fun CalendarMonthView( rowHeightPx = rowHeightPx, effectiveWeeks = effectiveWeeks, shiftKindAt = { date -> viewModel.shiftKindAt(date) }, + showLegalHoliday = viewModel.showLegalHoliday, onRowHeightMeasured = { h -> if (h > 0) rowHeightPx = h }, diff --git a/shared/src/commonMain/kotlin/plus/rua/project/ui/CalendarPager.kt b/shared/src/commonMain/kotlin/plus/rua/project/ui/CalendarPager.kt index def21e0..57d20c0 100644 --- a/shared/src/commonMain/kotlin/plus/rua/project/ui/CalendarPager.kt +++ b/shared/src/commonMain/kotlin/plus/rua/project/ui/CalendarPager.kt @@ -30,6 +30,8 @@ import kotlin.math.abs * @param collapseProgress 折叠进度,0f=展开,1f=折叠 * @param rowHeightPx 锁定行高(像素) * @param effectiveWeeks 当前有效行数(含翻页插值) + * @param shiftKindAt 日期 → 个人轮班类型的查询闭包 + * @param showLegalHoliday 是否显示法定调休角标。详见 [DayCell] 的同名参数。 * @param onRowHeightMeasured 首次行高测量回调 * @param pagerState 外层共享的 PagerState,用于保持翻页状态 * @param modifier 外部布局修饰符 @@ -44,6 +46,7 @@ fun CalendarPager( rowHeightPx: Int, effectiveWeeks: Float, shiftKindAt: (LocalDate) -> ShiftKind?, + showLegalHoliday: Boolean, onRowHeightMeasured: ((Int) -> Unit)? = null, pagerState: PagerState, modifier: Modifier = Modifier @@ -97,6 +100,7 @@ fun CalendarPager( rowHeightPx = rowHeightPx, effectiveWeeks = effectiveWeeks, shiftKindAt = shiftKindAt, + showLegalHoliday = showLegalHoliday, onRowHeightMeasured = onRowHeightMeasured, modifier = Modifier.alpha(alpha) ) diff --git a/shared/src/commonMain/kotlin/plus/rua/project/ui/DayCell.kt b/shared/src/commonMain/kotlin/plus/rua/project/ui/DayCell.kt index f95f690..795e1d9 100644 --- a/shared/src/commonMain/kotlin/plus/rua/project/ui/DayCell.kt +++ b/shared/src/commonMain/kotlin/plus/rua/project/ui/DayCell.kt @@ -49,7 +49,10 @@ enum class DayCellState { * @param isCurrentMonth 是否属于当前显示月份 * @param isSelected 是否为选中日期 * @param isToday 是否为今天 - * @param shiftKind 个人轮班类型,左上角胶囊显示;null 表示不显示。与法定调休完全独立。 + * @param shiftKind 个人轮班类型;null 表示不显示。与法定调休完全独立。 + * @param showLegalHoliday 是否显示法定调休角标。 + * false(默认):排班放右上角,左上角空白,不显示法定调休。 + * true:排班放左上角,法定调休放右上角(旧版布局)。 * @param onClick 点击回调 * @param modifier 外部布局修饰符 */ @@ -60,6 +63,7 @@ fun DayCell( isSelected: Boolean, isToday: Boolean, shiftKind: ShiftKind?, + showLegalHoliday: Boolean, onClick: () -> Unit, modifier: Modifier = Modifier ) { @@ -259,6 +263,13 @@ fun DayCell( } val shiftLabel = if (shiftKind == ShiftKind.WORK) "班" else "休" val shiftAlpha = if (isCurrentMonth) 1f else 0.38f + // showLegalHoliday=true 时排班让位左上角,法定调休占右上角;否则排班独占右上角 + val shiftAlignment = if (showLegalHoliday) Alignment.TopStart else Alignment.TopEnd + val shiftPadding = if (showLegalHoliday) { + Modifier.padding(top = 1.dp, start = 2.dp) + } else { + Modifier.padding(top = 1.dp, end = 2.dp) + } Text( text = shiftLabel, color = shiftFgColor.copy(alpha = shiftAlpha), @@ -266,14 +277,14 @@ fun DayCell( fontWeight = FontWeight.Bold, lineHeight = 9.sp, modifier = Modifier - .align(Alignment.TopStart) + .align(shiftAlignment) .zIndex(1f) - .padding(top = 1.dp, start = 2.dp) + .then(shiftPadding) .background(shiftBgColor.copy(alpha = shiftAlpha), CircleShape) .padding(horizontal = 2.dp) ) } - if (holidayBadge != null) { + if (showLegalHoliday && holidayBadge != null) { Text( text = holidayBadge, color = holidayBadgeColor.copy(alpha = holidayBadgeAlpha), diff --git a/shared/src/commonMain/kotlin/plus/rua/project/ui/WeekPager.kt b/shared/src/commonMain/kotlin/plus/rua/project/ui/WeekPager.kt index 338ab2b..e500203 100644 --- a/shared/src/commonMain/kotlin/plus/rua/project/ui/WeekPager.kt +++ b/shared/src/commonMain/kotlin/plus/rua/project/ui/WeekPager.kt @@ -28,6 +28,8 @@ import kotlin.math.abs * @param today 今天的日期 * @param onDateClick 日期点击回调 * @param onWeekChanged 周切换回调,滑动到新周时触发,参数为该周周一日期 + * @param shiftKindAt 日期 → 个人轮班类型的查询闭包 + * @param showLegalHoliday 是否显示法定调休角标。详见 [DayCell] 的同名参数。 * @param modifier 外部布局修饰符 */ @Composable @@ -37,6 +39,7 @@ fun WeekPager( onDateClick: (LocalDate) -> Unit, onWeekChanged: (LocalDate) -> Unit, shiftKindAt: (LocalDate) -> ShiftKind?, + showLegalHoliday: Boolean, modifier: Modifier = Modifier ) { val initialWeekMonday = remember { selectedDate.toWeekMonday() } @@ -85,6 +88,7 @@ fun WeekPager( isSelected = date == selectedDate, isToday = date == today, shiftKind = shiftKindAt(date), + showLegalHoliday = showLegalHoliday, onClick = { onDateClick(date) }, modifier = Modifier.weight(1f) )