From f86619f3a9b769a7c9509a46d61f309254f4fd9f Mon Sep 17 00:00:00 2001 From: Roman194 Date: Tue, 15 Aug 2023 10:37:57 +0600 Subject: [PATCH 1/5] Business-logic for BottomDialog (modal filters on MainScreen and AboutEmployee) was added --- .../repository/MockBookingRepositoryImpl.kt | 37 +++++--- .../domain/repository/BookingRepository.kt | 5 +- .../domain/useCase/AboutEmployeeUseCase.kt | 7 +- .../domain/useCase/GetBookingsUseCase.kt | 7 +- .../employee/aboutEmployee/AboutEmployee.kt | 38 +++++--- .../aboutEmployee/models/BookingsFilter.kt | 5 ++ .../aboutEmployee/store/AboutEmployeeStore.kt | 6 +- .../store/AboutEmployeeStoreFactory.kt | 87 +++++++++++++++---- .../office/elevator/ui/main/MainScreen.kt | 7 +- .../ui/main/components/BottomDialog.kt | 18 ++-- .../elevator/ui/main/store/MainStore.kt | 3 +- .../ui/main/store/MainStoreFactory.kt | 36 ++++++-- .../resources/MR/base/strings_ru.xml | 4 +- .../commonMain/resources/MR/en/strings_en.xml | 6 +- 14 files changed, 191 insertions(+), 75 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/models/BookingsFilter.kt diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/MockBookingRepositoryImpl.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/MockBookingRepositoryImpl.kt index 4bb52841..f3d9757f 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/MockBookingRepositoryImpl.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/MockBookingRepositoryImpl.kt @@ -3,6 +3,7 @@ package band.effective.office.elevator.data.repository import band.effective.office.elevator.domain.repository.BookingRepository import band.effective.office.elevator.domain.models.BookingInfo import band.effective.office.elevator.domain.models.CreatingBookModel +import band.effective.office.elevator.ui.employee.aboutEmployee.models.BookingsFilter import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.IO @@ -17,7 +18,7 @@ class MockBookingRepositoryImpl: BookingRepository { private val scope = CoroutineScope(Dispatchers.IO) private val initLis = listOf( BookingInfo( - id = "2455L", + id = "2455W", ownerId = "1L", seatName = "Seat A1", dateOfStart = LocalDateTime( @@ -30,7 +31,7 @@ class MockBookingRepositoryImpl: BookingRepository { ) ), BookingInfo( - id = "303040L", + id = "303040W", ownerId = "1L", seatName = "Seat A2", dateOfStart = LocalDateTime( @@ -43,7 +44,7 @@ class MockBookingRepositoryImpl: BookingRepository { ) ), BookingInfo( - id = "8989L", + id = "8989W", ownerId = "1L", seatName = "Seat A2", dateOfStart = LocalDateTime( @@ -56,7 +57,7 @@ class MockBookingRepositoryImpl: BookingRepository { ) ), BookingInfo( - id = "234L", + id = "234W", ownerId = "1L", seatName = "Seat A2", dateOfStart = LocalDateTime( @@ -69,7 +70,7 @@ class MockBookingRepositoryImpl: BookingRepository { ) ), BookingInfo( - id = "754L", + id = "754W", ownerId = "1L", seatName = "Seat A2", dateOfStart = LocalDateTime( @@ -82,7 +83,7 @@ class MockBookingRepositoryImpl: BookingRepository { ) ), BookingInfo( - id = "2222L", + id = "2222W", ownerId = "1H", seatName = "Seat A2", dateOfStart = LocalDateTime( @@ -95,9 +96,9 @@ class MockBookingRepositoryImpl: BookingRepository { ) ), BookingInfo( - id = "358L", + id = "358M", ownerId = "1H", - seatName= "Переговорная Sun", + seatName= "Meeting room Sun", dateOfStart = LocalDateTime( date = LocalDate(year = 2023, monthNumber = 8, dayOfMonth = 17), time = LocalTime(hour = 14, minute = 10, second = 0, nanosecond = 0) @@ -119,13 +120,25 @@ class MockBookingRepositoryImpl: BookingRepository { TODO("Not yet implemented") } - override suspend fun getBookingsForUser(ownerId:String): StateFlow> { - bookings.update { initLis.filter { it.ownerId == ownerId } } + override suspend fun getBookingsForUser(ownerId:String, bookingsFilter: BookingsFilter): StateFlow> { + bookings.update { + initLis.filter { + it.ownerId == ownerId && + ((it.id.contains('M') && bookingsFilter.meetRoom) || + (it.id.contains('W') && bookingsFilter.workPlace)) + } + } return bookings } - override suspend fun getBookingsByDate(date: LocalDate,ownerId:String): StateFlow> { - bookings.update { initLis.filter { it.dateOfStart.date == date && it.ownerId == ownerId} } + override suspend fun getBookingsByDate(date: LocalDate, ownerId:String, bookingsFilter: BookingsFilter): StateFlow> { + bookings.update { + initLis.filter { + it.dateOfStart.date == date && it.ownerId == ownerId && + ((it.id.contains('M') && bookingsFilter.meetRoom) || + (it.id.contains('W') && bookingsFilter.workPlace)) + } + } return bookings } diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/BookingRepository.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/BookingRepository.kt index 80e5ba14..a86d7004 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/BookingRepository.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/BookingRepository.kt @@ -2,6 +2,7 @@ package band.effective.office.elevator.domain.repository import band.effective.office.elevator.domain.models.BookingInfo import band.effective.office.elevator.domain.models.CreatingBookModel +import band.effective.office.elevator.ui.employee.aboutEmployee.models.BookingsFilter import kotlinx.coroutines.flow.StateFlow import kotlinx.datetime.LocalDate @@ -10,7 +11,7 @@ interface BookingRepository { suspend fun createBook(bookingInfo: CreatingBookModel) - suspend fun getBookingsForUser(ownerId:String): StateFlow> + suspend fun getBookingsForUser(ownerId:String, bookingsFilter: BookingsFilter): StateFlow> - suspend fun getBookingsByDate(date: LocalDate, ownerId:String): StateFlow> + suspend fun getBookingsByDate(date: LocalDate, ownerId:String, bookingsFilter: BookingsFilter): StateFlow> } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AboutEmployeeUseCase.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AboutEmployeeUseCase.kt index 4e4d51b8..f4089fd9 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AboutEmployeeUseCase.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AboutEmployeeUseCase.kt @@ -2,6 +2,7 @@ package band.effective.office.elevator.domain.useCase import band.effective.office.elevator.domain.models.toUIModel import band.effective.office.elevator.domain.repository.BookingRepository +import band.effective.office.elevator.ui.employee.aboutEmployee.models.BookingsFilter import band.effective.office.elevator.ui.models.ReservedSeat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.StateFlow @@ -13,18 +14,20 @@ class AboutEmployeeUseCase(private val repository: BookingRepository) { suspend fun getBookingsForUser( ownerId:String, + bookingsFilter: BookingsFilter, coroutineScope: CoroutineScope ): StateFlow> = - repository.getBookingsForUser(ownerId = ownerId) + repository.getBookingsForUser(ownerId = ownerId, bookingsFilter = bookingsFilter) .map { bookingsList -> bookingsList.toUIModel() } .stateIn(coroutineScope) suspend fun getBookingsByDate( date: LocalDate, ownerId:String, + bookingsFilter: BookingsFilter, coroutineScope: CoroutineScope ): StateFlow> = - repository.getBookingsByDate(date = date, ownerId = ownerId) + repository.getBookingsByDate(date = date, ownerId = ownerId, bookingsFilter = bookingsFilter) .map { bookingsList -> bookingsList.toUIModel() } .stateIn(coroutineScope) } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/GetBookingsUseCase.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/GetBookingsUseCase.kt index da4fee53..2ec74105 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/GetBookingsUseCase.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/GetBookingsUseCase.kt @@ -2,6 +2,7 @@ package band.effective.office.elevator.domain.useCase import band.effective.office.elevator.domain.repository.BookingRepository import band.effective.office.elevator.domain.models.toUIModel +import band.effective.office.elevator.ui.employee.aboutEmployee.models.BookingsFilter import band.effective.office.elevator.ui.models.ReservedSeat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.StateFlow @@ -14,18 +15,20 @@ class GetBookingsUseCase( ) { suspend fun getBookingsForUser( ownerId:String, + bookingsFilter: BookingsFilter, coroutineScope: CoroutineScope ): StateFlow> = - repository.getBookingsForUser(ownerId = ownerId) + repository.getBookingsForUser(ownerId = ownerId, bookingsFilter = bookingsFilter) .map { bookingsList -> bookingsList.toUIModel() } .stateIn(coroutineScope) suspend fun getBookingsByDate( date: LocalDate, ownerId:String, + bookingsFilter: BookingsFilter, coroutineScope: CoroutineScope ): StateFlow> = - repository.getBookingsByDate(date = date, ownerId = ownerId) + repository.getBookingsByDate(date = date, ownerId = ownerId, bookingsFilter = bookingsFilter) .map { bookingsList -> bookingsList.toUIModel() } .stateIn(coroutineScope) } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployee.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployee.kt index c49740e7..2b0d34d4 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployee.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployee.kt @@ -37,6 +37,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import band.effective.office.elevator.MainRes @@ -47,6 +48,7 @@ import band.effective.office.elevator.components.TitlePage import band.effective.office.elevator.textGrayColor import band.effective.office.elevator.ui.employee.aboutEmployee.components.BookingCardUser import band.effective.office.elevator.ui.employee.aboutEmployee.components.ContactUserUIComponent +import band.effective.office.elevator.ui.employee.aboutEmployee.models.BookingsFilter import band.effective.office.elevator.ui.employee.aboutEmployee.store.AboutEmployeeStore import band.effective.office.elevator.ui.main.components.BottomDialog import band.effective.office.elevator.ui.main.components.CalendarTitle @@ -86,7 +88,8 @@ fun AboutEmployee (component: AboutEmployeeComponent){ post = state.user.post, telegram = state.user.telegram, email = state.user.email, - reservedSeats = state.reservedSeats, + reservedSeatsList = state.reservedSeatsList, + dateFiltrationOnReserves = state.dateFiltrationOnReserves, filtrationOnReserves = state.filtrationOnReserves, bottomSheetState = bottomSheetState, onClickOpenPhone = { component.onEvent(AboutEmployeeStore.Intent.TelephoneClicked) }, @@ -95,7 +98,7 @@ fun AboutEmployee (component: AboutEmployeeComponent){ onClickBack = { component.onOutput(AboutEmployeeComponent.Output.OpenAllEmployee) }, onClickOpenCalendar = { component.onEvent(AboutEmployeeStore.Intent.OpenCalendarClicked) }, onClickOpenBottomDialog = { component.onEvent(AboutEmployeeStore.Intent.OpenBottomDialog)}, - onClickCloseBottomDialog = {component.onEvent(AboutEmployeeStore.Intent.CloseBottomDialog)} + onClickCloseBottomDialog = {component.onEvent(AboutEmployeeStore.Intent.CloseBottomDialog(it))} ) if(showModalCalendar){ @@ -119,7 +122,8 @@ private fun AboutEmployeeContent( post: String?, telegram: String?, email: String?, - reservedSeats: List, + reservedSeatsList: List, + dateFiltrationOnReserves: Boolean, filtrationOnReserves: Boolean, bottomSheetState: ModalBottomSheetState, onClickBack: () -> Unit, @@ -128,7 +132,7 @@ private fun AboutEmployeeContent( onClickOpenSpb: () ->Unit, onClickOpenCalendar: () ->Unit, onClickOpenBottomDialog: () ->Unit, - onClickCloseBottomDialog: () ->Unit + onClickCloseBottomDialog: (BookingsFilter) ->Unit ){ ModalBottomSheetLayout( sheetShape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), @@ -243,11 +247,11 @@ private fun AboutEmployeeContent( FilterButton(onClickOpenBottomSheetDialog = onClickOpenBottomDialog) } } - if(reservedSeats.isEmpty()){ - NoReservationsThisDate(noThisDayReservations = filtrationOnReserves) + if(reservedSeatsList.isEmpty()){ + NoReservationsThisDate(noThisDayReservations = dateFiltrationOnReserves, filtration = filtrationOnReserves) }else{ ReservationsOnThisDate( - reservedSeats = reservedSeats, + reservedSeatsList = reservedSeatsList, ) } } @@ -256,7 +260,8 @@ private fun AboutEmployeeContent( } @Composable -fun NoReservationsThisDate(noThisDayReservations: Boolean){ +fun NoReservationsThisDate(noThisDayReservations: Boolean, filtration: Boolean){ + Column ( modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, @@ -264,21 +269,28 @@ fun NoReservationsThisDate(noThisDayReservations: Boolean){ ) { Text( text = stringResource( - if(noThisDayReservations) MainRes.strings.none_booking_seats_on_this_date - else MainRes.strings.none_booking_seats_by_the_employee), + if(filtration){ + if(noThisDayReservations) MainRes.strings.none_such_booking_seats_on_this_date + else MainRes.strings.none_such_booking_seats_by_the_employee + }else{ + if(noThisDayReservations) MainRes.strings.none_booking_seats_on_this_date + else MainRes.strings.none_booking_seats_by_the_employee + } + ), fontSize = 15.sp, - color = textGrayColor + color = textGrayColor, + textAlign = TextAlign.Center ) } } @Composable -fun ReservationsOnThisDate(reservedSeats: List){ +fun ReservationsOnThisDate(reservedSeatsList: List){ LazyColumn( modifier = Modifier.fillMaxSize().padding(horizontal = 16.dp), verticalArrangement = Arrangement.spacedBy(18.dp) ) { - items(reservedSeats) { seat -> + items(reservedSeatsList) { seat -> BookingCardUser( seat ) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/models/BookingsFilter.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/models/BookingsFilter.kt new file mode 100644 index 00000000..534bc3c9 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/models/BookingsFilter.kt @@ -0,0 +1,5 @@ +package band.effective.office.elevator.ui.employee.aboutEmployee.models + +data class BookingsFilter( + val meetRoom: Boolean, + val workPlace: Boolean) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStore.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStore.kt index a1a07729..363c4e18 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStore.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStore.kt @@ -1,6 +1,7 @@ package band.effective.office.elevator.ui.employee.aboutEmployee.store import band.effective.office.elevator.domain.models.User +import band.effective.office.elevator.ui.employee.aboutEmployee.models.BookingsFilter import band.effective.office.elevator.ui.models.ReservedSeat import com.arkivanov.mvikotlin.core.store.Store import kotlinx.datetime.LocalDate @@ -16,13 +17,14 @@ interface AboutEmployeeStore : Store, + val reservedSeatsList: List, + val dateFiltrationOnReserves: Boolean, val filtrationOnReserves: Boolean, val currentDate: LocalDate ) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStoreFactory.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStoreFactory.kt index 80df07da..7bbf1ce9 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStoreFactory.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStoreFactory.kt @@ -6,6 +6,7 @@ import band.effective.office.elevator.domain.useCase.AboutEmployeeUseCase import band.effective.office.elevator.expects.makeCall import band.effective.office.elevator.expects.pickSBP import band.effective.office.elevator.expects.pickTelegram +import band.effective.office.elevator.ui.employee.aboutEmployee.models.BookingsFilter import band.effective.office.elevator.ui.employee.aboutEmployee.models.toUIAbout import band.effective.office.elevator.ui.employee.aboutEmployee.store.AboutEmployeeStore.* import band.effective.office.elevator.ui.models.ReservedSeat @@ -28,6 +29,9 @@ class AboutEmployeeStoreFactory(private val storeFactory: StoreFactory, private private val aboutEmployeeUseCase: AboutEmployeeUseCase by inject() private var mokValueUser = EmployeeInfo.defaultEmployee.toUIAbout() + private var recentDate = getCurrentDate() + private var filtration = BookingsFilter(meetRoom = true, workPlace = true) + private var datedList = false @OptIn(ExperimentalMviKotlinApi::class) fun create(): AboutEmployeeStore = @@ -35,8 +39,9 @@ class AboutEmployeeStoreFactory(private val storeFactory: StoreFactory, private name = "AboutEmployeeStore", initialState = State( mokValueUser, - reservedSeats = listOf(), + reservedSeatsList = listOf(), currentDate = getCurrentDate(), + dateFiltrationOnReserves = false, filtrationOnReserves = false ), bootstrapper = coroutineBootstrapper { @@ -54,12 +59,14 @@ class AboutEmployeeStoreFactory(private val storeFactory: StoreFactory, private is Msg.ProfileData -> copy( user = msg.user, - reservedSeats = msg.reservedSeats + reservedSeatsList = msg.reservedSeatsList, + filtrationOnReserves = msg.filtrationOnReserves ) is Msg.UpdateSeatsReservation -> { copy( - reservedSeats = msg.reservedSeats, - filtrationOnReserves=msg.filtrationOnReserves) + reservedSeatsList = msg.reservedSeatsList, + dateFiltrationOnReserves=msg.dateFiltrationOnReserves, + filtrationOnReserves = msg.filtrationOnReserves) } } } @@ -69,8 +76,14 @@ class AboutEmployeeStoreFactory(private val storeFactory: StoreFactory, private } private sealed interface Msg { - data class ProfileData(val user: User, val reservedSeats: List) : Msg - data class UpdateSeatsReservation(val reservedSeats: List, val filtrationOnReserves: Boolean) : Msg + data class ProfileData( + val user: User, + val reservedSeatsList: List, + val filtrationOnReserves: Boolean) : Msg + data class UpdateSeatsReservation( + val reservedSeatsList: List, + val dateFiltrationOnReserves: Boolean, + val filtrationOnReserves: Boolean) : Msg } private inner class ExecutorImpl : @@ -94,8 +107,12 @@ class AboutEmployeeStoreFactory(private val storeFactory: StoreFactory, private is Intent.OnClickApplyDate ->{ scope.launch { publish(Label.CloseCalendar) + datedList = true intent.date?.let { newDate -> - fetchUserInfoByDate(date=newDate, ownerId = mokValueUser.id) + fetchUserInfoByDate( + date=newDate, + ownerId = mokValueUser.id, + bookingsFilter = filtration) } } } @@ -104,9 +121,21 @@ class AboutEmployeeStoreFactory(private val storeFactory: StoreFactory, private publish(Label.OpenBottomDialog) } } - Intent.CloseBottomDialog ->{ + is Intent.CloseBottomDialog ->{ scope.launch { publish(Label.CloseBottomDialog) + intent.bookingsFilter.let { bookingsFilter -> + if (datedList) { + fetchUserInfoByDate( + date = recentDate, + ownerId = mokValueUser.id, + bookingsFilter = bookingsFilter) + }else{ + fetchUserInfo( + employee = mokValueUser, + bookingsFilter=bookingsFilter) + } + } } } } @@ -114,28 +143,52 @@ class AboutEmployeeStoreFactory(private val storeFactory: StoreFactory, private override fun executeAction(action: Action, getState: () -> State) { when (action) { - is Action.FetchUserInfo -> fetchUserInfo(employee = action.employee) + is Action.FetchUserInfo -> fetchUserInfo(employee = action.employee, bookingsFilter = filtration) } } - private fun fetchUserInfoByDate(date: LocalDate, ownerId:String,) { + private fun fetchUserInfoByDate(date: LocalDate, ownerId:String, bookingsFilter: BookingsFilter) { + if(recentDate != date) + recentDate = date + else + filtration = bookingsFilter + scope.launch (Dispatchers.IO){ aboutEmployeeUseCase - .getBookingsByDate(date = date, ownerId = ownerId, coroutineScope = this) + .getBookingsByDate( + date = date, + ownerId = ownerId, + bookingsFilter = bookingsFilter, + coroutineScope = this) .collect{newList -> withContext(Dispatchers.Main){ - dispatch(Msg.UpdateSeatsReservation(reservedSeats = newList, filtrationOnReserves = true)) + dispatch(Msg.UpdateSeatsReservation( + reservedSeatsList = newList, + dateFiltrationOnReserves = true, + filtrationOnReserves = !(filtration.workPlace && filtration.meetRoom))) } } } } - private fun fetchUserInfo(employee: User){ - mokValueUser=employee + private fun fetchUserInfo(employee: User, bookingsFilter: BookingsFilter){ + if (mokValueUser!=employee) + mokValueUser = employee + else + filtration = bookingsFilter + scope.launch (Dispatchers.IO){ - aboutEmployeeUseCase.getBookingsForUser(ownerId = employee.id, coroutineScope = this) + aboutEmployeeUseCase + .getBookingsForUser( + ownerId = employee.id, + bookingsFilter = bookingsFilter, + coroutineScope = this) .collect{newList -> withContext(Dispatchers.Main){ - dispatch(Msg.ProfileData(user = employee, reservedSeats = newList)) - } } + dispatch(Msg.ProfileData( + user = employee, + reservedSeatsList = newList, + filtrationOnReserves = !(filtration.workPlace && filtration.meetRoom))) + } + } } } } diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/MainScreen.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/MainScreen.kt index e25ccfb5..da1a80e8 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/MainScreen.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/MainScreen.kt @@ -32,6 +32,7 @@ import band.effective.office.elevator.MainRes import band.effective.office.elevator.components.ModalCalendar import band.effective.office.elevator.components.TitlePage import band.effective.office.elevator.successGreen +import band.effective.office.elevator.ui.employee.aboutEmployee.models.BookingsFilter import band.effective.office.elevator.ui.main.components.BookingInformation import band.effective.office.elevator.ui.main.components.BottomDialog import band.effective.office.elevator.ui.main.components.ElevatorUIComponent @@ -40,7 +41,6 @@ import band.effective.office.elevator.ui.models.ReservedSeat import dev.icerock.moko.resources.StringResource import dev.icerock.moko.resources.compose.stringResource import kotlinx.coroutines.delay -import kotlinx.coroutines.launch @OptIn(ExperimentalMaterialApi::class) @Composable @@ -100,7 +100,7 @@ fun MainScreen(component: MainComponent) { }, onClickOpenCalendar = { component.onEvent(MainStore.Intent.OnClickOpenCalendar) }, onClickOpenBottomDialog = { component.onEvent(MainStore.Intent.OpenFiltersBottomDialog) }, - onClickCloseBottomDialog = { component.onEvent(MainStore.Intent.CloseFiltersBottomDialog)} + onClickCloseBottomDialog = { component.onEvent(MainStore.Intent.CloseFiltersBottomDialog(it))} ) if (showModalCalendar) { ModalCalendar( @@ -156,7 +156,7 @@ fun MainScreenContent( onClickShowOptions: () -> Unit, onClickOpenCalendar: () -> Unit, onClickOpenBottomDialog: () -> Unit, - onClickCloseBottomDialog: () -> Unit + onClickCloseBottomDialog: (BookingsFilter) -> Unit ) { ModalBottomSheetLayout( sheetShape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), @@ -168,7 +168,6 @@ fun MainScreenContent( onClickCloseBottomDialog ) } - //,sheetPeekHeight = 0.dp ) { Column( modifier = modifier.fillMaxSize() diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BottomDialog.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BottomDialog.kt index 06b94481..bba89f32 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BottomDialog.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BottomDialog.kt @@ -33,10 +33,11 @@ import band.effective.office.elevator.components.EffectiveButton import band.effective.office.elevator.components.OutlinedPrimaryButton import band.effective.office.elevator.textInBorderGray import band.effective.office.elevator.textInBorderPurple +import band.effective.office.elevator.ui.employee.aboutEmployee.models.BookingsFilter import dev.icerock.moko.resources.compose.stringResource @Composable -fun BottomDialog(modifier: Modifier, title: String, onClickCloseBottomDialog:() -> Unit) { +fun BottomDialog(modifier: Modifier, title: String, onClickCloseBottomDialog:(BookingsFilter) -> Unit) { var isExpanded by remember { mutableStateOf(true) } var isExpandedScBtn by remember { mutableStateOf(true) } @@ -57,12 +58,12 @@ fun BottomDialog(modifier: Modifier, title: String, onClickCloseBottomDialog:() OutlinedIconButton( onClick = { if(isExpandedScBtn) isExpanded = !isExpanded }, border = BorderStroke(1.dp, if(isExpanded) textInBorderPurple else textInBorderGray),//ExtendedTheme.colors.purple_heart_800 - modifier = Modifier.fillMaxWidth(0.5f), + modifier = Modifier.weight(.1f), + shape = RoundedCornerShape(12.dp), ) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(vertical = 10.dp, horizontal = 12.dp), - horizontalArrangement = Arrangement.Center + modifier = Modifier.padding(vertical = 10.dp, horizontal = 12.dp) ) { Icon( imageVector = Icons.Rounded.Done, @@ -72,7 +73,7 @@ fun BottomDialog(modifier: Modifier, title: String, onClickCloseBottomDialog:() ) Spacer(modifier = Modifier.width(8.dp)) Text( - text = stringResource(MainRes.strings.workplace), + text = stringResource(MainRes.strings.meeting_room), color = if(isExpanded) textInBorderPurple else textInBorderGray, style = MaterialTheme.typography.body2, modifier = Modifier.fillMaxWidth() @@ -86,7 +87,7 @@ fun BottomDialog(modifier: Modifier, title: String, onClickCloseBottomDialog:() onClick = { if(isExpanded) isExpandedScBtn =!isExpandedScBtn}, border = BorderStroke(1.dp, if(isExpandedScBtn) textInBorderPurple else textInBorderGray), - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.weight(.1f), shape = RoundedCornerShape(12.dp), ) { Row( @@ -101,9 +102,10 @@ fun BottomDialog(modifier: Modifier, title: String, onClickCloseBottomDialog:() ) Spacer(modifier = Modifier.width(8.dp)) Text( - text = stringResource(MainRes.strings.meeting_room), + text = stringResource(MainRes.strings.workplace), color = if(isExpandedScBtn) textInBorderPurple else textInBorderGray, style = MaterialTheme.typography.body2, + modifier = Modifier.fillMaxWidth() ) } } @@ -127,7 +129,7 @@ fun BottomDialog(modifier: Modifier, title: String, onClickCloseBottomDialog:() Spacer(modifier = Modifier.width(16.dp)) EffectiveButton( buttonText = stringResource(MainRes.strings.ok), - onClick = onClickCloseBottomDialog, + onClick = { onClickCloseBottomDialog(BookingsFilter(isExpanded, isExpandedScBtn)) }, modifier = Modifier.weight(.1f), roundedCorner = 8.dp, contentPadding = 12.dp diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStore.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStore.kt index 980c20fa..212d6ac6 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStore.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStore.kt @@ -1,5 +1,6 @@ package band.effective.office.elevator.ui.main.store +import band.effective.office.elevator.ui.employee.aboutEmployee.models.BookingsFilter import band.effective.office.elevator.ui.models.ElevatorState import band.effective.office.elevator.ui.models.ReservedSeat import com.arkivanov.mvikotlin.core.store.Store @@ -20,7 +21,7 @@ interface MainStore : Store data class OnClickApplyDate(val date: LocalDate?) : Intent object OpenFiltersBottomDialog : Intent - object CloseFiltersBottomDialog : Intent + data class CloseFiltersBottomDialog(val bookingsFilter: BookingsFilter) : Intent object OnClickShowMap : Intent diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStoreFactory.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStoreFactory.kt index 548bca05..43e1477f 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStoreFactory.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStoreFactory.kt @@ -5,6 +5,7 @@ import band.effective.office.elevator.data.ApiResponse import band.effective.office.elevator.domain.useCase.ElevatorCallUseCase import band.effective.office.elevator.domain.useCase.GetBookingsUseCase import band.effective.office.elevator.expects.showToast +import band.effective.office.elevator.ui.employee.aboutEmployee.models.BookingsFilter import band.effective.office.elevator.ui.models.ElevatorState import band.effective.office.elevator.ui.models.ReservedSeat import band.effective.office.elevator.utils.getCurrentDate @@ -31,6 +32,9 @@ internal class MainStoreFactory( private val elevatorUseCase: ElevatorCallUseCase by inject() private val bookingsUseCase: GetBookingsUseCase by inject() + private var recentDate = LocalDate(2023,8,16) + private var filtration = BookingsFilter(meetRoom = true, workPlace = true) + private var updatedList = false @OptIn(ExperimentalMviKotlinApi::class) fun create(): MainStore = @@ -96,8 +100,9 @@ internal class MainStoreFactory( is MainStore.Intent.OnClickApplyDate -> { publish(MainStore.Label.CloseCalendar) + updatedList=true intent.date?.let { newDate -> - changeBookingsByDate(date = newDate) + changeBookingsByDate(date = newDate, bookingsFilter = filtration) } } @@ -120,9 +125,16 @@ internal class MainStoreFactory( } } - MainStore.Intent.CloseFiltersBottomDialog -> { + is MainStore.Intent.CloseFiltersBottomDialog -> { scope.launch { publish(MainStore.Label.CloseFiltersBottomDialog) + intent.bookingsFilter.let {bookingsFilter -> + if(updatedList){ + changeBookingsByDate(date=recentDate, bookingsFilter = bookingsFilter) + }else{ + getBookingsForUserByDate(date = getCurrentDate(), bookingsFilter = bookingsFilter) + } + } } } } @@ -130,7 +142,7 @@ internal class MainStoreFactory( override fun executeAction(action: Action, getState: () -> MainStore.State) { when (action) { - is Action.LoadBookings -> getBookingsForUserByDate(date = action.date) + is Action.LoadBookings -> getBookingsForUserByDate(date = action.date, bookingsFilter = filtration) } } @@ -175,10 +187,15 @@ internal class MainStoreFactory( } } - fun getBookingsForUserByDate(date: LocalDate) { + fun getBookingsForUserByDate(date: LocalDate, bookingsFilter: BookingsFilter) { + if(recentDate!=date) + recentDate=date + else + filtration=bookingsFilter + scope.launch(Dispatchers.IO) { bookingsUseCase - .getBookingsByDate(date = date, ownerId = "1L", coroutineScope = this) + .getBookingsByDate(date = date, ownerId = "1L", bookingsFilter = bookingsFilter, coroutineScope = this) .collect { bookings -> withContext(Dispatchers.Main) { dispatch(Msg.UpdateSeatsReservation(reservedSeats = bookings)) @@ -187,10 +204,15 @@ internal class MainStoreFactory( } } - fun changeBookingsByDate(date: LocalDate) { + fun changeBookingsByDate(date: LocalDate, bookingsFilter: BookingsFilter) { + if(recentDate!=date) + recentDate=date + else + filtration=bookingsFilter + scope.launch(Dispatchers.IO) { bookingsUseCase - .getBookingsByDate(date = date, ownerId = "1L", coroutineScope = this) + .getBookingsByDate(date = date, ownerId = "1L", bookingsFilter = bookingsFilter, coroutineScope = this) .collect { bookings -> withContext(Dispatchers.Main) { dispatch( diff --git a/composeApp/src/commonMain/resources/MR/base/strings_ru.xml b/composeApp/src/commonMain/resources/MR/base/strings_ru.xml index 8974994e..8f8f9b7a 100644 --- a/composeApp/src/commonMain/resources/MR/base/strings_ru.xml +++ b/composeApp/src/commonMain/resources/MR/base/strings_ru.xml @@ -84,8 +84,6 @@ Занять до Фильтры по категории - Рабочее место - Переговорка Сбросить Отмена @@ -159,5 +157,7 @@ Брони сотрудника Перевод У этого сотрудника пока нет бронирований + У этого сотрудника пока нет таких бронирований У этого сотрудника нет бронирований на этот день + У этого сотрудника нет таких бронирований на этот день diff --git a/composeApp/src/commonMain/resources/MR/en/strings_en.xml b/composeApp/src/commonMain/resources/MR/en/strings_en.xml index 802f1e07..b7dc1789 100644 --- a/composeApp/src/commonMain/resources/MR/en/strings_en.xml +++ b/composeApp/src/commonMain/resources/MR/en/strings_en.xml @@ -31,8 +31,6 @@ You dont have any bookings yet Filter by category - Working Place - Meeting Room Reset Cansel @@ -40,7 +38,7 @@ OK Type booking - Workplace + Working place Meeting room Booking period Suitable options @@ -146,5 +144,7 @@ Employee reservations Transfer This employee dont have any bookings yet + This employee dont have such bookings yet This employee dont have bookings on this date + This employee dont have such bookings on this date -- GitLab From be6e2e3dc3075c23c573c8b6b891aacebb6a0752 Mon Sep 17 00:00:00 2001 From: Roman194 Date: Tue, 15 Aug 2023 13:15:14 +0600 Subject: [PATCH 2/5] DateSelection was modified to looks like latest design version --- .../employee/aboutEmployee/AboutEmployee.kt | 14 ++++++++-- .../store/AboutEmployeeStoreFactory.kt | 7 +++-- .../office/elevator/ui/main/MainScreen.kt | 7 +++++ .../ui/main/components/BookingInformation.kt | 10 ++++++- .../ui/main/components/DateSelection.kt | 27 +++++++++++++++---- .../elevator/ui/main/store/MainStore.kt | 3 ++- .../ui/main/store/MainStoreFactory.kt | 14 ++++++---- .../resources/MR/base/strings_ru.xml | 1 + .../commonMain/resources/MR/en/strings_en.xml | 1 + 9 files changed, 68 insertions(+), 16 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployee.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployee.kt index 2b0d34d4..8cd3d39c 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployee.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployee.kt @@ -56,6 +56,7 @@ import band.effective.office.elevator.ui.main.components.FilterButton import band.effective.office.elevator.ui.models.ReservedSeat import dev.icerock.moko.resources.compose.painterResource import dev.icerock.moko.resources.compose.stringResource +import kotlinx.datetime.LocalDate @OptIn(ExperimentalMaterialApi::class) @Composable @@ -91,6 +92,7 @@ fun AboutEmployee (component: AboutEmployeeComponent){ reservedSeatsList = state.reservedSeatsList, dateFiltrationOnReserves = state.dateFiltrationOnReserves, filtrationOnReserves = state.filtrationOnReserves, + currentDate = state.currentDate, bottomSheetState = bottomSheetState, onClickOpenPhone = { component.onEvent(AboutEmployeeStore.Intent.TelephoneClicked) }, onClickOpenTelegram = { component.onEvent(AboutEmployeeStore.Intent.TelegramClicked) }, @@ -126,6 +128,7 @@ private fun AboutEmployeeContent( dateFiltrationOnReserves: Boolean, filtrationOnReserves: Boolean, bottomSheetState: ModalBottomSheetState, + currentDate: LocalDate, onClickBack: () -> Unit, onClickOpenPhone: () ->Unit, onClickOpenTelegram: () ->Unit, @@ -243,8 +246,15 @@ private fun AboutEmployeeContent( horizontalArrangement = Arrangement.spacedBy(16.dp, Alignment.End), verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth()){ - CalendarTitle(onClickOpenCalendar = onClickOpenCalendar) - FilterButton(onClickOpenBottomSheetDialog = onClickOpenBottomDialog) + CalendarTitle( + onClickOpenCalendar = onClickOpenCalendar, + fromMainScreen = false, + currentDate = currentDate, + dateFiltration = dateFiltrationOnReserves + ) + FilterButton( + onClickOpenBottomSheetDialog = onClickOpenBottomDialog + ) } } if(reservedSeatsList.isEmpty()){ diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStoreFactory.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStoreFactory.kt index 7bbf1ce9..5032e6e6 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStoreFactory.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStoreFactory.kt @@ -41,7 +41,7 @@ class AboutEmployeeStoreFactory(private val storeFactory: StoreFactory, private mokValueUser, reservedSeatsList = listOf(), currentDate = getCurrentDate(), - dateFiltrationOnReserves = false, + dateFiltrationOnReserves = datedList, filtrationOnReserves = false ), bootstrapper = coroutineBootstrapper { @@ -64,6 +64,7 @@ class AboutEmployeeStoreFactory(private val storeFactory: StoreFactory, private ) is Msg.UpdateSeatsReservation -> { copy( + currentDate=msg.date, reservedSeatsList = msg.reservedSeatsList, dateFiltrationOnReserves=msg.dateFiltrationOnReserves, filtrationOnReserves = msg.filtrationOnReserves) @@ -81,6 +82,7 @@ class AboutEmployeeStoreFactory(private val storeFactory: StoreFactory, private val reservedSeatsList: List, val filtrationOnReserves: Boolean) : Msg data class UpdateSeatsReservation( + val date: LocalDate, val reservedSeatsList: List, val dateFiltrationOnReserves: Boolean, val filtrationOnReserves: Boolean) : Msg @@ -162,8 +164,9 @@ class AboutEmployeeStoreFactory(private val storeFactory: StoreFactory, private coroutineScope = this) .collect{newList -> withContext(Dispatchers.Main){ dispatch(Msg.UpdateSeatsReservation( + date=recentDate, reservedSeatsList = newList, - dateFiltrationOnReserves = true, + dateFiltrationOnReserves = datedList, filtrationOnReserves = !(filtration.workPlace && filtration.meetRoom))) } } diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/MainScreen.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/MainScreen.kt index da1a80e8..4ee48433 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/MainScreen.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/MainScreen.kt @@ -41,6 +41,7 @@ import band.effective.office.elevator.ui.models.ReservedSeat import dev.icerock.moko.resources.StringResource import dev.icerock.moko.resources.compose.stringResource import kotlinx.coroutines.delay +import kotlinx.datetime.LocalDate @OptIn(ExperimentalMaterialApi::class) @Composable @@ -88,6 +89,8 @@ fun MainScreen(component: MainComponent) { MainScreenContent( reservedSeats = state.reservedSeats, bottomSheetState = bottomSheetState, + currentDate = state.currentDate, + dateFiltrationOnReserves = state.dateFiltrationOnReserves, onClickBook = { component.onOutput(MainComponent.Output.OpenBookingScreen) }, onClickShowOptions = { component.onEvent(MainStore.Intent.OnClickShowOption) }, onClickOptionMenu = { index -> @@ -151,6 +154,8 @@ fun MainScreenContent( modifier: Modifier = Modifier, bottomSheetState: ModalBottomSheetState, reservedSeats: List, + currentDate: LocalDate, + dateFiltrationOnReserves: Boolean, onClickBook: () -> Unit, onClickOptionMenu: (Int) -> Unit, onClickShowOptions: () -> Unit, @@ -193,6 +198,8 @@ fun MainScreenContent( ) { BookingInformation( reservedSeats = reservedSeats, + currentDate = currentDate, + dateFiltrationOnReserves = dateFiltrationOnReserves, onClickBook = onClickBook, onClickOptionMenu = onClickOptionMenu, onClickShowOptions = onClickShowOptions, diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BookingInformation.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BookingInformation.kt index 81431edc..89bd3a52 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BookingInformation.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BookingInformation.kt @@ -8,10 +8,13 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import band.effective.office.elevator.ui.models.ReservedSeat +import kotlinx.datetime.LocalDate @Composable fun BookingInformation( reservedSeats: List, + currentDate: LocalDate, + dateFiltrationOnReserves: Boolean, onClickBook: () -> Unit, onClickOptionMenu: (Int) -> Unit, onClickShowOptions: () -> Unit, @@ -23,7 +26,12 @@ fun BookingInformation( .fillMaxSize() ) { Spacer(modifier = Modifier.height(24.dp)) - DateSelection(onClickOpenCalendar = onClickOpenCalendar, onClickOpenBottomDialog = onClickOpenBottomDialog) + DateSelection( + onClickOpenCalendar = onClickOpenCalendar, + onClickOpenBottomDialog = onClickOpenBottomDialog, + currentDate = currentDate, + dateFiltration = dateFiltrationOnReserves + ) Spacer(modifier = Modifier.height(24.dp)) SeatsReservation( reservedSeats = reservedSeats, diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/DateSelection.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/DateSelection.kt index 3727d083..3a90abe8 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/DateSelection.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/DateSelection.kt @@ -20,9 +20,10 @@ import androidx.compose.ui.unit.sp import band.effective.office.elevator.MainRes import dev.icerock.moko.resources.compose.painterResource import dev.icerock.moko.resources.compose.stringResource +import kotlinx.datetime.LocalDate @Composable -fun DateSelection(onClickOpenCalendar: () -> Unit, onClickOpenBottomDialog: () -> Unit) { +fun DateSelection(onClickOpenCalendar: () -> Unit, onClickOpenBottomDialog: () -> Unit, currentDate: LocalDate, dateFiltration: Boolean) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, @@ -41,14 +42,21 @@ fun DateSelection(onClickOpenCalendar: () -> Unit, onClickOpenBottomDialog: () - verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth() ) { - CalendarTitle(onClickOpenCalendar = onClickOpenCalendar) - FilterButton(onClickOpenBottomSheetDialog = onClickOpenBottomDialog) + CalendarTitle( + onClickOpenCalendar = onClickOpenCalendar, + fromMainScreen = true, + currentDate = currentDate, + dateFiltration = dateFiltration + ) + FilterButton( + onClickOpenBottomSheetDialog = onClickOpenBottomDialog + ) } } } @Composable -fun CalendarTitle(onClickOpenCalendar: () -> Unit) { +fun CalendarTitle(onClickOpenCalendar: () -> Unit, fromMainScreen: Boolean, currentDate: LocalDate, dateFiltration: Boolean) { Row( modifier = Modifier .clickable { onClickOpenCalendar() }, @@ -60,7 +68,16 @@ fun CalendarTitle(onClickOpenCalendar: () -> Unit) { ) Spacer(modifier = Modifier.width(8.dp)) Text( - text = stringResource(MainRes.strings.by_date), + text = + if(dateFiltration) + if(currentDate.dayOfMonth<10) "0" else {""} + "${currentDate.dayOfMonth}." + + if(currentDate.monthNumber<10) "0" else {""} + "${currentDate.monthNumber}" + else{ + stringResource( + if (fromMainScreen) MainRes.strings.on_today + else MainRes.strings.by_date + ) + }, color = MaterialTheme.colors.secondaryVariant, fontSize = 15.sp ) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStore.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStore.kt index 212d6ac6..8dd2feae 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStore.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStore.kt @@ -49,7 +49,8 @@ interface MainStore : Store data class State( val reservedSeats: List, val elevatorState: ElevatorState, - val currentDate: LocalDate + val currentDate: LocalDate, + val dateFiltrationOnReserves: Boolean ) data class ErrorState(val message: StringResource) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStoreFactory.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStoreFactory.kt index 43e1477f..58910c08 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStoreFactory.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/store/MainStoreFactory.kt @@ -44,7 +44,8 @@ internal class MainStoreFactory( initialState = MainStore.State( elevatorState = ElevatorState.Below, reservedSeats = listOf(), - currentDate = getCurrentDate() + currentDate = getCurrentDate(), + dateFiltrationOnReserves = updatedList ), executorFactory = ::ExecutorImpl, reducer = ReducerImpl, @@ -64,7 +65,8 @@ internal class MainStoreFactory( data class UpdateSeatReservationByDate( val date: LocalDate, - val reservedSeats: List + val reservedSeats: List, + val dateFiltrationOnReserves: Boolean ) : Msg } @@ -217,8 +219,9 @@ internal class MainStoreFactory( withContext(Dispatchers.Main) { dispatch( Msg.UpdateSeatReservationByDate( - date = date, - reservedSeats = bookings + date = recentDate, + reservedSeats = bookings, + dateFiltrationOnReserves = updatedList ) ) } @@ -235,7 +238,8 @@ internal class MainStoreFactory( is Msg.UpdateSeatsReservation -> copy(reservedSeats = message.reservedSeats) is Msg.UpdateSeatReservationByDate -> copy( currentDate = message.date, - reservedSeats = message.reservedSeats + reservedSeats = message.reservedSeats, + dateFiltrationOnReserves = message.dateFiltrationOnReserves ) } } diff --git a/composeApp/src/commonMain/resources/MR/base/strings_ru.xml b/composeApp/src/commonMain/resources/MR/base/strings_ru.xml index 8f8f9b7a..c7f7b013 100644 --- a/composeApp/src/commonMain/resources/MR/base/strings_ru.xml +++ b/composeApp/src/commonMain/resources/MR/base/strings_ru.xml @@ -35,6 +35,7 @@ Поднять По дате + На сегодня Карта Забронировать место Брони diff --git a/composeApp/src/commonMain/resources/MR/en/strings_en.xml b/composeApp/src/commonMain/resources/MR/en/strings_en.xml index b7dc1789..7c1a0d13 100644 --- a/composeApp/src/commonMain/resources/MR/en/strings_en.xml +++ b/composeApp/src/commonMain/resources/MR/en/strings_en.xml @@ -25,6 +25,7 @@ telegramnick By date + On today Show on map Book a seat Bookings -- GitLab From 1628e71965bd2afd10133c6fec7d730046aca9f6 Mon Sep 17 00:00:00 2001 From: Roman194 Date: Tue, 15 Aug 2023 14:40:44 +0600 Subject: [PATCH 3/5] ExtendedThemeColors.colors.purple_heart_800 was used instead of textInBorderPurple --- .../office/elevator/ui/main/components/BottomDialog.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BottomDialog.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BottomDialog.kt index bba89f32..f28e486d 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BottomDialog.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BottomDialog.kt @@ -32,7 +32,6 @@ import band.effective.office.elevator.MainRes import band.effective.office.elevator.components.EffectiveButton import band.effective.office.elevator.components.OutlinedPrimaryButton import band.effective.office.elevator.textInBorderGray -import band.effective.office.elevator.textInBorderPurple import band.effective.office.elevator.ui.employee.aboutEmployee.models.BookingsFilter import dev.icerock.moko.resources.compose.stringResource @@ -57,7 +56,7 @@ fun BottomDialog(modifier: Modifier, title: String, onClickCloseBottomDialog:(B ) { OutlinedIconButton( onClick = { if(isExpandedScBtn) isExpanded = !isExpanded }, - border = BorderStroke(1.dp, if(isExpanded) textInBorderPurple else textInBorderGray),//ExtendedTheme.colors.purple_heart_800 + border = BorderStroke(1.dp, if(isExpanded) ExtendedTheme.colors.purple_heart_800 else textInBorderGray), modifier = Modifier.weight(.1f), shape = RoundedCornerShape(12.dp), ) { @@ -74,7 +73,7 @@ fun BottomDialog(modifier: Modifier, title: String, onClickCloseBottomDialog:(B Spacer(modifier = Modifier.width(8.dp)) Text( text = stringResource(MainRes.strings.meeting_room), - color = if(isExpanded) textInBorderPurple else textInBorderGray, + color = if(isExpanded) ExtendedTheme.colors.purple_heart_800 else textInBorderGray, style = MaterialTheme.typography.body2, modifier = Modifier.fillMaxWidth() ) @@ -86,7 +85,7 @@ fun BottomDialog(modifier: Modifier, title: String, onClickCloseBottomDialog:(B OutlinedIconButton( onClick = { if(isExpanded) isExpandedScBtn =!isExpandedScBtn}, - border = BorderStroke(1.dp, if(isExpandedScBtn) textInBorderPurple else textInBorderGray), + border = BorderStroke(1.dp, if(isExpandedScBtn) ExtendedTheme.colors.purple_heart_800 else textInBorderGray), modifier = Modifier.weight(.1f), shape = RoundedCornerShape(12.dp), ) { @@ -103,7 +102,7 @@ fun BottomDialog(modifier: Modifier, title: String, onClickCloseBottomDialog:(B Spacer(modifier = Modifier.width(8.dp)) Text( text = stringResource(MainRes.strings.workplace), - color = if(isExpandedScBtn) textInBorderPurple else textInBorderGray, + color = if(isExpandedScBtn) ExtendedTheme.colors.purple_heart_800 else textInBorderGray, style = MaterialTheme.typography.body2, modifier = Modifier.fillMaxWidth() ) -- GitLab From 82cf3f234da98387512e967561de77c7cdead67d Mon Sep 17 00:00:00 2001 From: Roman194 Date: Tue, 15 Aug 2023 14:44:51 +0600 Subject: [PATCH 4/5] ExtendedThemeColors.colors.purple_heart_700 was used instead of borderPurple --- .../elevator/ui/employee/allEmployee/EmployeeScreen.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeScreen.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeScreen.kt index c002d37b..fb9659dd 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeScreen.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeScreen.kt @@ -40,10 +40,10 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import band.effective.office.elevator.ExtendedTheme import band.effective.office.elevator.MainRes import band.effective.office.elevator.borderGray import band.effective.office.elevator.borderGreen -import band.effective.office.elevator.borderPurple import band.effective.office.elevator.textInBorderGray import band.effective.office.elevator.textInBorderPurple import band.effective.office.elevator.theme_light_background @@ -201,8 +201,8 @@ fun EveryEmployeeCard(emp: EmployeeCard, onCardClick: (String) -> Unit) { } else { if (emp.state == "Will be today") { - stateColorBorder = borderPurple - stateColorText = textInBorderPurple + stateColorBorder = ExtendedTheme.colors.purple_heart_700 + stateColorText = ExtendedTheme.colors.purple_heart_800 } else { stateColorBorder = borderGray stateColorText = textInBorderGray -- GitLab From e92cac2aa7b3aa3d404fee5c39bba69fb771c244 Mon Sep 17 00:00:00 2001 From: Roman194 Date: Tue, 15 Aug 2023 15:02:48 +0600 Subject: [PATCH 5/5] The conflict after update from the mobileApp with ExtendedThemeColors was solved --- .../ui/employee/aboutEmployee/AboutEmployee.kt | 1 + .../elevator/ui/main/components/BottomDialog.kt | 14 +++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployee.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployee.kt index bf74733c..2780fa5a 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployee.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployee.kt @@ -239,6 +239,7 @@ private fun AboutEmployeeContent( ){ Text( text = stringResource(MainRes.strings.upcoming_bookings), + color = ExtendedThemeColors.colors.blackColor, style = MaterialTheme.typography.body1, modifier = Modifier.padding(vertical = 24.dp).padding(end = 16.dp), fontWeight = FontWeight(500) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BottomDialog.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BottomDialog.kt index 6774d114..77cd1322 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BottomDialog.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/main/components/BottomDialog.kt @@ -27,7 +27,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp -import band.effective.office.elevator.ExtendedTheme +import band.effective.office.elevator.ExtendedThemeColors import band.effective.office.elevator.MainRes import band.effective.office.elevator.components.EffectiveButton import band.effective.office.elevator.components.OutlinedPrimaryButton @@ -56,7 +56,7 @@ fun BottomDialog(modifier: Modifier, title: String, onClickCloseBottomDialog:(B ) { OutlinedIconButton( onClick = { if(isExpandedScBtn) isExpanded = !isExpanded }, - border = BorderStroke(1.dp, if(isExpanded) ExtendedTheme.colors.purple_heart_800 else textInBorderGray), + border = BorderStroke(1.dp, if(isExpanded) ExtendedThemeColors.colors.purple_heart_800 else textInBorderGray), modifier = Modifier.weight(.1f), shape = RoundedCornerShape(12.dp), ) { @@ -67,13 +67,13 @@ fun BottomDialog(modifier: Modifier, title: String, onClickCloseBottomDialog:(B Icon( imageVector = Icons.Rounded.Done, contentDescription = "done button", - tint = ExtendedTheme.colors.purple_heart_800, + tint = ExtendedThemeColors.colors.purple_heart_800, modifier = Modifier.size(if(isExpanded) 24.dp else 0.dp), ) Spacer(modifier = Modifier.width(8.dp)) Text( text = stringResource(MainRes.strings.meeting_room), - color = if(isExpanded) ExtendedTheme.colors.purple_heart_800 else textInBorderGray, + color = if(isExpanded) ExtendedThemeColors.colors.purple_heart_800 else textInBorderGray, style = MaterialTheme.typography.body2, modifier = Modifier.fillMaxWidth() ) @@ -85,7 +85,7 @@ fun BottomDialog(modifier: Modifier, title: String, onClickCloseBottomDialog:(B OutlinedIconButton( onClick = { if(isExpanded) isExpandedScBtn =!isExpandedScBtn}, - border = BorderStroke(1.dp, if(isExpandedScBtn) ExtendedTheme.colors.purple_heart_800 else textInBorderGray), + border = BorderStroke(1.dp, if(isExpandedScBtn) ExtendedThemeColors.colors.purple_heart_800 else textInBorderGray), modifier = Modifier.weight(.1f), shape = RoundedCornerShape(12.dp), ) { @@ -96,13 +96,13 @@ fun BottomDialog(modifier: Modifier, title: String, onClickCloseBottomDialog:(B Icon( imageVector = Icons.Rounded.Done, contentDescription = "done button", - tint = ExtendedTheme.colors.purple_heart_800, + tint = ExtendedThemeColors.colors.purple_heart_800, modifier = Modifier.size(if (isExpandedScBtn)24.dp else 0.dp), ) Spacer(modifier = Modifier.width(8.dp)) Text( text = stringResource(MainRes.strings.workplace), - color = if(isExpandedScBtn) ExtendedTheme.colors.purple_heart_800 else textInBorderGray, + color = if(isExpandedScBtn) ExtendedThemeColors.colors.purple_heart_800 else textInBorderGray, style = MaterialTheme.typography.body2, modifier = Modifier.fillMaxWidth() ) -- GitLab