diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4fc89af..4a6b22f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,7 +16,7 @@ android { minSdk = 26 targetSdk = 35 versionCode = 1 - versionName = "0.0.15" + versionName = "0.0.16" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/planify/mobile/data/local/dao/LabelDao.kt b/app/src/main/java/com/planify/mobile/data/local/dao/LabelDao.kt index e33d513..e1975b2 100644 --- a/app/src/main/java/com/planify/mobile/data/local/dao/LabelDao.kt +++ b/app/src/main/java/com/planify/mobile/data/local/dao/LabelDao.kt @@ -13,6 +13,9 @@ interface LabelDao { @Query("SELECT * FROM labels WHERE is_deleted = 0 ORDER BY `order` ASC") fun getAllLabels(): Flow> + @Query("SELECT * FROM labels WHERE is_deleted = 0 AND source_id = :sourceId ORDER BY `order` ASC") + fun getLabelsBySourceId(sourceId: String): Flow> + @Query("SELECT * FROM labels WHERE id = :id") suspend fun getById(id: String): LabelEntity? diff --git a/app/src/main/java/com/planify/mobile/data/repository/LabelRepositoryImpl.kt b/app/src/main/java/com/planify/mobile/data/repository/LabelRepositoryImpl.kt index 0cc7d01..f54db00 100644 --- a/app/src/main/java/com/planify/mobile/data/repository/LabelRepositoryImpl.kt +++ b/app/src/main/java/com/planify/mobile/data/repository/LabelRepositoryImpl.kt @@ -16,6 +16,9 @@ class LabelRepositoryImpl @Inject constructor( override fun getAllLabels(): Flow> = dao.getAllLabels().map { it.map { e -> e.toDomain() } } + override fun getLabelsByProject(projectId: String): Flow> = + dao.getLabelsBySourceId(projectId).map { it.map { e -> e.toDomain() } } + override suspend fun getLabelById(id: String): Label? = dao.getById(id)?.toDomain() override suspend fun insertLabel(label: Label) = dao.insert(label.toEntity()) override suspend fun updateLabel(label: Label) = dao.update(label.toEntity()) diff --git a/app/src/main/java/com/planify/mobile/domain/repository/LabelRepository.kt b/app/src/main/java/com/planify/mobile/domain/repository/LabelRepository.kt index f353d16..1102dc8 100644 --- a/app/src/main/java/com/planify/mobile/domain/repository/LabelRepository.kt +++ b/app/src/main/java/com/planify/mobile/domain/repository/LabelRepository.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.flow.Flow interface LabelRepository { fun getAllLabels(): Flow> + fun getLabelsByProject(projectId: String): Flow> suspend fun getLabelById(id: String): Label? suspend fun insertLabel(label: Label) suspend fun updateLabel(label: Label) diff --git a/app/src/main/java/com/planify/mobile/ui/task/LabelPickerSheet.kt b/app/src/main/java/com/planify/mobile/ui/task/LabelPickerSheet.kt index c667638..c2a79c1 100644 --- a/app/src/main/java/com/planify/mobile/ui/task/LabelPickerSheet.kt +++ b/app/src/main/java/com/planify/mobile/ui/task/LabelPickerSheet.kt @@ -28,31 +28,44 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel +import androidx.compose.runtime.LaunchedEffect import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.planify.mobile.domain.model.Label import com.planify.mobile.domain.repository.LabelRepository import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.stateIn import javax.inject.Inject @HiltViewModel class LabelPickerViewModel @Inject constructor( - labelRepository: LabelRepository, + private val labelRepository: LabelRepository, ) : ViewModel() { - val labels = labelRepository.getAllLabels() + private val _projectId = MutableStateFlow("") + val labels = _projectId + .flatMapLatest { projectId -> + if (projectId.isNotBlank()) labelRepository.getLabelsByProject(projectId) + else labelRepository.getAllLabels() + } .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList()) + + fun setProjectId(projectId: String) { _projectId.value = projectId } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun LabelPickerSheet( + projectId: String, selectedLabels: List, onConfirm: (List) -> Unit, onDismiss: () -> Unit, viewModel: LabelPickerViewModel = hiltViewModel(), ) { + LaunchedEffect(projectId) { viewModel.setProjectId(projectId) } + val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) val labels by viewModel.labels.collectAsState() var selected by remember { mutableStateOf(selectedLabels.toSet()) } diff --git a/app/src/main/java/com/planify/mobile/ui/task/TaskEditSheet.kt b/app/src/main/java/com/planify/mobile/ui/task/TaskEditSheet.kt index 63237a8..db13abd 100644 --- a/app/src/main/java/com/planify/mobile/ui/task/TaskEditSheet.kt +++ b/app/src/main/java/com/planify/mobile/ui/task/TaskEditSheet.kt @@ -194,6 +194,7 @@ fun TaskEditSheet( } if (showLabelPicker) { LabelPickerSheet( + projectId = projectId, selectedLabels = state.labels, onConfirm = { viewModel.setLabels(it); showLabelPicker = false }, onDismiss = { showLabelPicker = false },