added error inputfield
This commit is contained in:
		
							parent
							
								
									7934154af9
								
							
						
					
					
						commit
						0b65c44da1
					
				
					 1 changed files with 93 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -1,11 +1,11 @@
 | 
			
		|||
package be.ugent.sel.studeez.common.composable
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.StringRes
 | 
			
		||||
import androidx.compose.foundation.layout.Column
 | 
			
		||||
import androidx.compose.foundation.layout.padding
 | 
			
		||||
import androidx.compose.foundation.text.KeyboardActions
 | 
			
		||||
import androidx.compose.foundation.text.KeyboardOptions
 | 
			
		||||
import androidx.compose.material.Icon
 | 
			
		||||
import androidx.compose.material.IconButton
 | 
			
		||||
import androidx.compose.material.OutlinedTextField
 | 
			
		||||
import androidx.compose.material.Text
 | 
			
		||||
import androidx.compose.material.*
 | 
			
		||||
import androidx.compose.material.icons.Icons
 | 
			
		||||
import androidx.compose.material.icons.filled.Email
 | 
			
		||||
import androidx.compose.material.icons.filled.Lock
 | 
			
		||||
| 
						 | 
				
			
			@ -14,10 +14,15 @@ import androidx.compose.runtime.*
 | 
			
		|||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.res.painterResource
 | 
			
		||||
import androidx.compose.ui.res.stringResource
 | 
			
		||||
import androidx.compose.ui.text.input.ImeAction
 | 
			
		||||
import androidx.compose.ui.text.input.KeyboardType
 | 
			
		||||
import androidx.compose.ui.text.input.PasswordVisualTransformation
 | 
			
		||||
import androidx.compose.ui.text.input.VisualTransformation
 | 
			
		||||
import androidx.compose.ui.tooling.preview.Preview
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
import be.ugent.sel.studeez.common.ext.fieldModifier
 | 
			
		||||
import be.ugent.sel.studeez.resources
 | 
			
		||||
import kotlin.math.sin
 | 
			
		||||
import be.ugent.sel.studeez.R.drawable as AppIcon
 | 
			
		||||
import be.ugent.sel.studeez.R.string as AppText
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -85,6 +90,90 @@ fun EmailField(
 | 
			
		|||
    )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun LabeledNumberInputField(
 | 
			
		||||
    value: Int,
 | 
			
		||||
    onNewValue: (Int) -> Unit,
 | 
			
		||||
    @StringRes label: Int,
 | 
			
		||||
    singleLine: Boolean = false
 | 
			
		||||
) {
 | 
			
		||||
    var number by remember { mutableStateOf(value) }
 | 
			
		||||
    OutlinedTextField(
 | 
			
		||||
        value = number.toString(),
 | 
			
		||||
        singleLine = singleLine,
 | 
			
		||||
        label = { Text(resources().getString(label)) },
 | 
			
		||||
        keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
 | 
			
		||||
        onValueChange = {typedInt ->
 | 
			
		||||
            val isNumber = typedInt.matches(Regex("[1-9]+\\d*]"))
 | 
			
		||||
            if (isNumber) {
 | 
			
		||||
                number = typedInt.toInt()
 | 
			
		||||
                onNewValue(typedInt.toInt())
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun LabeledErrorTextField(
 | 
			
		||||
    modifier: Modifier = Modifier,
 | 
			
		||||
    initialValue: String,
 | 
			
		||||
    @StringRes label: Int,
 | 
			
		||||
    singleLine: Boolean = false,
 | 
			
		||||
    errorText: String,
 | 
			
		||||
    keyboardType: KeyboardType,
 | 
			
		||||
    predicate: (String) -> Boolean,
 | 
			
		||||
    onNewCorrectValue: (String) -> Unit
 | 
			
		||||
) {
 | 
			
		||||
    var value by remember {
 | 
			
		||||
        mutableStateOf(initialValue)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var isValid by remember {
 | 
			
		||||
        mutableStateOf(predicate(value))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Column {
 | 
			
		||||
        OutlinedTextField(
 | 
			
		||||
            modifier = modifier.fieldModifier(),
 | 
			
		||||
            value = value,
 | 
			
		||||
            onValueChange = { newText ->
 | 
			
		||||
                value = newText
 | 
			
		||||
                isValid = predicate(value)
 | 
			
		||||
                if (isValid) {
 | 
			
		||||
                    onNewCorrectValue(newText)
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            singleLine = singleLine,
 | 
			
		||||
            label = { Text(text = resources().getString(label)) },
 | 
			
		||||
            isError = !isValid,
 | 
			
		||||
            keyboardOptions = KeyboardOptions(
 | 
			
		||||
                keyboardType = keyboardType,
 | 
			
		||||
                imeAction = ImeAction.Done
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        if (!isValid) {
 | 
			
		||||
            Text(
 | 
			
		||||
                modifier = Modifier.padding(start = 16.dp),
 | 
			
		||||
                text = errorText,
 | 
			
		||||
                color = MaterialTheme.colors.error
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fun isNumber(string: String): Boolean {
 | 
			
		||||
    return string.matches(Regex("[1-9]+\\d*"))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 @Preview(showBackground = true)
 | 
			
		||||
 @Composable
 | 
			
		||||
 fun IntInputPreview() {
 | 
			
		||||
     LabeledNumberInputField(value = 1, onNewValue = {}, label = AppText.email)
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun PasswordField(
 | 
			
		||||
    value: String,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Reference in a new issue