KVision allows you to build modern web applications with the Kotlin language

Overview

KVision Logo

KVision

Object oriented web framework for Kotlin/JS.

https://kvision.io

CI API IR License: MIT Slack Discord

KVision allows you to build modern web applications with the Kotlin language, without any use of HTML, CSS or JavaScript. It gives you a rich hierarchy of ready to use GUI components, which can be used as builder blocks for the application UI.

KVision fully supports both reactive and imperative programming models. It gives you everything you may need for the state management of your apps.

KVision contains innovative connectivity interface for Ktor, Jooby, Spring Boot, Javalin, Vert.x and Micronaut frameworks on the server side, which allows to build fullstack applications with shared code for data model and business logic.

KVision is being actively developed. Please create an issue for any bugs or feature requests.

Sample code

class App : Application() {

    val state = ObservableValue("Hello world")

    override fun start() {
        root("root") {
            vPanel {
                h1(state) {
                    +it
                }
                button("Add an exclamation mark").onClick {
                    state.value += "!"
                }
            }
        }
    }
}

Features

Examples and documentation

Ready to explore, rich set of KVision examples is available in the separate project.

See also the complete frontend implementation of RealWorld example application and a fullstack version built with Spring Webflux and R2DBC.

The comprehensive KVision guide is published on GitBook.

The API documentation, generated with new Dokka, is available at https://rjaros.github.io/kvision/index.html.

You can also look at KVision blog posts at dev.to and you can talk with KVision users and developers on Kotlin Slack #kvision channel and on the Discord server.

Quickstart

Development

  1. Download KVision examples from GitHub:

     git clone https://github.com/rjaros/kvision-examples.git
    
  2. Enter one of the examples directory:

     cd kvision-examples/showcase                        (on Linux)
     cd kvision-examples\showcase                        (on Windows)
    
  3. Run Gradle incremental build with:

     ./gradlew -t run                                    (on Linux)
     gradlew.bat -t run                                  (on Windows)
    
  4. Open http://localhost:3000/ in your browser.

  5. Play with the code and see your changes immediately in the browser.

Production

To build complete application optimized for production run:

    ./gradlew zip                       (on Linux)
    gradlew.bat zip                     (on Windows)

Application package will be saved as build/libs/showcase-1.0.0-SNAPSHOT.zip.

Leave us a star

If you like this project, please give it a star on GitHub. Thank you!

Comments
  • Upgrading 2.10.0 -> 3.6.0

    Upgrading 2.10.0 -> 3.6.0

    Dzień dobry!

    I think I've seen this before, but do not remember the solution:

    npm ERR! code E404
    npm ERR! 404 Not Found - GET https://registry.npmjs.org/kvision-kvision-common-types - Not found
    npm ERR! 404 
    npm ERR! 404  '[email protected]' is not in the npm registry.
    npm ERR! 404 You should bug the author to publish it (or use the name yourself!)
    npm ERR! 404 It was specified as a dependency of 'kvision'
    

    What am I doing wrong?

    opened by joerg-rade 58
  • Dynamic Table Data

    Dynamic Table Data

    The following code used to work, but ceased to do so a while ago (I really should cover it better in tests!): (used to work = data was displayed)

    /**
     * Makes properties of delegate available for display in tabulator.
     * For regular TObjects these are members (properties).
     * For FixtureResults these are: result, resultClass etc.
     *
     * Exposer bears some similarity to the JS "Revealing Module Pattern"
     * (see: https://addyosmani.com/resources/essentialjsdesignpatterns/book/),
     * but it goes further since it even reveals members of it's delegate.
     */
    @Serializable
    class Exposer(val delegate: TObject) {
    
        var iconName = ""
        var selected = false 
    
        fun dynamise(): dynamic {
            val thys = this.asDynamic()
            for (m in delegate.members) {
                val member = m.value
                if (member.memberType == MemberType.PROPERTY.type) {
                    val realValue = member.value
                    if (realValue != null) {
                        thys[member.id] = realValue.content
                    }
                }
            }
            iconName = IconManager.find(delegate.title)
            if (iconName == IconManager.DEFAULT_ICON) {
                iconName = IconManager.find(delegate.domainType)
            }
            return thys
        }
    
        // eg. for dataNucleusId
        fun get(propertyName: String): Any? {
            return this.delegate.getProperty(propertyName)?.value
        }
    
    }
    

    I added in @OptIn(ExperimentalJsExport::class) and @JsExport without success.

    Was there any change in KVision, Tabulator, or Kotlin that broke this code?

    opened by joerg-rade 25
  • Gradle plugin refactor

    Gradle plugin refactor

    Hi, here's a first go at refactoring the plugin to make it

    1. more configurable (resolves #392)
    2. compatible with Gradle caching (resolve #393)

    I've only very briefly tested compatibility with Kotlin JS - see the included test project (open it independently, e.g. idea kvision-tools/kvision-gradle-plugin-test/)

    I wanted to share the progress to get feedback. I hope they make the plugin much more clear and understandable.

    Summary

    • enabled Gradle build cache and parallel build. This is unrelated, but it really helps with development
    • bump com.gradle.plugin-publish (which means no need for META-INF prop file, so I've moved it)
    • share URL between Gradle plugin definition and Maven POM
    • created a new KVisionPlugin
    • create specific tasks for the tasks defined in KVisionGradleSubplugin
    • create KVisionExtension for shared plugin/task config
    • add kvision(...) dependency helper function
    • renamed the subproject directory to match the other subprojects

    TODO

    • [x] Create some TestKit tests
    • [x] create a demo project for Kotlin MPP
    • [ ] Re-align KVisionGradleSubplugin and the new KVision plugin. I've kept the existing plugin in as a reference, but only one should remain.
    • [ ] Update the example projects
    • [ ] Update the documentation
    opened by aSemy 22
  • Redux states - do they need to be serializable?

    Redux states - do they need to be serializable?

    Is there any specific reason why KVision's redux module should require serializable data classes? I'm running into a problem with a custom class of ObjectID from MongoDB. I've written a custom serializer for my class:

    @Serializer(forClass = ObjectID::class)
    object ObjectIDSerializer: KSerializer<ObjectID> {
        override val descriptor: SerialDescriptor =
                StringDescriptor.withName("ObjectID")
    
        override fun serialize(encoder: Encoder, obj: ObjectID) {
            encoder.encodeString(obj.toString())
        }
    
        override fun deserialize(decoder: Decoder): ObjectID {
            return ObjectID(decoder.decodeString())
        }
    }
    

    but when I try to run it in the browser, I get Can't locate argument-less serializer for class null even though none of my variables in the redux state are nullable. Is it possible to remove the requirement for it to be serializable? Unless there is a specific reason why it needs to be.

    opened by robert-cronin 19
  • node: Permission denied when building kvision project

    node: Permission denied when building kvision project

    I'm building a KVision+Micronaut project on Linux and running into an error during my Gradle build, starting with no gradle cache:

    > Task :kotlinNpmInstall
    ...
    error /home/tyrel/devel/northpass/build/js/node_modules/core-js: Command failed.
    Exit code: 127
    Command: node -e "try{require('./postinstall')}catch(e){}"
    Arguments: 
    Directory: /home/tyrel/devel/northpass/build/js/node_modules/core-js
    Output:
    /bin/sh: 1: node: not found
    

    If I try to run in a second time, I get nearly the exact same error except it says "Permission denied" instead of "not found". That error then continues.

    Here are some potentially relevant portions of my gradle file, which are copied from various kvision samples:

         val frontendMain by getting {
            resources.srcDir(webDir)
            dependencies {
                implementation(kotlin("stdlib-js"))
                implementation("pl.treksoft:kvision:$kvisionVersion")
                implementation("pl.treksoft:kvision-fontawesome:$kvisionVersion")
                implementation("pl.treksoft:kvision-i18n:$kvisionVersion")
                implementation("pl.treksoft:kvision-onsenui:$kvisionVersion")
                implementation("pl.treksoft:kvision-onsenui-css:$kvisionVersion")
            }
            kotlin.srcDir("build/generated-src/frontend")
        }
    
    fun getNodeJsBinaryExecutable(): String {
        val nodeDir = NodeJsRootPlugin.apply(project).nodeJsSetupTaskProvider.get().destination
        val isWindows = System.getProperty("os.name").toLowerCase().contains("windows")
        val nodeBinDir = if (isWindows) nodeDir else nodeDir.resolve("bin")
        val command = NodeJsRootPlugin.apply(project).nodeCommand
        val finalCommand = if (isWindows && command == "node") "node.exe" else command
        return nodeBinDir.resolve(finalCommand).absolutePath
    }
    

    Any suggestions on finding our more about the problem here?

    opened by tyrel 16
  • Spring Boot OAuth2

    Spring Boot OAuth2

    First of all I would like to say that this project seems very promising and can be used by our company's internal tools team.

    Thank you for your hard work on integrations and documentation.

    We use OAuth2 (Keycloak) in our company for authentication. I tried template-fullstack-spring-boot example and added simple oauth security configuration:

    1. implementation("org.springframework.boot:spring-boot-starter-oauth2-client")
    2. simple application.yml Github configuration:
    spring:
      security:
        oauth2:
          client:
            registration:
              github:
                clientId: client_id
                clientSecret: client_secret
    
    @Bean    
    fun securityWebFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
            return http
                .csrf().disable()
                .authorizeExchange().anyExchange().authenticated().and()
                .oauth2Login()
                .and().build()
        }
    

    But after I launch app I am getting: jquery.js?0110:10099 GET http://localhost:3000/login 404 (Not Found)

    Should I somehow provide implementation for /login on UI? What is a correct way to handle such situation?

    Thanks in advance!

    opened by glebrodionov 16
  • <app>.js not loaded after migrating to 5.1.1 ?

    .js not loaded after migrating to 5.1.1 ?

    index.html is fetched, but kroviz.js isn't displaying the burger button. What am I doing wrong?

    https://github.com/apache/isis/blob/ISIS-2872/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/App.kt https://github.com/apache/isis/blob/ISIS-2872/incubator/clients/kroviz/build.gradle.kts

    11:13:32: Executing task ' -t run'...
    
    > Task :kotlinNodeJsSetup SKIPPED
    > Task :kotlinNpmCachesSetup
    > Task :packageJson UP-TO-DATE
    > Task :rootPackageJson UP-TO-DATE
    > Task :kotlinNpmInstall UP-TO-DATE
    > Task :generateExternalsIntegrated SKIPPED
    > Task :compileKotlinJs UP-TO-DATE
    > Task :processResources UP-TO-DATE
    > Task :mainClasses UP-TO-DATE
    > Task :compileDevelopmentExecutableKotlinJs UP-TO-DATE
    > Task :developmentExecutableCompileSync UP-TO-DATE
    > Task :browserDevelopmentRun
    > Task :run
    
    Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
    Use '--warning-mode all' to show the individual deprecation warnings.
    See https://docs.gradle.org/6.7/userguide/command_line_interface.html#sec:command_line_warnings
    
    BUILD SUCCESSFUL in 1s
    9 actionable tasks: 2 executed, 7 up-to-date
    
    Waiting for changes to input files of tasks... (ctrl-d then enter to exit)
    <i> [webpack-dev-server] [HPM] Proxy created: /kv  -> http://localhost:8080
    <i> [webpack-dev-server] [HPM] Proxy created: /kvws  -> ws://localhost:8080
    <i> [webpack-dev-server] Project is running at:
    <i> [webpack-dev-server] Loopback: http://localhost:3000/
    <i> [webpack-dev-server] On Your Network (IPv4): http://192.168.178.24:3000/
    <i> [webpack-dev-server] On Your Network (IPv6): http://[fe80::b87d:900:f9c6:bbd]:3000/
    <i> [webpack-dev-server] Content not from webpack is served from 'C:\data\master\isis\incubator\clients\kroviz\build/processedResources/js/main' directory
    

    ScreenShot 558 DevTools - localhost_3000_

    opened by joerg-rade 14
  • Typeahead/Select component with remote data source

    Typeahead/Select component with remote data source

    I am trying to use these components with remote data source but I do not understand how to configure. I think it is better to create a parameter like that:

    suspend fun getOptions(search?: String): List<String>
    

    It is more customizable and I can use that with the base component (~remote~).

    I have seen the ajax options for the base component, I mean AjaxOptions class, but to separate the UI components from the business logic, I prefer to use a custom service class.

    On the other hand, I have not been seeing a function parameter to display each option of the components. I mean I want to include images and more information like a description or a date. Currently, I can only see a list of items.

    opened by eugenio1590 12
  • smooth transitions between switching components

    smooth transitions between switching components

    I'm creating one of my first websites to display data.

    You can see the WIP page here.

    Click the numbers on the left and use ctrl + the up and down arrow keys to naviage.

    I'm wondering if there is a way to switch these images without the screen flickering and irritating people's eyes.

    This may be due to a lack of experience on my part, or it may be an inherent limitation of kvision. Probably the former and if so I apologize but I wasn't sure where else to ask this.

    When you switch between subjects, this code is eventually called to make the change:

    (this is called within a VPanel that's inside the tab)

    //  inspectChildrenRetrieval constructs all the components and returns a List<Widget>
    // I was hoping this would reduce the flickering by preloading and preparing the images
    val hopefullyPrepped = inspectChildrenRetrieval(obj)
    
    // removes all children from the VPanel. 
    // I see at the bottom of this, the function refresh() is called. 
    // Perhaps this is bad for my situation? 
    // Is there some way to avoid the refresh() here to reduce visual flicker?
    removeAll()
    
    // obviously the main flicker happens here, when everything is added. 
    // The images seem to appear at the wrong size and then quickly fix themselves. 
    // How can I make them appear at the right size and location right away?
    addAll(hopefullyPrepped)
    
    
    opened by mgroth0 12
  • Page loader module

    Page loader module

    I think one of the things missing for KVision is a good loader/spinner module. Since a lot of the cool things KVision can do are using coroutines and ajax requests, it stands to reason that KVision needs a good loading bar.

    I saw there is ProgressBar which works well for our team in our forms, but we also would like a generic loader when we load our data from the backend (our app is very data intensive and makes a lot of requests).

    I could just create something for our team, but would rather contribute something to KVision for others. Let me know what you think, I was thinking something like a wrapper for nanobar.js or pace.js

    opened by robert-cronin 12
  • Frontend service not starting

    Frontend service not starting

    I created a new project using the Kvision wizzard and when I try to run it, the frontend service is not starting giving the error message below.

    You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.
    
    See https://docs.gradle.org/7.2/userguide/command_line_interface.html#sec:command_line_warnings
    
    BUILD SUCCESSFUL in 34s
    10 actionable tasks: 7 executed, 3 up-to-date
    
    Waiting for changes to input files of tasks... (ctrl-d then enter to exit)
    [webpack-cli] Unable to load '@webpack-cli/serve' command
    [webpack-cli] TypeError: options.forEach is not a function
    [webpack-cli] TypeError: options.forEach is not a function
        at WebpackCLI.makeCommand (E:\DEV_PROJECTS\CMIS\build\js\node_modules\webpack-cli\lib\webpack-cli.js:108:21)
        at ServeCommand.apply (E:\DEV_PROJECTS\CMIS\build\js\node_modules\@webpack-cli\serve\lib\index.js:42:19)
        at loadCommandByName (E:\DEV_PROJECTS\CMIS\build\js\node_modules\webpack-cli\lib\webpack-cli.js:797:35)
        at Command.<anonymous> (E:\DEV_PROJECTS\CMIS\build\js\node_modules\webpack-cli\lib\webpack-cli.js:1255:23)
        at Command.listener [as _actionHandler] (E:\DEV_PROJECTS\CMIS\build\js\node_modules\commander\index.js:922:31)
        at Command._parseCommand (E:\DEV_PROJECTS\CMIS\build\js\node_modules\commander\index.js:1503:14)
        at Command.parse (E:\DEV_PROJECTS\CMIS\build\js\node_modules\commander\index.js:1292:10)
        at Command.parseAsync (E:\DEV_PROJECTS\CMIS\build\js\node_modules\commander\index.js:1318:10)
        at WebpackCLI.run (E:\DEV_PROJECTS\CMIS\build\js\node_modules\webpack-cli\lib\webpack-cli.js:1287:28)
        at runCLI (E:\DEV_PROJECTS\CMIS\build\js\node_modules\webpack-cli\lib\bootstrap.js:11:19)
    
    opened by chavu 11
  • Support for global styles without relying on css classname literals

    Support for global styles without relying on css classname literals

    One way to avoid recalculating styles on the fly (and yet keep styling in code) is to have a global styles class (or series of classes/objects) which is initialized.

    For example:

    class GlobalStyles {
    
        val cardStyle = Style(".card") {
                // stuff here
            }
        }
    }
    

    This gets "imported" as follows:

    val styles = GlobalStyles()
    

    ...and now styles don't need to be regenerated each time components are rerendered. However, it's a bit messy, since it relies on the css classname to "link" the style to the component; i.e. to use it, of course, I have to have a widget that does:

    class CardView(): Div() {
       init {
          addCssClass("card")
       }
    }
    

    I can't even break out "card" fully to a constant, because the css rule wants a dot in front of it, so I'd need to prepend with a dot when initializing the style (which is...ok, but still smelly.)

    Can you come up with a cleaner way of "linking" the component to the global style? (This may be the same solution as #450, but I thought I would file separately in case there are two separate ways of tackling this.)

    One possibility, though I don't know if inline/reifying/etc will work with the js compiler:

    class GlobalStyles {
    
        val cardStyle = Style.for<CardView>() {
            // stuff here
        }
    }
    

    Of course, people would eventually want to replicate CSS selectors in code, so you could imagine craziness like:

    class GlobalStyles {
    
        val cardStyle = Style.for<Heading1>().in<CardView> {
            // stuff here
        }
    }
    

    ...but maybe this isn't so bad, as it's more readable than css selectors for somebody who isn't a browser developer.

    Another simpler possibility:

    class CardView {
    
        staticStyle {
             // stuff here
        }
    }
    
    
    opened by reubenfirmin 3
  • New map module based on MapLibre

    New map module based on MapLibre

    This is a very speculative issue,

    https://maplibre.org/

    I like the look of MapLibre for a couple of reasons:

    • TypeScript native (Leaflet is entirely JS and it doesn't look like they'll be using TypeScript any time soon)
    • Native vector tile support https://maplibre.org/maplibre-gl-js-docs/example/third-party/ (Leaflet requires 3rd party plugins)
    • Leaflet has an ugly display bug (for 7 years!) where white lines appear between tiles https://github.com/Leaflet/Leaflet/issues/3575
    • it uses TypeScript, which is much more easy to integrate with Kotlin

    Generally it looks like MapLibre is less popular (it's much newer, having been recently split from MapBox, after a license change), but it supports more modern features.

    Implementing MapLibre bindings is made much more difficult because Dukat fails to generate anything https://github.com/Kotlin/dukat/issues/477. By comparison, Dukat did generate most of the Leaflet bindings, which provided a good basis. However... those aren't perfect because Leaflet is not TypeScript native (unlike MapLibre), so the TypeScript the Leaflet bindings were generated from might not be accurate (but they seem to work okay). So it's a mixed bag. Anyway, defining new bindings is a lot of work, regardless of Dukat support.

    There is some interest in creating Kotlin bindings for MapBox/MapLibre https://github.com/Kotlin/dukat/issues/477. Additional it looks like there's some movement to migrate the MapLibre's Java code to Kotlin https://github.com/maplibre/maplibre-gl-native/pull/420 - so maybe MapLibre devs could help with the bindings? Or even include them themselves? I might make an issue.

    I'm not likely to pick this up any time soon - Leaflet is good enough. But if there's a lot of support, or someone wants to collaborate, I could give it a go.

    enhancement PR welcomed 
    opened by aSemy 3
  • row.getPosition(false) is missing

    row.getPosition(false) is missing

    Tabulator changed it. I was using it to get row number in original data set. Not all data sets have IDs. Some queries with group by for example.

    How now in a click handler I can get row number in original data set?

    thanks

    opened by mgrouch 5
  • How to load page data in the background

    How to load page data in the background

    I have a web page with a tabPannel that has 7 tabs. I'm loading 8 data collections displayed in tables on the tabs during page load, but it takes a lot of time to fully load the data from the server and the page is not responsive during that time. How can I make sure the data contintiues to load in the background while I can access other tabs which have loaded data.

    opened by chavu 2
  • > Module not found: Error: Can't resolve 'react-dom/client'

    > Module not found: Error: Can't resolve 'react-dom/client'

    Hi i'm updating kvision to last version 5.12.0 and now can't build frontend part

    Main error Caused by: java.lang.IllegalStateException: Module not found: Error: Can't resolve react-dom/client' in

    Full StackTrace Caused by: java.lang.IllegalStateException: Module not found: Error: Can't resolve react-dom/client' in /Users/user/test/project/build/js/packages/porject-frontend/kotlin-dce
        at org.jetbrains.kotlin.gradle.internal.ExecKt$execWithErrorLogger$1.invoke(exec.kt:82)
        at org.jetbrains.kotlin.gradle.internal.ExecKt$execWithErrorLogger$1.invoke(exec.kt:76)
        at org.jetbrains.kotlin.gradle.internal.ProgressKt.operation(progress.kt:21)
        at org.jetbrains.kotlin.gradle.internal.ProgressKt.operation$default(progress.kt:12)
        at org.jetbrains.kotlin.gradle.internal.ExecKt.execWithErrorLogger(exec.kt:76)
        at org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackRunner.execute(KotlinWebpackRunner.kt:31)
        at org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack.doExecute(KotlinWebpack.kt:304)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
        at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:242)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:227)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:210)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:193)
        at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:171)
        at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:89)
        at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:40)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:53)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:50)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:40)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:61)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:42)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:60)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:27)
        at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:180)
        at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)
        at org.gradle.internal.Either$Right.fold(Either.java:175)
        at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:36)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:25)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:110)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:56)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:56)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:73)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:44)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:89)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:50)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:114)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:57)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:76)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:50)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.executeWithNoEmptySources(SkipEmptyWorkStep.java:249)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:86)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:54)
        at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:32)
        at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:21)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
        at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:43)
        at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:31)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40)
        at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:287)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:33)
        at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:144)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:133)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:333)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:320)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:313)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:299)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:143)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:227)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:218)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:140)
        at org.gradle.execution.plan.DefaultPlanExecutor.process(DefaultPlanExecutor.java:72)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.executeWithServices(DefaultTaskExecutionGraph.java:144)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.execute(DefaultTaskExecutionGraph.java:129)
        at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:42)
        at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:51)
        at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor$ExecuteTasks.call(BuildOperationFiringBuildWorkerExecutor.java:54)
        at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor$ExecuteTasks.call(BuildOperationFiringBuildWorkerExecutor.java:43)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor.execute(BuildOperationFiringBuildWorkerExecutor.java:40)
        at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$executeTasks$7(DefaultBuildLifecycleController.java:165)
        at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:238)
        at org.gradle.internal.model.StateTransitionController.lambda$tryTransition$8(StateTransitionController.java:174)
        at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:44)
        at org.gradle.internal.model.StateTransitionController.tryTransition(StateTransitionController.java:174)
        at org.gradle.internal.build.DefaultBuildLifecycleController.executeTasks(DefaultBuildLifecycleController.java:165)
        at org.gradle.internal.build.DefaultBuildWorkGraphController$DefaultBuildWorkGraph.runWork(DefaultBuildWorkGraphController.java:142)
        at org.gradle.composite.internal.DefaultBuildController.doBuild(DefaultBuildController.java:231)
        at org.gradle.internal.Factories$1.create(Factories.java:31)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:270)
        at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:119)
        at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:124)
        at org.gradle.composite.internal.DefaultBuildController.doRun(DefaultBuildController.java:204)
        at org.gradle.composite.internal.DefaultBuildController.access$000(DefaultBuildController.java:51)
        at org.gradle.composite.internal.DefaultBuildController$BuildOpRunnable.run(DefaultBuildController.java:264)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    
    BuildGradle frontentd
    sourceSets["frontendMain"].apply {
        resources.srcDir(webDir)
        dependencies {
    
            implementation(kotlin("stdlib-js"))
            implementation(npm("toastr", "^2.1.4"))
            implementation(npm("dateformat", "3.0.3"))
            implementation(npm("react-spinners-kit", "*"))
    
            implementation("io.kvision:kvision:$kvisionVersion")
            implementation("io.kvision:kvision-bootstrap:$kvisionVersion")
            implementation("io.kvision:kvision-bootstrap-css:$kvisionVersion")
            implementation("io.kvision:kvision-bootstrap-select:$kvisionVersion")
            implementation("io.kvision:kvision-bootstrap-datetime:$kvisionVersion")
            implementation("io.kvision:kvision-bootstrap-spinner:$kvisionVersion")
            implementation("io.kvision:kvision-bootstrap-upload:$kvisionVersion")
            implementation("io.kvision:kvision-bootstrap-dialog:$kvisionVersion")
            implementation("io.kvision:kvision-fontawesome:$kvisionVersion")
            implementation("io.kvision:kvision-i18n:$kvisionVersion")
            implementation("io.kvision:kvision-richtext:$kvisionVersion")
            implementation("io.kvision:kvision-handlebars:$kvisionVersion")
            implementation("io.kvision:kvision-datacontainer:$kvisionVersion")
            implementation("io.kvision:kvision-redux-kotlin:$kvisionVersion")
            implementation("io.kvision:kvision-chart:$kvisionVersion")
            implementation("io.kvision:kvision-tabulator:$kvisionVersion")
            implementation("io.kvision:kvision-pace:$kvisionVersion")
            implementation("io.kvision:kvision-moment:$kvisionVersion")
            implementation("io.kvision:kvision-react:$kvisionVersion")
            implementation("io.kvision:kvision-state:$kvisionVersion")
            implementation("io.kvision:kvision-routing-navigo:$kvisionVersion")
            implementation("io.kvision:kvision-bootstrap-typeahead:$kvisionVersion")
        }
    
        kotlin.srcDir("build/generated-src/frontend")
    }
    sourceSets["frontendTest"].dependencies {
        implementation(kotlin("test-js"))
        implementation("io.kvision:kvision-testutils:$kvisionVersion:tests")
    }
    
    opened by Souppp 2
Releases(6.0.1)
  • 6.0.1(Jan 1, 2023)

  • 6.0.0(Dec 30, 2022)

    • Java 17 or greater is now required.
    • Upgraded dependencies (Kotlin 1.8.0, Spring Boot 3.0.1, Micronaut 3.8.0, Ktor 2.2.1, Koin 3.3.0, Vert.x 4.3.7, kotlin-wrappers 466, Chart.js 4.1.1, npm-publish 3.2.0, bootstrap-icons 1.10.3, OnsenUI 2.12.8, tempus-dominus 6.2.10, trix 2.0.4, Electron 22.0.0, Tabulator 5.4.3)
    • Drop support for the deprecated legacy backend.
    • Direct dependency on kotlinx.coroutines library.
    • Removed deprecated components and modules (kvision-bootstrap-select, kvision-bootstrap-select-remote, kvision-bootstrap-datetime, kvision-bootstrap-typeahead, kvision-bootstrap-typeahead-remote, kvision-bootstrap-spinner, kvision-chart2, kvision-datacontainer, kvision-moment, kvision-toast, kvision-tabulator4 i kvision-tabulator4-remote).
    • Merge kvision-bootstrap, kvision-bootstrap-css and kvision-bootstrap-dialog modules.
    • Support for returning kotlin.Result<T> from fullstack remote methods.
    • Rename SimpleSelect to Select, SimpleSpinner to Spinner and Upload to BootstrapUpload.
    • Add new Upload/UploadInput components based on browser file input API.
    • Move Spinner and Range components to the new io.kvision.form.number package.
    • Change Spinner component into integer-only.
    • New Numeric/NumericInput and ImaskNumeric/ImaskNumericInput components for handling decimal numbers.
    • New kvision-ballast and kvision-routing-ballast modules integrating with Ballast state management framework.
    • Remove greatly overused fluent pattern from different components (#326).
    • Support type-safe list style CSS options (#449).
    • Add new tabulator css module initializers for different CSS themes (use TabulatorCssBootstrapModule initializer for Bootstrap 5 theme) (#400).
    • Add labelFirst option to the constructor of CheckBox and Radio components.
    • Add maxlength option to the constructor of Text/TextInput components.
    • Support DropDown component without button arrow.
    • Additional XSMALL size for Button and ButtonGroup.
    • Change return type of getElement() to HTMLElement instead of Node.
    • Change default hash sign to '#' for navigo router.
    • Minor a11y fixes for TomSelect components.
    • Return handler id from onClick methods.
    • Require serializer parameter when initializing Tabulator with Kotlin data model.
    • Use kotlin.Result<T> in Cordova API.
    • Update Cordova Camera API (remove NATIVE_URI destination).
    • Restore clear button for DateTime time picker.
    • Fix manual configuration for Pace progress bar
    • Remove dedicated locale files for BootstrapUpload component.
    • Configure JVM toolchain.
    • Remove panelsCompatibilityMode option.
    • Remove lots of old, deprecated API.
    Source code(tar.gz)
    Source code(zip)
  • 6.0.0-Beta(Dec 4, 2022)

    • Java 17 or greater is now required
    • Upgraded dependencies (Kotlin 1.8.0-Beta, Spring Boot 3.0.0, Chart.js 4.0.1, kotlin-wrappers 455)
    • Drop support for the deprecated legacy backend
    • Removed deprecated modules (kvision-bootstrap-select, kvision-bootstrap-select-remote, kvision-bootstrap-datetime, kvision-bootstrap-typeahead, kvision-bootstrap-typeahead-remote, kvision-bootstrap-spinner, kvision-chart2, kvision-datacontainer, kvision-moment, kvision-toast, kvision-tabulator4 i kvision-tabulator4-remote)
    • Merge kvision-bootstrap and kvision-bootstrap-css module into one
    • Remove panelsCompatibilityMode option
    • Remove lots of old, deprecated API
    • Add new tabulator css module initializers for different CSS themes (use TabulatorCssBootstrapModule initializer for Bootstrap 5 theme)
    • Require serializer parameter when initializing Tabulator with Kotlin data model
    • Remove greatly overused fluent pattern from different components (#326)
    • Support type-safe list style CSS options (#449)
    • Return handler id from onClick methods
    • Minor a11y fixes for TomSelect components
    Source code(tar.gz)
    Source code(zip)
  • 5.18.1(Dec 1, 2022)

  • 5.18.0(Nov 26, 2022)

    • Upgraded dependencies (Kotlin 1.7.21, Spring Boot 2.7.6, Javalin 5.2.0, Vert.x 4.3.5, Micronaut 3.7.4, Jackson Module Kotlin 2.14.1, kotlin-wrappers 450, Bootstrap 5.2.3, Electron 21.3.1, Leaflet 1.9.3, Trix 2.0.1, Tempus Dominus 6.2.7, KSP 1.0.8, Gradle 7.6, Kotest 5.5.4 and some other npm dependencies)
    • New select and typeahead components based on Tom Select library (included in the new kvision-tom-select and kvision-tom-select-remote modules)
    • New kvision-toastify module supporting toasts without jQuery dependency
    • Cache generated style declarations (#450)
    • Support setting request parameters in the SimpleSelectRemote component
    • Fix nested ListTag rendering
    • Change dropdown icon for SimpleSelect component
    • Deprecate kvision-bootstrap-select, kvision-bootstrap-typeahead and kvision-toast modules, because JS libraries used by these modules are no longer maintained
    Source code(tar.gz)
    Source code(zip)
  • 5.17.0(Nov 1, 2022)

    • Upgraded dependencies (Ktor 2.1.3, Javalin 5.1.3, Micronaut 3.7.3, kotlin-wrappers 420, Kotest 5.5.3, Tempus-dominus 6.2.6)
    • Added new SimpleSpinner/SimpleSpinnerInput components based on plain HTML numeric input
    • Import correct bundle for Redux module (#447)
    • Support headerFilter for Tabulator component as a custom function (#446)
    • Add direct support for Tempus-dominus locales in DateTime components
    • Drop all jcenter dependencies
    • Replace kotlinx-nodejs with kotlin-node from kotlin-wrappers (easy to fix breaking changes are expected for Electron apps)
    Source code(tar.gz)
    Source code(zip)
  • 5.16.2(Oct 23, 2022)

    • Upgraded dependencies (Serialization 1.4.1, Dokka 1.7.20, Spring Boot 2.7.5, Javalin 5.1.1, Micronaut 3.7.2, kotlin-wrappers 412, KSP 1.0.7, bootstrap-fileinput 5.5.2, Leaflet 1.9.2, OnsenUI 2.12.6, Tabulator 5.4.2)
    • Correctly update radio button deselected state (#444)
    • Added formatterPrint and formatterPrintParams options to Tabulator column definitions (thanks to @tfonrouge)
    • Fixed exporting to CSV by delimiter used as String in Tabulator component (thanks to @tfonrouge)
    • Fixed return value of the getSorters() method of JS Tabulator component (thanks to @tfonrouge)
    Source code(tar.gz)
    Source code(zip)
  • 5.16.1(Oct 10, 2022)

    • Upgraded dependencies (Tabulator 5.4.1, kotlin-wrappers 403)
    • Generate services functions only when KVision services are used (fix compilation problems when remote module is not used in MPP projects)
    Source code(tar.gz)
    Source code(zip)
  • 5.16.0(Oct 5, 2022)

    • Upgraded dependencies (Kotlin 1.7.20, Spring Boot 2.7.4, Ktor 2.1.2, Javalin 5.0.1, Vert.x 4.3.4, Micronaut 3.7.1, Koin 3.2.2, kotlin-wrappers 399, Bootstrap 5.2.2, Tempus Dominus 6.2.4, Leaflet 1.9.1, OnsenUI 2.12.3, Tabulator 5.4.0)
    • Expose configuration options of split.js in the SplitPanel (#442)
    • Automatic custom exceptions registration using @KVServiceException (a @MetaSerializable annotation)
    Source code(tar.gz)
    Source code(zip)
  • 5.15.3(Sep 21, 2022)

  • 5.15.2(Sep 17, 2022)

    • Upgraded kotlin-wrappers to 386
    • Simplify Tabulator component localization
    • Move ServiceManager functions to the common sources set. Allow interface-only references in all fullstack components.
    Source code(tar.gz)
    Source code(zip)
  • 5.15.1(Sep 14, 2022)

    • Upgraded dependencies (Tabulator 5.3.4, kotlin-wrappers 384)
    • Fix problem with jQuery webpack provide plugin and Bootstrap (note: webpack.config.d/jquery.js should be removed from applications)
    Source code(tar.gz)
    Source code(zip)
  • 5.15.0(Sep 12, 2022)

    • Upgraded dependencies (Serialization 1.4.0, Spring Boot 2.7.3, Ktor 2.1.1, Javalin 5.0.0.RC2, Jooby 2.16.1, Micronaut 3.6.3, Jackson Module Kotlin 2.13.4, kotlin-wrappers 383, Bootstrap 5.2.1, Tabulator 5.3.3 and some other npm dependencies)
    • New kvision-datetime module based on new @eonasdan/tempus-dominus component (will replace kvision-bootstrap-datetime module in the future release)
    • New kvision-fullstack-ktor-koin module for Ktor with Koin dependency injection (instead of Guice)
    • Fix auto-shrinking windows (#433)
    • Use InputType enum instead of TextInputType (#432)
    • Handle "204 No Content" responses in RestClient (#435)
    • Optimize convertPoToJson gradle task (#436)
    • Fix dataEditedTabulator event
    • Better handling websocket cancellation exception on Firefox
    • Automatically generate functions to get Service and ServiceManager instances
    • Add extension property for configuring generated resources dir (thanks to @aSemy)
    Source code(tar.gz)
    Source code(zip)
  • 5.14.0(Aug 10, 2022)

    • Upgraded dependencies (Bootstrap 5.2.0, Gradle 7.5.1, Serialization 1.4.0-RC, Spring Boot 2.7.2, Micronaut 3.6.0, Vert.x 4.3.3, kotlin-wrappers 365, Kotest 5.4.1, Bootstrap icons 1.9.1, Tabulator 5.3.1, Chart.js 3.9.1, OnsenUI 2.12.2, Fontawesome 6.1.2)
    • New Offcanvas component in the kvision-bootstrap module
    • New SwitchInput/Switch components in the kvision-bootstrap module
    • Major rewrite of all check and radio components (remove awesome-bootstrap-checkbox dependency, restore original Bootstrap look and feel, add new reversed and labelFirst properties for horizontal form layouts) (#385)
    Source code(tar.gz)
    Source code(zip)
  • 5.13.1(Jul 15, 2022)

    • Upgraded dependencies (Coroutines 1.6.4, Dokka 1.7.10, Micronaut 3.5.3, kotlin-wrappers 357, Gradle 7.5)
    • Allow adding/removing css classes for DropDownButton when forNavbar is set to true (#423)
    • Support forms without strict data class model (#411)
    • Fix KSP processing KVBinding* annotations (#424)
    Source code(tar.gz)
    Source code(zip)
  • 5.13.0(Jul 12, 2022)

    • Upgraded dependencies (Kotlin 1.7.10, Javalin 4.6.4, Vert.x 4.3.2, kotlin-wrappers 354, OnsenUI 2.12.1, Tabulator 5.3.0 and some other npm dependencies)
    • Change bootstrap-typeahead dependency to a better supported fork
    • Added support for Bootstrap toasts (#420)
    • Fix KSP code generation on Windows
    Source code(tar.gz)
    Source code(zip)
  • 5.12.0(Jul 1, 2022)

    • Upgraded dependencies (Coroutines 1.6.3, Dokka 1.7.0, Spring Boot 2.7.1, Ktor 2.0.3, Micronaut 3.5.2, kotlin-wrappers 349, bootstrap-fileinput 5.5.0)
    • Migrate the compiler plugin to KSP
    • Add right align option for the dropdown menu (#415)
    • Fixed support for the legacy compiler (broken in 5.11.0)
    Source code(tar.gz)
    Source code(zip)
  • 5.11.0(Jun 19, 2022)

    • Upgraded dependencies (Kotlin 1.7.0, Javalin 4.6.3, React 18.2.0, kotlin-wrappers 346, Chart.js 3.8.0, Tabulator 5.2.7 and webpack npm dependencies)
    • Upgrade webpack dependencies in the gradle plugin to workaround KT-52776 (#410)
    • Completely redesigned and rewritten gradle plugin contributed by @aSemy (#392, #393)
    Source code(tar.gz)
    Source code(zip)
  • 5.10.1(Jun 4, 2022)

    • Upgraded dependencies (Ktor 2.0.2, Serialization 1.3.3, Jooby 2.15.1, Spring Boot 2.7.0, Javalin 4.6.0, Vert.x 4.3.1, Micronaut 3.5.1, kotlin-wrappers 341, Tabulator 5.2.6 and some other npm dependencies)
    • Restore Tabulator state (including filters) asynchronously (#402)
    • Allow to configure initial Leaflet map options (#404)
    • Add options to control select dropdown size (#403)
    • Upgrade navigo-kotlin-ng to support done hooks callback with parameter (#405)
    • Make requestFilter suspending for fullstack interfaces (#390)
    • Fix horizontal layout for feedback info with some form components
    • Support different form layouts when using form without data model
    Source code(tar.gz)
    Source code(zip)
  • 5.10.0(May 8, 2022)

    • Upgraded dependencies (Kotlin 1.6.21, Dokka 1.6.21, Jooby 2.14.1, Spring Boot 2.6.7, Ktor 2.0.1, Javalin 4.5.0, kotlin-wrappers 334, React 18.1.0 and some other npm packages)
    • Updated Leaflet to 1.8.0 (thanks @aSemy) - watch out for some breaking changes
    • Updated Tabulator to 5.2.3 - watch out for some breaking changes
    • New text input mask module (kvision-imask) powered by Imask.js
    • Full support for indeterminate property for CheckBox/CheckBoxInput components (#372)
    • New TriStateCheckBox/TriStateCheckBoxInput components
    • Fix drag & resize event handling for the Window component (#367)
    • Implement isActive() and Window.getActiveWindow() for Window components (#369)
    • Support dragging windows on touchscreen (#370)
    • Allow changing the window header height and the resize handle height (#375)
    • Fixed Window components html elements clash within resize observer (#374)
    • Fix optimization of virtual nodes generation from html
    Source code(tar.gz)
    Source code(zip)
  • 5.9.0(Apr 14, 2022)

    • Upgraded dependencies (Kotlin 1.6.20, Ktor 2.0.0, Coroutines 1.6.1, OnsenUI 2.12.0, Vert.x 4.2.7, Micronaut 3.4.2, kotlin-wrappers 329 and some other npm dependencies)
    • Fix bidirectional state binding for text form fields
    • Optimize virtual nodes generation from rich html strings
    • Optimize subscriptions of ObservableValue
    • Helper tasks in the gradle plugin for developing webworkers (#322)
    • Add property to allow working with MPP project without backend source set (#364)
    Source code(tar.gz)
    Source code(zip)
  • 5.8.3(Apr 1, 2022)

    • Upgraded dependencies (Spring 2.6.6, Ktor 1.6.8, Vert.x 4.2.6, Javalin 4.4.0, Micronaut 3.4.1, React 18.0.0, kotlin-wrappers 325, Gradle 7.4.2, Bootstrap icons 1.8.1, Font Awesome 6.1.1 and some other npm dependencies)
    • Allow more dynamic configuration of Chart.js component (#361)
    Source code(tar.gz)
    Source code(zip)
  • 5.8.2(Feb 28, 2022)

    • Upgraded dependencies (Gradle 7.4, Spring Boot 2.6.4, Vert.x 4.2.5, Micronaut 3.3.3, kotlin-wrappers 308, multiplatform-diff 0.4.0, Tabulator 5.1.3)
    • Support user-defined exceptions in the fullstack interfaces (#354)
    • Better handling empty string values in text inputs (#352)
    • Fix finalization problems with Leaflet Maps
    Source code(tar.gz)
    Source code(zip)
  • 5.8.1(Feb 6, 2022)

    • Upgraded dependencies (Electron17.0.0, kotlin-wrappers 293, Tabulator 5.1.0, Snabbdom 3.3.1)
    • Fixed Tabulator error with empty data - another try (#339)
    • Support overflow-x and overflow-y CSS properties (#348)
    • Forked bootstrap-select and upgraded to 1.14.0-beta3 (#345)
    • Added new extension functions and properties to decode KFile content (#347)
    Source code(tar.gz)
    Source code(zip)
  • 5.8.0(Jan 30, 2022)

    • Upgraded dependencies (Jooby 2.13.0, Spring Boot 2.6.3, Vert.x 4.2.4, Micronaut 3.3.0, Guice 5.1.0, kotlin-wrappers 292, npm-publish 2.1.2, kotest 5.1.0)
    • Upgraded some npm packages to fix vulnerable dependencies
    • Major refactoring of serialization in the fullstack interfaces including removal of old workarounds and legacy code Note: You might need to add @Serializable annotation to your enum classes in the common module
    • Support custom serialization modules for the fullstack interfaces (#342)
    • Fixed Tabulator error with empty data (#339)
    • Added new generateKVisionSources task to the Gradle plugin
    • Added missing responsiveCollapse formatter for Tabulator component
    Source code(tar.gz)
    Source code(zip)
  • 5.7.2(Jan 16, 2022)

    • Upgraded dependencies (Javalin 4.3.0, Micronaut 3.2.6, kotlin-wrappers 290 and various npm projects)
    • Fix date/time serialization format for TabulatorRemote (#334)
    • Fix row height in tabulator (#332)
    Source code(tar.gz)
    Source code(zip)
  • 5.7.1(Jan 6, 2022)

  • 5.7.0(Jan 6, 2022)

    Update: Version 5.7.0 is broken. Please use 5.7.1.

    • Upgraded dependencies (Kotlin 1.6.10, Serialization 1.3.2, Coroutines 1.6.0, Spring Boot 2.6.2, Micronaut 3.2.4, Ktor 1.6.7, Javalin 4.2.0, Vert.x 4.2.3, kotlin-wrappers 286, Gradle 7.3.3, Dokka 1.6.10, Jackson Module Kotlin 2.13.1)
    • Major rewrite of the kvision-maps module, thanks to @aSemy (introduces breaking changes in the API!)
    • Introduce Kotest to the kvision-testutils module, thanks to @aSemy
    • New option to customize Json serialization configuration for the whole app (#324)
    • Add properties to disable functions of the KVision gradle plugin (see KT-50410)
    • Support data-navigo attribute for links to make history API routing easier to use
    • A few fixes for the Tabulator component
    • Use new Kotlin React API in the kvision-react module (introduces breaking changes in the API!)
    • Rename JSON objects to Serialization to avoid conflict with kotlin.js.JSON (add deprecated typealiases for compatibility)
    • Forked and updated some npm packages to fix vulnerable dependencies
    Source code(tar.gz)
    Source code(zip)
  • 5.6.1(Dec 2, 2021)

  • 5.6.0(Nov 29, 2021)

    • Upgraded dependencies (Kotlin 1.6.0, Serialization 1.3.1, Coroutines 1.6.0-RC, Spring Boot 2.6.0, Micronaut 3.2.0, Ktor to 1.6.6, Redux 4.1.2, kotlin-wrappers 274, Dokka 1.6.0, Gradle 7.3).
    • Upgrade Snabbdom to 3.1.0 with built-in wrappers instead of external library.
    • Upgrade Tabulator to 5.0.7 in the main kvision-tabulator module. Publish kvision-tabulator4 module with the old and now deprecated Tabulator component based on Tabulator 4.x for compatibility.
    • Upgrade Chart.js to 3.6.0 in the main kvision-chart module. Publish kvision-chart2 module with the old and now deprecated Chart component based on Chart.js 2.x for compatibility.
    • Fix invalid feedback with long text for horizontal forms.
    • Add methods for asynchronous testing in kvision-testutils module.
    Source code(tar.gz)
    Source code(zip)
Owner
Robert Jaros
Robert Jaros
An Interpreter/Transpiler for the Folders esoteric programming language, a language with no code and just folders

Folders2kt ?? An Interpreter/Transpiler of the Folders esoteric programming language, a language with no code and just folders, written in Kotlin Show

Jens Klingenberg 18 Jan 4, 2023
🟣 Opinionated Kotlin libs, DSLs and frameworks to build better web apps

Tegral Tegral is an opinionated collection of Kotlin frameworks, libraries, helpers and DSLs that help you make awesome apps, from web back-ends and b

Zoroark 21 Dec 22, 2022
Building Web Applications with React and Kotlin JS Hands-On Lab

Building Web Applications with React and Kotlin JS Hands-On Lab This repository is the code corresponding to the hands-on lab Building Web Application

Brian Donnoe 0 Nov 13, 2021
Build with Jetpack Compose & all modern techniques and architecture of android app development

IMDB Movie App Build with Jetpack Compose & all modern techniques and architecture of android app development ScreenShots ?? Built With ?? Kotlin - Fi

Jayant Kumar 7 Dec 17, 2022
Ktor is an asynchronous framework for creating microservices, web applications and more.

ktor-sample Ktor is an asynchronous framework for creating microservices, web applications and more. Written in Kotlin from the ground up. Application

mohamed tamer 5 Jan 22, 2022
Jetpack Compose for Desktop and Web, a modern UI framework for Kotlin that makes building performant and beautiful user interfaces easy and enjoyable.

Jetpack Compose for Desktop and Web, a modern UI framework for Kotlin that makes building performant and beautiful user interfaces easy and enjoyable.

JetBrains 10k Jan 7, 2023
Web Container: A simple web container library for Android to help fellow developer to open WebView easily

WebContainer Description Web Container is a simple web container library for And

Achmad Ichsan Thaib 8 Nov 22, 2022
Template for a modern spring web service.

Spring Service Scaffold A scaffold for a web service operating with a Spring Framework backend, reactjs as frontend and a continuous testing and build

null 0 Nov 15, 2021
An Android template you can use to build your project with gradle kotlin dsl

Android Gradle KTS An Android template you can use to build your project with gradle kotlin dsl Build.gradle.kts You can use your project's build.grad

Deep 17 Sep 12, 2022
This is a template to help you get started building amazing Kotlin applications and libraries.

Welcome to the Starter This is a template to help you get started building amazing Kotlin applications and libraries. Over time, examples will be comp

Backbone 8 Nov 4, 2022
Saga pattern implementation in Kotlin build in top of Kotlin's Coroutines.

Module Saga Website can be found here Add in build.gradle.kts repositories { mavenCentral() } dependencies { implementation("io.github.nomisr

Simon Vergauwen 50 Dec 30, 2022
It is a project that contains lessons and examples about Kotlin programming language. 🇰

Kotlin Tutorials What is Kotlin? I added the platforms it supports and great resources. You can access the article from the link below: https://medium

Halil Özel 94 Dec 22, 2022
A showcase music app for Android entirely written using Kotlin language

Bandhook Kotlin This project is a small replica of the app I developed some time ago. Bandhook can still be found on Play Store At the moment it will

Antonio Leiva 1.9k Dec 23, 2022
101 examples for Kotlin Programming language.

This is a collection of runnable console applications that highlights the features of Kotlin programming language. The use of console application enab

Dody Gunawinata 192 Dec 1, 2022
Android Multi Theme Switch Library ,use kotlin language ,coroutine ,and so on ...

Magic Mistletoe Android多主题(换肤)切换框架 背景 时隔四年,在网易换肤之前的思路下,做了几点改进,现在完全通过反射创建View,并且在SkinLoadManager中提供一个configCustomAttrs以支持自定义View的属性插队替换 摈弃了之前的AsyncTask

Mistletoe 18 Jun 17, 2022
The Okila server project uses the Spring boot framework and uses the Kotlin language

Okila-Server The Okila server project uses the Spring boot framework and uses the Kotlin language Format Response //The response successfully format

Nankai 1 Oct 25, 2021
Practising kotlin language

Kotlin Learning About this project : 1.Starting with kotlin. 2.Creating a birthday wishing program. ?? Tech Stack: [] [] ?? Main Page: HELLO WORLD BIR

Shruti Mishra 0 Dec 4, 2021
Demonstration of Object Pool Design Pattern using Kotlin language and Coroutine

Object Pool Design Pattern with Kotlin Demonstration of Thread Safe Object Pool Design Pattern using Kotlin language and Coroutine. Abstract The objec

Enes Kayıklık 7 Apr 12, 2022
A coding examples project about Kotlin Programming language. 🇰

Kotlin Tutorial ????‍?? What is Kotlin ❓ Kotlin is a new programming language, developed by JetBrains. Jetbrains is a popular software development com

Mustajab Ikram 4 Oct 11, 2022