0
0
mirror of https://github.com/florisboard/florisboard.git synced 2024-09-20 03:52:18 +02:00

Restrict variable name input validation and fix behavior bugs

This commit is contained in:
Patrick Goldinger 2022-02-08 19:33:03 +01:00
parent 0dc0f53a91
commit ea159527f3
3 changed files with 18 additions and 4 deletions

View File

@ -28,6 +28,8 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredSize
import androidx.compose.foundation.shape.CutCornerShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
@ -40,8 +42,10 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
@ -145,7 +149,7 @@ internal fun EditPropertyDialog(
}
fun isPropertyNameValid(): Boolean {
return propertyName.isNotBlank() && propertyName != SnyggEmptyPropertyInfoForAdding.name
return propertyNameValidation.isValid() && propertyName != SnyggEmptyPropertyInfoForAdding.name
}
fun isPropertyValueValid(): Boolean {
@ -270,10 +274,14 @@ private fun PropertyNameInput(
onDismissRequest = { propertiesExpanded = false },
)
} else {
val focusManager = LocalFocusManager.current
FlorisOutlinedTextField(
value = name,
onValueChange = onNameChange,
enabled = isAddPropertyDialog,
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
singleLine = true,
showValidationHint = isAddPropertyDialog,
showValidationError = showSelectAsError,
validationResult = nameValidation,

View File

@ -31,6 +31,7 @@ object ExtensionValidation {
private val MetaIdRegex = """^[a-z][a-z0-9_]*(\.[a-z0-9][a-z0-9_]*)*${'$'}""".toRegex()
private val ComponentIdRegex = """^[a-z][a-z0-9_]*${'$'}""".toRegex()
private val ThemeComponentStylesheetPathRegex = """^[^:*<>"']*${'$'}""".toRegex()
val ThemeComponentVariableNameRegex = """^[a-zA-Z0-9-_]+${'$'}""".toRegex()
val MetaId = ValidationRule<String> {
forKlass = ExtensionMeta::class
@ -143,10 +144,14 @@ object ExtensionValidation {
val ThemeComponentVariableName = ValidationRule<String> {
forKlass = SnyggStylesheet::class
forProperty = "propertyName"
validator { str ->
validator { input ->
val str = input.trim()
when {
str.isBlank() -> resultInvalid(error = "Please enter a variable name")
str == "-" || str.startsWith("--") -> resultValid()
!ThemeComponentVariableNameRegex.matches(str) -> {
resultInvalid(error = "Please enter a valid variable name matching $ThemeComponentVariableNameRegex")
}
else -> resultValid(hint = "By convention a FlorisCSS variable name starts with two dashes (--)")
}
}

View File

@ -16,15 +16,16 @@
package dev.patrickgold.florisboard.snygg.value
import dev.patrickgold.florisboard.res.ext.ExtensionValidation
private const val VarKey = "varKey"
private val VarRegex = """^[a-zA-Z0-9-_]+${'$'}""".toRegex()
sealed interface SnyggVarValue : SnyggValue
data class SnyggDefinedVarValue(val key: String) : SnyggVarValue {
companion object : SnyggValueEncoder {
override val spec = SnyggValueSpec {
function(name = "var") { string(id = VarKey, regex = VarRegex) }
function(name = "var") { string(id = VarKey, regex = ExtensionValidation.ThemeComponentVariableNameRegex) }
}
override fun defaultValue() = SnyggDefinedVarValue("")