Writing full-stack statically-typed web apps on JVM at its simplest

Overview

Powered By Vaadin on Kotlin Join the chat at https://gitter.im/vaadin/vaadin-on-kotlin GitHub tag Maven Central Build Status

Welcome to Vaadin-On-Kotlin

Vaadin-on-Kotlin is a web-application framework that includes everything needed to create database-backed web applications. Please see the official documentation at www.vaadinonkotlin.eu.

Vaadin-on-Kotlin does not enforce you to use Model-View-Controller (MVC), Dependency Injection (DI) nor Service-Oriented Architecture (SOA). It by default does not use Spring nor JavaEE. Instead, Vaadin-on-Kotlin focuses on simplicity.

The View layer leverages component-oriented programming as offered by the Vaadin framework. Vaadin offers powerful components which are built on AJAX; programming in Vaadin resembles programming in a traditional client-side framework such as JavaFX or Swing.

The database access layer is covered by the vok-orm library. vok-orm allows you to present the data from database rows as objects and embellish these data objects with business logic methods. Using vok-orm is the recommended approach to access SQL databases. Of course, you may decide not to use vok-orm and integrate with NoSQL instead, or use JPA and/or Hibernate.

Everything is combined with the conciseness of the Kotlin programming language, which makes Vaadin-on-Kotlin a perfect starting point for beginner programmers. And Kotlin is statically-typed, so you can always Ctrl+Click on a code and learn how it works under the hood!

For a Getting Started guide please see the official documentation at www.vaadinonkotlin.eu/.

Getting Started

  1. Please install Java 8 JDK and git client if you haven't yet.

  2. Then, at the command prompt, just type in:

    git clone https://github.com/mvysny/vok-helloworld-app
    cd vok-helloworld-app
    ./gradlew clean build web:appRun
  3. Using a browser, go to http://localhost:8080 and you'll see: "Yay! You're on Vaadin-on-Kotlin!"

  4. Follow the guidelines to start developing your application. You may find the following resources handy:

  5. For easy development, we encourage you to edit the project sources in Intellij IDEA; the Community Edition is enough.

Example project

A more polished example application which you can inspire from. Just type this into your terminal:

git clone https://github.com/mvysny/vaadin-on-kotlin
cd vaadin-on-kotlin
./gradlew vok-example-crud-vokdb:appRun

The web app will be running at http://localhost:8080.

You can find the VoK-CRUD Live Demo running on Heroku.

For more information check out the vok-example-crud-vokdb module.

Vaadin 14 Flow Example project

Head to Beverage Buddy VoK for the standalone example project.

Run the example application from Intellij IDEA Community

  1. In Intellij IDEA, open the project simply by opening the build.gradle file, and then selecting "Open as Project".
  2. To run the application from IDEA, just open Gradle tab, select vok-example-crud-vokdb / Tasks / gretty / appRun, right-click and select Debug. The web app will be running at http://localhost:8080.

If you have the Intellij IDEA Ultimate version, we recommend you to use Tomcat for development, since it offers better code hot-redeployment:

  1. Open the project in IDEA
  2. Launch the vok-example-crud-vokdb WAR in Tomcat as described here: https://kotlinlang.org/docs/tutorials/httpservlets.html

Contributing

We encourage you to contribute to Vaadin-on-Kotlin! Join us and discuss at Vaadin Forums: Miscellaneous.

Trying to report a possible security vulnerability in Vaadin-on-Kotlin? Please use Vaadin Bug Tracker.

For general Vaadin-on-Kotlin bugs, please use the Vaadin-on-Kotlin Github Issue Tracker.

Modules

Vaadin-on-Kotlin consists of several modules which provides you with handy functionality. To include the modules into your project, you simply add appropriate Gradle jar dependencies to your build.gradle.

Every module contains a description of what exactly the module does, when you should use it and when it might be better to use something else.

The list of modules:

  • vok-framework - the very core of Vaadin-on-Kotlin which contains machinery for developing VoK plugins, and also the means to bootstrap/teardown the VoK runtime. Always included in your project when you build your app with VoK.
  • vok-util-vaadin - when you want to have additional support for Vaadin 14. You typically include this module when you build your Vaadin10-based app with VoK.
  • vok-framework-vokdb - when you want to have additional support for Vaadin 14 and the support for the database using the recommended approach. Includes vok-util-vaadin and vok-db.
  • vok-rest - when you want to expose data from your VoK app to other REST-consuming clients.
  • vok-rest-client - when you want to consume data in your VoK app from other REST servers.
  • vok-db - Provides access to the database; uses VoK-ORM
  • vok-security - provides basic security support. The documentation there explains the basics and provides links to sample projects.

Code Examples

Easy database transactions:

vok-orm:

button("Save", { db { person.save() } })

See vok-orm for an explanation on how this works.

Prepare your database

Simply use Flyway: write Flyway scripts, add a Gradle dependency:

compile 'org.flywaydb:flyway-core:7.1.1'

and introduce a context listener, to auto-update your database to the newest version before your app starts:

@WebListener
class Bootstrap: ServletContextListener {
    override fun contextInitialized(sce: ServletContextEvent?) {
        VaadinOnKotlin.init()
        val flyway = Flyway()
        flyway.dataSource = VaadinOnKotlin.getDataSource()
        flyway.migrate()
    }
}

Please scroll below for more details.

Defining UI DSL-style

verticalLayout {
  formLayout {
    isSpacing = true
    textField("Name:") {
      focus()
    }
    textField("Age:")
  }
  horizontalLayout {
    w = 100.perc
    isSpacing = true
    button("Save") {
      onLeftClick { okPressed() }
      setPrimary()
    }
  }
}

Simple popups

popupView("Details") {
  verticalLayout {
    formLayout { ... }
    button("Close", { isPopupVisible = false })
  }
}

vok-orm-based grid is a breeze

Support for sorting and filtering out-of-the-box:

grid<User>(dataProvider = Person.dataProvider) {
  isExpand = true
  
  val filterBar = appendHeaderRow().asFilterBar(this)

  columnFor(User::id) {
      filterBar.forField(NumberRangePopup(), this).inRange()
  }
  columnFor(User::username) {
      filterBar.forField(TextField(), this).ilike()
  }
  columnFor(User::roles) {
      filterBar.forField(TextField(), this).ilike()
  }
  columnFor(User::hashedPassword)
  addButtonColumn(VaadinIcon.EDIT, "edit", { createOrEditUser(it) }) {}
  addButtonColumn(VaadinIcon.TRASH, "delete", { it.delete(); refresh() }) {}
}

Advanced syntax

Keyboard shortcuts via operator overloading

import com.github.mvysny.karibudsl.v8.ModifierKey.Alt
import com.github.mvysny.karibudsl.v8.ModifierKey.Ctrl
import com.vaadin.event.ShortcutAction.KeyCode.C

button("Create New Person (Ctrl+Alt+C)") {
  onLeftClick { ... }
  clickShortcut = Ctrl + Alt + C
}

Width/height

button {
  icon = ...
  w = 48.px
  h = 50.perc
}
if (button.w.isFillParent) { ... }

Further Links

License

Licensed under the MIT License.

Copyright (c) 2017-2018 Martin Vysny

All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Comments
  • Remove JPA

    Remove JPA

    This talk is hilarious: https://vimeo.com/28885655 and helped to soothe my anger a lot while fighting with Hibernate's

    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.example.vok.Article.comments, could not initialize proxy - no Session
    	at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:582)
    	at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:201)
    	at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:561)
    	at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:132)
    	at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:277)
    	at kotlin.collections.CollectionsKt___CollectionsKt.joinTo(_Collections.kt:2013)
    	at kotlin.collections.CollectionsKt___CollectionsKt.joinToString(_Collections.kt:2031)
    	at kotlin.collections.CollectionsKt___CollectionsKt.joinToString$default(_Collections.kt:2030)
    	at com.example.vok.ArticleView$refreshComments$1.invoke(ArticleView.kt:71)
    	at com.example.vok.ArticleView$refreshComments$1.invoke(ArticleView.kt:16)
    	at com.github.vok.framework.DBKt.db(DB.kt:146)
    

    As it turns out, I had a detached article and there is no way of reattaching it back to the session! How dumb is that? https://stackoverflow.com/questions/912659/what-is-the-proper-way-to-re-attach-detached-objects-in-hibernate/4438358#4438358

    So instead of article.comments.forEach {...} you need to write Article.find(article.id!!)!!.comments.forEach {...} to force Hibernate to reload the entity and make the bloody comments collection attached. Smooth :-1:

    So there goes Hibernate. I kinda liked Ebean until I realized it needs to do some compile-time class enhancement with Maven Tiles - :-1: , sorry, no, I'm not going to install a plugin into my IDE just to develop with Ebean. There goes Ebean.

    I remember EclipseLink having troubles with sequences as primary keys generators: I believe EclipseLink started with 51 instead of 1, and then EclipseLink wondered where the hell is record number 1: http://stackoverflow.com/questions/18474046/eclipselink-and-sequence-generator-preallocation :-1:

    Anyway, it seems that JPA is hated by the interwebs with glaring passion: https://virgo47.wordpress.com/2014/10/09/jpa-is-it-worth-it-horror-stories-with-eclipselink-and-hibernate/ and https://www.reddit.com/r/java/comments/ln2st/jpa_the_mother_of_all_leaky_abstractions/

    JPA - the mother of all leaky abstractions :-D Kinda says it all. There's no way I'm going to touch Spring Data (because it has Spring in it :-1: ), which leaves us either with (yet) another JDBC wrapper library, or https://github.com/JetBrains/Exposed . It looks quite foreign to me, but I'll evaluate.

    More blogs from people pissed by Hibernate:

    enhancement 
    opened by mvysny 26
  • Getting Started Tutorial: Listing All Articles

    Getting Started Tutorial: Listing All Articles

    Hi @mvysny.

    I'm following the tutorial and when I arrive to section 5.8 Listing All Articles I get stuck:

    vok-helloworld-app-v10/web/src/main/kotlin/com/example/vok/ArticlesView.kt: (6, 41): Unresolved reference: dataProvider

    package com.example.vok
    
    import com.github.mvysny.karibudsl.v10.*
    import com.vaadin.flow.component.grid.Grid
    import com.vaadin.flow.router.*
    import eu.vaadinonkotlin.vaadin10.vokdb.dataProvider
    
    @Route("articles")
    class ArticlesView: KComposite(), AfterNavigationObserver {
       private lateinit var grid: Grid<Article>
       private val root = ui {
           verticalLayout {
               setSizeFull()
               h1("Listing Articles")
               grid = grid(dataProvider = Article.dataProvider) {
                   isExpand = true; setSizeFull()
                   addColumnFor(Article::id)
                   addColumnFor(Article::title)
                   addColumnFor(Article::text)
               }
           }
       }
    
       override fun afterNavigation(event: AfterNavigationEvent) {
           grid.refresh()
       }
    }
    
    bug 
    opened by max-bertinetti 16
  • Add support for  ListDataProvider in generateFilterComponents fo use in Grid

    Add support for ListDataProvider in generateFilterComponents fo use in Grid

    It would be great if .generateFilterComponents() would support ListDataProvider also.. It does not currently support that, and If we try to use it, we get: ERROR c.vaadin.server.DefaultErrorHandler - java.lang.ClassCastException: com.github.vok.framework.LikeFilter cannot be cast to java.lang.Void

    bug user feedback needed 
    opened by skoude 14
  • New docs

    New docs

    For this version I removed ALL from docs and restarted. At some point we need to reintroduce favicon, cname etc.

    For local development you need ruby on your system.

    bundle install Install the dependencies locally (I think if you have ruby you also must have bundler, but in case you don't see https://bundler.io/)

    bundle exec jekyll serve Starts the local server in development mode (it recompiles changes without quitting the server) on http://localhost:4000

    For reference Just the docs repo and docs: https://github.com/pmarsceill/just-the-docs

    opened by max-bertinetti 12
  • Vaadin Grid and Grid editor

    Vaadin Grid and Grid editor

    This is more like a feature request, in order to make your awseome project even easier to use. The one feature that brought me into the Vaadin world was Grids and specially the inline editing provided by Grids. Unfortunately documentation on this aspect is not very extensive, this beeing true for original Vaadin as well as for VoK. Key things I had to learn so far where:

    • setting up simple Editor Components (Textfield, Combobox inside grid, ...)
    • setting up more complex Editor Bindings (in order to do type conversion with grid editor)
    • formating values consistently between grid and grid editor
    • using row value based StyleGenerator
    • programmatically filtering DataSources inside the Grid
    • setting a validation Binder for the grid Editor

    Things that I still struggle with but could be interesting for others too:

    • finding the best way of adding and editing new lines purely in grid editor
    • using unbuffered grid editor (where is that save event?)
    • using the GridFastNavigationAddon by Tatu Lund

    I understand that making such samples that are easy enough to be understood yet show all the complex features is very time consuming, but I think that adding such into the grid (or even a new grid editor) section of karibudsl would greatly help future newbie VoK users.

    All the best

    enhancement user feedback needed 
    opened by hromatka 10
  • Update to support new DataProvider enhancements in Flow 4.0

    Update to support new DataProvider enhancements in Flow 4.0

    There are updates needed to support the new DataProvider improvements that are being done in Vaadin #8054.

    Example:

    java.lang.IllegalStateException: Grid uses Vaadin built-in ListDataProvider however the filter is VoK's Filter, which is incompatible with Vaadin's ListDataProvider. Please use `grid.setDataLoaderItems()` to use the DataLoader API instead (which is much simpler anyway).
    	at eu.vaadinonkotlin.vaadin10.FilterBar.applyFilterToGrid(FilterBar.kt:116) ~[vok-util-vaadin10-master-22926d5677-1.jar:?]
    	at eu.vaadinonkotlin.vaadin10.FilterBar.updateFilter(FilterBar.kt:169) ~[vok-util-vaadin10-master-22926d5677-1.jar:?]
    	at eu.vaadinonkotlin.vaadin10.FilterBar.access$updateFilter(FilterBar.kt:91) ~[vok-util-vaadin10-master-22926d5677-1.jar:?]
    	at eu.vaadinonkotlin.vaadin10.FilterBar$finalizeBinding$reg$1.invoke(FilterBar.kt:348) ~[vok-util-vaadin10-master-22926d5677-1.jar:?]
    	at eu.vaadinonkotlin.vaadin10.FilterBar$finalizeBinding$reg$1.invoke(FilterBar.kt:91) ~[vok-util-vaadin10-master-22926d5677-1.jar:?]
    	at eu.vaadinonkotlin.vaadin10.FilterBar$Binding$addFilterChangeListener$1.valueChanged(FilterBar.kt:222) ~[vok-util-vaadin10-master-22926d5677-1.jar:?]
    	at com.vaadin.flow.component.internal.AbstractFieldSupport.lambda$addValueChangeListener$828eca10$1(AbstractFieldSupport.java:96) ~[flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.component.internal.AbstractFieldSupport$$Lambda$874/0000000000000000.onComponentEvent(Unknown Source) ~[?:?]
    	at com.vaadin.flow.component.ComponentEventBus.fireEventForListener(ComponentEventBus.java:205) ~[flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.component.ComponentEventBus.fireEvent(ComponentEventBus.java:194) ~[flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.component.Component.fireEvent(Component.java:378) ~[flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.component.ComponentUtil.fireEvent(ComponentUtil.java:385) ~[flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.component.internal.AbstractFieldSupport.setValue(AbstractFieldSupport.java:207) ~[flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.component.internal.AbstractFieldSupport.setModelValue(AbstractFieldSupport.java:167) ~[flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.component.AbstractField.setModelValue(AbstractField.java:225) ~[flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.component.AbstractSinglePropertyField.handlePropertyChange(AbstractSinglePropertyField.java:352) ~[flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.component.AbstractSinglePropertyField.access$200(AbstractSinglePropertyField.java:48) ~[flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.component.AbstractSinglePropertyField$1.propertyChange(AbstractSinglePropertyField.java:325) ~[flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.internal.nodefeature.ElementPropertyMap.lambda$fireEvent$2(ElementPropertyMap.java:462) ~[flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.internal.nodefeature.ElementPropertyMap$$Lambda$812/0000000000000000.accept(Unknown Source) ~[?:?]
    	at java.util.ArrayList.forEach(ArrayList.java:1507) ~[?:?]
    	at com.vaadin.flow.internal.nodefeature.ElementPropertyMap.fireEvent(ElementPropertyMap.java:462) ~[flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.internal.nodefeature.ElementPropertyMap.access$100(ElementPropertyMap.java:48) ~[flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.internal.nodefeature.ElementPropertyMap$PutResult.run(ElementPropertyMap.java:169) ~[flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.server.communication.ServerRpcHandler.runMapSyncTask(ServerRpcHandler.java:395) [flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.server.communication.ServerRpcHandler.lambda$handleInvocations$0(ServerRpcHandler.java:389) [flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at com.vaadin.flow.server.communication.ServerRpcHandler$$Lambda$776/0000000000000000.accept(Unknown Source) [flow-server-4.0-SNAPSHOT.jar:4.0-SNAPSHOT]
    	at java.util.ArrayList.forEach(ArrayList.java:1507) [?:?]
    
    enhancement 
    opened by jhult 9
  • vok-example-flow-sql2o failing with appRun - Could not find ... org.webjars.bower:vaadin-valo-theme:[2.0.0,3)

    vok-example-flow-sql2o failing with appRun - Could not find ... org.webjars.bower:vaadin-valo-theme:[2.0.0,3)

    Hello. Following the instructions on the README for the project, it's failing on

    ./gradlew vok-example-flow-sql2o:appRun
    

    Error:

    Execution failed for task ':vok-example-flow-sql2o:appRun'.
    > Could not resolve all dependencies for configuration ':vok-example-flow-sql2o:compile'.
    > Could not find any version that matches org.webjars.bower:vaadin-valo-theme:[2.0.0,3).
     Versions that do not match:
         2.0.0-alpha5
         2.0.0-alpha4
         2.0.0-alpha3
         0.3.2
     Required by:
         project :vok-example-flow-sql2o > project :vok-framework-v10-sql2o > project :vok-util-vaadin10 > com.github.vok.karibudsl:karibu-dsl-v10:0.2.16 > com.vaadin:vaadin:10.0.0.alpha11 > com.vaadin:vaadin-dialog-flow:1.0.0.alpha4 > org.webjars.bower:vaadin-dialog:2.0.0-alpha1
         project :vok-example-flow-sql2o > project :vok-framework-v10-sql2o > project :vok-util-vaadin10 > com.github.vok.karibudsl:karibu-dsl-v10:0.2.16 > com.vaadin:vaadin:10.0.0.alpha11 > com.vaadin:vaadin-combo-box-flow:1.0.0.alpha5 > org.webjars.bower:vaadin-combo-box:3.0.1 > org.webjars.bower:vaadin-overlay:2.0.1
    
    bug 
    opened by WakeRealityDev 8
  • How to create new Project using VoK framework

    How to create new Project using VoK framework

    Documentation/steps to import the VoK framework in Intenllij for new Project.

    Documentation must show the steps to be used to create a new project from the scratch and importing all the files required to start a new project right from the scratch

    enhancement 
    opened by NiranjanShah 7
  • vok-example-flow-sql2o - Build failed

    vok-example-flow-sql2o - Build failed

    Hello,

    It's not really a bug, I tried to build and run vok-example-flow-sql2o. It's not working.

    I did this:

    git clone https://github.com/mvysny/vaadin-on-kotlin cd vaadin-on-kotlin ./gradlew vok-example-crud-sql2o:appRun

    --> vok-example-crud-sql2o is working

    then this:

    ./gradlew vok-example-flow-sql2o:appRun

    And I got this:

    18:24:13.895 ERROR [Bower] Install failed: ENOTEMPTY: Error: ENOTEMPTY:/home/jgueriaud/.cache/bower/packages/57f7f0864b724db288d6fd3200db7f1d/2.0.0 at /home/jgueriaud/dev_kotlin/vaadin-on-kotlin/vok-example-flow-sql2o/build/webResource/build.js:1347 at _fulfilled (/home/jgueriaud/dev_kotlin/vaadin-on-kotlin/vok-example-flow-sql2o/build/webResource/build.js:1346) at /home/jgueriaud/dev_kotlin/vaadin-on-kotlin/vok-example-flow-sql2o/build/webResource/build.js:1346 at /home/jgueriaud/dev_kotlin/vaadin-on-kotlin/vok-example-flow-sql2o/build/webResource/build.js:1346 at /home/jgueriaud/dev_kotlin/vaadin-on-kotlin/vok-example-flow-sql2o/build/webResource/build.js:1346 at runSingle (/home/jgueriaud/dev_kotlin/vaadin-on-kotlin/vok-example-flow-sql2o/build/webResource/build.js:1346) at flush (/home/jgueriaud/dev_kotlin/vaadin-on-kotlin/vok-example-flow-sql2o/build/webResource/build.js:1346) at processImmediate (timers.js:345)

    There is no kotlin problem but there is a problem with bower

    • Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':vok-example-flow-sql2o:webResourceInstallBowerDependencies'.

    Do you have the same error ? (and resolve it ? )

    Thanks,

    bug waiting for upstream 
    opened by jcgueriaud 7
  • REST CRUD: Add support for filtering, pagination and sorting

    REST CRUD: Add support for filtering, pagination and sorting

    When displaying outcome of REST call in a Grid, we obviously need support for at least pagination, maybe sorting and maybe filtering. However, there are multiple competing standards:

    • https://www.moesif.com/blog/technical/api-design/REST-API-Design-Filtering-Sorting-and-Pagination/
    • https://specs.openstack.org/openstack/api-wg/guidelines/pagination_filter_sort.html
    • https://jsao.io/2018/08/creating-a-rest-api-manual-pagination-sorting-and-filtering/
    • https://www.baeldung.com/rest-api-pagination-in-spring
    enhancement 
    opened by mvysny 6
  • Use Vaadin-Boot

    Use Vaadin-Boot

    We can't use Vaadin-Boot since it uses Jetty 10, however VoK uses Javalin 4.x which uses Jetty 9 and is incompatible with Jetty 10. We can not upgrade to Javalin 5.x since that uses Jetty 11 which uses jakarta Servlet 5 which is incompatible with Vaadin 23. Vaadin 24 will use jakarta servlet 5 but it's not out yet.

    Solutions:

    • Upgrade to Vaadin 24 when it's out, OR
    • Persuade Tipsy to upgrade to Jetty 10 in Javalin 4.x :-)
    opened by mvysny 4
  • Bump json5 from 2.2.0 to 2.2.3 in /vok-example-crud

    Bump json5 from 2.2.0 to 2.2.3 in /vok-example-crud

    Bumps json5 from 2.2.0 to 2.2.3.

    Release notes

    Sourced from json5's releases.

    v2.2.3

    v2.2.2

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295).

    v2.2.1

    • Fix: Removed dependence on minimist to patch CVE-2021-44906. (#266)
    Changelog

    Sourced from json5's changelog.

    v2.2.3 [code, diff]

    v2.2.2 [code, diff]

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295).

    v2.2.1 [code, diff]

    • Fix: Removed dependence on minimist to patch CVE-2021-44906. (#266)
    Commits
    • c3a7524 2.2.3
    • 94fd06d docs: update CHANGELOG for v2.2.3
    • 3b8cebf docs(security): use GitHub security advisories
    • f0fd9e1 docs: publish a security policy
    • 6a91a05 docs(template): bug -> bug report
    • 14f8cb1 2.2.2
    • 10cc7ca docs: update CHANGELOG for v2.2.2
    • 7774c10 fix: add proto to objects and arrays
    • edde30a Readme: slight tweak to intro
    • 97286f8 Improve example in readme
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies javascript 
    opened by dependabot[bot] 0
  • Bump minimist from 1.2.5 to 1.2.7 in /vok-example-crud

    Bump minimist from 1.2.5 to 1.2.7 in /vok-example-crud

    Bumps minimist from 1.2.5 to 1.2.7.

    Changelog

    Sourced from minimist's changelog.

    v1.2.7 - 2022-10-10

    Commits

    • [meta] add auto-changelog 0ebf4eb
    • [actions] add reusable workflows e115b63
    • [eslint] add eslint; rules to enable later are warnings f58745b
    • [Dev Deps] switch from covert to nyc ab03356
    • [readme] rename and add badges 236f4a0
    • [meta] create FUNDING.yml; add funding in package.json 783a49b
    • [meta] use npmignore to autogenerate an npmignore file f81ece6
    • Only apps should have lockfiles 56cad44
    • [Dev Deps] update covert, tape; remove unnecessary tap 49c5f9f
    • [Tests] add aud in posttest 228ae93
    • [meta] add safe-publish-latest 01fc23f
    • [meta] update repo URLs 6b164c7

    v1.2.6 - 2022-03-21

    Commits

    • test from prototype pollution PR bc8ecee
    • isConstructorOrProto adapted from PR c2b9819
    • security notice for additional prototype pollution issue ef88b93
    Commits
    • c590d75 v1.2.7
    • 0ebf4eb [meta] add auto-changelog
    • e115b63 [actions] add reusable workflows
    • 01fc23f [meta] add safe-publish-latest
    • f58745b [eslint] add eslint; rules to enable later are warnings
    • 228ae93 [Tests] add aud in posttest
    • 236f4a0 [readme] rename and add badges
    • ab03356 [Dev Deps] switch from covert to nyc
    • 49c5f9f [Dev Deps] update covert, tape; remove unnecessary tap
    • 783a49b [meta] create FUNDING.yml; add funding in package.json
    • Additional commits viewable in compare view
    Maintainer changes

    This version was pushed to npm by ljharb, a new releaser for minimist since your current version.


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies javascript 
    opened by dependabot[bot] 0
  • Bump nokogiri from 1.13.4 to 1.13.9 in /docs

    Bump nokogiri from 1.13.4 to 1.13.9 in /docs

    Bumps nokogiri from 1.13.4 to 1.13.9.

    Release notes

    Sourced from nokogiri's releases.

    1.13.9 / 2022-10-18

    Security

    Dependencies

    • [CRuby] Vendored libxml2 is updated to v2.10.3 from v2.9.14.
    • [CRuby] Vendored libxslt is updated to v1.1.37 from v1.1.35.
    • [CRuby] Vendored zlib is updated from 1.2.12 to 1.2.13. (See LICENSE-DEPENDENCIES.md for details on which packages redistribute this library.)

    Fixed

    • [CRuby] Nokogiri::XML::Namespace objects, when compacted, update their internal struct's reference to the Ruby object wrapper. Previously, with GC compaction enabled, a segmentation fault was possible after compaction was triggered. [#2658] (Thanks, @​eightbitraptor and @​peterzhu2118!)
    • [CRuby] Document#remove_namespaces! now defers freeing the underlying xmlNs struct until the Document is GCed. Previously, maintaining a reference to a Namespace object that was removed in this way could lead to a segfault. [#2658]

    sha256 checksums:

    9b69829561d30c4461ea803baeaf3460e8b145cff7a26ce397119577a4083a02  nokogiri-1.13.9-aarch64-linux.gem
    e76ebb4b7b2e02c72b2d1541289f8b0679fb5984867cf199d89b8ef485764956  nokogiri-1.13.9-arm64-darwin.gem
    15bae7d08bddeaa898d8e3f558723300137c26a2dc2632a1f89c8574c4467165  nokogiri-1.13.9-java.gem
    f6a1dbc7229184357f3129503530af73cc59ceba4932c700a458a561edbe04b9  nokogiri-1.13.9-x64-mingw-ucrt.gem
    36d935d799baa4dc488024f71881ff0bc8b172cecdfc54781169c40ec02cbdb3  nokogiri-1.13.9-x64-mingw32.gem
    ebaf82aa9a11b8fafb67873d19ee48efb565040f04c898cdce8ca0cd53ff1a12  nokogiri-1.13.9-x86-linux.gem
    11789a2a11b28bc028ee111f23311461104d8c4468d5b901ab7536b282504154  nokogiri-1.13.9-x86-mingw32.gem
    01830e1646803ff91c0fe94bc768ff40082c6de8cfa563dafd01b3f7d5f9d795  nokogiri-1.13.9-x86_64-darwin.gem
    8e93b8adec22958013799c8690d81c2cdf8a90b6f6e8150ab22e11895844d781  nokogiri-1.13.9-x86_64-linux.gem
    96f37c1baf0234d3ae54c2c89aef7220d4a8a1b03d2675ff7723565b0a095531  nokogiri-1.13.9.gem
    

    1.13.8 / 2022-07-23

    Deprecated

    • XML::Reader#attribute_nodes is deprecated due to incompatibility between libxml2's xmlReader memory semantics and Ruby's garbage collector. Although this method continues to exist for backwards compatibility, it is unsafe to call and may segfault. This method will be removed in a future version of Nokogiri, and callers should use #attribute_hash instead. [#2598]

    Improvements

    • XML::Reader#attribute_hash is a new method to safely retrieve the attributes of a node from XML::Reader. [#2598, #2599]

    Fixed

    ... (truncated)

    Changelog

    Sourced from nokogiri's changelog.

    1.13.9 / 2022-10-18

    Security

    Dependencies

    • [CRuby] Vendored libxml2 is updated to v2.10.3 from v2.9.14.
    • [CRuby] Vendored libxslt is updated to v1.1.37 from v1.1.35.
    • [CRuby] Vendored zlib is updated from 1.2.12 to 1.2.13. (See LICENSE-DEPENDENCIES.md for details on which packages redistribute this library.)

    Fixed

    • [CRuby] Nokogiri::XML::Namespace objects, when compacted, update their internal struct's reference to the Ruby object wrapper. Previously, with GC compaction enabled, a segmentation fault was possible after compaction was triggered. [#2658] (Thanks, @​eightbitraptor and @​peterzhu2118!)
    • [CRuby] Document#remove_namespaces! now defers freeing the underlying xmlNs struct until the Document is GCed. Previously, maintaining a reference to a Namespace object that was removed in this way could lead to a segfault. [#2658]

    1.13.8 / 2022-07-23

    Deprecated

    • XML::Reader#attribute_nodes is deprecated due to incompatibility between libxml2's xmlReader memory semantics and Ruby's garbage collector. Although this method continues to exist for backwards compatibility, it is unsafe to call and may segfault. This method will be removed in a future version of Nokogiri, and callers should use #attribute_hash instead. [#2598]

    Improvements

    • XML::Reader#attribute_hash is a new method to safely retrieve the attributes of a node from XML::Reader. [#2598, #2599]

    Fixed

    • [CRuby] Calling XML::Reader#attributes is now safe to call. In Nokogiri <= 1.13.7 this method may segfault. [#2598, #2599]

    1.13.7 / 2022-07-12

    Fixed

    XML::Node objects, when compacted, update their internal struct's reference to the Ruby object wrapper. Previously, with GC compaction enabled, a segmentation fault was possible after compaction was triggered. [#2578] (Thanks, @​eightbitraptor!)

    1.13.6 / 2022-05-08

    Security

    • [CRuby] Address CVE-2022-29181, improper handling of unexpected data types, related to untrusted inputs to the SAX parsers. See GHSA-xh29-r2w5-wx8m for more information.

    ... (truncated)

    Commits
    • 897759c version bump to v1.13.9
    • aeb1ac3 doc: update CHANGELOG
    • c663e49 Merge pull request #2671 from sparklemotion/flavorjones-update-zlib-1.2.13_v1...
    • 212e07d ext: hack to cross-compile zlib v1.2.13 on darwin
    • 76dbc8c dep: update zlib to v1.2.13
    • 24e3a9c doc: update CHANGELOG
    • 4db3b4d Merge pull request #2668 from sparklemotion/flavorjones-namespace-scopes-comp...
    • 73d73d6 fix: Document#remove_namespaces! use-after-free bug
    • 5f58b34 fix: namespace nodes behave properly when compacted
    • b08a858 test: repro namespace_scopes compaction issue
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies ruby 
    opened by dependabot[bot] 0
  • Bump tzinfo from 1.2.9 to 1.2.10 in /docs

    Bump tzinfo from 1.2.9 to 1.2.10 in /docs

    Bumps tzinfo from 1.2.9 to 1.2.10.

    Release notes

    Sourced from tzinfo's releases.

    v1.2.10

    TZInfo v1.2.10 on RubyGems.org

    Changelog

    Sourced from tzinfo's changelog.

    Version 1.2.10 - 19-Jul-2022

    Commits
    • 0814dcd Fix the release date.
    • fd05e2a Preparing v1.2.10.
    • b98c32e Merge branch 'fix-directory-traversal-1.2' into 1.2
    • ac3ee68 Remove unnecessary escaping of + within regex character classes.
    • 9d49bf9 Fix relative path loading tests.
    • 394c381 Remove private_constant for consistency and compatibility.
    • 5e9f990 Exclude Arch Linux's SECURITY file from the time zone index.
    • 17fc9e1 Workaround for 'Permission denied - NUL' errors with JRuby on Windows.
    • 6bd7a51 Update copyright years.
    • 9905ca9 Fix directory traversal in Timezone.get when using Ruby data source
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies ruby 
    opened by dependabot[bot] 0
  • Bump ejs from 3.1.6 to 3.1.7 in /vok-example-crud

    Bump ejs from 3.1.6 to 3.1.7 in /vok-example-crud

    Bumps ejs from 3.1.6 to 3.1.7.

    Release notes

    Sourced from ejs's releases.

    v3.1.7

    Version 3.1.7

    Commits
    • 820855a Version 3.1.7
    • 076dcb6 Don't use template literal
    • faf8b84 Skip test -- error message vary depending on JS runtime
    • c028c34 Update packages
    • e4180b4 Merge pull request #629 from markbrouwer96/main
    • d5404d6 Updated jsdoc to 3.6.7
    • 7b0845d Merge pull request #609 from mde/dependabot/npm_and_yarn/glob-parent-5.1.2
    • 32fb8ee Bump glob-parent from 5.1.1 to 5.1.2
    • f21a9e4 Merge pull request #603 from mde/mde-null-proto-where-possible
    • a50e46f Merge pull request #606 from akash-55/main
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies javascript 
    opened by dependabot[bot] 0
  • Replace Gson with Moshi

    Replace Gson with Moshi

    Gson is aging. Moshi is newer, built on Okio, and works better with Kotlin.

    Moshi also seems to be more performant. Here are some benchmarks:

    • https://zacsweers.github.io/json-serialization-benchmarking/
    • https://www.ericdecanini.com/2020/10/13/benchmarking-gson-vs-jackson-vs-moshi-2020/
    enhancement 
    opened by jhult 4
Owner
Martin Vysny
First Principle Thinking
Martin Vysny
A Full-Stack mobile app, including Android & Server, Simple-Poem 简诗. You can write poem in graceful & traditional Chinese style.

JianShi 简诗 A Full-Stack mobile app, including Android side & Server side, Simple-Poem 简诗. You can write poem in graceful & traditional Chinese style.

wingjay 1.9k Jan 6, 2023
Kotlin TodoMVC – full-stack Kotlin application demo

Kotlin full stack TodoMVC This project is an example implementation of the TodoMVC app written in Kotlin. More specifically, it's the Kotlin port of t

Gyula Voros 22 Oct 3, 2022
A full-stack application showing the power 💪 of KOTLIN. Entire android app + backend Apis written in Kotlin 🔥

Gamebaaz ?? A full-stack application showing the power ?? of KOTLIN. Entire android app + backend Apis written in Kotlin ?? Android Backend Jetpack Co

Sarnava Konar 85 Nov 17, 2022
Full stack examples of how to use Hotwire JS in Kotlin services

hotwire-kt A collection of Kotlin examples using the Hotwire JS framework to build interactive web apps with a Kotlin Armeria server backend. Using Ho

Andrew (Paradi) Alexander 9 Dec 14, 2022
Twidere-Android Twidere is a powerful twitter client for Android 1.6+ 1 , which gives you a full Holo experience and nearly full Twitter's feature.

Twidere for Android Material Design ready and feature rich Twitter/Mastodon/Fanfou app for Android 4.1+. Enjoy Fediverse now! Twidere-Android is maint

Twidere Project 2.7k Jan 2, 2023
Link-converter - A web service that converts links between web url and deeplink for mobile and web applications

Deep Link Converter Linkleri, mobil ve web uygulamaları için web url ile deeplin

Muhammed Eren DURSUN 2 Apr 9, 2022
A TextView that automatically fit its font and line count based on its available size and content

AutoFitTextView A TextView that automatically fit its font and line count based on its available size and content This code is heavily based on this S

null 899 Jan 2, 2023
Create circular ImageView in Android in the simplest way possible

CircularImageView This is an Android project allowing to realize a circular ImageView in the simplest way possible. USAGE To make a circular ImageView

Lopez Mikhael 1.9k Dec 29, 2022
ArcProgressbar project let create Arc progressbar in android in simplest way.

Arc Progressbar In Android ArcProgressbar project let create Arc progressbar in android in simplest way. USAGE To make a Arc Progressbar add ArcProgre

Manish 40 Dec 11, 2022
The simplest version of a notepad application with the feature to save pictures on a note.

PhotoNotePad Easy to write, read and organize notes with photo(s). Feature A note has... title content date color pin images Easy to write a note. Pro

seungmin shin 1 Dec 5, 2021
Android Easy Http - Simplest android http request library.

Android Easy Http Library 繁體中文文檔 About Android Easy Http Library Made on OkHttp. Easy to do http request, just make request and listen for the respons

null 13 Sep 30, 2022
A View on which you can freely draw, customizing paint width, alpha and color, and take a screenshot of the content. Useful for note apps, signatures or free hand writing.

FreeDrawView A View that let you draw freely on it. You can customize paint width, alpha and color. Can be useful for notes app, signatures or hands-f

Riccardo Moro 643 Nov 28, 2022
Androids EditText that animates the typed text. EditText is extended to create AnimatedEditText and a PinEntryEditText.

AnimatedEditText for Android This repository contains AnimatedEditText and TextDrawable all of which extend the behaviour of EditText and implement fe

Ali Muzaffar 439 Nov 29, 2022
A lightweight library to help you navigate in compose with well typed functions.

TypedNavigation A lightweight library to help you navigate in compose with well typed functions. Installation: You can add this library to your projec

xmartlabs 23 Apr 7, 2022
Typed Shared Preferences with kotlin

TypedSharedPreferences By specifying type parameters for the keys you define, you can avoid typing mistakes when saving to SharedPreferences. Installa

null 0 Oct 26, 2021
Gradle plugin which allows to use typed DSL for generating kubernetes/openshift YAML files

gr8s Gradle plugin which allows using typed DSL for generating kubernetes/openshift YAML files. Based on kuberig Usage import io.github.guai.gr8s.Gene

null 0 Jan 3, 2022
App that says if the movie you typed in has bazooka or not.

TemBazuca App that says if the movie you typed in has bazooka or not. But... why? The idea for the app came up while I was watching Choque de Cultura

Julia 3 Jan 8, 2022
kotlin-core - A full framework for making Android apps. Based on Anko and Kotson.

kotlin-core This package is not Android-specific, and can be used across platforms. However, for a good example of use in Android, take a look at kotl

Lightning Kite 36 Oct 3, 2022
AndroidIDE - an IDE for Android to develop full featured Android apps on Android smartphones.

AndroidIDE - an IDE for Android to develop full featured Android apps on Android smartphones.

Akash Yadav 615 Dec 27, 2022
CLI tool for decompiling Android apps to Java. It does resources! It does Java! Its real easy!

Easy-as-pie Android Decompiler Why One stop shop I got pretty tired of decompiling Android apps with a bunch of steps that I had to remember all the t

Alex Davis 619 Dec 27, 2022