{"id":13400168,"url":"https://github.com/invoiceninja/admin-portal","last_synced_at":"2025-05-14T06:12:13.096Z","repository":{"id":37241415,"uuid":"133502303","full_name":"invoiceninja/admin-portal","owner":"invoiceninja","description":"Invoice Ninja: Desktop/mobile admin portal built with Flutter","archived":false,"fork":false,"pushed_at":"2025-05-06T18:14:04.000Z","size":68429,"stargazers_count":1679,"open_issues_count":68,"forks_count":557,"subscribers_count":57,"default_branch":"master","last_synced_at":"2025-05-06T19:32:01.303Z","etag":null,"topics":["android","flutter","invoice","ios","linux","macos","redux","windows"],"latest_commit_sha":null,"homepage":"https://demo.invoiceninja.com","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/invoiceninja.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-05-15T10:50:36.000Z","updated_at":"2025-05-06T18:28:42.000Z","dependencies_parsed_at":"2024-01-02T15:46:06.606Z","dependency_job_id":"d6aa3ec5-ffb6-436a-831c-76e9c1247b1b","html_url":"https://github.com/invoiceninja/admin-portal","commit_stats":null,"previous_names":["invoiceninja/flutter-client"],"tags_count":118,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/invoiceninja%2Fadmin-portal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/invoiceninja%2Fadmin-portal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/invoiceninja%2Fadmin-portal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/invoiceninja%2Fadmin-portal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/invoiceninja","download_url":"https://codeload.github.com/invoiceninja/admin-portal/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253534829,"owners_count":21923550,"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":["android","flutter","invoice","ios","linux","macos","redux","windows"],"created_at":"2024-07-30T19:00:49.199Z","updated_at":"2025-05-14T06:12:12.992Z","avatar_url":"https://github.com/invoiceninja.png","language":"Dart","funding_links":[],"categories":["Dart","iOS Apps","Misc","flutter"],"sub_categories":["iOS Finance","Flutter"],"readme":"# Invoice Ninja\n\nClient application for [Invoice Ninja](https://github.com/invoiceninja/invoiceninja).\n\n#### Desktop Apps\n- [Windows](https://apps.microsoft.com/store/detail/invoice-ninja/9N3F2BBCFDR6)\n- [macOS](https://apps.apple.com/app/id1503970375?platform=mac)\n- [Linux - Snap](https://snapcraft.io/invoiceninja)\n- [Linux - Flatpak](https://flathub.org/apps/com.invoiceninja.InvoiceNinja)\n\n#### Mobile Apps\n- [iOS](https://apps.apple.com/app/id1503970375?platform=iphone)\n- [Android](https://play.google.com/store/apps/details?id=com.invoiceninja.app)\n- [F-Droid](https://f-droid.org/en/packages/com.invoiceninja.app)\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"https://github.com/invoiceninja/flutter-mobile/blob/master/samples/screenshots/1.png\" alt=\"Dashboard\" width=\"200\"/\u003e\n    \u003cimg src=\"https://github.com/invoiceninja/flutter-mobile/blob/master/samples/screenshots/2.png\" alt=\"View Invoice\" width=\"200\"/\u003e\n    \u003cimg src=\"https://github.com/invoiceninja/flutter-mobile/blob/master/samples/screenshots/3.png\" alt=\"List Invoice\" width=\"200\"/\u003e\n    \u003cimg src=\"https://github.com/invoiceninja/flutter-mobile/blob/master/samples/screenshots/4.png\" alt=\"New Invoice\" width=\"200\"/\u003e\n\u003c/p\u003e\n\n# Table of Contents\n\n- [Setting up the app](#setting-up-the-app)\n- [Steps to remove non-FOSS code](#steps-to-remove-non-foss-code)\n- [Application Architecture](#application-architecture)\n    - [Package Structure](#package-structure)\n    - [Blog Posts](#blog-posts)\n- [Code generation](#code-generation)\n- [Tests](#tests)\n- [Code signing](#code-signing)\n- [Credits](#credits)\n- [Contributions](#contributions)\n\n---\n\n## Setting up the app\n\n- Initialize the config file\n\n    `cp lib/.env.dart.example lib/.env.dart`\n\n- Support running the code unsigned on Android\n\n    `cp android/app/build.gradle.dev android/app/build.gradle`\n\n- Run the app\n\n    `flutter run`\n\nNote: if you don't have an Invoice Ninja backend setup you can test the app with these credentials:\n\n- Email: `demo@invoiceninja.com`\n- Password: `Password0`\n- URL: `demo.invoiceninja.com`\n\n## Steps to remove non-FOSS code\n\n```\ncp android/build.gradle.foss android/build.gradle\ncp lib/utils/oauth.dart.foss lib/utils/oauth.dart\ncp lib/utils/app_review.dart.foss lib/utils/app_review.dart\ncp lib/ui/app/upgrade_dialog.dart.foss lib/ui/app/upgrade_dialog.dart\ncp lib/ui/app/pinput.dart.foss lib/ui/app/pinput.dart\ncp android/app/src/main/AndroidManifest.foss.xml android/app/src/main/AndroidManifest.xml\ncp pubspec.foss.yaml pubspec.yaml \nrm pubspec.lock\n```\n\n## Application Architecture\n\nThe application was created using the [Flutter Redux Starter](https://github.com/hillelcoren/flutter-redux-starter).\n\nThe architecture is based off these two projects:\n\n- [Redux Sample](https://github.com/brianegan/flutter_architecture_samples/tree/master/redux) - [Brian Egan](https://twitter.com/brianegan)\n- [inKino](https://github.com/roughike/inKino) - [Iiro Krankka](https://twitter.com/koorankka)\n\n### File Structure\n\nA High-level overview of the project structure:\n```\n\nlib/                     # Root Package\n|\n├─ data/                 # For data handling\n│  ├─ mock/              # sample used for testing\n│  ├─ models/            # Objects representing data\n│  ├─ repositories/      # Source of data\n|\n├─ redux/                # manages app state\n│  ├─ component/         # app building block\n│     ├─ actions         # methods to update app state\n|     ├─ middleware      # run in response to actions, execute before reducer\n|     ├─ reducer         # intercepts actions, responsible for updating the state\n|     ├─ selectors       # read data from the state, queries against your 'state database'\n|     ├─ state           # immutable object that lives at the top of the widget hierarchy\n|\n├─ ui/                   # app views\n│  ├─ component/         # views for different components\n│    ├─ view/            # generel view for component\n│    ├─ edit/            # change values on the views fields\n|\n├─ utils/                # Utility classes\n\n```\n\nThe ui and redux folders contain components that are paired together.\nPut simply you will find an 'auth' folder in both the ui and redux folders.\n\nFor additional information on [Redux architecture](https://blog.logrocket.com/flutter-redux-complete-tutorial-with-examples/)\n\n\n\n### Blog Posts\n- [Intro to Google Flutter](https://hillel.dev/2018/05/18/flutter-is-darts-killer-app/)\n- [Using Redux to manage state](https://hillel.dev/2018/06/01/building-a-large-flutter-app-with-redux/)\n- [Handling complex forms](https://hillel.dev/2018/06/18/flutter-using-redux-to-manage-complex-forms-with-multiple-tabs-and-relationships/)\n- [Architectural review](https://hillel.dev/2018/08/10/an-architectural-review-of-the-invoice-ninja-flutter-app/)\n- [Additional thoughts](https://hillel.dev/2018/08/24/ongoing-adventures-with-flutter-and-redux/)\n\n## Code generation\n- Run `flutter packages pub run build_runner build --delete-conflicting-outputs` to regenerate the model files. It will also remove the old generated files so conflicts are avoided..\n\n## Tests\n- Run `flutter drive --target=test_driver/all_it.dart` to run the tests\n    \n## Credits\n\n[https://github.com/invoiceninja/invoiceninja#credits](https://github.com/invoiceninja/invoiceninja/tree/v5-develop#credits)\n\n## Contributions\n\nWe gladly accept contributions! If you'd like to get involved with development please join our [Slack group](http://slack.invoiceninja.com/) or [Discord Server](https://discord.gg/ZwEdtfCwXA).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finvoiceninja%2Fadmin-portal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finvoiceninja%2Fadmin-portal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finvoiceninja%2Fadmin-portal/lists"}