From f81033e46eb67b0660666f503cf3dd60524a0de0 Mon Sep 17 00:00:00 2001 From: Hitesh Kumar Date: Tue, 12 Sep 2023 17:08:28 +0530 Subject: [PATCH] =?UTF-8?q?TP-40579=20add=20on=20max=20char=20reached=20an?= =?UTF-8?q?d=20on=20click=20action=20in=20custom=20text=20f=E2=80=A6=20(#1?= =?UTF-8?q?70)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/uitron/demo/playground/Playground.kt | 4 +- .../uitron/model/data/CustomTextFieldData.kt | 2 + .../uitron/render/CustomTextFieldRenderer.kt | 133 ++++++++++++------ 3 files changed, 95 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/com/uitron/demo/playground/Playground.kt b/app/src/main/java/com/uitron/demo/playground/Playground.kt index 0666903..2979402 100644 --- a/app/src/main/java/com/uitron/demo/playground/Playground.kt +++ b/app/src/main/java/com/uitron/demo/playground/Playground.kt @@ -47,16 +47,18 @@ fun PlayGroundScreen() { .fillMaxSize() ) { if (fieldValue.value.isEmpty().not()) { + var errorMessage = "Error In Config" val uiTronResponse: UiTronResponse? = try { stringToUiTronResponse(rawString = fieldValue.value) } catch (e: Exception) { + errorMessage = e.toString() null } uiTronResponse?.let { UiTronRenderer(uiTronResponse.data, uiTronViewModel = UiTronViewModel()) .Render(composeViews = uiTronResponse.parentComposeView.orEmpty()) } ?: kotlin.run { - Text(text = "Error In Config", color = Color.Red) + Text(text = errorMessage, color = Color.Red) } } } diff --git a/navi-uitron/src/main/java/com/navi/uitron/model/data/CustomTextFieldData.kt b/navi-uitron/src/main/java/com/navi/uitron/model/data/CustomTextFieldData.kt index a509b3f..d910759 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/model/data/CustomTextFieldData.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/model/data/CustomTextFieldData.kt @@ -4,6 +4,7 @@ data class CustomTextFieldData( var hint: String? = null, var onValueChangeAction: UiTronActionData? = null, var onInputValueChangeAction: UiTronActionData? = null, + var onMaxCharReachedAction: UiTronActionData? = null, var inputText: String? = null, var hasError: Boolean? = null, var errorMessage: String? = null, @@ -15,6 +16,7 @@ data class CustomTextFieldData( hint = data?.hint ?: hint onValueChangeAction = data?.onValueChangeAction ?: onValueChangeAction onInputValueChangeAction = data?.onInputValueChangeAction ?: onInputValueChangeAction + onMaxCharReachedAction = data?.onMaxCharReachedAction ?: onMaxCharReachedAction inputText = data?.inputText ?: inputText hasError = data?.hasError ?: hasError errorMessage = data?.errorMessage ?: errorMessage diff --git a/navi-uitron/src/main/java/com/navi/uitron/render/CustomTextFieldRenderer.kt b/navi-uitron/src/main/java/com/navi/uitron/render/CustomTextFieldRenderer.kt index d25592c..f5c024c 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/render/CustomTextFieldRenderer.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/render/CustomTextFieldRenderer.kt @@ -27,6 +27,7 @@ import com.navi.uitron.model.data.UiTronData import com.navi.uitron.model.ui.* import com.navi.uitron.utils.ShapeUtil import com.navi.uitron.viewmodel.UiTronViewModel +import customClickable import getContentAlignment import getDataId import getInputId @@ -74,15 +75,22 @@ class CustomTextFieldRenderer( customTextFieldData = customTextFieldData?.copyNonNull(dataState.value) ?: dataState.value } - var inputValue by remember { - mutableStateOf(customTextFieldData?.inputText.orEmpty()) + val isTextTransformedValueUpdated = remember { + mutableStateOf(false) + } + var inputValue by remember(customTextFieldData?.inputText) { + val input = onInputValueChange( + input = customTextFieldData?.inputText.orEmpty(), + property = property, + customTextFieldData = customTextFieldData, + uiTronViewModel = uiTronViewModel, + isTextTransformedValueUpdated = isTextTransformedValueUpdated + ) + mutableStateOf(input) } var isFocused by remember { mutableStateOf(false) } - LaunchedEffect(Unit) { - uiTronViewModel.handle[property.layoutId.getInputId()] = inputValue - } var borderColor by remember { mutableStateOf(property.colors?.unfocusedBorderColor) } @@ -120,7 +128,14 @@ class CustomTextFieldRenderer( shape = ShapeUtil.getShape(shape = property.rowProperty?.borderStrokeData?.shape) ) .setPadding(property.rowProperty?.padding ?: ComposePadding(10, 10, 10, 10)) - .alpha(property.alpha ?: 1.0f), + .alpha(property.alpha ?: 1.0f) + .customClickable( + { + uiTronViewModel.handleActions(customTextFieldData?.onClick) + }, + actions = customTextFieldData?.onClick?.actions, + property = property + ), verticalAlignment = getVerticalAlignment( property.rowProperty?.verticalAlignment ?: VerticalAlignmentType.CenterVertically.name @@ -184,44 +199,19 @@ class CustomTextFieldRenderer( ), value = inputValue, onValueChange = { input -> - val updatedInput = if (property.singleLine.orFalse()) { - input.replace("\n"," ") - } else { - input - } - if (!updatedInput.isInvalidInput(property.invalidCharRegex)) { - property.maxChar?.let { maxChar -> - if (maxChar >= updatedInput.length) { - inputValue = updatedInput - val transformedText = transformInput( - property.valueTransformation, - updatedInput - ) - customTextFieldData?.inputText = transformedText - uiTronViewModel.handle[property.layoutId.getInputId()] = - transformedText - if (property.applyValidationOnValueChange.orFalse() || customTextFieldData?.hasError == true) { - uiTronViewModel.handleActions(customTextFieldData?.onValueChangeAction) - } - } - } ?: run { - inputValue = updatedInput - val transformedText = transformInput( - property.valueTransformation, - updatedInput - ) - customTextFieldData?.inputText = transformedText - uiTronViewModel.handle[property.layoutId.getInputId()] = - transformedText - if (property.applyValidationOnValueChange.orFalse() || customTextFieldData?.hasError == true) { - uiTronViewModel.handleActions(customTextFieldData?.onValueChangeAction) - } - } - uiTronViewModel.handleActions(customTextFieldData?.onInputValueChangeAction) - } + val editedInput = onInputValueChange( + input = input, + property = property, + customTextFieldData = customTextFieldData, + uiTronViewModel = uiTronViewModel, + isTextTransformedValueUpdated = mutableStateOf(false) + ) + isTextTransformedValueUpdated.value = true + inputValue = editedInput }, singleLine = property.singleLine ?: false, - visualTransformation = property.visualTransformation?.getVisualTransformation() ?: VisualTransformation.None, + visualTransformation = property.visualTransformation?.getVisualTransformation() + ?: VisualTransformation.None, enabled = property.isEnabled ?: true, cursorBrush = SolidColor( property.cursorColor?.hexToComposeColor ?: Color.Gray @@ -258,6 +248,8 @@ class CustomTextFieldRenderer( } else if (inputValue.isNotNullAndNotEmpty()) { if (isFocused) { borderColor = property.colors?.focusedBorderColor + } else { + borderColor = property.colors?.unfocusedBorderColor } val successText = getTransformedText( property.successTextTransformation, @@ -277,4 +269,59 @@ class CustomTextFieldRenderer( } } } -} \ No newline at end of file + + private fun onInputValueChange( + input: String, + property: CustomTextFieldProperty, + customTextFieldData: CustomTextFieldData?, + uiTronViewModel: UiTronViewModel, + isTextTransformedValueUpdated: MutableState + ): String { + if (isTextTransformedValueUpdated.value && input == customTextFieldData?.inputText) { + isTextTransformedValueUpdated.value = false + return customTextFieldData.inputText.orEmpty() + } + val updatedInput = if (property.singleLine.orFalse()) { + input.replace("\n", " ") + } else { + input + } + var inputValue = updatedInput + if (!updatedInput.isInvalidInput(property.invalidCharRegex)) { + property.maxChar?.let { maxChar -> + if (maxChar >= updatedInput.length) { + inputValue = updatedInput + val transformedText = transformInput( + property.valueTransformation, + updatedInput + ) + customTextFieldData?.inputText = transformedText + uiTronViewModel.handle[property.layoutId.getInputId()] = + transformedText + if (property.applyValidationOnValueChange.orFalse() || customTextFieldData?.hasError == true) { + uiTronViewModel.handleActions(customTextFieldData?.onValueChangeAction) + } + if (maxChar == updatedInput.length) { + uiTronViewModel.handleActions(customTextFieldData?.onMaxCharReachedAction) + } + } else { + return customTextFieldData?.inputText.orEmpty() + } + } ?: run { + inputValue = updatedInput + val transformedText = transformInput( + property.valueTransformation, + updatedInput + ) + customTextFieldData?.inputText = transformedText + uiTronViewModel.handle[property.layoutId.getInputId()] = + transformedText + if (property.applyValidationOnValueChange.orFalse() || customTextFieldData?.hasError == true) { + uiTronViewModel.handleActions(customTextFieldData?.onValueChangeAction) + } + } + uiTronViewModel.handleActions(customTextFieldData?.onInputValueChangeAction) + } + return inputValue + } +}