From 84477695e044b787211e22a16a2f55dabb926e3b Mon Sep 17 00:00:00 2001 From: hue Date: Thu, 21 Sep 2023 16:28:20 -0400 Subject: [PATCH] Allow direct note input from create/edit Case --- .../feature/caseeditor/CaseEditorViewModel.kt | 20 +++++++++ .../caseeditor/model/NotesFlagsInputData.kt | 2 + .../caseeditor/ui/PropertyNotesFlagsView.kt | 45 ++++++++++--------- 3 files changed, 47 insertions(+), 20 deletions(-) diff --git a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/CaseEditorViewModel.kt b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/CaseEditorViewModel.kt index f3f5472a..e8d405c3 100644 --- a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/CaseEditorViewModel.kt +++ b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/CaseEditorViewModel.kt @@ -36,9 +36,11 @@ import com.crisiscleanup.core.model.data.Incident import com.crisiscleanup.core.model.data.LocalWorksite import com.crisiscleanup.core.model.data.WorkTypeStatus import com.crisiscleanup.core.model.data.Worksite +import com.crisiscleanup.core.model.data.WorksiteNote import com.crisiscleanup.feature.caseeditor.model.CaseDataWriter import com.crisiscleanup.feature.caseeditor.model.FormFieldsInputData import com.crisiscleanup.feature.caseeditor.model.LocationInputData +import com.crisiscleanup.feature.caseeditor.model.NotesFlagsInputData import com.crisiscleanup.feature.caseeditor.model.PropertyInputData import com.crisiscleanup.feature.caseeditor.model.coordinates import com.crisiscleanup.feature.caseeditor.navigation.CaseEditorArgs @@ -657,6 +659,24 @@ class CaseEditorViewModel @Inject constructor( } return false } + + (dataWriter as? NotesFlagsInputData)?.let { notesInputData -> + val editingNote = notesInputData.editingNote.trim() + var notes = worksite!!.notes + if (editingNote.isNotBlank() && + (notes.isEmpty() || notes.first().note.trim() != editingNote) + ) { + notes = notes.toMutableList() + .also { + val note = WorksiteNote.create().copy(note = editingNote) + it.add(0, note) + } + worksite = worksite!!.copy( + notes = notes, + ) + notesInputData.editingNote = "" + } + } } val workTypeLookup = editorState.incident.workTypeLookup diff --git a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/model/NotesFlagsInputData.kt b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/model/NotesFlagsInputData.kt index ec21df2d..fdcba2eb 100644 --- a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/model/NotesFlagsInputData.kt +++ b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/model/NotesFlagsInputData.kt @@ -24,6 +24,8 @@ class NotesFlagsInputData( val notesStream = snapshotFlow { notes.toList() } + var editingNote by mutableStateOf("") + private fun isChanged(notes: List, worksite: Worksite): Boolean { return notes != worksite.notes || isHighPriority != worksite.hasHighPriorityFlag || diff --git a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/PropertyNotesFlagsView.kt b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/PropertyNotesFlagsView.kt index 9660ebff..1b1ff58c 100644 --- a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/PropertyNotesFlagsView.kt +++ b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/PropertyNotesFlagsView.kt @@ -19,10 +19,13 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag +import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.crisiscleanup.core.designsystem.LocalAppTranslator +import com.crisiscleanup.core.designsystem.component.CrisisCleanupButton +import com.crisiscleanup.core.designsystem.component.CrisisCleanupTextArea import com.crisiscleanup.core.designsystem.component.CrisisCleanupTextButton import com.crisiscleanup.core.designsystem.theme.listItemHeight import com.crisiscleanup.core.designsystem.theme.listItemHorizontalPadding @@ -34,7 +37,6 @@ import com.crisiscleanup.core.model.data.WorksiteNote import com.crisiscleanup.core.model.data.hasSurvivorNote import com.crisiscleanup.feature.caseeditor.CaseNotesFlagsDataEditor import com.crisiscleanup.feature.caseeditor.EditCaseBaseViewModel -import com.crisiscleanup.feature.caseeditor.R @Composable internal fun PropertyNotesFlagsView( @@ -45,8 +47,6 @@ internal fun PropertyNotesFlagsView( val translator = LocalAppTranslator.current val isEditable = LocalCaseEditor.current.isEditable - var isCreatingNote by remember { mutableStateOf(false) } - val inputData = editor.notesFlagsInputData HighPriorityFlagInput(inputData, isEditable) @@ -104,25 +104,30 @@ internal fun PropertyNotesFlagsView( NoteView(note, modifier) } - val onAddNote = remember(viewModel) { { isCreatingNote = true } } - CrisisCleanupIconTextButton( - modifier = Modifier - .testTag("propertyAddNoteBtn") - .listItemHeight() - .fillMaxWidth(), - iconResId = R.drawable.ic_note, - label = translator("caseView.add_note"), - onClick = onAddNote, + val saveNote = remember(viewModel) { + { note: WorksiteNote -> editor.notesFlagsInputData.notes.add(0, note) } + } + CrisisCleanupTextArea( + text = inputData.editingNote, + onTextChange = { inputData.editingNote = it }, + modifier = listItemModifier, + label = { Text(translator("caseView.note")) }, enabled = isEditable, + imeAction = ImeAction.Default, + ) + CrisisCleanupButton( + onClick = { + val note = WorksiteNote.create().copy( + note = inputData.editingNote, + ) + saveNote(note) + inputData.editingNote = "" + // TODO Scroll to newly added note? + }, + modifier = listItemModifier, + text = translator("actions.add"), + enabled = isEditable && inputData.editingNote.isNotBlank(), ) - - if (isCreatingNote) { - val dismissNoteDialog = { isCreatingNote = false } - val saveNote = remember(viewModel) { - { note: WorksiteNote -> editor.notesFlagsInputData.notes.add(0, note) } - } - OnCreateNote(saveNote, dismissNoteDialog) - } if (showAllNotesDialog) { val dismissDialog = { showAllNotesDialog = false }