almost completed adding of new creds type UI

This commit is contained in:
InsanusMokrassar 2022-11-16 16:45:48 +06:00
parent 3be0f24eac
commit 788fe49aa4
5 changed files with 135 additions and 2 deletions

View File

@ -53,6 +53,11 @@ data class MavenPublishingRepository(
val usernameProperty: String, val usernameProperty: String,
val passwordProperty: String val passwordProperty: String
): CredentialsType { ): CredentialsType {
constructor(baseParameter: String) : this(
"${baseParameter.uppercase()}_USER",
"${baseParameter.uppercase()}_PASSWORD",
)
override fun buildCheckPart(): String = "(project.hasProperty('${usernameProperty}') || System.getenv('${usernameProperty}') != null) && (project.hasProperty('${passwordProperty}') || System.getenv('${passwordProperty}') != null)" override fun buildCheckPart(): String = "(project.hasProperty('${usernameProperty}') || System.getenv('${usernameProperty}') != null) && (project.hasProperty('${passwordProperty}') || System.getenv('${passwordProperty}') != null)"
override fun buildCredsPart(): String { override fun buildCredsPart(): String {
return """ return """

View File

@ -3,24 +3,32 @@ package dev.inmo.kmppscriptbuilder.core.ui
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository import dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository
import dev.inmo.kmppscriptbuilder.core.ui.utils.ButtonsPanel
import dev.inmo.kmppscriptbuilder.core.ui.utils.CommonText import dev.inmo.kmppscriptbuilder.core.ui.utils.CommonText
import dev.inmo.kmppscriptbuilder.core.ui.utils.CommonTextField import dev.inmo.kmppscriptbuilder.core.ui.utils.CommonTextField
import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultSmallVerticalMargin import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultSmallVerticalMargin
import dev.inmo.kmppscriptbuilder.core.ui.utils.Drawer
class RepositoryState( class RepositoryState(
name: String = "", name: String = "",
url: String = "" url: String = "",
credsType: MavenPublishingRepository.CredentialsType = MavenPublishingRepository.CredentialsType.UsernameAndPassword(name)
) { ) {
var name: String by mutableStateOf(name) var name: String by mutableStateOf(name)
var url: String by mutableStateOf(url) var url: String by mutableStateOf(url)
var credsType by mutableStateOf(credsType)
fun toRepository() = MavenPublishingRepository(name, url) fun toRepository() = MavenPublishingRepository(name, url)
} }
private fun MavenPublishingRepository.toRepositoryState() = RepositoryState(name, url) private fun MavenPublishingRepository.toRepositoryState() = RepositoryState(name, url)
expect class RepositoryCredentialTypeDrawer : Drawer<MavenPublishingRepository.CredentialsType>
expect fun RepositoryCredentialTypeDrawerWithState(repositoryState: RepositoryState): RepositoryCredentialTypeDrawer
class RepositoriesView : ListView<RepositoryState>("Repositories info") { class RepositoriesView : ListView<RepositoryState>("Repositories info") {
var repositories: List<MavenPublishingRepository> var repositories: List<MavenPublishingRepository>
get() = itemsList.map { it.toRepository() } get() = itemsList.map { it.toRepository() }
@ -38,6 +46,10 @@ class RepositoriesView : ListView<RepositoryState>("Repositories info") {
@Composable @Composable
override fun buildView(item: RepositoryState) { override fun buildView(item: RepositoryState) {
val credsTypesDrawer = remember {
RepositoryCredentialTypeDrawerWithState(item)
}
CommonText("Repository name") CommonText("Repository name")
CommonTextField( CommonTextField(
item.name, item.name,
@ -49,6 +61,49 @@ class RepositoriesView : ListView<RepositoryState>("Repositories info") {
item.url, item.url,
"For example: https://repo.maven.apache.org/maven2/" "For example: https://repo.maven.apache.org/maven2/"
) { item.url = it } ) { item.url = it }
ButtonsPanel(
"Credentials type",
MavenPublishingRepository.CredentialsType.Nothing.takeIf { item.credsType != it } ?: item.credsType,
MavenPublishingRepository.CredentialsType.UsernameAndPassword(item.name).takeIf { item.credsType !is MavenPublishingRepository.CredentialsType.UsernameAndPassword } ?: item.credsType,
MavenPublishingRepository.CredentialsType.HttpHeaderCredentials("Authorization", "${item.name.uppercase()}_TOKEN").takeIf { item.credsType !is MavenPublishingRepository.CredentialsType.HttpHeaderCredentials } ?: item.credsType,
) {
with(credsTypesDrawer) {
with(item.credsType) {
draw()
}
}
}
when (val credsType = item.credsType) {
is MavenPublishingRepository.CredentialsType.HttpHeaderCredentials -> {
CommonText("Header name")
CommonTextField(credsType.headerName) {
item.credsType = credsType.copy(headerName = it)
}
DefaultSmallVerticalMargin()
CommonText("Property name")
CommonTextField(credsType.headerValueProperty) {
item.credsType = credsType.copy(headerValueProperty = it)
}
}
MavenPublishingRepository.CredentialsType.Nothing -> {
CommonText("No parameters for absence of credentials")
}
is MavenPublishingRepository.CredentialsType.UsernameAndPassword -> {
CommonText("Username property name")
CommonTextField(credsType.usernameProperty) {
item.credsType = credsType.copy(usernameProperty = it)
}
DefaultSmallVerticalMargin()
CommonText("Password property name")
CommonTextField(credsType.passwordProperty) {
item.credsType = credsType.copy(passwordProperty = it)
}
}
}
} }
} }

View File

@ -0,0 +1,32 @@
package dev.inmo.kmppscriptbuilder.core.ui
import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.elements.DefaultButton
import dev.inmo.jsuikit.modifiers.UIKitButton
import dev.inmo.jsuikit.modifiers.UIKitMargin
import dev.inmo.jsuikit.modifiers.UIKitUtility
import dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository
import dev.inmo.kmppscriptbuilder.core.ui.utils.Drawer
import dev.inmo.kmppscriptbuilder.core.ui.utils.NoTransform
actual class RepositoryCredentialTypeDrawer(
private val state: RepositoryState
) : Drawer<MavenPublishingRepository.CredentialsType> {
@Composable
override fun MavenPublishingRepository.CredentialsType.draw() {
val name = when (this@draw) {
is MavenPublishingRepository.CredentialsType.HttpHeaderCredentials -> "Headers"
MavenPublishingRepository.CredentialsType.Nothing -> "No"
is MavenPublishingRepository.CredentialsType.UsernameAndPassword -> "Username and password"
}
if (state.credsType == this) {
DefaultButton(name, UIKitButton.Type.Primary, UIKitButton.Size.Small, UIKitMargin.Small.Horizontal, UIKitUtility.NoTransform, UIKitUtility.Border.Rounded)
} else {
DefaultButton(name, UIKitButton.Type.Default, UIKitButton.Size.Small, UIKitMargin.Small.Horizontal, UIKitUtility.NoTransform, UIKitUtility.Border.Rounded) {
state.credsType = this
}
}
}
}
actual fun RepositoryCredentialTypeDrawerWithState(repositoryState: RepositoryState): RepositoryCredentialTypeDrawer = RepositoryCredentialTypeDrawer(repositoryState)

View File

@ -0,0 +1,40 @@
package dev.inmo.kmppscriptbuilder.core.ui
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Button
import androidx.compose.material.OutlinedButton
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository
import dev.inmo.kmppscriptbuilder.core.ui.utils.Drawer
actual class RepositoryCredentialTypeDrawer(
private val state: RepositoryState
) : Drawer<MavenPublishingRepository.CredentialsType> {
@Composable
override fun MavenPublishingRepository.CredentialsType.draw() {
val name = when (this@draw) {
is MavenPublishingRepository.CredentialsType.HttpHeaderCredentials -> "Headers"
MavenPublishingRepository.CredentialsType.Nothing -> "No"
is MavenPublishingRepository.CredentialsType.UsernameAndPassword -> "Username and password"
}
if (state.credsType == this) {
Button({}, Modifier.padding(8.dp, 0.dp)) {
Text(name)
}
} else {
OutlinedButton(
{
state.credsType = this
},
Modifier.padding(8.dp, 0.dp)
) {
Text(name)
}
}
}
}
actual fun RepositoryCredentialTypeDrawerWithState(repositoryState: RepositoryState): RepositoryCredentialTypeDrawer = RepositoryCredentialTypeDrawer(repositoryState)

View File

@ -87,7 +87,8 @@ actual fun TitleText(text: String) {
actual fun <T> ButtonsPanel( actual fun <T> ButtonsPanel(
title: String, title: String,
data: Iterable<T>, data: Iterable<T>,
itemDrawer: @Composable (T) -> Unit) { itemDrawer: @Composable (T) -> Unit
) {
Row { Row {
Text(title, Modifier.padding(8.dp)) Text(title, Modifier.padding(8.dp))
data.forEach { itemDrawer(it) } data.forEach { itemDrawer(it) }