Skip to content
Merged
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
3 changes: 2 additions & 1 deletion app/src/main/java/com/xpeho/xpeapp/enums/Screens.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ enum class Screens {
Vacation,
Colleague,
Qvst,
Profile
Profile,
Agenda
}
10 changes: 10 additions & 0 deletions app/src/main/java/com/xpeho/xpeapp/ui/Navigation.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.xpeho.xpeapp.ui.components.layout.DisabledFeaturePlaceHolder
import com.xpeho.xpeapp.ui.page.HomePage
import com.xpeho.xpeapp.ui.page.LoginPage
import com.xpeho.xpeapp.ui.page.NewsletterPage
import com.xpeho.xpeapp.ui.page.AgendaPage
import com.xpeho.xpeapp.ui.page.qvst.QvstCampaignDetailPage
import com.xpeho.xpeapp.ui.page.qvst.QvstPage
import com.xpeho.xpeapp.ui.page.user.ProfilePage
Expand Down Expand Up @@ -80,4 +81,13 @@ fun NavGraphBuilder.navigationBuilder(
}
}
}
composable(route = Screens.Agenda.name) {
Layout(navigationController) {
if (ffManager.isFeatureEnabled(FeatureFlippingEnum.AGENDA)) {
AgendaPage()
} else {
DisabledFeaturePlaceHolder()
}
}
}
}
6 changes: 6 additions & 0 deletions app/src/main/java/com/xpeho/xpeapp/ui/Resources.kt
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@ class Resources {
redirection = Screens.Vacation.name,
featureFlippingId = FeatureFlippingEnum.VACATION,
),
Menu(
idImage = XpehoRes.calendar,
title = "Agenda",
redirection = Screens.Agenda.name,
featureFlippingId = FeatureFlippingEnum.AGENDA,
)
)

var listOfRequest: Array<RequestLeaveDetail> =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ fun AgendaBirthdayCard(

@Composable
private fun getBirthdayTagsList(birthday: AgendaBirthday, color: Color): @Composable () -> Unit {
val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.FRENCH)
val dateFormat = SimpleDateFormat("dd/MM", Locale.FRENCH)

return {
TagPill(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import com.xpeho.xpeho_ui_android.TagPill
import com.xpeho.xpeho_ui_android.foundations.Colors as XpehoColors
import com.xpeho.xpeapp.R
import androidx.core.graphics.toColorInt
import com.xpeho.xpeapp.ui.components.layout.TagPillCustom
import java.text.SimpleDateFormat
import java.util.Locale

Expand Down Expand Up @@ -49,23 +50,21 @@ fun AgendaCard(

@Composable
private fun getTagsList(event: AgendaEvent, eventType: List<AgendaEventType>, color: Color): @Composable () -> Unit {
val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.FRENCH)
val dateFormat = SimpleDateFormat("dd/MM", Locale.FRENCH)
val timeInfo = listOfNotNull(
event.startTime?.let { "De: $it" },
event.endTime?.let { "à: $it" }
).joinToString(separator = " ")

return {
TagPill(
label = dateFormat.format(event.date),
backgroundColor = color,
size = 9.sp
)
event.startTime?.let {
if (timeInfo.isNotEmpty()) {
TagPill(
label = event.startTime.toString(),
backgroundColor = color,
size = 9.sp
)
}
event.endTime?.let {
TagPill(
label = event.endTime.toString(),
label = timeInfo,
backgroundColor = color,
size = 9.sp
)
Expand All @@ -78,7 +77,8 @@ private fun getTagsList(event: AgendaEvent, eventType: List<AgendaEventType>, co
)
}
event.location?.takeIf { it.isNotEmpty() }?.let {
TagPill(
TagPillCustom(
iconResId = R.drawable.location,
label = it,
backgroundColor = color,
size = 9.sp
Expand Down Expand Up @@ -112,13 +112,13 @@ private fun getTagColor(baseColor: Color): Color {
}

private fun getEventTypeIcon(event: AgendaEvent, eventType: List<AgendaEventType>): Int {
return when (eventType.firstOrNull { it.id == event.typeId.toInt() }?.label) {
"XpeUp" -> R.drawable.birthday
"Event interne" -> R.drawable.building
"Formation" -> R.drawable.study
"RSE" -> R.drawable.leaf
"Activité" -> R.drawable.gamepad
"Event externe" -> R.drawable.outside
else -> R.drawable.building
return when (eventType.firstOrNull { it.id == event.typeId.toInt() }?.label) {
"XpeUp" -> R.drawable.birthday
"Event interne" -> R.drawable.building
"Formation" -> R.drawable.study
"RSE" -> R.drawable.leaf
"Activité" -> R.drawable.gamepad
"Event externe" -> R.drawable.outside
else -> R.drawable.building
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,34 +6,34 @@ import androidx.compose.foundation.layout.height
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.xpeho.xpeapp.data.model.agenda.AgendaBirthday
import com.xpeho.xpeapp.data.model.agenda.AgendaEvent
import com.xpeho.xpeapp.data.model.agenda.AgendaEventType

@Composable
fun AgendaCardList(
events: List<AgendaEvent>,
birthdays: List<AgendaBirthday>,
items: List<AgendaItem>,
eventsTypes: List<AgendaEventType>,
collapsable: Boolean = true
) {
Column {
for (birthday in birthdays) {
AgendaBirthdayCard(
birthday = birthday,
collapsable = collapsable,
defaultOpen = true
)
Spacer(modifier = Modifier.height(10.dp))
}
for (event in events) {
AgendaCard(
event = event,
eventTypes = eventsTypes,
collapsable = collapsable,
defaultOpen = true
)
for (item in items) {
when (item) {
is AgendaBirthdayItem -> {
AgendaBirthdayCard(
birthday = item.birthday,
collapsable = collapsable,
defaultOpen = true
)
}
is AgendaEventItem -> {
AgendaCard(
event = item.event,
eventTypes = eventsTypes,
collapsable = collapsable,
defaultOpen = true
)
}
}
Spacer(modifier = Modifier.height(10.dp))
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.xpeho.xpeapp.ui.components.agenda

import com.xpeho.xpeapp.data.model.agenda.AgendaBirthday
import com.xpeho.xpeapp.data.model.agenda.AgendaEvent
import java.util.Date

// Common base class to sort the global display by the dates
// of each event and birthday in ascending order
sealed class AgendaItem(val date: Date)

data class AgendaBirthdayItem(val birthday: AgendaBirthday) : AgendaItem(birthday.birthdate)
data class AgendaEventItem(val event: AgendaEvent) : AgendaItem(event.date)
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.xpeho.xpeapp.ui.components.layout

import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.xpeho.xpeho_ui_android.foundations.Colors
import com.xpeho.xpeho_ui_android.foundations.Fonts

@Composable
fun TagPillCustom(
label: String,
size: TextUnit = 10.sp,
backgroundColor: Color = Colors.GREEN_DARK_COLOR,
labelColor: Color = Color.White,
iconResId: Int? = null
) {
Card(
shape = RoundedCornerShape(6.dp),
colors = CardDefaults.cardColors(
containerColor = backgroundColor,
),
) {
Row(
modifier = Modifier.padding(vertical = 1.dp, horizontal = 4.dp),
verticalAlignment = Alignment.CenterVertically
) {
iconResId?.let {
Icon(
painter = painterResource(id = it),
contentDescription = null,
tint = labelColor,
modifier = Modifier.size(12.dp)
)
Spacer(modifier = Modifier.width(4.dp))
}
Text(
text = label.uppercase(),
fontSize = size,
fontFamily = Fonts.rubik,
fontWeight = FontWeight.Medium,
color = labelColor,
softWrap = false,
overflow = TextOverflow.Ellipsis,
)
}
}
}
70 changes: 70 additions & 0 deletions app/src/main/java/com/xpeho/xpeapp/ui/page/AgendaPage.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.xpeho.xpeapp.ui.page

import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.xpeho.xpeapp.R
import com.xpeho.xpeapp.ui.components.CustomDialog
import com.xpeho.xpeapp.ui.components.agenda.AgendaBirthdayItem
import com.xpeho.xpeapp.ui.components.agenda.AgendaCardList
import com.xpeho.xpeapp.ui.components.agenda.AgendaEventItem
import com.xpeho.xpeapp.ui.components.layout.Title
import com.xpeho.xpeapp.ui.sendAnalyticsEvent
import com.xpeho.xpeapp.ui.uiState.AgendaUiState
import com.xpeho.xpeapp.ui.uiState.QvstUiState
import com.xpeho.xpeapp.ui.viewModel.agenda.AgendaViewModel
import com.xpeho.xpeapp.ui.viewModel.viewModelFactory

@Composable
fun AgendaPage() {
val agendaViewModel = viewModel<AgendaViewModel>(
factory = viewModelFactory {
AgendaViewModel()
}
)

sendAnalyticsEvent("agenda_page")

LaunchedEffect(Unit) {
agendaViewModel.updateState()
}

LazyColumn(
modifier = Modifier
.padding(horizontal = 24.dp, vertical = 10.dp)
.fillMaxSize(),
) {
when (agendaViewModel.state) {
is AgendaUiState.SUCCESS -> {
item {
Title(label = "Agenda")
val state = agendaViewModel.state as AgendaUiState.SUCCESS
val events = state.agendaEvent.map { AgendaEventItem(it) }
val birthdays = state.agendaBirthday.map { AgendaBirthdayItem(it) }
val items = (events + birthdays).sortedBy { it.date }
AgendaCardList(
items = items,
eventsTypes = state.agendaEventType,
collapsable = true
)
}
}
is AgendaUiState.ERROR -> {
item {
CustomDialog(
title = stringResource(id = R.string.login_page_error_title),
message = (agendaViewModel.state as AgendaUiState.ERROR).error,
) {
agendaViewModel.resetState()
}
}
}
}
}
}
27 changes: 12 additions & 15 deletions app/src/main/java/com/xpeho/xpeapp/ui/page/HomePage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,20 @@ import com.xpeho.xpeapp.R
import com.xpeho.xpeapp.XpeApp
import com.xpeho.xpeapp.data.FeatureFlippingEnum
import com.xpeho.xpeapp.data.entity.QvstCampaignEntity
import com.xpeho.xpeapp.data.model.agenda.AgendaBirthday
import com.xpeho.xpeapp.data.model.agenda.AgendaEvent
import com.xpeho.xpeapp.data.model.agenda.AgendaEventType
import com.xpeho.xpeapp.domain.FeatureFlippingState
import com.xpeho.xpeapp.ui.components.CustomDialog
import com.xpeho.xpeapp.ui.components.agenda.AgendaBirthdayItem
import com.xpeho.xpeapp.ui.components.agenda.AgendaCardList
import com.xpeho.xpeapp.ui.components.agenda.AgendaEventItem
import com.xpeho.xpeapp.ui.components.layout.NoContentPlaceHolder
import com.xpeho.xpeapp.ui.components.layout.Title
import com.xpeho.xpeapp.ui.components.newsletter.NewsletterPreview
import com.xpeho.xpeapp.ui.components.qvst.QvstCardList
import com.xpeho.xpeapp.ui.sendAnalyticsEvent
import com.xpeho.xpeapp.ui.uiState.AgendaUiState
import com.xpeho.xpeapp.ui.uiState.QvstActiveUiState
import com.xpeho.xpeapp.ui.viewModel.FeatureFlippingViewModel
import com.xpeho.xpeapp.ui.viewModel.agenda.AgendaViewModel
import com.xpeho.xpeapp.ui.viewModel.agenda.AgendaViewModelState
import com.xpeho.xpeapp.ui.viewModel.newsletter.NewsletterViewModel
import com.xpeho.xpeapp.ui.viewModel.qvst.QvstActiveCampaignsViewModel
import com.xpeho.xpeapp.ui.viewModel.viewModelFactory
Expand Down Expand Up @@ -161,29 +160,27 @@ fun HomePage(navigationController: NavController) {
when (agendaViewModel.state) {

// If we successfully loaded the events
is AgendaViewModelState.SUCCESS -> {
is AgendaUiState.SUCCESS -> {
item {
val events: List<AgendaEvent> =
(agendaViewModel.state as AgendaViewModelState.SUCCESS).agendaEvent
val eventsTypes: List<AgendaEventType> =
(agendaViewModel.state as AgendaViewModelState.SUCCESS).agendaEventType
val birthdays: List<AgendaBirthday> =
(agendaViewModel.state as AgendaViewModelState.SUCCESS).agendaBirthday
val state = agendaViewModel.state as AgendaUiState.SUCCESS
val events = state.agendaEvent.map { AgendaEventItem(it) }
val birthdays = state.agendaBirthday.map { AgendaBirthdayItem(it) }
val items = (events + birthdays).sortedBy { it.date }
val eventsTypes = state.agendaEventType
AgendaCardList(
events = events,
items = items,
eventsTypes = eventsTypes,
birthdays = birthdays,
collapsable = false
)
}
}

// If there was an error loading the events
is AgendaViewModelState.ERROR -> {
is AgendaUiState.ERROR -> {
item {
CustomDialog(
title = stringResource(id = R.string.login_page_error_title),
message = (agendaViewModel.state as AgendaViewModelState.ERROR).error,
message = (agendaViewModel.state as AgendaUiState.ERROR).error,
) {
agendaViewModel.resetState()
}
Expand Down
Loading
Loading