{"id":20239310,"url":"https://github.com/edvin/todomvc","last_synced_at":"2025-04-10T19:36:19.943Z","repository":{"id":46295446,"uuid":"85485142","full_name":"edvin/todomvc","owner":"edvin","description":"TodoMVC with TornadoFX","archived":false,"fork":false,"pushed_at":"2017-11-15T08:46:56.000Z","size":60,"stargazers_count":50,"open_issues_count":0,"forks_count":13,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-04T22:43:40.617Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/edvin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-03-19T15:05:22.000Z","updated_at":"2024-11-29T22:12:23.000Z","dependencies_parsed_at":"2022-08-31T00:02:13.252Z","dependency_job_id":null,"html_url":"https://github.com/edvin/todomvc","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edvin%2Ftodomvc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edvin%2Ftodomvc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edvin%2Ftodomvc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edvin%2Ftodomvc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/edvin","download_url":"https://codeload.github.com/edvin/todomvc/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248281414,"owners_count":21077423,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-14T08:38:28.401Z","updated_at":"2025-04-10T19:36:19.922Z","avatar_url":"https://github.com/edvin.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TodoMVC TornadoFX\n\nThis is the TornadoFX take on the Todo MVC application.\n\n## Description of Views\n\n`MainView` encapsulates the `Header`, `TodoList` and `Footer` while the `TodoList` uses `TodoItemFragment` for each ListView cell.\n\n![](http://i.imgur.com/WMQ9ebV.png)\n\n## Filtering\n\nThe `Footer` contains three toggle buttons that allow you to select what todo items to show. The selection\nrepresents a predicate set on a `SortedFilteredList`.\n\n## Editing todo items\n\nWe leverage the built in `ListView` editing support to toggle between a label and a textfield for the\ntext of the todo item. When the edit is committed, the underlying `SortedFilteredList` will update\nautomatically to reflect the changes. If the edited todo item no longer satisfies the current filtering\npredicate, the item will no longer be visible. This all comes for free by leveraging the `SortedFilteredList`\ntogether with the native `ListView` editing support.\n\n## Declarative programming\n\nI opted for using builders together with declarative constructs like `removeWhen`, `toggleClass` and `whenVisible`\nto configure actions and changes in UI state. This makes for source code that is easy to read and understand\nas well as being a pleasure to maintain. I believe this showcases some of the greatest advantages TornadoFX\noffers compared to almost every other UI framework.\n\n## Alternative approaches\n\nI opted for a model with some coupling, by injecting the controller and calling functions instead of\nusing the event bus. If there is any interest I'll create an alternative implementation with events.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedvin%2Ftodomvc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fedvin%2Ftodomvc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedvin%2Ftodomvc/lists"}