From e51fb2c8cc81c7af59f9be2454f81da3825da60a Mon Sep 17 00:00:00 2001 From: Robert Jaros Date: Sun, 21 Jan 2018 20:31:15 +0100 Subject: Examples refactoring --- build.gradle | 118 ++- .../helloworld/src/main/resources/css/style.css | 3 + npm.dependencies | 24 + src/main/assets/css/style.css | 116 --- src/main/assets/js/bootstrap-select-i18n.min.js | 1 - src/main/kotlin/pl/treksoft/kvision/Main.kt | 37 - src/main/kotlin/pl/treksoft/kvision/Showcase.kt | 823 --------------------- src/main/kotlin/pl/treksoft/kvision/core/Css.kt | 2 + src/main/kotlin/pl/treksoft/kvision/core/Img.kt | 10 - .../kotlin/pl/treksoft/kvision/core/KVManager.kt | 4 +- src/main/resources/css/style.css | 116 +++ src/main/resources/js/bootstrap-select-i18n.min.js | 1 + src/main/web/index.html | 3 +- .../kotlin/test/pl/treksoft/kvision/TestUtil.kt | 4 +- .../test/pl/treksoft/kvision/html/ImageSpec.kt | 4 +- 15 files changed, 239 insertions(+), 1027 deletions(-) create mode 100644 examples/helloworld/src/main/resources/css/style.css create mode 100644 npm.dependencies delete mode 100644 src/main/assets/css/style.css delete mode 100644 src/main/assets/js/bootstrap-select-i18n.min.js delete mode 100644 src/main/kotlin/pl/treksoft/kvision/Main.kt delete mode 100644 src/main/kotlin/pl/treksoft/kvision/Showcase.kt delete mode 100644 src/main/kotlin/pl/treksoft/kvision/core/Img.kt create mode 100644 src/main/resources/css/style.css create mode 100644 src/main/resources/js/bootstrap-select-i18n.min.js diff --git a/build.gradle b/build.gradle index fc703e2f..b374249a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,7 @@ buildscript { ext.kotlin_version = '1.2.20' + ext.production = (findProperty('prod') ?: 'false') == 'true' + ext.npmdeps = new File("npm.dependencies").getText() repositories { jcenter() @@ -14,13 +16,18 @@ buildscript { } } -group = 'pl.treksoft' -version = '0.0.1-SNAPSHOT' +plugins { + id "maven-publish" + id "com.jfrog.bintray" version "1.7.3" +} apply plugin: 'kotlin2js' apply plugin: 'org.jetbrains.kotlin.frontend' apply plugin: "io.gitlab.arturbosch.detekt" +group = 'pl.treksoft' +version = '0.0.1' + repositories { jcenter() maven { url = 'https://dl.bintray.com/gbaldeck/kotlin' } @@ -31,36 +38,17 @@ dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" compile "org.jetbrains.kotlin:kotlin-test-js:$kotlin_version" // for now only compile configuration is supported compile "com.github.snabbdom:snabbdom-kotlin:0.1.1" - compile "pl.treksoft:navigo-kotlin:0.0.1" - compile "pl.treksoft:jquery-kotlin:0.0.2" - compile "pl.treksoft:kotlin-observable-js:0.0.2" + compile "pl.treksoft:navigo-kotlin:0.0.2" + compile "pl.treksoft:jquery-kotlin:0.0.3" + compile "pl.treksoft:kotlin-observable-js:0.0.3" } kotlinFrontend { npm { - dependency "jquery" - dependency "bootstrap" - dependency "css-loader" - dependency "style-loader" - dependency "less" - dependency "less-loader" - dependency "imports-loader" - dependency "bootstrap-webpack" - dependency "font-awesome" - dependency("font-awesome-webpack", "0.0.5-beta.2") - dependency "file-loader" - dependency "url-loader" - dependency("awesome-bootstrap-checkbox", "0.3.7") - dependency "bootstrap-select" - dependency "ajax-bootstrap-select" - dependency "trix" - dependency "fecha" - dependency "bootstrap-datetime-picker" - dependency "bootstrap-touchspin" - dependency("snabbdom", "0.6.9") - dependency "snabbdom-virtualize" - dependency "navigo" - dependency "jquery-resizable-dom" + npmdeps.eachLine { line -> + def (name, version) = line.tokenize(" ") + dependency(name, version) + } devDependency("karma") } @@ -69,12 +57,26 @@ kotlinFrontend { contentPath = file('src/main/web') } - define "PRODUCTION", false + define "PRODUCTION", production + +} + +task cleanLibs(type: Delete) { + delete 'build/js', 'build/libs' +} +if (project.gradle.startParameter.taskNames.contains("jar")){ + compileKotlin2Js.dependsOn 'cleanLibs' } jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE + excludes = [ "package.json" ] +} + +task sourcesJar(type: Jar, dependsOn: classes) { + classifier = 'sources' + from sourceSets.main.allSource } detekt { @@ -89,23 +91,73 @@ detekt { compileKotlin2Js { kotlinOptions.metaInfo = true kotlinOptions.outputFile = "$project.buildDir.path/js/${project.name}.js" - kotlinOptions.sourceMap = true + kotlinOptions.sourceMap = !production kotlinOptions.moduleKind = 'commonjs' } compileTestKotlin2Js { kotlinOptions.metaInfo = true kotlinOptions.outputFile = "$project.buildDir.path/js-tests/${project.name}-tests.js" - kotlinOptions.sourceMap = true + kotlinOptions.sourceMap = !production kotlinOptions.moduleKind = 'commonjs' } task copyResources(type: Copy) { - from "src/main/assets" + from "src/main/resources" into file(buildDir.path + "/js") } +task copyResourcesForTests(type: Copy) { + from "src/main/resources" + into file(buildDir.path + "/js-tests/") +} + afterEvaluate { tasks.getByName("webpack-bundle") { dependsOn(copyResources) } - tasks.getByName("webpack-run") { dependsOn(copyResources) } + tasks.getByName("webpack-run") { dependsOn(copyResources, copyResourcesForTests) } +} + +publishing { + publications { + maven(MavenPublication) { + from components.java + pom.withXml { + asNode().dependencies.'*'.findAll() { + it.artifactId.text() == 'kotlin-test-js' + }.each() { + it.scope*.value = 'test' + } + } + } + } +} + +model { + tasks.generatePomFileForMavenPublication { + destination = file("$buildDir/libs/${project.name}-${version}.pom") + } +} + +bintray { + user = findProperty('buser') + key = findProperty('bkey') + pkg { + repo = 'kotlin' + name = "${project.name}" + licenses = ['MIT'] + vcsUrl = "https://github.com/rjaros/${project.name}.git" + version { + name = "${project.version}" + desc = 'Object oriented Web UI framework for Kotlin.' + released = new Date() + } + } + filesSpec { + from "${project.buildDir}/libs/" + into "pl/treksoft/${project.name}/${project.version}" + } +} + +bintrayUpload { + dependsOn "generatePomFileForMavenPublication" } diff --git a/examples/helloworld/src/main/resources/css/style.css b/examples/helloworld/src/main/resources/css/style.css new file mode 100644 index 00000000..76482c15 --- /dev/null +++ b/examples/helloworld/src/main/resources/css/style.css @@ -0,0 +1,3 @@ +.helloworld { + font-size: 30px; +} diff --git a/npm.dependencies b/npm.dependencies new file mode 100644 index 00000000..50a8bb4e --- /dev/null +++ b/npm.dependencies @@ -0,0 +1,24 @@ +css-loader * +style-loader * +less * +less-loader * +imports-loader * +uglifyjs-webpack-plugin * +file-loader * +url-loader * +jquery 3.3.1 +bootstrap 3.3.7 +bootstrap-webpack 0.0.6 +font-awesome 4.7.0 +font-awesome-webpack 0.0.5-beta.2 +awesome-bootstrap-checkbox 0.3.7 +bootstrap-select 1.12.4 +ajax-bootstrap-select 1.4.3 +trix 0.11.1 +fecha 2.3.2 +bootstrap-datetime-picker 2.4.4 +bootstrap-touchspin 3.1.1 +snabbdom 0.6.9 +snabbdom-virtualize 0.7.0 +navigo 7.0.0 +jquery-resizable-dom 0.26.0 diff --git a/src/main/assets/css/style.css b/src/main/assets/css/style.css deleted file mode 100644 index 3e7ee728..00000000 --- a/src/main/assets/css/style.css +++ /dev/null @@ -1,116 +0,0 @@ -.splitpanel-vertical { - display: flex; - flex-direction: row; - overflow: auto; -} - -.splitpanel-vertical > *:first-child { - max-width: calc(100% - 9px); -} - -.splitpanel-vertical > * { - flex: 0 0 auto; - overflow: auto; -} - -.splitpanel-vertical > *:last-child { - flex: 1 1 auto; - overflow: auto; -} - -.splitpanel-horizontal { - display: flex; - flex-direction: column; - overflow: auto; -} - -.splitpanel-horizontal > *:first-child { - max-height: calc(100% - 9px); -} - -.splitpanel-horizontal > * { - flex: 0 0 auto; - overflow: auto; -} - -.splitpanel-horizontal > *:last-child { - flex: 1 1 auto; - overflow: auto; -} - - -.splitter-vertical { - flex: 0 0 auto; - width: 9px; - background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAhCAQAAABOpSL+AAAAIklEQVR4AWMwbb/PdR+JZDD9f1/oPhI5sgVGBSruc9xHIgGdSQqqQJGkRgAAAABJRU5ErkJggg==') center center no-repeat #cecece; - cursor: col-resize; -} - -.splitter-horizontal { - flex: 0 0 auto; - height: 9px; - background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACEAAAAICAQAAADdTl4aAAAAIElEQVQoz2MwrTD9TxFsZ7jPcV+IIsjFQAUw6hFqegQA+xzRHT2p7pEAAAAASUVORK5CYII=') center center no-repeat #cecece; - cursor: row-resize; -} - -.trix-control { - overflow-y: auto; -} - -trix-toolbar .trix-button-group { - margin-bottom: 3px; -} - -.form-inline .form-group { - margin-right:6px; -} - -.form-inline .checkbox, .form-inline .radio { - margin-right:6px; -} - -.form-inline .form-group .form-control { - margin-left:6px; -} - -.form-horizontal .checkbox, .form-horizontal .radio { - padding-left: 25px; -} - -.form-inline .form-group trix-editor.form-control { - margin-left: 0px; - width: 100%; -} - -.form-inline .form-group, .form-inline .control-label { - vertical-align: top; -} - -.bootstrap-touchspin .input-group-btn-vertical> .input-sm { - padding: 7px 10px; - height: 6px; -} - -.bootstrap-touchspin .input-group-btn-vertical> .input-lg { - height: 24px; -} - -.kv-spinner-btn-none .input-group-btn-vertical { - display: none; -} - -.kv-spinner-btn-none .form-control { - border-radius: 4px !important; -} - -.kv-spinner-btn-vertical .form-control { - border-radius: 4px 0px 0px 4px !important; -} - -.kv-radiogroup .radio { - margin-top: -5px; -} - -.kv-radiogroup-inline label { - margin-right: 10px; -} diff --git a/src/main/assets/js/bootstrap-select-i18n.min.js b/src/main/assets/js/bootstrap-select-i18n.min.js deleted file mode 100644 index 4428d3c0..00000000 --- a/src/main/assets/js/bootstrap-select-i18n.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"",noneResultsText:"",countSelectedText:function(a,b){return 1==a?"... ({n})":"... ({n})"},maxOptionsText:function(a,b){return[1==a?"🛇":"🛇",1==b?"🛇":"🛇"]},selectAllText:"++",deselectAllText:"--",multipleSeparator:", "}}(a)}); \ No newline at end of file diff --git a/src/main/kotlin/pl/treksoft/kvision/Main.kt b/src/main/kotlin/pl/treksoft/kvision/Main.kt deleted file mode 100644 index e4816888..00000000 --- a/src/main/kotlin/pl/treksoft/kvision/Main.kt +++ /dev/null @@ -1,37 +0,0 @@ -package pl.treksoft.kvision - -import pl.treksoft.kvision.core.KVManager -import kotlin.browser.document - -fun main(args: Array) { - var application: ApplicationBase? = null - - val state: dynamic = module.hot?.let { hot -> - hot.accept() - - hot.dispose { data -> - data.appState = application?.dispose() - KVManager.shutdown() - application = null - } - - hot.data - } - - if (document.body != null) { - application = start(state) - } else { - KVManager.init() - application = null - document.addEventListener("DOMContentLoaded", { application = start(state) }) - } -} - -fun start(state: dynamic): ApplicationBase? { - if (document.getElementById("showcase") == null) return null - val application = Showcase() - @Suppress("UnsafeCastFromDynamic") - application.start(state?.appState ?: emptyMap()) - return application -} - diff --git a/src/main/kotlin/pl/treksoft/kvision/Showcase.kt b/src/main/kotlin/pl/treksoft/kvision/Showcase.kt deleted file mode 100644 index 51f0213b..00000000 --- a/src/main/kotlin/pl/treksoft/kvision/Showcase.kt +++ /dev/null @@ -1,823 +0,0 @@ -package pl.treksoft.kvision - -import com.lightningkite.kotlin.observable.list.observableListOf -import pl.treksoft.kvision.basic.Label -import pl.treksoft.kvision.core.* -import pl.treksoft.kvision.data.DataComponent -import pl.treksoft.kvision.data.DataContainer -import pl.treksoft.kvision.dropdown.DD.* -import pl.treksoft.kvision.dropdown.DropDown -import pl.treksoft.kvision.form.Form -import pl.treksoft.kvision.form.FormPanel -import pl.treksoft.kvision.form.INPUTSIZE -import pl.treksoft.kvision.form.bool -import pl.treksoft.kvision.form.check.CheckBox -import pl.treksoft.kvision.form.check.Radio -import pl.treksoft.kvision.form.check.RadioGroup -import pl.treksoft.kvision.form.date -import pl.treksoft.kvision.form.select.AjaxOptions -import pl.treksoft.kvision.form.select.SELECTWIDTHTYPE -import pl.treksoft.kvision.form.select.Select -import pl.treksoft.kvision.form.select.SelectInput -import pl.treksoft.kvision.form.select.SelectOptGroup -import pl.treksoft.kvision.form.select.SelectOption -import pl.treksoft.kvision.form.spinner.FORCETYPE -import pl.treksoft.kvision.form.spinner.Spinner -import pl.treksoft.kvision.form.spinner.SpinnerInput -import pl.treksoft.kvision.form.string -import pl.treksoft.kvision.form.text.Password -import pl.treksoft.kvision.form.text.RichText -import pl.treksoft.kvision.form.text.TEXTINPUTTYPE -import pl.treksoft.kvision.form.text.Text -import pl.treksoft.kvision.form.text.TextArea -import pl.treksoft.kvision.form.text.TextAreaInput -import pl.treksoft.kvision.form.text.TextInput -import pl.treksoft.kvision.form.time.DateTime -import pl.treksoft.kvision.form.time.DateTimeInput -import pl.treksoft.kvision.html.* -import pl.treksoft.kvision.html.TAG.DIV -import pl.treksoft.kvision.html.TAG.H1 -import pl.treksoft.kvision.modal.Alert -import pl.treksoft.kvision.modal.Confirm -import pl.treksoft.kvision.modal.Modal -import pl.treksoft.kvision.panel.* -import pl.treksoft.kvision.routing.routing -import pl.treksoft.kvision.snabbdom.obj -import pl.treksoft.kvision.utils.perc -import pl.treksoft.kvision.utils.px -import pl.treksoft.kvision.utils.toDateF -import kotlin.js.Date - -class Showcase : ApplicationBase() { - - override fun start(state: Map) { - data class DataForm(val a: String?, val b: Boolean?, val c: Date?) - - val f = DataForm("ala", true, Date()) - val form = Form { - DataForm(it.string("a"), it.bool("b"), it.date("c")) - } - form.add("a", Text()) - form.add("b", CheckBox()) - form.add("c", DateTime()) - form.setData(f) - val ret = form.getData() - console.log(ret) - - class DataFormMap(map: Map) { - val name: String by map - val age: Date by map - } - - val fm = DataFormMap(mapOf("name" to "Ala", "age" to Date())) - val formm = Form { - DataFormMap(it) - } - formm.add("name", Text()) - formm.add("age", DateTime()) - formm.setData(fm) - val retm = formm.getData() - console.log(retm.name) - console.log(retm.age) - - val root = Root("showcase") - - class Model(p: Boolean, t: String) : DataComponent() { - var p: Boolean by obs(p) - var t: String by obs(t) - } - - val model = observableListOf(Model(true, "Pierwszy"), Model(false, "Drugi"), Model(false, "Trzeci")) - val datac = DataContainer(model, { element, index -> - CheckBox( - value = element.p, - label = if (element.p) "" + (index + 1) + " " + element.t + "" else element.t, - rich = true - ).setEventListener({ - click = { - element.p = self.value - } - }) - }) - root.add(datac) - - val mbutton = Button("Pokaż wartości").setEventListener