mirror of
https://github.com/InsanusMokrassar/KotlinPublicationScriptsBuilder.git
synced 2024-11-25 03:28:52 +00:00
whole view complete, files handling left
This commit is contained in:
parent
7aa30ef46c
commit
0c8eef971a
@ -1,15 +1,17 @@
|
|||||||
package dev.inmo.kmppscriptbuilder.web
|
package dev.inmo.kmppscriptbuilder.web
|
||||||
|
|
||||||
import dev.inmo.kmppscriptbuilder.web.views.MavenProjectInfoView
|
import dev.inmo.kmppscriptbuilder.web.views.*
|
||||||
import dev.inmo.kmppscriptbuilder.web.views.ProjectTypeView
|
|
||||||
import kotlinx.browser.document
|
import kotlinx.browser.document
|
||||||
|
|
||||||
fun main() {
|
fun main() {
|
||||||
document.addEventListener(
|
document.addEventListener(
|
||||||
"DOMContentLoaded",
|
"DOMContentLoaded",
|
||||||
{
|
{
|
||||||
val projectTypeView = ProjectTypeView()
|
val builderView = BuilderView()
|
||||||
val mavenInfoTypeView = MavenProjectInfoView()
|
document.body ?.onclick = {
|
||||||
|
println(builderView.config)
|
||||||
|
Unit
|
||||||
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
package dev.inmo.kmppscriptbuilder.web.utils
|
||||||
|
|
||||||
|
import kotlinx.browser.document
|
||||||
|
|
||||||
|
inline fun <R> keepScrolling(crossinline block: () -> R): R = document.body ?.let {
|
||||||
|
val (x, y) = (it.scrollLeft to it.scrollTop)
|
||||||
|
return block().also { _ ->
|
||||||
|
it.scrollTo(x, y)
|
||||||
|
}
|
||||||
|
} ?: block()
|
@ -0,0 +1,23 @@
|
|||||||
|
package dev.inmo.kmppscriptbuilder.web.views
|
||||||
|
|
||||||
|
import dev.inmo.kmppscriptbuilder.core.models.Config
|
||||||
|
import kotlinx.browser.document
|
||||||
|
import org.w3c.dom.HTMLElement
|
||||||
|
|
||||||
|
class BuilderView : View {
|
||||||
|
private val projectTypeView = ProjectTypeView()
|
||||||
|
private val licensesView = LicensesView(document.getElementById("licensesListDiv") as HTMLElement)
|
||||||
|
private val mavenInfoTypeView = MavenProjectInfoView()
|
||||||
|
|
||||||
|
var config: Config
|
||||||
|
get() = Config(
|
||||||
|
licensesView.licenses,
|
||||||
|
mavenInfoTypeView.mavenConfig,
|
||||||
|
projectTypeView.projectType
|
||||||
|
)
|
||||||
|
set(value) {
|
||||||
|
licensesView.licenses = value.licenses
|
||||||
|
mavenInfoTypeView.mavenConfig = value.mavenConfig
|
||||||
|
projectTypeView.projectType = value.type
|
||||||
|
}
|
||||||
|
}
|
@ -3,16 +3,16 @@ package dev.inmo.kmppscriptbuilder.web.views
|
|||||||
import dev.inmo.kmppscriptbuilder.core.models.Developer
|
import dev.inmo.kmppscriptbuilder.core.models.Developer
|
||||||
import org.w3c.dom.*
|
import org.w3c.dom.*
|
||||||
|
|
||||||
class DevelopersView(rootElement: HTMLElement) : ListView<Developer>(rootElement, "Add developer", "Remove developer") {
|
class DevelopersView(rootElement: HTMLElement) : MutableListView<Developer>(rootElement, "Add developer", "Remove developer") {
|
||||||
private val HTMLElement.usernameElement: HTMLInputElement
|
private val HTMLElement.usernameElement: HTMLInputElement
|
||||||
get() = children[0] as HTMLInputElement
|
get() = getElementsByTagName("input")[0] as HTMLInputElement
|
||||||
private val HTMLElement.nameElement: HTMLInputElement
|
private val HTMLElement.nameElement: HTMLInputElement
|
||||||
get() = children[1] as HTMLInputElement
|
get() = getElementsByTagName("input")[1] as HTMLInputElement
|
||||||
private val HTMLElement.emailElement: HTMLInputElement
|
private val HTMLElement.emailElement: HTMLInputElement
|
||||||
get() = children[2] as HTMLInputElement
|
get() = getElementsByTagName("input")[2] as HTMLInputElement
|
||||||
|
|
||||||
var developers: List<Developer>
|
var developers: List<Developer>
|
||||||
get() = elements.values.map {
|
get() = elements.map {
|
||||||
Developer(it.usernameElement.value, it.nameElement.value, it.emailElement.value)
|
Developer(it.usernameElement.value, it.nameElement.value, it.emailElement.value)
|
||||||
}
|
}
|
||||||
set(value) {
|
set(value) {
|
||||||
@ -21,7 +21,7 @@ class DevelopersView(rootElement: HTMLElement) : ListView<Developer>(rootElement
|
|||||||
|
|
||||||
override fun createPlainObject(): Developer = Developer("", "", "")
|
override fun createPlainObject(): Developer = Developer("", "", "")
|
||||||
|
|
||||||
override fun HTMLElement.placeElement(value: Developer) {
|
override fun HTMLElement.addContentBeforeRemoveButton(value: Developer) {
|
||||||
createTextField("Developer ID", "Developer username").value = value.id
|
createTextField("Developer ID", "Developer username").value = value.id
|
||||||
createTextField("Developer name", "").value = value.name
|
createTextField("Developer name", "").value = value.name
|
||||||
createTextField("Developer E-Mail", "").value = value.eMail
|
createTextField("Developer E-Mail", "").value = value.eMail
|
||||||
|
@ -0,0 +1,113 @@
|
|||||||
|
package dev.inmo.kmppscriptbuilder.web.views
|
||||||
|
|
||||||
|
import dev.inmo.kmppscriptbuilder.core.models.License
|
||||||
|
import dev.inmo.kmppscriptbuilder.core.models.getLicenses
|
||||||
|
import dev.inmo.micro_utils.coroutines.safeActor
|
||||||
|
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
|
||||||
|
import io.ktor.client.HttpClient
|
||||||
|
import kotlinx.coroutines.*
|
||||||
|
import kotlinx.coroutines.channels.Channel
|
||||||
|
import kotlinx.coroutines.channels.SendChannel
|
||||||
|
import kotlinx.coroutines.flow.consumeAsFlow
|
||||||
|
import kotlinx.coroutines.flow.debounce
|
||||||
|
import kotlinx.dom.appendElement
|
||||||
|
import org.w3c.dom.*
|
||||||
|
|
||||||
|
class LicensesView(
|
||||||
|
rootElement: HTMLElement,
|
||||||
|
client: HttpClient = HttpClient(),
|
||||||
|
scope: CoroutineScope = CoroutineScope(Dispatchers.Default)
|
||||||
|
) : MutableListView<License>(rootElement, "Add empty license", "Remove license") {
|
||||||
|
private val HTMLElement.idElement: HTMLInputElement
|
||||||
|
get() = getElementsByTagName("input")[0] as HTMLInputElement
|
||||||
|
private val HTMLElement.titleElement: HTMLInputElement
|
||||||
|
get() = getElementsByTagName("input")[1] as HTMLInputElement
|
||||||
|
private val HTMLElement.urlElement: HTMLInputElement
|
||||||
|
get() = getElementsByTagName("input")[2] as HTMLInputElement
|
||||||
|
|
||||||
|
private class LicenseOfferList(
|
||||||
|
rootElement: HTMLElement,
|
||||||
|
private val licensesView: LicensesView,
|
||||||
|
client: HttpClient,
|
||||||
|
scope: CoroutineScope
|
||||||
|
) : ListView<License>(rootElement, useSimpleDiffStrategy = true) {
|
||||||
|
private var licensesTemplates: List<License> = emptyList()
|
||||||
|
|
||||||
|
init {
|
||||||
|
scope.launch {
|
||||||
|
licensesTemplates = client.getLicenses().values.toList()
|
||||||
|
changeActor.send(Unit) // update list of searches
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val changeActor: SendChannel<Unit> = scope.run {
|
||||||
|
val onChangeActor = Channel<Unit>(Channel.CONFLATED)
|
||||||
|
onChangeActor.consumeAsFlow().subscribeSafelyWithoutExceptions(scope) {
|
||||||
|
val lowercased = searchString
|
||||||
|
data = if (lowercased.isEmpty()) {
|
||||||
|
emptyList()
|
||||||
|
} else {
|
||||||
|
licensesTemplates.filter {
|
||||||
|
val lowercasedTitle = it.title.toLowerCase()
|
||||||
|
lowercased.all { it in lowercasedTitle }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onChangeActor
|
||||||
|
}
|
||||||
|
private val searchElement = rootElement.createTextField("Quick add", "Type some license name part to find it").apply {
|
||||||
|
oninput = {
|
||||||
|
changeActor.offer(Unit)
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private var searchString: String
|
||||||
|
get() = searchElement.value.toLowerCase()
|
||||||
|
set(value) {
|
||||||
|
searchElement.value = value
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun HTMLElement.placeElement(value: License) {
|
||||||
|
createCommonButton(value.title).onclick = {
|
||||||
|
searchString = ""
|
||||||
|
licensesView.licenses += value
|
||||||
|
changeActor.offer(Unit)
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun HTMLElement.updateElement(from: License, to: License) {
|
||||||
|
getElementsByTagName("button")[0] ?.remove()
|
||||||
|
placeElement(to)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val licensesOffersList = LicenseOfferList(
|
||||||
|
rootElement.appendElement("div") { classList.add("uk-padding-small") } as HTMLElement,
|
||||||
|
this,
|
||||||
|
client,
|
||||||
|
scope
|
||||||
|
)
|
||||||
|
|
||||||
|
var licenses: List<License>
|
||||||
|
get() = elements.map {
|
||||||
|
License(it.idElement.value, it.titleElement.value, it.urlElement.value)
|
||||||
|
}
|
||||||
|
set(value) {
|
||||||
|
data = value
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun createPlainObject(): License = License("", "", "")
|
||||||
|
|
||||||
|
override fun HTMLElement.addContentBeforeRemoveButton(value: License) {
|
||||||
|
createTextField("License Id", "Short name like \"Apache-2.0\"").value = value.id
|
||||||
|
createTextField("License Title", "Official title of license (like \"Apache Software License 2.0\")").value = value.title
|
||||||
|
createTextField("License URL", "Link to your LICENSE file OR official license file (like \"https://opensource.org/licenses/Apache-2.0\")").value = value.url ?: ""
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun HTMLElement.updateElement(from: License, to: License) {
|
||||||
|
idElement.value = to.id
|
||||||
|
titleElement.value = to.title
|
||||||
|
urlElement.value = to.url ?: ""
|
||||||
|
}
|
||||||
|
}
|
@ -1,61 +1,57 @@
|
|||||||
package dev.inmo.kmppscriptbuilder.web.views
|
package dev.inmo.kmppscriptbuilder.web.views
|
||||||
|
|
||||||
import dev.inmo.micro_utils.common.calculateDiff
|
import dev.inmo.micro_utils.common.calculateStrictDiff
|
||||||
import kotlinx.browser.document
|
|
||||||
import kotlinx.dom.appendElement
|
import kotlinx.dom.appendElement
|
||||||
import org.w3c.dom.HTMLElement
|
import org.w3c.dom.HTMLElement
|
||||||
|
|
||||||
abstract class ListView<T>(
|
abstract class ListView<T>(
|
||||||
private val rootElement: HTMLElement,
|
protected val rootElement: HTMLElement,
|
||||||
addButtonText: String = "Add",
|
useSimpleDiffStrategy: Boolean = false
|
||||||
private val removeButtonText: String = "Remove"
|
|
||||||
) : View {
|
) : View {
|
||||||
protected val elements = mutableMapOf<T, HTMLElement>()
|
protected val elements = mutableListOf<HTMLElement>()
|
||||||
|
private val diffHandling: (old: List<T>, new: List<T>) -> Unit = if (useSimpleDiffStrategy) {
|
||||||
|
{ _, new ->
|
||||||
|
elements.forEach { it.remove() }
|
||||||
|
elements.clear()
|
||||||
|
new.forEach {
|
||||||
|
val element = instantiateElement()
|
||||||
|
elements.add(element)
|
||||||
|
element.placeElement(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
{ old, new ->
|
||||||
|
val diff = old.calculateStrictDiff(new)
|
||||||
|
diff.removed.forEach {
|
||||||
|
elements[it.index].remove()
|
||||||
|
elements.removeAt(it.index)
|
||||||
|
println(it.value)
|
||||||
|
}
|
||||||
|
diff.added.forEach {
|
||||||
|
val element = instantiateElement()
|
||||||
|
elements.add(element)
|
||||||
|
element.placeElement(it.value)
|
||||||
|
}
|
||||||
|
diff.replaced.forEach { (old, new) ->
|
||||||
|
val element = elements.getOrNull(old.index) ?.also { it.updateElement(old.value, new.value) }
|
||||||
|
if (element == null) {
|
||||||
|
val newElement = instantiateElement()
|
||||||
|
newElement.placeElement(new.value)
|
||||||
|
elements[new.index] = newElement
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
protected var data: List<T> = emptyList()
|
protected var data: List<T> = emptyList()
|
||||||
set(value) {
|
set(value) {
|
||||||
val old = field
|
val old = field
|
||||||
field = value
|
field = value
|
||||||
val diff = old.calculateDiff(value)
|
diffHandling(old, value)
|
||||||
diff.removed.forEach {
|
|
||||||
rootElement.removeChild(elements[it.value] ?: return@forEach)
|
|
||||||
}
|
|
||||||
diff.added.forEach {
|
|
||||||
val element = instantiateElement()
|
|
||||||
element.placeElement(it.value)
|
|
||||||
elements[it.value] = element
|
|
||||||
element.addRemoveButton(it.value)
|
|
||||||
}
|
|
||||||
diff.replaced.forEach { (old, new) ->
|
|
||||||
val element = elements[old.value] ?.also { it.updateElement(old.value, new.value) }
|
|
||||||
if (element == null) {
|
|
||||||
val newElement = instantiateElement()
|
|
||||||
newElement.placeElement(new.value)
|
|
||||||
elements[new.value] = newElement
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
|
||||||
rootElement.createButton(addButtonText).apply {
|
|
||||||
onclick = {
|
|
||||||
data += createPlainObject()
|
|
||||||
Unit
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract fun createPlainObject(): T
|
|
||||||
protected abstract fun HTMLElement.placeElement(value: T)
|
protected abstract fun HTMLElement.placeElement(value: T)
|
||||||
protected abstract fun HTMLElement.updateElement(from: T, to: T)
|
protected abstract fun HTMLElement.updateElement(from: T, to: T)
|
||||||
|
|
||||||
private fun HTMLElement.addRemoveButton(value: T) {
|
|
||||||
createButton(removeButtonText).onclick = {
|
|
||||||
data = data.filter {
|
|
||||||
it != value
|
|
||||||
}
|
|
||||||
Unit
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private fun instantiateElement() = rootElement.appendElement("div") {
|
private fun instantiateElement() = rootElement.appendElement("div") {
|
||||||
classList.add("uk-padding-small")
|
classList.add("uk-padding-small")
|
||||||
} as HTMLElement
|
} as HTMLElement
|
||||||
|
@ -14,6 +14,7 @@ class MavenProjectInfoView : View {
|
|||||||
private val includeGpgElement = document.getElementById("includeGpgSignToggle") as HTMLInputElement
|
private val includeGpgElement = document.getElementById("includeGpgSignToggle") as HTMLInputElement
|
||||||
private val includeMavenCentralElement = document.getElementById("includeMavenCentralTargetRepoToggle") as HTMLInputElement
|
private val includeMavenCentralElement = document.getElementById("includeMavenCentralTargetRepoToggle") as HTMLInputElement
|
||||||
private val developersView = DevelopersView(document.getElementById("developersListDiv") as HTMLElement)
|
private val developersView = DevelopersView(document.getElementById("developersListDiv") as HTMLElement)
|
||||||
|
private val repositoriesView = RepositoriesView(document.getElementById("repositoriesListDiv") as HTMLElement)
|
||||||
|
|
||||||
var mavenConfig: MavenConfig
|
var mavenConfig: MavenConfig
|
||||||
get() = MavenConfig(
|
get() = MavenConfig(
|
||||||
@ -22,9 +23,8 @@ class MavenProjectInfoView : View {
|
|||||||
urlElement.value,
|
urlElement.value,
|
||||||
vcsUrlElement.value,
|
vcsUrlElement.value,
|
||||||
includeGpgElement.checked,
|
includeGpgElement.checked,
|
||||||
developersView.developers,// TODO:: Add developers
|
developersView.developers,
|
||||||
// TODO:: Add repositories
|
repositoriesView.repositories + if (includeMavenCentralElement.checked) {
|
||||||
if (includeMavenCentralElement.checked) {
|
|
||||||
listOf(SonatypeRepository)
|
listOf(SonatypeRepository)
|
||||||
} else {
|
} else {
|
||||||
emptyList()
|
emptyList()
|
||||||
@ -37,8 +37,8 @@ class MavenProjectInfoView : View {
|
|||||||
vcsUrlElement.value = value.vcsUrl
|
vcsUrlElement.value = value.vcsUrl
|
||||||
includeGpgElement.checked = value.includeGpgSigning
|
includeGpgElement.checked = value.includeGpgSigning
|
||||||
developersView.developers = value.developers
|
developersView.developers = value.developers
|
||||||
// TODO:: Add repositories
|
|
||||||
val reposWithoutSonatype = value.repositories.filter { it != SonatypeRepository }
|
val reposWithoutSonatype = value.repositories.filter { it != SonatypeRepository }
|
||||||
includeMavenCentralElement.checked = value.repositories.size != reposWithoutSonatype.size
|
includeMavenCentralElement.checked = value.repositories.size != reposWithoutSonatype.size
|
||||||
|
repositoriesView.repositories = value.repositories
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package dev.inmo.kmppscriptbuilder.web.views
|
||||||
|
|
||||||
|
import dev.inmo.kmppscriptbuilder.web.utils.keepScrolling
|
||||||
|
import org.w3c.dom.HTMLElement
|
||||||
|
|
||||||
|
abstract class MutableListView<T>(
|
||||||
|
rootElement: HTMLElement,
|
||||||
|
addButtonText: String = "Add",
|
||||||
|
private val removeButtonText: String = "Remove"
|
||||||
|
) : ListView<T>(rootElement) {
|
||||||
|
init {
|
||||||
|
rootElement.createPrimaryButton(addButtonText).apply {
|
||||||
|
onclick = {
|
||||||
|
keepScrolling {
|
||||||
|
val newObject = createPlainObject()
|
||||||
|
data += newObject
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract fun createPlainObject(): T
|
||||||
|
protected open fun HTMLElement.addContentBeforeRemoveButton(value: T) {}
|
||||||
|
protected open fun HTMLElement.addContentAfterRemoveButton(value: T) {}
|
||||||
|
final override fun HTMLElement.placeElement(value: T) {
|
||||||
|
addContentBeforeRemoveButton(value)
|
||||||
|
addRemoveButton()
|
||||||
|
addContentAfterRemoveButton(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun HTMLElement.addRemoveButton() {
|
||||||
|
val button = createPrimaryButton(removeButtonText)
|
||||||
|
button.onclick = {
|
||||||
|
elements.indexOf(button.parentElement).takeIf { it > -1 } ?.also {
|
||||||
|
data -= data[it]
|
||||||
|
} ?: rootElement.removeChild(this@addRemoveButton)
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package dev.inmo.kmppscriptbuilder.web.views
|
||||||
|
|
||||||
|
import dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository
|
||||||
|
import org.w3c.dom.*
|
||||||
|
|
||||||
|
class RepositoriesView(rootElement: HTMLElement) : MutableListView<MavenPublishingRepository>(rootElement, "Add repository", "Remove repository") {
|
||||||
|
private val HTMLElement.nameElement: HTMLInputElement
|
||||||
|
get() = getElementsByTagName("input")[0] as HTMLInputElement
|
||||||
|
private val HTMLElement.urlElement: HTMLInputElement
|
||||||
|
get() = getElementsByTagName("input")[1] as HTMLInputElement
|
||||||
|
|
||||||
|
var repositories: List<MavenPublishingRepository>
|
||||||
|
get() = elements.map {
|
||||||
|
MavenPublishingRepository(it.nameElement.value, it.urlElement.value)
|
||||||
|
}
|
||||||
|
set(value) {
|
||||||
|
data = value
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun createPlainObject(): MavenPublishingRepository = MavenPublishingRepository("", "")
|
||||||
|
|
||||||
|
override fun HTMLElement.addContentBeforeRemoveButton(value: MavenPublishingRepository) {
|
||||||
|
createTextField("Repository name", "This name will be used to identify repository in grade").value = value.name
|
||||||
|
createTextField("Repository URL", "For example: https://repo.maven.apache.org/maven2/").value = value.name
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun HTMLElement.updateElement(from: MavenPublishingRepository, to: MavenPublishingRepository) {
|
||||||
|
nameElement.value = to.name
|
||||||
|
urlElement.value = to.url
|
||||||
|
}
|
||||||
|
}
|
@ -2,29 +2,34 @@ package dev.inmo.kmppscriptbuilder.web.views
|
|||||||
|
|
||||||
import kotlinx.dom.appendElement
|
import kotlinx.dom.appendElement
|
||||||
import org.w3c.dom.*
|
import org.w3c.dom.*
|
||||||
import kotlin.random.Random
|
|
||||||
|
|
||||||
fun HTMLElement.createTextField(
|
fun HTMLElement.createTextField(
|
||||||
label: String,
|
label: String,
|
||||||
placeholder: String
|
placeholder: String
|
||||||
): HTMLInputElement {
|
): HTMLInputElement {
|
||||||
val uuid = "r" + Random.nextLong()
|
|
||||||
return appendElement("div") {
|
return appendElement("div") {
|
||||||
classList.add("uk-margin", "uk-width-1-1")
|
classList.add("uk-margin", "uk-width-1-1")
|
||||||
appendElement("label") {
|
}.appendElement("label") {
|
||||||
classList.add("uk-form-label")
|
classList.add("uk-form-label")
|
||||||
setAttribute("for", uuid)
|
innerHTML = label
|
||||||
innerText = label
|
}.run {
|
||||||
}
|
val input = appendElement("input") {
|
||||||
}.appendElement("input") {
|
|
||||||
id = uuid
|
|
||||||
classList.add("uk-input", "uk-width-expand")
|
classList.add("uk-input", "uk-width-expand")
|
||||||
setAttribute("type", "text")
|
setAttribute("type", "text")
|
||||||
setAttribute("placeholder", placeholder)
|
setAttribute("placeholder", placeholder)
|
||||||
} as HTMLInputElement
|
} as HTMLInputElement
|
||||||
|
input
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun HTMLElement.createButton(text: String): HTMLButtonElement = appendElement("button") {
|
fun HTMLElement.createPrimaryButton(text: String): HTMLButtonElement = (appendElement("button") {
|
||||||
classList.add("uk-button", "uk-button-primary")
|
classList.add("uk-button", "uk-button-primary")
|
||||||
innerHTML = text
|
} as HTMLButtonElement).apply {
|
||||||
} as HTMLButtonElement
|
innerText = text
|
||||||
|
}
|
||||||
|
|
||||||
|
fun HTMLElement.createCommonButton(text: String): HTMLButtonElement = (appendElement("button") {
|
||||||
|
classList.add("uk-button", "uk-button-default")
|
||||||
|
} as HTMLButtonElement).apply {
|
||||||
|
innerText = text
|
||||||
|
}
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/uikit@3.6.17/dist/css/uikit.min.css" />
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/uikit@3.6.17/dist/css/uikit.min.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div uk-sticky="sel-target: .uk-navbar-container; cls-active: uk-navbar-sticky; bottom: #transparent-sticky-navbar">
|
|
||||||
<nav class="uk-navbar-container" uk-navbar>
|
<nav class="uk-navbar-container" uk-navbar>
|
||||||
<div class="uk-navbar-left">
|
<div class="uk-navbar-left">
|
||||||
<div class="uk-padding-small uk-text-lead">Kotlin Publication Scripts Builder</div>
|
<div class="uk-padding-small uk-text-lead">Kotlin Publication Scripts Builder</div>
|
||||||
@ -19,7 +18,6 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
|
||||||
<form class="uk-padding-small">
|
<form class="uk-padding-small">
|
||||||
<fieldset class="uk-fieldset">
|
<fieldset class="uk-fieldset">
|
||||||
<legend class="uk-legend">Project type</legend>
|
<legend class="uk-legend">Project type</legend>
|
||||||
@ -30,11 +28,11 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<legend class="uk-legend">Licenses</legend>
|
<legend class="uk-legend">Licenses</legend>
|
||||||
<div class="uk-padding-small">
|
<div id="licensesListDiv" class="uk-padding-small">
|
||||||
<div class="uk-margin uk-width-1-1">
|
<!-- <div class="uk-margin uk-width-1-1">-->
|
||||||
<input id="searchFilterInput" class="uk-input uk-width-expand" type="text" placeholder="License search filter">
|
<!-- <input id="searchFilterInput" class="uk-input uk-width-expand" type="text" placeholder="License search filter">-->
|
||||||
</div>
|
<!-- </div>-->
|
||||||
<button class="uk-button uk-button-primary">Add empty license</button>
|
<!-- <button class="uk-button uk-button-primary">Add empty license</button>-->
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<legend class="uk-legend">Project information</legend>
|
<legend class="uk-legend">Project information</legend>
|
||||||
@ -66,13 +64,10 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<legend class="uk-legend">Developers info</legend>
|
<legend class="uk-legend">Developers info</legend>
|
||||||
<div id="developersListDiv" class="uk-padding-small">
|
<div id="developersListDiv" class="uk-padding-small"></div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<legend class="uk-legend">Repositories info</legend>
|
<legend class="uk-legend">Repositories info</legend>
|
||||||
<div class="uk-padding-small">
|
<div id="repositoriesListDiv" class="uk-padding-small"></div>
|
||||||
<button class="uk-button uk-button-primary">Add repository</button>
|
|
||||||
</div>
|
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</form>
|
</form>
|
||||||
<!-- UIkit JS -->
|
<!-- UIkit JS -->
|
||||||
|
Loading…
Reference in New Issue
Block a user