Skip to content

Commit ccb0e20

Browse files
authored
Forms: DateTimeFieldState refactor (#133)
* init refactor * textareainput show done button even if field is empty * introduced classes to wrap common parameters * Update FormElements.kt * working remembersaveable * added remembersaveable outside lazycolumn * added id for formfieldelement * optimized imports * undo changes * optimized more imports * updated field element to not remember datetimefieldstate * migrated DateTimeFieldState to use BaseFieldState * added saver to DateTimeFieldState * update doc
1 parent ac0139d commit ccb0e20

File tree

5 files changed

+174
-195
lines changed

5 files changed

+174
-195
lines changed

toolkit/featureforms/src/main/java/com/arcgismaps/toolkit/featureforms/FeatureForm.kt

+20-5
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,15 @@ import androidx.compose.ui.text.font.FontWeight
3030
import androidx.compose.ui.tooling.preview.Preview
3131
import androidx.compose.ui.unit.dp
3232
import com.arcgismaps.mapping.featureforms.ComboBoxFormInput
33+
import com.arcgismaps.mapping.featureforms.DateTimePickerFormInput
3334
import com.arcgismaps.mapping.featureforms.FeatureForm
3435
import com.arcgismaps.mapping.featureforms.FieldFormElement
3536
import com.arcgismaps.mapping.featureforms.TextAreaFormInput
3637
import com.arcgismaps.mapping.featureforms.TextBoxFormInput
3738
import com.arcgismaps.toolkit.featureforms.components.FieldElement
3839
import com.arcgismaps.toolkit.featureforms.components.base.BaseFieldState
3940
import com.arcgismaps.toolkit.featureforms.components.combo.rememberComboBoxFieldState
41+
import com.arcgismaps.toolkit.featureforms.components.datetime.rememberDateTimeFieldState
4042
import com.arcgismaps.toolkit.featureforms.components.text.rememberFormTextFieldState
4143
import kotlinx.coroutines.CoroutineScope
4244
import java.util.Objects
@@ -126,11 +128,12 @@ internal fun FeatureFormContent(
126128
items(form.elements) { formElement ->
127129
if (formElement is FieldFormElement) {
128130
val state = states[formElement.id]
129-
FieldElement(
130-
field = formElement,
131-
form = form,
132-
state = state
133-
)
131+
if (state != null) {
132+
FieldElement(
133+
field = formElement,
134+
state = state
135+
)
136+
}
134137
}
135138
}
136139
}
@@ -170,6 +173,18 @@ private fun rememberFieldStates(
170173
)
171174
}
172175

176+
is DateTimePickerFormInput -> {
177+
val input = fieldElement.input as DateTimePickerFormInput
178+
rememberDateTimeFieldState(
179+
field = fieldElement,
180+
minEpochMillis = input.min?.toEpochMilli(),
181+
maxEpochMillis = input.max?.toEpochMilli(),
182+
shouldShowTime = input.includeTime,
183+
form = form,
184+
scope = scope
185+
)
186+
}
187+
173188
is ComboBoxFormInput -> {
174189
rememberComboBoxFieldState(
175190
field = fieldElement,

toolkit/featureforms/src/main/java/com/arcgismaps/toolkit/featureforms/components/FormElements.kt

+4-16
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.arcgismaps.toolkit.featureforms.components
33
import androidx.compose.runtime.Composable
44
import androidx.compose.runtime.collectAsState
55
import androidx.compose.runtime.getValue
6-
import androidx.compose.runtime.rememberCoroutineScope
76
import com.arcgismaps.mapping.featureforms.ComboBoxFormInput
87
import com.arcgismaps.mapping.featureforms.DateTimePickerFormInput
98
import com.arcgismaps.mapping.featureforms.FeatureForm
@@ -20,31 +19,20 @@ import com.arcgismaps.toolkit.featureforms.components.text.FormTextField
2019
import com.arcgismaps.toolkit.featureforms.components.text.FormTextFieldState
2120

2221
@Composable
23-
internal fun FieldElement(field: FieldFormElement, form: FeatureForm, state: BaseFieldState?) {
22+
internal fun FieldElement(field: FieldFormElement, state: BaseFieldState) {
2423
val visible by field.isVisible.collectAsState()
25-
val scope = rememberCoroutineScope()
2624
if (visible) {
2725
when (field.input) {
2826
is TextBoxFormInput, is TextAreaFormInput -> {
29-
state?.let {
30-
FormTextField(state = state as FormTextFieldState)
31-
}
27+
FormTextField(state = state as FormTextFieldState)
3228
}
3329

3430
is DateTimePickerFormInput -> {
35-
DateTimeField(
36-
state = DateTimeFieldState(
37-
formElement = field,
38-
form = form,
39-
scope = scope
40-
)
41-
)
31+
DateTimeField(state = state as DateTimeFieldState)
4232
}
4333

4434
is ComboBoxFormInput -> {
45-
state?.let {
46-
ComboBoxField(state = state as ComboBoxFieldState)
47-
}
35+
ComboBoxField(state = state as ComboBoxFieldState)
4836
}
4937

5038
else -> { /* TO-DO: add support for other input types */

toolkit/featureforms/src/main/java/com/arcgismaps/toolkit/featureforms/components/datetime/DateTimeField.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ internal fun DateTimeField(
6666
) {
6767
val isEditable by state.isEditable.collectAsState()
6868
val isRequired by state.isRequired.collectAsState()
69-
val epochMillis by state.value.collectAsState()
69+
val epochMillis by state.epochMillis.collectAsState()
7070

7171
val shouldShowTime = remember {
7272
state.shouldShowTime
@@ -151,7 +151,7 @@ internal fun DateTimeField(
151151
trailingIcon = {
152152
if (epochMillis != null) {
153153
IconButton(
154-
onClick = { state.clearValue() },
154+
onClick = { state.onValueChanged("") },
155155
modifier = Modifier.semantics {
156156
contentDescription = "Clear text button"
157157
}
@@ -214,7 +214,7 @@ internal fun DateTimeField(
214214
onDismissRequest = { openDialog = false },
215215
onCancelled = { openDialog = false },
216216
onConfirmed = {
217-
state.setValue(pickerState.selectedDateTimeMillis)
217+
state.onValueChanged(pickerState.selectedDateTimeMillis.toString())
218218
openDialog = false
219219
})
220220
}

0 commit comments

Comments
 (0)