From eb9b1d59395f5d851ee693bce2a45659f924623f Mon Sep 17 00:00:00 2001 From: Zenrac Date: Fri, 19 Feb 2021 17:08:57 +0100 Subject: [PATCH] First implementation of Xamarin generation (#489) * Xamarin front * Small fix * iOS improvements & JS lint * More JS lint * Improvements to Xamarin app * Entity generation & Fixing back * Entity generation * Back fix & Entity generation * Entity * Fix linter error * Fixing code smell * Update (#2) * Bump ini from 1.3.5 to 1.3.8 (#492) Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.8. - [Release notes](https://github.com/isaacs/ini/releases) - [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.8) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Change dto json/dto structure (#485) * Change dto structure for use relation id rather than complete json structure * [Blazor] Added dto support on Blazor (#493) Added dto support on Blazor * Added release-it package (#494) * Added release it package * Fix npm spawn command on blazor client (#496) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: nicolas63 * Revert "Update (#2)" This reverts commit 99bbf127be16d0680463b1d291cc19671a902fc8. * Remove test folder * Fixing npm & Small improvements * Handle http certificates * Update doc * Update doc * More doc update * Update * Remove unused model * Revert change * Real revert change * Fixing issues * Move Xamarin to debug only Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: nicolas63 --- README.md | 8 +- docs/Features/fronts.md | 67 ++ docs/Introduction/big-picture.md | 4 +- docs/assets/Front-choice.png | Bin 0 -> 6077 bytes generators/client/files-xamarin.js | 792 ++++++++++++++++++ generators/client/index.js | 27 + .../needle-api/needle-client-xamarin.js | 97 +++ generators/client/prompts.js | 15 +- .../MainActivity.cs.ejs | 47 ++ .../Project.Client.Xamarin.Android.csproj.ejs | 123 +++ ...ect.Client.Xamarin.Android.csproj.user.ejs | 9 + .../Properties/AndroidManifest.xml.ejs | 10 + .../Properties/AssemblyInfo.cs.ejs | 30 + .../Resources/drawable/menu.png | Bin 0 -> 7160 bytes .../Resources/drawable/splashscreen.png | Bin 0 -> 38965 bytes .../Resources/layout/SplashScreen.xml.ejs | 16 + .../Resources/layout/Tabbar.xml.ejs | 13 + .../Resources/layout/Toolbar.xml.ejs | 9 + .../Resources/mipmap-anydpi-v26/icon.xml.ejs | 6 + .../mipmap-anydpi-v26/icon_round.xml.ejs | 6 + .../Resources/mipmap-hdpi/icon.png | Bin 0 -> 14022 bytes .../mipmap-hdpi/launcher_foreground.png | Bin 0 -> 14022 bytes .../Resources/mipmap-mdpi/icon.png | Bin 0 -> 14022 bytes .../mipmap-mdpi/launcher_foreground.png | Bin 0 -> 14022 bytes .../Resources/mipmap-xhdpi/icon.png | Bin 0 -> 14022 bytes .../mipmap-xhdpi/launcher_foreground.png | Bin 0 -> 14022 bytes .../Resources/mipmap-xxhdpi/icon.png | Bin 0 -> 14022 bytes .../mipmap-xxhdpi/launcher_foreground.png | Bin 0 -> 14022 bytes .../Resources/mipmap-xxxhdpi/icon.png | Bin 0 -> 14022 bytes .../mipmap-xxxhdpi/launcher_foreground.png | Bin 0 -> 14022 bytes .../Resources/values/colors.xml.ejs | 8 + .../Resources/values/styles.xml.ejs | 19 + .../SplashScreenActivity.cs.ejs | 41 + .../Project.Client.Xamarin.Core/App.cs.ejs | 74 ++ .../AssemblyInfo.cs.ejs | 18 + .../FormsApp.xaml.cs.ejs | 26 + .../FormsApp.xaml.ejs | 8 + .../LinkerPreserve.cs.ejs | 35 + .../Models/JwtToken.cs.ejs | 24 + .../Models/LoginModel.cs.ejs | 23 + .../Models/RegisterResultRequest.cs.ejs | 36 + .../Models/UserModel.cs.ejs | 36 + .../Models/UserSaveModel.cs.ejs | 26 + .../Project.Client.Xamarin.Core.csproj.ejs | 49 ++ .../Resources/Strings.Designer.cs.ejs | 115 +++ .../Resources/Strings.resx.ejs | 150 ++++ .../Services/AbstractEntityService.cs.ejs | 60 ++ .../Services/AuthenticationService.cs.ejs | 92 ++ .../Services/Configuration.cs.ejs | 28 + .../Services/IAbstractEntityService.cs.ejs | 30 + .../Services/IAuthenticationService.cs.ejs | 29 + .../Services/IRegisterService.cs.ejs | 29 + .../Services/RegisterService.cs.ejs | 65 ++ .../ViewModels/BaseViewModel.cs.ejs | 29 + .../ViewModels/HomeViewModel.cs.ejs | 47 ++ .../ViewModels/LoginViewModel.cs.ejs | 131 +++ .../ViewModels/MenuViewModel.cs.ejs | 65 ++ .../ViewModels/RegisterViewModel.cs.ejs | 206 +++++ .../ViewModels/WelcomeViewModel.cs.ejs | 89 ++ .../Views/HomeView.xaml.cs.ejs | 47 ++ .../Views/HomeView.xaml.ejs | 10 + .../Views/LoginView.xaml.cs.ejs | 30 + .../Views/LoginView.xaml.ejs | 67 ++ .../Views/MenuPage.xaml.cs.ejs | 41 + .../Views/MenuPage.xaml.ejs | 50 ++ .../Views/RegisterView.xaml.cs.ejs | 30 + .../Views/RegisterView.xaml.ejs | 87 ++ .../Views/WelcomeView.xaml.cs.ejs | 32 + .../Views/WelcomeView.xaml.ejs | 110 +++ .../.vs/Project.Client.Shared/v16/.suo | Bin 0 -> 7680 bytes .../Constants/ErrorConst.cs.ejs | 28 + .../Project.Client.Xamarin.Shared.csproj.ejs | 7 + .../AppDelegate.cs.ejs | 26 + .../AppIcon.appiconset/Contents.json | 117 +++ .../AppIcon.appiconset/Icon1024.png | Bin 0 -> 70429 bytes .../AppIcon.appiconset/Icon120.png | Bin 0 -> 3773 bytes .../AppIcon.appiconset/Icon152.png | Bin 0 -> 4750 bytes .../AppIcon.appiconset/Icon167.png | Bin 0 -> 4692 bytes .../AppIcon.appiconset/Icon180.png | Bin 0 -> 5192 bytes .../AppIcon.appiconset/Icon20.png | Bin 0 -> 1313 bytes .../AppIcon.appiconset/Icon29.png | Bin 0 -> 845 bytes .../AppIcon.appiconset/Icon40.png | Bin 0 -> 1101 bytes .../AppIcon.appiconset/Icon58.png | Bin 0 -> 1761 bytes .../AppIcon.appiconset/Icon60.png | Bin 0 -> 2537 bytes .../AppIcon.appiconset/Icon76.png | Bin 0 -> 2332 bytes .../AppIcon.appiconset/Icon80.png | Bin 0 -> 2454 bytes .../AppIcon.appiconset/Icon87.png | Bin 0 -> 2758 bytes .../Entitlements.plist.ejs | 7 + .../Project.Client.Xamarin.iOS/Info.plist.ejs | 38 + .../Project.Client.Xamarin.iOS/Main.cs.ejs | 29 + .../Project.Client.Xamarin.iOS.csproj.ejs | 145 ++++ ...Project.Client.Xamarin.iOS.csproj.user.ejs | 6 + .../Properties/AssemblyInfo.cs.ejs | 35 + .../Resources/Default-568h@2x.png | Bin 0 -> 14022 bytes .../Resources/Default-Portrait.png | Bin 0 -> 14022 bytes .../Resources/Default-Portrait@2x.png | Bin 0 -> 14022 bytes .../Resources/Default.png | Bin 0 -> 14022 bytes .../Resources/Default@2x.png | Bin 0 -> 14022 bytes .../Resources/LaunchScreen.storyboard.ejs | 39 + .../Resources/menu.png | Bin 0 -> 7160 bytes .../Resources/splashscreen.png | Bin 0 -> 38965 bytes generators/dotnet.js | 44 + generators/entity-client/files-xamarin.js | 104 +++ generators/entity-client/index.js | 12 +- .../src/Project.Client/Models/Model.cs.ejs | 81 ++ .../Services/EntityService.cs.ejs | 33 + .../Services/IEntityService.cs.ejs | 30 + .../ViewModels/EntityViewModel.cs.ejs | 177 ++++ .../Views/EntityView.xaml.cs.ejs | 45 + .../Project.Client/Views/EntityView.xaml.ejs | 60 ++ generators/generator-dotnetcore-constants.js | 2 + .../Project/Configuration/MvcStartup.cs.ejs | 4 +- .../dotnetcore/src/Project/Program.cs.ejs | 2 +- .../dotnetcore/src/Project/Project.csproj.ejs | 4 +- generators/utils.js | 8 + package-lock.json | 11 +- package.json | 1 + 117 files changed, 4449 insertions(+), 17 deletions(-) create mode 100644 docs/assets/Front-choice.png create mode 100644 generators/client/files-xamarin.js create mode 100644 generators/client/needle-api/needle-client-xamarin.js create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/MainActivity.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Project.Client.Xamarin.Android.csproj.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Project.Client.Xamarin.Android.csproj.user.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Properties/AndroidManifest.xml.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Properties/AssemblyInfo.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/drawable/menu.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/drawable/splashscreen.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/layout/SplashScreen.xml.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/layout/Tabbar.xml.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/layout/Toolbar.xml.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-anydpi-v26/icon.xml.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-anydpi-v26/icon_round.xml.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-hdpi/icon.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-hdpi/launcher_foreground.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-mdpi/icon.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-mdpi/launcher_foreground.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-xhdpi/icon.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-xhdpi/launcher_foreground.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-xxhdpi/icon.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-xxhdpi/launcher_foreground.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-xxxhdpi/icon.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/values/colors.xml.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/values/styles.xml.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/SplashScreenActivity.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/App.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/AssemblyInfo.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/FormsApp.xaml.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/FormsApp.xaml.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/LinkerPreserve.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/JwtToken.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/LoginModel.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/RegisterResultRequest.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/UserModel.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/UserSaveModel.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Project.Client.Xamarin.Core.csproj.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Resources/Strings.Designer.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Resources/Strings.resx.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/AbstractEntityService.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/AuthenticationService.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/Configuration.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/IAbstractEntityService.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/IAuthenticationService.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/IRegisterService.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/RegisterService.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/BaseViewModel.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/HomeViewModel.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/LoginViewModel.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/MenuViewModel.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/RegisterViewModel.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/WelcomeViewModel.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/HomeView.xaml.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/HomeView.xaml.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/LoginView.xaml.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/LoginView.xaml.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/MenuPage.xaml.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/MenuPage.xaml.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/RegisterView.xaml.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/RegisterView.xaml.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/WelcomeView.xaml.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/WelcomeView.xaml.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Shared/.vs/Project.Client.Shared/v16/.suo create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Shared/Constants/ErrorConst.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.Shared/Project.Client.Xamarin.Shared.csproj.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/AppDelegate.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Entitlements.plist.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Info.plist.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Main.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Project.Client.Xamarin.iOS.csproj.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Project.Client.Xamarin.iOS.csproj.user.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Properties/AssemblyInfo.cs.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Resources/Default-568h@2x.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Resources/Default-Portrait.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Resources/Default-Portrait@2x.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Resources/Default.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Resources/Default@2x.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Resources/LaunchScreen.storyboard.ejs create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Resources/menu.png create mode 100644 generators/client/templates/xamarin/src/Project.Client.Xamarin.iOS/Resources/splashscreen.png create mode 100644 generators/entity-client/files-xamarin.js create mode 100644 generators/entity-client/templates/xamarin/src/Project.Client/Models/Model.cs.ejs create mode 100644 generators/entity-client/templates/xamarin/src/Project.Client/Services/EntityService.cs.ejs create mode 100644 generators/entity-client/templates/xamarin/src/Project.Client/Services/IEntityService.cs.ejs create mode 100644 generators/entity-client/templates/xamarin/src/Project.Client/ViewModels/EntityViewModel.cs.ejs create mode 100644 generators/entity-client/templates/xamarin/src/Project.Client/Views/EntityView.xaml.cs.ejs create mode 100644 generators/entity-client/templates/xamarin/src/Project.Client/Views/EntityView.xaml.ejs diff --git a/README.md b/README.md index 69076284b..0a950b657 100644 --- a/README.md +++ b/README.md @@ -20,15 +20,15 @@ JHipster provides a blueprints system that allows to override the default behavi JHipster.NET is a blueprint that overrides the back-end part, originally generated in spring boot, by back-end in asp.net core. For the front-end all the common language can be used (angular, react). -In alpha version we have also the possibility to choose Blazor for the front. [Blazor as front issue](https://github.com/jhipster/jhipster-dotnetcore/issues/165) +In alpha version we also have the possibility to choose either [Blazor](https://github.com/jhipster/jhipster-dotnetcore/issues/165) or [Xamarin](https://github.com/jhipster/jhipster-dotnetcore/issues/488) for the front. -This blueprint it's an official blueprint of jhipster [official-blueprints](https://www.jhipster.tech/modules/official-blueprints/) +This blueprint is an official blueprint of JHipster [official-blueprints](https://www.jhipster.tech/modules/official-blueprints/) # Docs -Documentation and information about `JHipster.NET ` is available [here](https://jhipsternet.readthedocs.io/en/latest/) +Documentation and information about `JHipster.NET` are available [here](https://jhipsternet.readthedocs.io/en/latest/) -Full documentation and information about JHipster is available [here](https://www.jhipster.tech/) +Full documentation and information about JHipster are available [here](https://www.jhipster.tech/) # Analysis of the sample project https://github.com/jhipster/jhipster-sample-app-dotnetcore diff --git a/docs/Features/fronts.md b/docs/Features/fronts.md index 0e88e08e6..7103fd824 100644 --- a/docs/Features/fronts.md +++ b/docs/Features/fronts.md @@ -1,3 +1,70 @@ +# Fronts + +When generating an application, you are able to choose between multiple fronts. +![front-choice](../assets/Front-choice.png) + +## Angular + +Angular (commonly referred to as "Angular 2+" or "Angular v2 and above") is a TypeScript-based open-source web application framework. + +## React + +React (also known as React.js or ReactJS) is an open-source, front end, JavaScript library for building user interfaces or UI components. + +## Alpha - Blazor + +Blazor is a free and open-source web framework that enables developers to create web apps using C# and HTML. + +## Alpha - Xamarin + +With a C#-shared codebase, developers can use Xamarin tools to write native Android, iOS, and Windows apps with native user interfaces and share code across multiple platforms, including Windows, macOS, and Linux. + +### Available features + +- Handle registration and connection. +- Sidebar menu to navigate through pages. +- Entities and users management. +- Auto-generated entity models, services, views and viewmodels. + +### NuGet requirements + +- [akavache](https://www.nuget.org/packages/akavache/) >= 7.1.1 +- [MvvmCross.Forms](https://www.nuget.org/packages/MvvmCross.Forms/) >= 7.1.1 +- [System.ComponentModel.Annotations](https://www.nuget.org/packages/System.ComponentModel.Annotations/) >= 5.0.0 +- [System.Net.Http.Json](https://www.nuget.org/packages/System.Net.Http.Json/) >= 3.2.1 +- [Xamarin.Forms](https://www.nuget.org/packages/Xamarin.Forms) >= 4.6.0 +- [Xamarin.Essential](https://www.nuget.org/packages/Xamarin.Essentials/) >=1.5.3 + +### Why Xamarin + +Xamarin allows to take advantage of this blueprint. Indeed, it enables to generate a modern cross platform application with both front-end and back-end in C#. + +### Structure + +Any generated Xamarin application is structured as follows +``` +client +├── Namespace.Client.Xamarin.Core - Your core application +│ ├── Models +│ │ ├── Entities - Generated models +│ ├── Services +│ │ ├── Entities - Generated services +│ ├── ViewModels +│ │ ├── Entities - Generated viewmodels +│ ├── Views +│ │ ├── Entities - Generated views +├── Namespace.Client.Xamarin.Android - Your Android application +│ ├── Resources +│ │ ├── drawable - Contains your images +│ │ ├── Layout - Contains your layouts +│ ├── Properties +├── Namespace.Client.Xamarin.iOS - Your iOS application +│ ├── Resources - Contains your images +│ ├── Properties +├── Namespace.Client.Xamarin.Shared - Shared code +│ ├── Constants - Contains shared constants +``` + # Fronts ## Using Blazor diff --git a/docs/Introduction/big-picture.md b/docs/Introduction/big-picture.md index 9529fe702..c56d174e4 100644 --- a/docs/Introduction/big-picture.md +++ b/docs/Introduction/big-picture.md @@ -5,6 +5,6 @@ JHipster provides a blueprints system that allows to override the default behavi JHipster.NET is a blueprint that overrides the back-end part, originally generated in spring boot, by back-end in asp.net core. For the front-end all the common language can be used (angular, react). -In alpha version we have also the possibility to choose Blazor for the front. [Blazor as front issue](https://github.com/jhipster/jhipster-dotnetcore/issues/165) +In alpha version we also have the possibility to choose either [Blazor](https://github.com/jhipster/jhipster-dotnetcore/issues/165) or [Xamarin](https://github.com/jhipster/jhipster-dotnetcore/issues/488) for the front. -This blueprint it's an official blueprint of jhipster [official-blueprints](https://www.jhipster.tech/modules/official-blueprints/) \ No newline at end of file +This blueprint is an official blueprint of JHipster [official-blueprints](https://www.jhipster.tech/modules/official-blueprints/) \ No newline at end of file diff --git a/docs/assets/Front-choice.png b/docs/assets/Front-choice.png new file mode 100644 index 0000000000000000000000000000000000000000..d0f9f40317c1b20f658a5e7d92117a3a7d76650e GIT binary patch literal 6077 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 Qe;v4d!S4LWb6&~+11;Vixc~qF literal 0 HcmV?d00001 diff --git a/generators/client/files-xamarin.js b/generators/client/files-xamarin.js new file mode 100644 index 000000000..40b0e3dcf --- /dev/null +++ b/generators/client/files-xamarin.js @@ -0,0 +1,792 @@ +/** + * Copyright 2013-2020 the original author or authors from the JHipster project. + * + * This file is part of the JHipster project, see https://www.jhipster.tech/ + * for more information. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const constants = require('../generator-dotnetcore-constants'); + +/* Constants use throughout */ +const CLIENT_SRC_DIR = constants.CLIENT_SRC_DIR; +const CLIENT_TEST_DIR = constants.CLIENT_TEST_DIR; + +/** + * The default is to use a file path string. It implies use of the template method. + * For any other config an object { file:.., method:.., template:.. } can be used + */ +const files = { + xamarinAppModels: [ + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Models/RegisterResultRequest.cs', + renameTo: generator => `${generator.mainClientDir}/Models/RegisterResultRequest.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Models/UserSaveModel.cs', + renameTo: generator => `${generator.mainClientDir}/Models/UserSaveModel.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Models/JwtToken.cs', + renameTo: generator => `${generator.mainClientDir}/Models/JwtToken.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Models/LoginModel.cs', + renameTo: generator => `${generator.mainClientDir}/Models/LoginModel.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Models/UserModel.cs', + renameTo: generator => `${generator.mainClientDir}/Models/UserModel.cs`, + }, + ], + }, + ], + xamarinAppViews: [ + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Views/HomeView.xaml.cs', + renameTo: generator => `${generator.mainClientDir}/Views/HomeView.xaml.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Views/HomeView.xaml', + renameTo: generator => `${generator.mainClientDir}/Views/HomeView.xaml`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Views/LoginView.xaml.cs', + renameTo: generator => `${generator.mainClientDir}/Views/LoginView.xaml.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Views/LoginView.xaml', + renameTo: generator => `${generator.mainClientDir}/Views/LoginView.xaml`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Views/MenuPage.xaml.cs', + renameTo: generator => `${generator.mainClientDir}/Views/MenuPage.xaml.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Views/MenuPage.xaml', + renameTo: generator => `${generator.mainClientDir}/Views/MenuPage.xaml`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Views/RegisterView.xaml.cs', + renameTo: generator => `${generator.mainClientDir}/Views/RegisterView.xaml.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Views/RegisterView.xaml', + renameTo: generator => `${generator.mainClientDir}/Views/RegisterView.xaml`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Views/WelcomeView.xaml.cs', + renameTo: generator => `${generator.mainClientDir}/Views/WelcomeView.xaml.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Views/WelcomeView.xaml', + renameTo: generator => `${generator.mainClientDir}/Views/WelcomeView.xaml`, + }, + ], + } + ], + xamarinAppViewModels: [ + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/ViewModels/BaseViewModel.cs', + renameTo: generator => `${generator.mainClientDir}/ViewModels/BaseViewModel.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/ViewModels/HomeViewModel.cs', + renameTo: generator => `${generator.mainClientDir}/ViewModels/HomeViewModel.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/ViewModels/LoginViewModel.cs', + renameTo: generator => `${generator.mainClientDir}/ViewModels/LoginViewModel.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/ViewModels/MenuViewModel.cs', + renameTo: generator => `${generator.mainClientDir}/ViewModels/MenuViewModel.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/ViewModels/RegisterViewModel.cs', + renameTo: generator => `${generator.mainClientDir}/ViewModels/RegisterViewModel.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/ViewModels/WelcomeViewModel.cs', + renameTo: generator => `${generator.mainClientDir}/ViewModels/WelcomeViewModel.cs`, + }, + ], + } + ], + xamarinAppServices: [ + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Services/Configuration.cs', + renameTo: generator => `${generator.mainClientDir}/Services/Configuration.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Services/IAuthenticationService.cs', + renameTo: generator => `${generator.mainClientDir}/Services/IAuthenticationService.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Services/AuthenticationService.cs', + renameTo: generator => `${generator.mainClientDir}/Services/AuthenticationService.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Services/IAbstractEntityService.cs', + renameTo: generator => `${generator.mainClientDir}/Services/IAbstractEntityService.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Services/AbstractEntityService.cs', + renameTo: generator => `${generator.mainClientDir}/Services/AbstractEntityService.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Services/IRegisterService.cs', + renameTo: generator => `${generator.mainClientDir}/Services/IRegisterService.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Services/RegisterService.cs', + renameTo: generator => `${generator.mainClientDir}/Services/RegisterService.cs`, + }, + ], + } + ], + xamarinAppResources: [ + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Resources/Strings.Designer.cs', + renameTo: generator => `${generator.mainClientDir}/Resources/Strings.Designer.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Resources/Strings.resx', + renameTo: generator => `${generator.mainClientDir}/Resources/Strings.resx`, + }, + ], + } + ], + xamarinAppBase: [ + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/App.cs', + renameTo: generator => `${generator.mainClientDir}/App.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/AssemblyInfo.cs', + renameTo: generator => `${generator.mainClientDir}/AssemblyInfo.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/FormsApp.xaml.cs', + renameTo: generator => `${generator.mainClientDir}/FormsApp.xaml.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/FormsApp.xaml', + renameTo: generator => `${generator.mainClientDir}/FormsApp.xaml`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/LinkerPreserve.cs', + renameTo: generator => `${generator.mainClientDir}/LinkerPreserve.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Core/Project.Client.Xamarin.Core.csproj', + renameTo: generator => `${generator.mainClientDir}/${generator.pascalizedBaseName}.Client.Xamarin.Core.csproj`, + }, + ], + } + ], + xamarinAppShared: [ + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Shared/Constants/ErrorConst.cs', + renameTo: generator => `${generator.sharedClientDir}/Constants/ErrorConst.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Shared/Project.Client.Xamarin.Shared.csproj', + renameTo: generator => `${generator.sharedClientDir}/${generator.pascalizedBaseName}.Client.Xamarin.Shared.csproj`, + }, + ], + } + ], + xamarinAppAndroid: [ + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Project.Client.Xamarin.Android.csproj', + renameTo: generator => `${generator.androidClientDir}/${generator.pascalizedBaseName}.Client.Xamarin.Android.csproj`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/MainActivity.cs', + renameTo: generator => `${generator.androidClientDir}/MainActivity.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/SplashScreenActivity.cs', + renameTo: generator => `${generator.androidClientDir}/SplashScreenActivity.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Project.Client.Xamarin.Android.csproj.user', + renameTo: generator => `${generator.androidClientDir}/${generator.pascalizedBaseName}.Client.Xamarin.Android.csproj.user`, + }, + ], + } + ], + xamarinAppAndroidResourcesValues: [ + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/values/colors.xml', + renameTo: generator => `${generator.androidClientDir}/Resources/values/colors.xml`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/values/styles.xml', + renameTo: generator => `${generator.androidClientDir}/Resources/values/styles.xml`, + }, + ], + } + ], + xamarinAppAndroidResourcesLayout: [ + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/Layout/Tabbar.xml', + renameTo: generator => `${generator.androidClientDir}/Resources/Layout/Tabbar.xml`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/Layout/Toolbar.xml', + renameTo: generator => `${generator.androidClientDir}/Resources/Layout/Toolbar.xml`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/Layout/SplashScreen.xml', + renameTo: generator => `${generator.androidClientDir}/Resources/Layout/SplashScreen.xml`, + }, + ], + }, + ], + xamarinAppAndroidResourcesImage: [ + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/drawable/splashscreen.png', + method: 'copy', + renameTo: generator => `${generator.androidClientDir}/Resources/drawable/splashscreen.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/drawable/menu.png', + method: 'copy', + renameTo: generator => `${generator.androidClientDir}/Resources/drawable/menu.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/mipmap-anydpi-v26/icon.xml', + renameTo: generator => `${generator.androidClientDir}/Resources/mipmap-anydpi-v26/icon.xml`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/mipmap-anydpi-v26/icon_round.xml', + renameTo: generator => `${generator.androidClientDir}/Resources/mipmap-anydpi-v26/icon_round.xml`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/mipmap-hdpi/icon.png', + method: 'copy', + renameTo: generator => `${generator.androidClientDir}/Resources/mipmap-hdpi/icon.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/mipmap-hdpi/launcher_foreground.png', + method: 'copy', + renameTo: generator => `${generator.androidClientDir}/Resources/mipmap-hdpi/launcher_foreground.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/mipmap-mdpi/icon.png', + method: 'copy', + renameTo: generator => `${generator.androidClientDir}/Resources/mipmap-mdpi/icon.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/mipmap-mdpi/launcher_foreground.png', + method: 'copy', + renameTo: generator => `${generator.androidClientDir}/Resources/mipmap-mdpi/launcher_foreground.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/mipmap-xhdpi/icon.png', + method: 'copy', + renameTo: generator => `${generator.androidClientDir}/Resources/mipmap-xhdpi/icon.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/mipmap-xhdpi/launcher_foreground.png', + method: 'copy', + renameTo: generator => `${generator.androidClientDir}/Resources/mipmap-xhdpi/launcher_foreground.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/mipmap-xxhdpi/icon.png', + method: 'copy', + renameTo: generator => `${generator.androidClientDir}/Resources/mipmap-xxhdpi/icon.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/mipmap-xxhdpi/launcher_foreground.png', + method: 'copy', + renameTo: generator => `${generator.androidClientDir}/Resources/mipmap-xxhdpi/launcher_foreground.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/mipmap-xxxhdpi/icon.png', + method: 'copy', + renameTo: generator => `${generator.androidClientDir}/Resources/mipmap-xxxhdpi/icon.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png', + method: 'copy', + renameTo: generator => `${generator.androidClientDir}/Resources/mipmap-xxxhdpi/launcher_foreground.png`, + }, + ], + }, + ], + xamarinAppAndroidProperties: [ + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Properties/AndroidManifest.xml', + renameTo: generator => `${generator.androidClientDir}/Properties/AndroidManifest.xml`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.Android/Properties/AssemblyInfo.cs', + renameTo: generator => `${generator.androidClientDir}/Properties/AssemblyInfo.cs`, + }, + ], + } + ], + xamarinAppiOS: [ + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.iOS/Project.Client.Xamarin.iOS.csproj', + renameTo: generator => `${generator.iOSClientDir}/${generator.pascalizedBaseName}.Client.Xamarin.iOS.csproj`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.iOS/Project.Client.Xamarin.iOS.csproj.user', + renameTo: generator => `${generator.iOSClientDir}/${generator.pascalizedBaseName}.Client.Xamarin.iOS.csproj.user`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.iOS/Main.cs', + renameTo: generator => `${generator.iOSClientDir}/Main.cs`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.iOS/Info.plist', + renameTo: generator => `${generator.iOSClientDir}/Info.plist`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.iOS/Entitlements.plist', + method: 'copy', + renameTo: generator => `${generator.iOSClientDir}/Entitlements.plist`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.iOS/AppDelegate.cs', + renameTo: generator => `${generator.iOSClientDir}/AppDelegate.cs`, + }, + ], + } + ], + xamarinAppiOSProperties: [ + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.iOS/Properties/AssemblyInfo.cs', + renameTo: generator => `${generator.iOSClientDir}/Properties/AssemblyInfo.cs`, + }, + ], + } + ], + xamarinAppiOSResources: [ + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.iOS/Resources/LaunchScreen.storyboard', + renameTo: generator => `${generator.iOSClientDir}/Resources/LaunchScreen.storyboard`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.iOS/Resources/Default.png', + method: 'copy', + renameTo: generator => `${generator.iOSClientDir}/Resources/Default.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.iOS/Resources/Default@2x.png', + method: 'copy', + renameTo: generator => `${generator.iOSClientDir}/Resources/Default@2x.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.iOS/Resources/Default-568h@2x.png', + method: 'copy', + renameTo: generator => `${generator.iOSClientDir}/Resources/Default.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.iOS/Resources/Default-Portrait@2x.png', + method: 'copy', + renameTo: generator => `${generator.iOSClientDir}/Resources/Default-Portrait@2x.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.iOS/Resources/Default-Portrait.png', + method: 'copy', + renameTo: generator => `${generator.iOSClientDir}/Resources/Default-Portrait.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.iOS/Resources/menu.png', + method: 'copy', + renameTo: generator => `${generator.iOSClientDir}/Resources/menu.png`, + }, + ], + }, + { + path: CLIENT_SRC_DIR, + templates: [ + { + file: 'Project.Client.Xamarin.iOS/Resources/splashscreen.png', + method: 'copy', + renameTo: generator => `${generator.iOSClientDir}/Resources/splashscreen.png`, + }, + ], + }, + ], +}; + +module.exports = { + writeFiles, + files, +}; + +function writeFiles() { + this.writeFilesToDisk(files, this, false, 'xamarin'); +} + diff --git a/generators/client/index.js b/generators/client/index.js index f2c6e33ec..481769fa5 100644 --- a/generators/client/index.js +++ b/generators/client/index.js @@ -32,10 +32,12 @@ const dotnet = require('../dotnet'); const writeAngularFiles = require('./files-angular').writeFiles; const writeReactFiles = require('./files-react').writeFiles; const writeBlazorFiles = require('./files-blazor').writeFiles; +const writeXamarinFiles = require('./files-xamarin').writeFiles; const writeCommonFiles = require('./files-common').writeFiles; const REACT = baseConstants.SUPPORTED_CLIENT_FRAMEWORKS.REACT; const BLAZOR = constants.BLAZOR; +const XAMARIN = constants.XAMARIN; module.exports = class extends ClientGenerator { constructor(args, opts) { @@ -106,6 +108,8 @@ module.exports = class extends ClientGenerator { switch (this.clientFramework) { case BLAZOR: return writeBlazorFiles.call(this); + case XAMARIN: + return writeXamarinFiles.call(this); case REACT: baseWriteReactFiles.call(this); writeCommonFiles.call(this); @@ -160,6 +164,29 @@ module.exports = class extends ClientGenerator { ) ); dotnet.installBlazorDependencies(); + } else if (this.clientFramework === XAMARIN) { + this.log(chalk.green.bold(`\nCreating ${this.solutionName} .Net Core solution if it does not already exist.\n`)); + try { + await dotnet.newSln(this.solutionName); + } catch (err) { + this.warning(`Failed to create ${this.solutionName} .Net Core solution: ${err}`); + } + await dotnet.slnAdd(`${this.solutionName}.sln`, [ + `${constants.CLIENT_SRC_DIR}${this.mainClientDir}/${this.pascalizedBaseName}.Client.Xamarin.Core.csproj`, + `${constants.CLIENT_SRC_DIR}${this.sharedClientDir}/${this.pascalizedBaseName}.Client.Xamarin.Shared.csproj`, + ]); + await dotnet.newSlnAddProj(this.solutionName, [ + { + 'path': `${constants.CLIENT_SRC_DIR}${this.androidClientDir}/${this.pascalizedBaseName}.Client.Xamarin.Android.csproj`, + 'name' : `${this.pascalizedBaseName}.Client.Xamarin.Android` + }, + { + 'path': `${constants.CLIENT_SRC_DIR}${this.iOSClientDir}/${this.pascalizedBaseName}.Client.Xamarin.iOS.csproj`, + 'name' : `${this.pascalizedBaseName}.Client.Xamarin.iOS` + } + ]); + this.log(chalk.green.bold('\Client application generated successfully.\n')); + } else { if (this.skipClient) return; this.log(chalk.green.bold('\nClient application generated successfully.\n')); diff --git a/generators/client/needle-api/needle-client-xamarin.js b/generators/client/needle-api/needle-client-xamarin.js new file mode 100644 index 000000000..ee3734b1a --- /dev/null +++ b/generators/client/needle-api/needle-client-xamarin.js @@ -0,0 +1,97 @@ +/** + * Copyright 2013-2020 the original author or authors from the JHipster project. + * + * This file is part of the JHipster project, see https://www.jhipster.tech/ + * for more information. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const needleBase = require('generator-jhipster/generators/needle-base'); +const chalk = require('chalk'); +const _ = require('lodash'); + +module.exports = class extends needleBase { + constructor(generator) { + super(generator); + + this.mainClientDir = generator.mainClientDir; + + if (!this.mainClientDir) { + generator.error('Client destination folder is missing'); + } + } + + addEntityToMenu(entityName) { + const errorMessage = `${chalk.yellow('Reference to ') + entityName} ${chalk.yellow('not added to menu.\n')}`; + const entityMenuPath = `src/${this.mainClientDir}/Views/MenuPage.xaml`; + const entityEntry = + // prettier-ignore + this.generator.stripMargin( + `| + | + |`); + + const rewriteFileModel = this.generateFileModel(entityMenuPath, 'jhipster-needle-add-entity-to-menu', entityEntry); + + this.addBlockContentToFile(rewriteFileModel, errorMessage); + } + + declareCommandToMenu(entityName) { + const errorMessage = `${chalk.yellow('Reference to ') + entityName} ${chalk.yellow('not added to menu.\n')}`; + const entityMenuPath = `src/${this.mainClientDir}/ViewModels/MenuViewModel.cs`; + const entityEntry = + // prettier-ignore + this.generator.stripMargin( + `|public IMvxCommand Show${entityName}Command => new MvxAsyncCommand(${entityName}CommandClicked);`); + + const rewriteFileModel = this.generateFileModel(entityMenuPath, 'jhipster-needle-declare-entity-command', entityEntry); + + this.addBlockContentToFile(rewriteFileModel, errorMessage); + } + + addCommandToMenu(entityName) { + const errorMessage = `${chalk.yellow('Reference to ') + entityName} ${chalk.yellow('not added to menu.\n')}`; + const entityMenuPath = `src/${this.mainClientDir}/ViewModels/MenuViewModel.cs`; + const entityEntry = + // prettier-ignore + this.generator.stripMargin( + `|private async Task ${entityName}CommandClicked() + | { + | await _navigationService.Navigate<${entityName}ViewModel>(); + | } + `); + + const rewriteFileModel = this.generateFileModel(entityMenuPath, 'jhipster-needle-add-entity-command', entityEntry); + + this.addBlockContentToFile(rewriteFileModel, errorMessage); + } + + addServiceInDI(entityName) { + const lowerEntityName = _.toLower(entityName); + const errorMessage = `${chalk.yellow('Reference to ') + entityName} ${chalk.yellow('not added to Program.\n')}`; + const programPath = `src/${this.mainClientDir}/App.cs`; + const serviceEntry = + // prettier-ignore + this.generator.stripMargin( + `|var ${lowerEntityName}Service = new ${entityName}Service(httpClient); + | Mvx.IoCProvider.RegisterSingleton(${lowerEntityName}Service);`); + + const rewriteFileModel = this.generateFileModel(programPath, 'jhipster-needle-add-services-in-di', serviceEntry); + + this.addBlockContentToFile(rewriteFileModel, errorMessage); + } +}; \ No newline at end of file diff --git a/generators/client/prompts.js b/generators/client/prompts.js index 9993973c1..825eca375 100644 --- a/generators/client/prompts.js +++ b/generators/client/prompts.js @@ -23,6 +23,7 @@ const constants = require('../generator-dotnetcore-constants'); const ANGULAR = baseConstants.SUPPORTED_CLIENT_FRAMEWORKS.ANGULAR; const REACT = baseConstants.SUPPORTED_CLIENT_FRAMEWORKS.REACT; const BLAZOR = constants.BLAZOR; +const XAMARIN = constants.XAMARIN; module.exports = { askForClient, @@ -30,7 +31,8 @@ module.exports = { function askForClient() { if (this.existingProject) return; - const choices = [ + + var choices = [ { value: ANGULAR, name: 'Angular', @@ -39,7 +41,7 @@ function askForClient() { value: REACT, name: 'React', }, - { + { value: BLAZOR, name: '[Alpha] - Blazor (WebAssembly)', }, @@ -48,6 +50,15 @@ function askForClient() { name: 'No client', }, ]; + + if (this.configOptions.isDebugEnabled) { + choices.push( + { + value: XAMARIN, + name: '[Alpha] - Xamarin', + }, + ) + } const PROMPT = { type: 'list', diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/MainActivity.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/MainActivity.cs.ejs new file mode 100644 index 000000000..94f3a5288 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/MainActivity.cs.ejs @@ -0,0 +1,47 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using Android.App; +using Android.Content.PM; +using Android.OS; +using Android.Runtime; +using MvvmCross.Forms.Platforms.Android.Core; +using MvvmCross.Forms.Platforms.Android.Views; +using Xamarin.Essentials; + +namespace <%= namespace %>.Client.Xamarin.Droid +{ + [Activity(Label = "<%= namespace %>", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = false, + ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | + ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize)] + public class MainActivity : MvxFormsAppCompatActivity + { + protected override void OnCreate(Bundle savedInstanceState) + { + TabLayoutResource = Resource.Layout.Tabbar; + ToolbarResource = Resource.Layout.Toolbar; + + base.OnCreate(savedInstanceState); + } + + public override void OnRequestPermissionsResult(int requestCode, string[] permissions, + [GeneratedEnum] Permission[] grantResults) + { + Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); + + base.OnRequestPermissionsResult(requestCode, permissions, grantResults); + } + } +} \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Project.Client.Xamarin.Android.csproj.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Project.Client.Xamarin.Android.csproj.ejs new file mode 100644 index 000000000..c358a350c --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Project.Client.Xamarin.Android.csproj.ejs @@ -0,0 +1,123 @@ + + + + Debug + AnyCPU + {55206BEA-B1A5-4EF4-8030-A53EE728F481} + {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + {c9e5eea5-ca05-42a1-839b-61506e0a37df} + Library + <%= namespace %>.Client.Xamarin.Droid + <%= namespace %>.Client.Xamarin.Android + True + True + Resources\Resource.designer.cs + Resource + Properties\AndroidManifest.xml + Resources + Assets + false + v10.0 + true + true + Xamarin.Android.Net.AndroidClientHandler + + + + + true + portable + false + bin\Debug + DEBUG; + prompt + 4 + None + false + false + false + false + + + true + portable + true + bin\Release + prompt + 4 + true + false + + + + + + + + + + + + + + 7.1.1 + + + 7.1.1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {73C411F6-14CB-4E3A-903B-7B42F8AC1651} + <%= namespace %>.Client.Xamarin.Core + + + + + MSBuild:UpdateGeneratedFiles + Designer + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Project.Client.Xamarin.Android.csproj.user.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Project.Client.Xamarin.Android.csproj.user.ejs new file mode 100644 index 000000000..ebe7a20cf --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Project.Client.Xamarin.Android.csproj.user.ejs @@ -0,0 +1,9 @@ + + + + pixel_2_pie_9_0_-_api_28 + pixel_2_pie_9_0_-_api_28 + Nexus 4 + MainTheme + + \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Properties/AndroidManifest.xml.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Properties/AndroidManifest.xml.ejs new file mode 100644 index 000000000..e0526e5bd --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Properties/AndroidManifest.xml.ejs @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Properties/AssemblyInfo.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Properties/AssemblyInfo.cs.ejs new file mode 100644 index 000000000..cb7b765d9 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Properties/AssemblyInfo.cs.ejs @@ -0,0 +1,30 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using Android; +using Android.App; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("<%= namespace %>.Client.Xamarin.Android")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("<%= namespace %>.Client.Xamarin.Android")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: ComVisible(false)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] + +// Add some common permissions, these can be removed if not needed +[assembly: UsesPermission(Manifest.Permission.Internet)] +[assembly: UsesPermission(Manifest.Permission.WriteExternalStorage)] \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/drawable/menu.png b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/drawable/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ea99cd5f6fbc937534c1ebf78996a8aebbe4ac GIT binary patch literal 7160 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 + + + + + + \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/layout/Tabbar.xml.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/layout/Tabbar.xml.ejs new file mode 100644 index 000000000..46746280c --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/layout/Tabbar.xml.ejs @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/layout/Toolbar.xml.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/layout/Toolbar.xml.ejs new file mode 100644 index 000000000..6f4b93076 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/layout/Toolbar.xml.ejs @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-anydpi-v26/icon.xml.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-anydpi-v26/icon.xml.ejs new file mode 100644 index 000000000..b80dc2ac8 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-anydpi-v26/icon.xml.ejs @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-anydpi-v26/icon_round.xml.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-anydpi-v26/icon_round.xml.ejs new file mode 100644 index 000000000..b80dc2ac8 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-anydpi-v26/icon_round.xml.ejs @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-hdpi/icon.png b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/mipmap-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a3be7886800b0a02ba63d326874c0018855e4112 GIT binary patch literal 14022 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 + + + #FFFFFF + #3F51B5 + #303F9F + #FF4081 + \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/values/styles.xml.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/values/styles.xml.ejs new file mode 100644 index 000000000..55a07018a --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/Resources/values/styles.xml.ejs @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/SplashScreenActivity.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/SplashScreenActivity.cs.ejs new file mode 100644 index 000000000..90e04b28a --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Android/SplashScreenActivity.cs.ejs @@ -0,0 +1,41 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using Android.App; +using Android.Content.PM; +using Android.OS; +using MvvmCross.Forms.Platforms.Android.Core; +using MvvmCross.Forms.Platforms.Android.Views; +using System.Threading.Tasks; +using <%= namespace %>.Client.Xamarin.Core; + +namespace <%= namespace %>.Client.Xamarin.Droid +{ + [Activity(Label = "<%= namespace %>", MainLauncher = true, NoHistory = true, Icon = "@mipmap/icon", ScreenOrientation = ScreenOrientation.Portrait)] + public class SplashScreenActivity : MvxFormsSplashScreenActivity, App, FormsApp> + { + public SplashScreenActivity() + : base(Resource.Layout.SplashScreen) + { + } + + protected override Task RunAppStartAsync(Bundle bundle) + { + StartActivity(typeof(MainActivity)); + return Task.CompletedTask; + } + + } +} \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/App.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/App.cs.ejs new file mode 100644 index 000000000..a9d552830 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/App.cs.ejs @@ -0,0 +1,74 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using System; +using Akavache; +using <%= namespace %>.Client.Xamarin.Core.Models; +using <%= namespace %>.Client.Xamarin.Core.Services; +using <%= namespace %>.Client.Xamarin.Core.ViewModels; +using MvvmCross; +using MvvmCross.ViewModels; +using System.Net.Http; +using System.Reactive.Linq; +using System.Threading.Tasks; +using MvvmCross.Logging; + +namespace <%= namespace %>.Client.Xamarin.Core +{ + public class App : MvxApplication + { + public override void Initialize() + { + Akavache.Registrations.Start("<%= namespace %>"); + var log = Mvx.IoCProvider.Resolve().GetLogFor("<%= namespace %>"); + + #if DEBUG + HttpClientHandler handler = new HttpClientHandler(); + handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => + { + if (cert.Issuer.Equals("CN=localhost")) + return true; + return errors == System.Net.Security.SslPolicyErrors.None; + }; + HttpClient httpClient = new HttpClient(handler); + #else + HttpClient httpClient = new HttpClient(); + #endif + httpClient.BaseAddress = new Uri(Configuration.BaseUri); + + var authenticationService = new AuthenticationService(httpClient, log); + Mvx.IoCProvider.RegisterSingleton(authenticationService); + var registerService = new RegisterService(httpClient, log); + Mvx.IoCProvider.RegisterSingleton(registerService); + // jhipster-needle-add-services-in-di - JHipster will add services in DI + + Mvx.IoCProvider.RegisterSingleton(log); + Mvx.IoCProvider.RegisterSingleton(httpClient); + + try + { + // sync trying to connect before loading home view + var token = Task.Run(async () => await BlobCache.Secure.GetObject("token")).Result; + Task.Run(async () => await authenticationService.SignIn(token)); + } + catch (Exception ex) + { + log.ErrorException("Failed to fetch token and auto-login.", ex); + } + + RegisterAppStart(); + } + } +} \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/AssemblyInfo.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/AssemblyInfo.cs.ejs new file mode 100644 index 000000000..e9c28f8ff --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/AssemblyInfo.cs.ejs @@ -0,0 +1,18 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using Xamarin.Forms.Xaml; + +[assembly: XamlCompilation(XamlCompilationOptions.Compile)] \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/FormsApp.xaml.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/FormsApp.xaml.cs.ejs new file mode 100644 index 000000000..055bde2cc --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/FormsApp.xaml.cs.ejs @@ -0,0 +1,26 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> +using Xamarin.Forms; + +namespace <%= namespace %>.Client.Xamarin.Core +{ + public partial class FormsApp : Application + { + public FormsApp() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/FormsApp.xaml.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/FormsApp.xaml.ejs new file mode 100644 index 000000000..abd13af82 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/FormsApp.xaml.ejs @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/LinkerPreserve.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/LinkerPreserve.cs.ejs new file mode 100644 index 000000000..d5b665d18 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/LinkerPreserve.cs.ejs @@ -0,0 +1,35 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using Akavache.Sqlite3; +using MvvmCross; + +namespace <%= namespace %>.Client.Xamarin.Core +{ + /// + /// Linker preserve for Akavache (https://github.com/reactiveui/Akavache#handling-xamarin-linker). + /// Ensures the Akavache.Sqlite3 dll will not be removed by Xamarin build tools. + /// Note: This class file is *required* for iOS to work correctly. + /// + [Preserve] + public static class LinkerPreserve + { + static LinkerPreserve() + { + var persistentName = typeof(SQLitePersistentBlobCache).FullName; + var encryptedName = typeof(SQLiteEncryptedBlobCache).FullName; + } + } +} diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/JwtToken.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/JwtToken.cs.ejs new file mode 100644 index 000000000..b7d51035b --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/JwtToken.cs.ejs @@ -0,0 +1,24 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> +using System.Text.Json.Serialization; + +namespace <%= namespace %>.Client.Xamarin.Core.Models +{ + public class JwtToken + { + [JsonPropertyName("id_token")] + public string IdToken { get; set; } + } +} diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/LoginModel.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/LoginModel.cs.ejs new file mode 100644 index 000000000..2dbbfb602 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/LoginModel.cs.ejs @@ -0,0 +1,23 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> +namespace <%= namespace %>.Client.Xamarin.Core.Models +{ + public class LoginModel + { + public string Username { get; set; } + public string Password { get; set; } + public bool RememberMe { get; set; } + } +} diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/RegisterResultRequest.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/RegisterResultRequest.cs.ejs new file mode 100644 index 000000000..7250e8180 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/RegisterResultRequest.cs.ejs @@ -0,0 +1,36 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace <%= namespace %>.Client.Xamarin.Core.Models +{ + public class RegisterResultRequest + { + public string Type { get; set; } + + public int Status { get; set; } + + public string Detail { get; set; } + + public string Params { get; set; } + + public string Message { get; set; } + + public string TraceId { get; set; } + } +} diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/UserModel.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/UserModel.cs.ejs new file mode 100644 index 000000000..a3f402912 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/UserModel.cs.ejs @@ -0,0 +1,36 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> +using System; +using System.Collections.Generic; + +namespace <%= namespace %>.Client.Xamarin.Core.Models +{ + public class UserModel + { + public string Id { get; set; } + public string Login { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } + public string Email { get; set; } + public string ImageUrl { get; set; } + public bool Activated { get; set; } + public string LangKey { get; set; } + public string CreatedBy { get; set; } + public DateTime? CreatedDate { get; set; } + public string LastModifiedBy { get; set; } + public DateTime? LastModifiedDate { get; set; } + public IEnumerable Authorities { get; set; } + } +} diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/UserSaveModel.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/UserSaveModel.cs.ejs new file mode 100644 index 000000000..87406a800 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Models/UserSaveModel.cs.ejs @@ -0,0 +1,26 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace <%= namespace %>.Client.Xamarin.Core.Models +{ + public class UserSaveModel : UserModel + { + public string Password { get; set; } + } +} diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Project.Client.Xamarin.Core.csproj.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Project.Client.Xamarin.Core.csproj.ejs new file mode 100644 index 000000000..bdbb04aee --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Project.Client.Xamarin.Core.csproj.ejs @@ -0,0 +1,49 @@ + + + + netstandard2.0 + true + + + + portable + true + + + + + + + + + + + + + + + + + + WelcomeView.xaml + + + HomeView.xaml + + + RegisterView.xaml + + + + + + MSBuild:Compile + + + MSBuild:UpdateDesignTimeXaml + + + MSBuild:Compile + + + \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Resources/Strings.Designer.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Resources/Strings.Designer.cs.ejs new file mode 100644 index 000000000..9f441a10a --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Resources/Strings.Designer.cs.ejs @@ -0,0 +1,115 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +namespace <%= namespace %>.Client.Xamarin.Core.Resources { + using System; + using System.Reflection; + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class Strings { + + private static System.Resources.ResourceManager resourceMan; + + private static System.Globalization.CultureInfo resourceCulture; + + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager { + get { + if (object.Equals(null, resourceMan)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("<%= namespace %>.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + public static string Name { + get { + return ResourceManager.GetString("Name", resourceCulture); + } + } + + public static string Statistics { + get { + return ResourceManager.GetString("Statistics", resourceCulture); + } + } + + public static string Time { + get { + return ResourceManager.GetString("Time", resourceCulture); + } + } + + public static string AnotherOption { + get { + return ResourceManager.GetString("AnotherOption", resourceCulture); + } + } + + public static string Menu { + get { + return ResourceManager.GetString("Menu", resourceCulture); + } + } + + public static string BirthYear { + get { + return ResourceManager.GetString("BirthYear", resourceCulture); + } + } + + public static string Gender { + get { + return ResourceManager.GetString("Gender", resourceCulture); + } + } + + public static string Yes { + get { + return ResourceManager.GetString("Yes", resourceCulture); + } + } + + public static string No { + get { + return ResourceManager.GetString("No", resourceCulture); + } + } + + public static string Close { + get { + return ResourceManager.GetString("Close", resourceCulture); + } + } + } +} diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Resources/Strings.resx.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Resources/Strings.resx.ejs new file mode 100644 index 000000000..af78c09f3 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Resources/Strings.resx.ejs @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Name + + + Menu + + + Yes + + + No + + + Close + + + Another option + + + Birth year + + + Gender + + + Statistics + + + Time + + \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/AbstractEntityService.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/AbstractEntityService.cs.ejs new file mode 100644 index 000000000..cc736a637 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/AbstractEntityService.cs.ejs @@ -0,0 +1,60 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using System.Collections.Generic; +using System.Net.Http; +using System.Net.Http.Json; +using System.Threading.Tasks; +using <%= namespace %>.Client.Xamarin.Core.Models; + +namespace <%= namespace %>.Client.Xamarin.Core.Services +{ + public class AbstractEntityService : IAbstractEntityService where T : class + { + private readonly HttpClient _httpClient; + private readonly string _baseUrl; + + public AbstractEntityService(HttpClient httpClient, string baseUrl) + { + _httpClient = httpClient; + _baseUrl = baseUrl; + } + + public async Task> GetEntities() + { + return await _httpClient.GetFromJsonAsync>(_baseUrl); + } + + public async Task GetEntity(long id) + { + return await _httpClient.GetFromJsonAsync($"{_baseUrl}/{id}"); + } + + public async Task CreateEntity(T entity) + { + await _httpClient.PostAsJsonAsync(_baseUrl, entity); + } + + public async Task DeleteEntity(long id) + { + await _httpClient.DeleteAsync($"{_baseUrl}/{id}"); + } + + public async Task UpdateEntity(T entity) + { + await _httpClient.PutAsJsonAsync(_baseUrl, entity); + } + } +} \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/AuthenticationService.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/AuthenticationService.cs.ejs new file mode 100644 index 000000000..95744dfed --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/AuthenticationService.cs.ejs @@ -0,0 +1,92 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using System; +using System.Net.Http; +using System.Net.Http.Json; +using System.Reactive.Linq; +using System.Threading.Tasks; +using Akavache; +using <%= namespace %>.Client.Xamarin.Core.Models; +using MvvmCross.Logging; + +namespace <%= namespace %>.Client.Xamarin.Core.Services +{ + public class AuthenticationService : IAuthenticationService + { + private const string AuthenticationUrl = "api/authenticate"; + private const string AccountUrl = "api/account"; + private const string AuthorizationHeader = "Authorization"; + private readonly HttpClient _httpClient; + private readonly IMvxLog _log; + + public bool IsAuthenticated { get; set; } + public UserModel CurrentUser { get; set; } + private JwtToken JwtToken { get; set; } + + public AuthenticationService(HttpClient httpClient, IMvxLog log) + { + _httpClient = httpClient; + _log = log; + } + + public async Task SignIn(LoginModel loginModel) + { + var result = await _httpClient.PostAsJsonAsync(AuthenticationUrl, loginModel); + if (result.IsSuccessStatusCode) + { + JwtToken = await result.Content.ReadFromJsonAsync(); + await SetUserAndAuthorizationHeader(JwtToken, loginModel.RememberMe); + } + return IsAuthenticated; + } + + public async Task SignIn(JwtToken jwtToken) + { + await SetUserAndAuthorizationHeader(jwtToken); + return IsAuthenticated; + } + + public void SignOut() + { + _httpClient.DefaultRequestHeaders.Remove(AuthorizationHeader); + JwtToken = null; + IsAuthenticated = false; + CurrentUser = null; + BlobCache.Secure.InvalidateAll(); + } + + private async Task SetUserAndAuthorizationHeader(JwtToken jwtToken, bool save = false) + { + IsAuthenticated = true; + _httpClient.DefaultRequestHeaders.Remove(AuthorizationHeader); + _httpClient.DefaultRequestHeaders.Add(AuthorizationHeader, $"Bearer {jwtToken.IdToken}"); + try + { + CurrentUser = await _httpClient.GetFromJsonAsync(AccountUrl); + if (save) + { + await BlobCache.Secure.InvalidateAll(); + await BlobCache.Secure.InsertObject("token", jwtToken); + } + } + catch (Exception ex) + { + _log.ErrorException("Failed to fetch user and login.", ex); + IsAuthenticated = false; + } + } + } +} \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/Configuration.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/Configuration.cs.ejs new file mode 100644 index 000000000..f42aed085 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/Configuration.cs.ejs @@ -0,0 +1,28 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using System; +using System.Collections.Generic; +using System.Text; +using Xamarin.Forms; + +namespace <%= namespace %>.Client.Xamarin.Core.Services +{ + public static class Configuration + { + public static string BaseUri = + Device.RuntimePlatform == Device.Android ? "https://10.0.2.2:5001/" : "https://localhost:5001/"; + } +} diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/IAbstractEntityService.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/IAbstractEntityService.cs.ejs new file mode 100644 index 000000000..c1f2d1319 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/IAbstractEntityService.cs.ejs @@ -0,0 +1,30 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using System.Collections.Generic; +using System.Threading.Tasks; +using <%= namespace %>.Client.Xamarin.Core.Models; + +namespace <%= namespace %>.Client.Xamarin.Core.Services +{ + public interface IAbstractEntityService + { + Task> GetEntities(); + Task GetEntity(long id); + Task DeleteEntity(long id); + Task CreateEntity(T entity); + Task UpdateEntity(T entity); + } +} \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/IAuthenticationService.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/IAuthenticationService.cs.ejs new file mode 100644 index 000000000..81ada790d --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/IAuthenticationService.cs.ejs @@ -0,0 +1,29 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using System.Net.Http; +using System.Threading.Tasks; +using <%= namespace %>.Client.Xamarin.Core.Models; + +namespace <%= namespace %>.Client.Xamarin.Core.Services +{ + public interface IAuthenticationService + { + bool IsAuthenticated { get; set; } + UserModel CurrentUser { get; set; } + Task SignIn(LoginModel model); + void SignOut(); + } +} \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/IRegisterService.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/IRegisterService.cs.ejs new file mode 100644 index 000000000..62607275f --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/IRegisterService.cs.ejs @@ -0,0 +1,29 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using <%= namespace %>.Client.Xamarin.Core.Models; + +namespace <%= namespace %>.Client.Xamarin.Core.Services +{ + public interface IRegisterService + { + Task Save(UserSaveModel registerModel); + } +} diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/RegisterService.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/RegisterService.cs.ejs new file mode 100644 index 000000000..159c02169 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Services/RegisterService.cs.ejs @@ -0,0 +1,65 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Http; +using System.Net.Http.Json; +using System.Text; +using System.Threading.Tasks; +using <%= namespace %>.Client.Xamarin.Core.Models; +using MvvmCross.Logging; +using <%= namespace %>.Client.Xamarin.Shared.Constants; + +namespace <%= namespace %>.Client.Xamarin.Core.Services +{ + public class RegisterService : IRegisterService + { + private const string RegisterUrl = "/api/register"; + private readonly HttpClient _httpClient; + private readonly IMvxLog _log; + + public RegisterService(HttpClient httpClient, IMvxLog log) + { + _httpClient = httpClient; + _log = log; + } + + public async Task Save(UserSaveModel registerModel) + { + var resp = await _httpClient.PostAsJsonAsync(RegisterUrl, registerModel); + if (resp.IsSuccessStatusCode) + return null; + return await ProcessError(resp); + } + + private async Task ProcessError(HttpResponseMessage result) + { + if (result.StatusCode != HttpStatusCode.BadRequest) return ErrorConst.UnknownErrorType; + + try + { + var res = await result.Content.ReadFromJsonAsync(); + return res.Type; + } + catch (Exception ex) + { + _log.ErrorException("Failed to parse JSON from error", ex); + return ErrorConst.UnknownErrorType; + } + } + } +} diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/BaseViewModel.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/BaseViewModel.cs.ejs new file mode 100644 index 000000000..b0ecfa859 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/BaseViewModel.cs.ejs @@ -0,0 +1,29 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using MvvmCross.ViewModels; +using <%= namespace %>.Client.Xamarin.Core.Resources; + +namespace <%= namespace %>.Client.Xamarin.Core.ViewModels +{ + public abstract class BaseViewModel : MvxViewModel + { + /// + /// Gets the internationalized string at the given , which is the key of the resource. + /// + /// Index key of the string from the resources of internationalized strings. + public string this[string index] => Strings.ResourceManager.GetString(index); + } +} diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/HomeViewModel.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/HomeViewModel.cs.ejs new file mode 100644 index 000000000..8a6a4ba26 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/HomeViewModel.cs.ejs @@ -0,0 +1,47 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using System; +using System.Threading.Tasks; +using <%= namespace %>.Client.Xamarin.Core.Services; +using MvvmCross.Commands; +using MvvmCross.Navigation; +using MvvmCross.ViewModels; + +namespace <%= namespace %>.Client.Xamarin.Core.ViewModels +{ + public class HomeViewModel : BaseViewModel + { + private readonly IMvxNavigationService _navigationService; + + public IMvxAsyncCommand ShowMenuViewModelCommand => new MvxAsyncCommand(ShowMenuViewModelCommandClicked); + public IMvxAsyncCommand ShowWelcomeViewModelCommand => new MvxAsyncCommand(ShowWelcomeViewModelCommandClicked); + + public HomeViewModel(IMvxNavigationService navigationService) + { + _navigationService = navigationService; + } + + private async Task ShowWelcomeViewModelCommandClicked() + { + await _navigationService.Navigate(); + } + + private async Task ShowMenuViewModelCommandClicked() + { + await _navigationService.Navigate(); + } + } +} \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/LoginViewModel.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/LoginViewModel.cs.ejs new file mode 100644 index 000000000..1accf8379 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/LoginViewModel.cs.ejs @@ -0,0 +1,131 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using System.Threading.Tasks; +using <%= namespace %>.Client.Xamarin.Core.Models; +using <%= namespace %>.Client.Xamarin.Core.Services; +using MvvmCross.Commands; +using MvvmCross.Navigation; +using MvvmCross.ViewModels; + +namespace <%= namespace %>.Client.Xamarin.Core.ViewModels +{ + public class LoginViewModel : BaseViewModel + { + private readonly IAuthenticationService _authenticationService; + private readonly IMvxNavigationService _navigationService; + + private bool _active; + private bool _rememberMe; + private string _password; + private string _username; + private bool _success = true; + + public IMvxCommand SignIn => new MvxAsyncCommand(SignInClicked); + public IMvxCommand SignUp => new MvxAsyncCommand(SignUpClicked); + public IMvxCommand ChangeStateCommand => new MvxCommand(InvertCheckBox); + + public bool Active + { + get => _active; + set + { + _active = value; + RaisePropertyChanged(() => Active); + } + } + + public string Username + { + get => _username; + set + { + _username = value; + RaisePropertyChanged(() => Username); + ReloadActive(); + } + } + + public string Password + { + get => _password; + set + { + _password = value; + RaisePropertyChanged(() => Password); + ReloadActive(); + } + } + + public bool RememberMe + { + get => _rememberMe; + set + { + _rememberMe = value; + RaisePropertyChanged(() => RememberMe); + } + } + + public bool Success + { + get => _success; + set + { + _success = value; + RaisePropertyChanged(() => Success); + } + } + + public LoginViewModel(IMvxNavigationService navigationService, IAuthenticationService authenticationService) + { + _navigationService = navigationService; + _authenticationService = authenticationService; + } + + private void InvertCheckBox() + { + RememberMe = !RememberMe; + } + + private async Task SignUpClicked() + { + await _navigationService.Navigate(); + } + + private async Task SignInClicked() + { + Active = false; + Success = await SignInConnection(); + if (Success) await _navigationService.Navigate(); + } + + public void ReloadActive() + { + Active = !string.IsNullOrEmpty(Password) && !string.IsNullOrEmpty(Username) && Password.Length > 3; + } + + public Task SignInConnection() + { + var model = new LoginModel + { + Username = Username, + Password = Password, + RememberMe = RememberMe + }; + return _authenticationService.SignIn(model); + } + } +} \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/MenuViewModel.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/MenuViewModel.cs.ejs new file mode 100644 index 000000000..446f4c2e5 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/MenuViewModel.cs.ejs @@ -0,0 +1,65 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using <%= namespace %>.Client.Xamarin.Core.Services; +using MvvmCross.Commands; +using MvvmCross.Navigation; +using System.Threading.Tasks; + +namespace <%= namespace %>.Client.Xamarin.Core.ViewModels +{ + public class MenuViewModel : BaseViewModel + { + private readonly IMvxNavigationService _navigationService; + private readonly IAuthenticationService _authenticationService; + + public IMvxCommand ShowWelcomeCommand => new MvxAsyncCommand(ShowWelcomeCommandClicked); + public IMvxCommand SignIn => new MvxAsyncCommand(SignInClicked); + public IMvxCommand SignUp => new MvxAsyncCommand(SignUpClicked); + // jhipster-needle-declare-entity-command - JHipster will declare commands + public IMvxCommand SignOut => new MvxCommand(SignOutClicked); + public bool IsConnected => _authenticationService.IsAuthenticated; + + public MenuViewModel(IMvxNavigationService navigationService, IAuthenticationService authenticationService) + { + _navigationService = navigationService; + _authenticationService = authenticationService; + } + + // jhipster-needle-add-entity-command - JHipster will add commands + + private async Task ShowWelcomeCommandClicked() + { + await _navigationService.Navigate(); + } + + private async Task SignInClicked() + { + await _navigationService.Navigate(); + } + + private async Task SignUpClicked() + { + await _navigationService.Navigate(); + } + + private void SignOutClicked() + { + _authenticationService.SignOut(); + RaisePropertyChanged(() => IsConnected); + _navigationService.Navigate(); + } + } +} \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/RegisterViewModel.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/RegisterViewModel.cs.ejs new file mode 100644 index 000000000..12470db9a --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/RegisterViewModel.cs.ejs @@ -0,0 +1,206 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using <%= namespace %>.Client.Xamarin.Core.Models; +using <%= namespace %>.Client.Xamarin.Core.Services; +using MvvmCross.Commands; +using MvvmCross.Navigation; +using MvvmCross.ViewModels; +using <%= namespace %>.Client.Xamarin.Shared.Constants; +using Xamarin.Essentials; + +namespace <%= namespace %>.Client.Xamarin.Core.ViewModels +{ + public class RegisterViewModel : BaseViewModel + { + private readonly IAuthenticationService _authenticationService; + private readonly IMvxNavigationService _navigationService; + private readonly IRegisterService _registerService; + + private bool _active; + private bool _rememberMe; + private bool _errorMail; + private bool _errorLogin; + private bool _success; + private string _password; + private string _username; + private string _email; + private string _confirmPassword; + private bool _error = false; + + public IMvxCommand SignUp => new MvxAsyncCommand(HandleSignUp); + public IMvxCommand ChangeStateCommand => new MvxCommand(InvertCheckBox); + public IMvxCommand GoBack => new MvxCommand(GoBackClicked); + + public bool Active + { + get => _active; + set + { + _active = value; + RaisePropertyChanged(() => Active); + } + } + + public string Username + { + get => _username; + set + { + _username = value; + RaisePropertyChanged(() => Username); + ReloadActive(); + } + } + + public string Password + { + get => _password; + set + { + _password = value; + RaisePropertyChanged(() => Password); + ReloadActive(); + } + } + + public string Email + { + get => _email; + set + { + _email = value; + RaisePropertyChanged(() => Password); + ReloadActive(); + } + } + + public bool RememberMe + { + get => _rememberMe; + set + { + _rememberMe = value; + RaisePropertyChanged(() => RememberMe); + } + } + + public bool Error + { + get => _error; + set + { + _error = value; + RaisePropertyChanged(() => Error); + } + } + + public string ConfirmPassword + { + get => _confirmPassword; + set + { + _confirmPassword = value; + RaisePropertyChanged(() => ConfirmPassword); + ReloadActive(); + } + } + + public bool ErrorMail + { + get => _errorMail; + set + { + _errorMail = value; + RaisePropertyChanged(() => ErrorMail); + } + } + + public bool ErrorLogin + { + get => _errorLogin; + set + { + _errorLogin = value; + RaisePropertyChanged(() => ErrorLogin); + } + } + + public bool Success + { + get => _success; + set + { + _success = value; + RaisePropertyChanged(() => Success); + } + } + + public RegisterViewModel(IMvxNavigationService navigationService, IAuthenticationService authenticationService, IRegisterService registerService) + { + _navigationService = navigationService; + _authenticationService = authenticationService; + _registerService = registerService; + } + + private void GoBackClicked() + { + _navigationService.Navigate(); + } + + private void InvertCheckBox() + { + RememberMe = !RememberMe; + } + + private async Task HandleSignUp() + { + Active = false; + var resultError = await _registerService.Save(new UserSaveModel + { + Password = Password, + Login = Username, + Email = Email, + LangKey = "en" + }); + + Error = resultError == ErrorConst.UnknownErrorType; + ErrorLogin = resultError == ErrorConst.LoginAlreadyUsedType; + ErrorMail = resultError == ErrorConst.EmailAlreadyUsedType; + + Success = (!new List() { Error, ErrorLogin, ErrorMail }.Contains(true)); + } + + private void ReloadActive() + { + Active = CheckActive(); + } + + private bool CheckActive() + { + var fields = new List { Password, ConfirmPassword, Username, Email }; + if (fields.Any(field => string.IsNullOrEmpty(field))) return false; + if (Password.Length < 4) return false; + if (ConfirmPassword != Password) return false; + if (Email.Length < 5) return false; + if (Email.Split('@').Length != 2) return false; + if (!Email.Split('@').All(val => val.Length > 0)) return false; + return true; + } + } +} \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/WelcomeViewModel.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/WelcomeViewModel.cs.ejs new file mode 100644 index 000000000..5abe4218a --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/ViewModels/WelcomeViewModel.cs.ejs @@ -0,0 +1,89 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using System; +using System.Threading.Tasks; +using <%= namespace %>.Client.Xamarin.Core.Services; +using MvvmCross.Commands; +using MvvmCross.Navigation; +using MvvmCross.ViewModels; +using Xamarin.Essentials; +using Xamarin.Forms; + +namespace <%= namespace %>.Client.Xamarin.Core.ViewModels +{ + public class WelcomeViewModel : BaseViewModel + { + private readonly IMvxNavigationService _navigationService; + private readonly IAuthenticationService _authenticationService; + + public IMvxCommand OpenHomepage => new MvxCommand(OpenHomepageClicked); + public IMvxCommand OpenStack => new MvxCommand(OpenStackClicked); + public IMvxCommand OpenBugTracker => new MvxCommand(OpenBugTrackerClicked); + public IMvxCommand OpenChatRoom => new MvxCommand(OpenChatRoomClicked); + public IMvxCommand OpenTwitter => new MvxCommand(OpenTwitterClicked); + public IMvxCommand OpenGitHub => new MvxCommand(OpenGitHubClicked); + public IMvxCommand SignIn => new MvxCommand(SignInClicked); + public IMvxCommand SignUp => new MvxCommand(SignUpClicked); + public bool IsConnected => _authenticationService.IsAuthenticated; + public string Username => (IsConnected) ? _authenticationService.CurrentUser.Login : null; + + public WelcomeViewModel(IMvxNavigationService navigationService, IAuthenticationService authenticationService) + { + _navigationService = navigationService; + _authenticationService = authenticationService; + } + + private void OpenHomepageClicked() + { + Launcher.OpenAsync("https://www.jhipster.tech/"); + } + + private void OpenStackClicked() + { + Launcher.OpenAsync("http://stackoverflow.com/tags/jhipster/info"); + } + + private void OpenBugTrackerClicked() + { + Launcher.OpenAsync("https://github.com/jhipster/generator-jhipster/issues?state=open"); + } + + private void OpenChatRoomClicked() + { + Launcher.OpenAsync("https://gitter.im/jhipster/generator-jhipster"); + } + + private void OpenTwitterClicked() + { + Launcher.OpenAsync("https://twitter.com/jhipster"); + } + + private void OpenGitHubClicked() + { + Launcher.OpenAsync("https://github.com/jhipster/generator-jhipster"); + } + + private void SignInClicked() + { + _navigationService.Navigate(); + } + + private void SignUpClicked() + { + _navigationService.Navigate(); + } + } +} \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/HomeView.xaml.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/HomeView.xaml.cs.ejs new file mode 100644 index 000000000..cd53933bc --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/HomeView.xaml.cs.ejs @@ -0,0 +1,47 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using System; +using <%= namespace %>.Client.Xamarin.Core.ViewModels; +using MvvmCross.Forms.Presenters.Attributes; +using MvvmCross.Forms.Views; +using Xamarin.Forms; + +namespace <%= namespace %>.Client.Xamarin.Core.Views +{ + [MvxMasterDetailPagePresentation(MasterDetailPosition.Root, WrapInNavigationPage = false, NoHistory = true)] + public partial class HomeView : MvxMasterDetailPage + { + private bool _firstTime = true; + + public HomeView() + { + InitializeComponent(); + } + + protected override void OnAppearing() + { + if (_firstTime) + { + ViewModel.ShowMenuViewModelCommand.Execute(null); + ViewModel.ShowWelcomeViewModelCommand.Execute(null); + + _firstTime = false; + } + + base.OnAppearing(); + } + } +} \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/HomeView.xaml.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/HomeView.xaml.ejs new file mode 100644 index 000000000..3c6b03685 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/HomeView.xaml.ejs @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/LoginView.xaml.cs.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/LoginView.xaml.cs.ejs new file mode 100644 index 000000000..41f6f69b0 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/LoginView.xaml.cs.ejs @@ -0,0 +1,30 @@ +<%# + Copyright 2013-2020 the original author or authors from the JHipster project. + This file is part of the JHipster project, see https://www.jhipster.tech/ + for more information. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-%> + +using <%= namespace %>.Client.Xamarin.Core.ViewModels; +using MvvmCross.Forms.Presenters.Attributes; +using MvvmCross.Forms.Views; + +namespace <%= namespace %>.Client.Xamarin.Core.Views +{ + [MvxMasterDetailPagePresentation(MasterDetailPosition.Detail, WrapInNavigationPage = true, NoHistory = true)] + public partial class LoginView : MvxContentPage + { + public LoginView() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/LoginView.xaml.ejs b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/LoginView.xaml.ejs new file mode 100644 index 000000000..56b996d88 --- /dev/null +++ b/generators/client/templates/xamarin/src/Project.Client.Xamarin.Core/Views/LoginView.xaml.ejs @@ -0,0 +1,67 @@ + + + + + + +