Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.infomaniak.calendar.components.eventdetail.detail.component
package com.infomaniak.calendar.components.eventdetail.component

import androidx.compose.foundation.layout.Column
import androidx.compose.material3.Icon
import androidx.compose.material3.ListItem
import androidx.compose.material3.ListItemShapes
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
Expand All @@ -28,19 +28,35 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.infomaniak.calendar.components.eventdetail.component.ItemIcon
import com.infomaniak.calendar.components.eventdetail.models.EventDetailUi
import com.infomaniak.calendar.components.resources.R

@Composable
internal fun ClassificationStatus(classification: EventDetailUi.Classification, modifier: Modifier = Modifier) {
ListItem(
content = { Text(text = stringResource(classification.label)) },
leadingContent = { ItemIcon(painterResource(R.drawable.ic_lock)) },
leadingContent = { ClassificationIcon() },
modifier = modifier,
)
}

@Composable
internal fun ClassificationStatusSwitch(
checked: () -> Boolean,
onCheckedChange: (isChecked: Boolean) -> Unit,
modifier: Modifier = Modifier,
shapes: ListItemShapes = ClickableItemDefaults.ClickableItemShapes,
) {
ListItemSwitch(checked, onCheckedChange, modifier, shapes, leadingContent = { ClassificationIcon() }) {
Text(text = stringResource(EventDetailUi.Classification.Public.label))
}
}

@Composable
private fun ClassificationIcon() {
ItemIcon(painterResource(R.drawable.ic_lock))
}

@Preview
@Composable
private fun PreviewClassificationStatus() {
Expand All @@ -52,3 +68,16 @@ private fun PreviewClassificationStatus() {
}
}
}

@Preview
@Composable
private fun PreviewClassificationStatusSwitch() {
MaterialTheme {
Surface {
Column {
ClassificationStatusSwitch(checked = { true }, onCheckedChange = {})
ClassificationStatusSwitch(checked = { false }, onCheckedChange = {})
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,10 @@ import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.ListItem
import androidx.compose.material3.ListItemDefaults
import androidx.compose.material3.ListItemShapes
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.PlainTooltip
import androidx.compose.material3.Surface
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.material3.TooltipAnchorPosition
import androidx.compose.material3.TooltipBox
Expand Down Expand Up @@ -75,28 +74,13 @@ internal fun KMeetButton(
@Composable
internal fun KMeetButtonSwitch(
checked: () -> Boolean,
onToggle: (isChecked: Boolean) -> Unit,
onCheckedChange: (isChecked: Boolean) -> Unit,
modifier: Modifier = Modifier,
shapes: ListItemShapes = ClickableItemDefaults.ClickableItemShapes,
) {
val defaultColors = ListItemDefaults.colors()

ListItem(
checked = checked(),
onCheckedChange = onToggle,
content = { Text(stringResource(id = R.string.kMeetMeeting)) },
leadingContent = { KMeetIcon() },
trailingContent = { Switch(checked = checked(), onCheckedChange = onToggle) },
modifier = modifier,
colors = ListItemDefaults.colors(
selectedContainerColor = defaultColors.containerColor,
selectedContentColor = defaultColors.contentColor,
selectedLeadingContentColor = defaultColors.leadingContentColor,
selectedTrailingContentColor = defaultColors.trailingContentColor,
selectedSupportingContentColor = defaultColors.supportingContentColor,
selectedOverlineContentColor = defaultColors.overlineContentColor,
),
shapes = ClickableItemDefaults.ClickableItemShapes,
)
ListItemSwitch(checked, onCheckedChange, modifier, shapes, leadingContent = { KMeetIcon() }) {
Text(stringResource(id = R.string.kMeetMeeting))
}
}

@Composable
Expand Down Expand Up @@ -139,7 +123,7 @@ private fun PreviewKMeetButton() {
private fun PreviewKMeetButtonSwitch() {
MaterialTheme {
Surface {
KMeetButtonSwitch(checked = { true }, onToggle = {})
KMeetButtonSwitch(checked = { true }, onCheckedChange = {})
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* Infomaniak Calendar - Android
* Copyright (C) 2026 Infomaniak Network SA
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.infomaniak.calendar.components.eventdetail.component

import androidx.compose.material3.ListItem
import androidx.compose.material3.ListItemDefaults
import androidx.compose.material3.ListItemShapes
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.infomaniak.calendar.components.resources.R

@Composable
internal fun ListItemSwitch(
checked: () -> Boolean,
onCheckedChange: (isChecked: Boolean) -> Unit,
modifier: Modifier = Modifier,
shapes: ListItemShapes = ClickableItemDefaults.ClickableItemShapes,
leadingContent: @Composable (() -> Unit)? = null,
content: @Composable () -> Unit,
) {
val defaultColors = ListItemDefaults.colors()

ListItem(
checked = checked(),
onCheckedChange = onCheckedChange,
content = content,
leadingContent = leadingContent,
trailingContent = { Switch(checked = checked(), onCheckedChange = onCheckedChange) },
modifier = modifier,
colors = ListItemDefaults.colors(
selectedContainerColor = defaultColors.containerColor,
selectedContentColor = defaultColors.contentColor,
selectedLeadingContentColor = defaultColors.leadingContentColor,
selectedTrailingContentColor = defaultColors.trailingContentColor,
selectedSupportingContentColor = defaultColors.supportingContentColor,
selectedOverlineContentColor = defaultColors.overlineContentColor,
),
shapes = shapes,
)
}
@Preview
@Composable
private fun Preview() {
MaterialTheme {
Surface {
ListItemSwitch(
checked = { true },
onCheckedChange = {},
content = { Text(stringResource(id = R.string.kMeetMeeting)) },
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,11 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.infomaniak.calendar.components.eventdetail.detail.component
package com.infomaniak.calendar.components.eventdetail.component

import androidx.compose.foundation.layout.Column
import androidx.compose.material3.ListItem
import androidx.compose.material3.ListItemShapes
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
Expand All @@ -27,18 +28,34 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.infomaniak.calendar.components.eventdetail.component.ItemIcon
import com.infomaniak.calendar.components.resources.R

@Composable
internal fun OccupiedStatus(isOccupied: Boolean, modifier: Modifier = Modifier) {
ListItem(
content = { Text(text = stringResource(if (isOccupied) R.string.occupiedLabel else R.string.availableLabel)) },
leadingContent = { ItemIcon(painterResource(R.drawable.ic_briefcase)) },
leadingContent = { OccupiedIcon() },
modifier = modifier,
)
}

@Composable
internal fun OccupiedStatusSwitch(
checked: () -> Boolean,
onCheckedChange: (isChecked: Boolean) -> Unit,
modifier: Modifier = Modifier,
shapes: ListItemShapes = ClickableItemDefaults.ClickableItemShapes,
) {
ListItemSwitch(checked, onCheckedChange, modifier, shapes, leadingContent = { OccupiedIcon() }) {
Text(text = stringResource(R.string.occupiedLabel))
}
}

@Composable
private fun OccupiedIcon() {
ItemIcon(painterResource(R.drawable.ic_briefcase))
}

@Preview
@Composable
private fun PreviewOccupiedStatus() {
Expand All @@ -51,3 +68,16 @@ private fun PreviewOccupiedStatus() {
}
}
}

@Preview
@Composable
private fun PreviewSwitch() {
MaterialTheme {
Surface {
Column {
OccupiedStatusSwitch(checked = { true }, onCheckedChange = {})
OccupiedStatusSwitch(checked = { false }, onCheckedChange = {})
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,23 +35,24 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.datasource.LoremIpsum
import com.infomaniak.calendar.components.eventdetail.component.AttachmentFiles
import com.infomaniak.calendar.components.eventdetail.component.AttendeesButton
import com.infomaniak.calendar.components.eventdetail.component.ClassificationStatus
import com.infomaniak.calendar.components.eventdetail.component.KMeetButton
import com.infomaniak.calendar.components.eventdetail.component.OccupiedStatus
import com.infomaniak.calendar.components.eventdetail.component.Recurrence
import com.infomaniak.calendar.components.eventdetail.component.Section
import com.infomaniak.calendar.components.eventdetail.component.Title
import com.infomaniak.calendar.components.eventdetail.detail.component.Calendar
import com.infomaniak.calendar.components.eventdetail.detail.component.ClassificationStatus
import com.infomaniak.calendar.components.eventdetail.detail.component.DateAndTime
import com.infomaniak.calendar.components.eventdetail.detail.component.DescriptionCollapsibleButton
import com.infomaniak.calendar.components.eventdetail.detail.component.LocationButton
import com.infomaniak.calendar.components.eventdetail.detail.component.Notifications
import com.infomaniak.calendar.components.eventdetail.detail.component.OccupiedStatus
import com.infomaniak.calendar.components.eventdetail.detail.component.RoomButton
import com.infomaniak.calendar.components.eventdetail.models.EventDetailTiming
import com.infomaniak.calendar.components.eventdetail.models.EventDetailUi
import com.infomaniak.calendar.components.eventdetail.models.NotificationTime
import com.infomaniak.calendar.components.eventdetail.modifier.EventSharedElement
import com.infomaniak.calendar.components.eventdetail.modifier.ProvideEventSharedTransition
import com.infomaniak.calendar.components.eventdetail.modifier.eventSharedBounds
import com.infomaniak.calendar.components.eventdetail.modifier.eventSharedElement
import com.infomaniak.calendar.components.foundation.models.Attendees
import com.infomaniak.calendar.components.foundation.preview.previewAttendees
Expand Down Expand Up @@ -100,7 +101,7 @@ fun EventDetail(
KMeetButton(
onJoin = onJoinKMeet,
onCopy = onCopyKMeet,
modifier = Modifier.eventSharedElement(EventSharedElement.KMeet),
modifier = Modifier.eventSharedBounds(EventSharedElement.KMeet),
)
}

Expand All @@ -123,16 +124,19 @@ fun EventDetail(

Section {
Notifications(
notifications,
notifications = notifications,
onNotificationClick = { /*TODO[eventDetail]*/ },
)
}

Section {
OccupiedStatus(isOccupied)
OccupiedStatus(isOccupied, modifier = Modifier.eventSharedBounds(EventSharedElement.OccupiedStatus))

if (classification != null) {
ClassificationStatus(classification)
ClassificationStatus(
classification = classification,
modifier = Modifier.eventSharedBounds(EventSharedElement.ClassificationStatus),
)
}

Calendar(calendarColor, calendarName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,15 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.infomaniak.calendar.components.eventdetail.component.AttendeesButton
import com.infomaniak.calendar.components.eventdetail.component.ClassificationStatusSwitch
import com.infomaniak.calendar.components.eventdetail.component.KMeetButtonSwitch
import com.infomaniak.calendar.components.eventdetail.component.OccupiedStatusSwitch
import com.infomaniak.calendar.components.eventdetail.component.Section
import com.infomaniak.calendar.components.eventdetail.component.TitleEditable
import com.infomaniak.calendar.components.eventdetail.form.component.AllDaySwitch
import com.infomaniak.calendar.components.eventdetail.modifier.EventSharedElement
import com.infomaniak.calendar.components.eventdetail.modifier.ProvideEventSharedTransition
import com.infomaniak.calendar.components.eventdetail.modifier.eventSharedBounds
import com.infomaniak.calendar.components.eventdetail.modifier.eventSharedElement
import com.infomaniak.calendar.components.eventdetail.preview.previewEventDetailCalendar
import com.infomaniak.calendar.components.foundation.models.AttendeeUi
Expand All @@ -63,6 +67,11 @@ fun EventForm(
modifier = Modifier.eventSharedElement(EventSharedElement.Title),
)

AllDaySwitch(
checked = state.isAllDay::value,
onCheckedChange = { isChecked -> state.isAllDay.value = isChecked },
)

Section {
AttendeesButton(
attendees = state.attendeesState.attendees.toList(),
Expand All @@ -71,9 +80,23 @@ fun EventForm(
)

KMeetButtonSwitch(
checked = { state.isKMeetUrlEnabled.value },
onToggle = { isChecked -> state.isKMeetUrlEnabled.value = isChecked },
modifier = Modifier.eventSharedElement(EventSharedElement.KMeet),
checked = state.isKMeetUrlEnabled::value,
onCheckedChange = { isChecked -> state.isKMeetUrlEnabled.value = isChecked },
modifier = Modifier.eventSharedBounds(EventSharedElement.KMeet),
)
}

Section {
OccupiedStatusSwitch(
checked = state.isOccupied::value,
onCheckedChange = { isChecked -> state.isOccupied.value = isChecked },
modifier = Modifier.eventSharedBounds(EventSharedElement.OccupiedStatus),
Comment on lines +89 to +93
)

ClassificationStatusSwitch(
checked = state.isPublic::value,
onCheckedChange = { isChecked -> state.isPublic.value = isChecked },
modifier = Modifier.eventSharedBounds(EventSharedElement.ClassificationStatus),
)
}
}
Expand Down
Loading
Loading