From 737cb10670081d55e2509ae92cbb34c35c776692 Mon Sep 17 00:00:00 2001 From: bharathwajv Date: Sun, 15 May 2022 17:09:33 +0530 Subject: [PATCH] Add project files. --- .dockerignore | 25 + .editorconfig | 158 + .github/FUNDING.yml | 3 + .github/dependabot.yml | 11 + .github/workflows/dotnet.yml | 25 + .gitignore | 454 ++ .template.config/icon.png | Bin 0 -> 153939 bytes .template.config/ide.host.json | 5 + .template.config/template.json | 51 + .vscode/launch.json | 12 + .vscode/settings.json | 8 + .vscode/tasks.json | 42 + Directory.Build.props | 27 + Directory.Build.targets | 5 + Dockerfile | 26 + FSH.BlazorWebAssembly.nuspec | 25 + LICENSE | 21 + README.md | 82 + RewardsPlus.BlazorWebAssembly.sln | 62 + blazor-wasm-boilerplate-main/.dockerignore | 25 + blazor-wasm-boilerplate-main/.editorconfig | 158 + .../.github/FUNDING.yml | 3 + .../.github/dependabot.yml | 11 + .../.github/workflows/dotnet.yml | 25 + blazor-wasm-boilerplate-main/.gitignore | 454 ++ .../.template.config/icon.png | Bin 0 -> 153939 bytes .../.template.config/ide.host.json | 5 + .../.template.config/template.json | 51 + .../.vscode/launch.json | 12 + .../.vscode/settings.json | 8 + .../.vscode/tasks.json | 42 + .../Directory.Build.props | 27 + .../Directory.Build.targets | 5 + blazor-wasm-boilerplate-main/Dockerfile | 26 + .../FSH.BlazorWebAssembly.nuspec | 25 + .../FSH.BlazorWebAssembly.sln | 62 + blazor-wasm-boilerplate-main/LICENSE | 21 + blazor-wasm-boilerplate-main/README.md | 82 + blazor-wasm-boilerplate-main/dotnet.ruleset | 164 + blazor-wasm-boilerplate-main/global.json | 7 + blazor-wasm-boilerplate-main/icon.png | Bin 0 -> 153939 bytes .../scripts/nswag-regen.ps1 | 20 + .../scripts/pull-shared-from-webapi.ps1 | 40 + .../Client.Infrastructure/ApiClient/FSHApi.cs | 6849 +++++++++++++++++ .../ApiClient/IApiService.cs | 5 + .../ApiClient/nswag.json | 100 + .../Auth/AuthProvider.cs | 7 + .../Auth/AuthorizationServiceExtensions.cs | 10 + .../AzureAd/AzureAdAuthenticationService.cs | 34 + .../AzureAdAuthorizationMessageHandler.cs | 12 + .../AzureAd/AzureAdClaimsPrincipalFactory.cs | 73 + .../Auth/IAuthenticationService.cs | 16 + .../Auth/Jwt/AccessTokenProviderAccessor.cs | 17 + .../Jwt/JwtAuthenticationHeaderHandler.cs | 34 + .../Auth/Jwt/JwtAuthenticationService.cs | 222 + .../Auth/MustHavePermissionAttribute.cs | 10 + .../src/Client.Infrastructure/Auth/Startup.cs | 47 + .../Client.Infrastructure.csproj | 39 + .../Common/AccessTokenProviderExtensions.cs | 12 + .../Common/ApplicationConstants.cs | 15 + .../Common/ConfigNames.cs | 7 + .../Common/IAppService.cs | 5 + .../Common/LocalizationConstants.cs | 21 + .../Common/StorageConstants.cs | 14 + .../src/Client.Infrastructure/GlobalUsings.cs | 7 + .../Notifications/ConnectionState.cs | 8 + .../Notifications/ConnectionStateChanged.cs | 5 + .../Notifications/INotificationPublisher.cs | 8 + .../Notifications/NotificationPublisher.cs | 24 + .../Notifications/NotificationWrapper.cs | 12 + .../Notifications/Startup.cs | 34 + .../Preferences/ClientPreference.cs | 15 + .../Preferences/ClientPreferenceManager.cs | 137 + .../Preferences/FshTablePreference.cs | 11 + .../Preferences/IClientPreferenceManager.cs | 14 + .../Preferences/IPreference.cs | 6 + .../Preferences/IPreferenceManager.cs | 10 + .../src/Client.Infrastructure/Startup.cs | 81 + .../Theme/CustomColors.cs | 42 + .../Theme/CustomTypography.cs | 114 + .../Client.Infrastructure/Theme/DarkTheme.cs | 44 + .../Client.Infrastructure/Theme/LightTheme.cs | 31 + .../src/Client/App.razor | 23 + .../src/Client/Client.csproj | 35 + .../Components/Common/CustomValidation.cs | 51 + .../Components/Common/ErrorHandler.razor | 2 + .../Components/Common/ErrorHandler.razor.cs | 31 + .../Components/Common/FshCustomError.razor | 1 + .../src/Client/Components/Common/FshTable.cs | 39 + .../Client/Components/Common/FshTitle.razor | 8 + .../Client/Components/Common/PersonCard.razor | 19 + .../Components/Common/PersonCard.razor.cs | 46 + .../Client/Components/Common/TablePager.razor | 3 + .../Dialogs/DeleteConfirmation.razor | 31 + .../Client/Components/Dialogs/Logout.razor | 40 + .../Components/EntityTable/AddEditModal.razor | 51 + .../EntityTable/AddEditModal.razor.cs | 49 + .../EntityTable/EntityClientTableContext.cs | 67 + .../Components/EntityTable/EntityField.cs | 35 + .../EntityTable/EntityServerTableContext.cs | 73 + .../Components/EntityTable/EntityTable.razor | 158 + .../EntityTable/EntityTable.razor.cs | 321 + .../EntityTable/EntityTableContext.cs | 197 + .../Components/EntityTable/IAddEditModal.cs | 8 + .../EntityTable/PaginationResponse.cs | 9 + .../Localization/LanguageSelector.razor | 41 + .../NotificationConnection.razor | 3 + .../NotificationConnection.razor.cs | 153 + .../NotificationConnectionStatus.razor | 49 + .../Components/ThemeManager/ColorPanel.razor | 27 + .../ThemeManager/ColorPanel.razor.cs | 24 + .../ThemeManager/DarkModePanel.razor | 17 + .../ThemeManager/DarkModePanel.razor.cs | 24 + .../Components/ThemeManager/RadiusPanel.razor | 15 + .../ThemeManager/RadiusPanel.razor.cs | 28 + .../TableCustomizationPanel.razor | 19 + .../TableCustomizationPanel.razor.cs | 74 + .../Components/ThemeManager/ThemeButton.razor | 16 + .../ThemeManager/ThemeButton.razor.cs | 10 + .../Components/ThemeManager/ThemeDrawer.razor | 28 + .../ThemeManager/ThemeDrawer.razor.cs | 96 + .../Pages/Authentication/Authentication.razor | 74 + .../Pages/Authentication/ForgotPassword.razor | 45 + .../Authentication/ForgotPassword.razor.cs | 31 + .../Client/Pages/Authentication/Login.razor | 47 + .../Pages/Authentication/Login.razor.cs | 81 + .../Pages/Authentication/SelfRegister.razor | 74 + .../Authentication/SelfRegister.razor.cs | 58 + .../Client/Pages/Catalog/BrandAutocomplete.cs | 68 + .../src/Client/Pages/Catalog/Brands.razor | 52 + .../src/Client/Pages/Catalog/Products.razor | 78 + .../Client/Pages/Catalog/Products.razor.cs | 159 + .../Pages/Identity/Account/Account.razor | 33 + .../Pages/Identity/Account/Profile.razor | 84 + .../Pages/Identity/Account/Profile.razor.cs | 101 + .../Pages/Identity/Account/Security.razor | 41 + .../Pages/Identity/Account/Security.razor.cs | 72 + .../Identity/Roles/RolePermissions.razor | 75 + .../Identity/Roles/RolePermissions.razor.cs | 114 + .../Client/Pages/Identity/Roles/Roles.razor | 33 + .../Pages/Identity/Roles/Roles.razor.cs | 60 + .../Pages/Identity/Users/UserProfile.razor | 148 + .../Pages/Identity/Users/UserProfile.razor.cs | 74 + .../Pages/Identity/Users/UserRoles.razor | 67 + .../Pages/Identity/Users/UserRoles.razor.cs | 77 + .../Client/Pages/Identity/Users/Users.razor | 46 + .../Pages/Identity/Users/Users.razor.cs | 95 + .../src/Client/Pages/Index.razor | 95 + .../Client/Pages/Multitenancy/Tenants.razor | 107 + .../Pages/Multitenancy/Tenants.razor.cs | 121 + .../UpgradeSubscriptionModal.razor | 58 + .../src/Client/Pages/Personal/AuditLogs.razor | 131 + .../Client/Pages/Personal/AuditLogs.razor.cs | 71 + .../src/Client/Pages/Personal/Dashboard.razor | 65 + .../Client/Pages/Personal/Dashboard.razor.cs | 62 + .../src/Client/Program.cs | 30 + .../src/Client/Properties/launchSettings.json | 30 + .../Components/Common/TablePager.ar.resx | 126 + .../Components/Common/TablePager.de.resx | 126 + .../Components/Common/TablePager.en.resx | 126 + .../Components/Common/TablePager.es.resx | 126 + .../Components/Common/TablePager.fr.resx | 126 + .../Components/Common/TablePager.id.resx | 126 + .../Components/Common/TablePager.it.resx | 126 + .../Components/Common/TablePager.km.resx | 126 + .../Components/Common/TablePager.nl.resx | 126 + .../Components/Common/TablePager.ru.resx | 126 + .../Components/Common/TablePager.sv.resx | 126 + .../Resources/Pages/Account/Register.ar.resx | 147 + .../Resources/Pages/Account/Register.de.resx | 147 + .../Resources/Pages/Account/Register.en.resx | 147 + .../Resources/Pages/Account/Register.es.resx | 147 + .../Resources/Pages/Account/Register.fr.resx | 147 + .../Resources/Pages/Account/Register.id.resx | 147 + .../Resources/Pages/Account/Register.it.resx | 144 + .../Resources/Pages/Account/Register.km.resx | 147 + .../Resources/Pages/Account/Register.nl.resx | 147 + .../Resources/Pages/Account/Register.ru.resx | 147 + .../Resources/Pages/Account/Register.sv.resx | 147 + .../Resources/Pages/Account/Reset.ar.resx | 132 + .../Resources/Pages/Account/Reset.de.resx | 132 + .../Resources/Pages/Account/Reset.en.resx | 132 + .../Resources/Pages/Account/Reset.es.resx | 129 + .../Resources/Pages/Account/Reset.fr.resx | 132 + .../Resources/Pages/Account/Reset.id.resx | 132 + .../Resources/Pages/Account/Reset.it.resx | 132 + .../Resources/Pages/Account/Reset.km.resx | 129 + .../Resources/Pages/Account/Reset.nl.resx | 132 + .../Resources/Pages/Account/Reset.ru.resx | 132 + .../Resources/Pages/Account/Reset.sv.resx | 132 + .../Authentication/Authentication.ar.resx | 147 + .../Authentication/Authentication.de.resx | 147 + .../Authentication/Authentication.en.resx | 147 + .../Authentication/Authentication.es.resx | 147 + .../Authentication/Authentication.fr.resx | 147 + .../Authentication/Authentication.id.resx | 147 + .../Authentication/Authentication.it.resx | 147 + .../Authentication/Authentication.km.resx | 147 + .../Authentication/Authentication.nl.resx | 147 + .../Authentication/Authentication.ru.resx | 147 + .../Authentication/Authentication.sv.resx | 147 + .../Authentication/ForgotPassword.ar.resx | 135 + .../Authentication/ForgotPassword.de.resx | 135 + .../Authentication/ForgotPassword.en.resx | 135 + .../Authentication/ForgotPassword.es.resx | 132 + .../Authentication/ForgotPassword.fr.resx | 135 + .../Authentication/ForgotPassword.id.resx | 135 + .../Authentication/ForgotPassword.it.resx | 138 + .../Authentication/ForgotPassword.km.resx | 132 + .../Authentication/ForgotPassword.nl.resx | 135 + .../Authentication/ForgotPassword.ru.resx | 135 + .../Authentication/ForgotPassword.sv.resx | 135 + .../Pages/Authentication/Login.ar.resx | 159 + .../Pages/Authentication/Login.de.resx | 162 + .../Pages/Authentication/Login.en.resx | 162 + .../Pages/Authentication/Login.es.resx | 159 + .../Pages/Authentication/Login.fr.resx | 147 + .../Pages/Authentication/Login.id.resx | 159 + .../Pages/Authentication/Login.it.resx | 156 + .../Pages/Authentication/Login.km.resx | 147 + .../Pages/Authentication/Login.nl.resx | 156 + .../Pages/Authentication/Login.ru.resx | 159 + .../Pages/Authentication/Login.sv.resx | 159 + .../Pages/Authentication/Register.ar.resx | 150 + .../Pages/Authentication/Register.de.resx | 150 + .../Pages/Authentication/Register.en.resx | 150 + .../Pages/Authentication/Register.es.resx | 150 + .../Pages/Authentication/Register.fr.resx | 150 + .../Pages/Authentication/Register.id.resx | 150 + .../Pages/Authentication/Register.it.resx | 150 + .../Pages/Authentication/Register.km.resx | 150 + .../Pages/Authentication/Register.nl.resx | 150 + .../Pages/Authentication/Register.ru.resx | 150 + .../Pages/Authentication/Register.sv.resx | 150 + .../Pages/Catalog/AddEditBrandModal.ar.resx | 153 + .../Pages/Catalog/AddEditBrandModal.de.resx | 153 + .../Pages/Catalog/AddEditBrandModal.en.resx | 153 + .../Pages/Catalog/AddEditBrandModal.es.resx | 153 + .../Pages/Catalog/AddEditBrandModal.fr.resx | 153 + .../Pages/Catalog/AddEditBrandModal.id.resx | 153 + .../Pages/Catalog/AddEditBrandModal.it.resx | 133 + .../Pages/Catalog/AddEditBrandModal.km.resx | 153 + .../Pages/Catalog/AddEditBrandModal.nl.resx | 153 + .../Pages/Catalog/AddEditBrandModal.ru.resx | 153 + .../Pages/Catalog/AddEditProductModal.ar.resx | 168 + .../Pages/Catalog/AddEditProductModal.de.resx | 168 + .../Pages/Catalog/AddEditProductModal.en.resx | 168 + .../Pages/Catalog/AddEditProductModal.es.resx | 168 + .../Pages/Catalog/AddEditProductModal.fr.resx | 168 + .../Pages/Catalog/AddEditProductModal.id.resx | 168 + .../Pages/Catalog/AddEditProductModal.it.resx | 168 + .../Pages/Catalog/AddEditProductModal.km.resx | 168 + .../Pages/Catalog/AddEditProductModal.nl.resx | 168 + .../Pages/Catalog/AddEditProductModal.ru.resx | 168 + .../Pages/Catalog/AddEditProductModal.sv.resx | 168 + .../Resources/Pages/Catalog/Brands.ar.resx | 186 + .../Resources/Pages/Catalog/Brands.de.resx | 186 + .../Resources/Pages/Catalog/Brands.en.resx | 186 + .../Resources/Pages/Catalog/Brands.es.resx | 186 + .../Resources/Pages/Catalog/Brands.fr.resx | 186 + .../Resources/Pages/Catalog/Brands.id.resx | 177 + .../Resources/Pages/Catalog/Brands.it.resx | 177 + .../Resources/Pages/Catalog/Brands.km.resx | 174 + .../Resources/Pages/Catalog/Brands.nl.resx | 186 + .../Resources/Pages/Catalog/Brands.ru.resx | 186 + .../Resources/Pages/Catalog/Brands.sv.resx | 177 + .../Resources/Pages/Catalog/Products.ar.resx | 186 + .../Resources/Pages/Catalog/Products.de.resx | 192 + .../Resources/Pages/Catalog/Products.en.resx | 192 + .../Resources/Pages/Catalog/Products.es.resx | 186 + .../Resources/Pages/Catalog/Products.fr.resx | 186 + .../Resources/Pages/Catalog/Products.id.resx | 177 + .../Resources/Pages/Catalog/Products.it.resx | 180 + .../Resources/Pages/Catalog/Products.km.resx | 168 + .../Resources/Pages/Catalog/Products.nl.resx | 186 + .../Resources/Pages/Catalog/Products.ru.resx | 186 + .../Resources/Pages/Catalog/Products.sv.resx | 177 + .../Pages/Communication/Chat.ar.resx | 147 + .../Pages/Communication/Chat.de.resx | 147 + .../Pages/Communication/Chat.en.resx | 147 + .../Pages/Communication/Chat.es.resx | 147 + .../Pages/Communication/Chat.fr.resx | 147 + .../Pages/Communication/Chat.id.resx | 147 + .../Pages/Communication/Chat.it.resx | 147 + .../Pages/Communication/Chat.km.resx | 147 + .../Pages/Communication/Chat.nl.resx | 147 + .../Pages/Communication/Chat.ru.resx | 147 + .../Pages/Communication/Chat.sv.resx | 147 + .../Resources/Pages/Content/Home.ar.resx | 192 + .../Resources/Pages/Content/Home.de.resx | 192 + .../Resources/Pages/Content/Home.en.resx | 192 + .../Resources/Pages/Content/Home.es.resx | 192 + .../Resources/Pages/Content/Home.fr.resx | 192 + .../Resources/Pages/Content/Home.id.resx | 198 + .../Resources/Pages/Content/Home.it.resx | 195 + .../Resources/Pages/Content/Home.km.resx | 192 + .../Resources/Pages/Content/Home.nl.resx | 192 + .../Resources/Pages/Content/Home.ru.resx | 192 + .../Resources/Pages/Content/Home.sv.resx | 192 + .../Resources/Pages/Content/Resources.ar.resx | 132 + .../Resources/Pages/Content/Resources.de.resx | 132 + .../Resources/Pages/Content/Resources.en.resx | 132 + .../Resources/Pages/Content/Resources.es.resx | 132 + .../Resources/Pages/Content/Resources.fr.resx | 132 + .../Resources/Pages/Content/Resources.id.resx | 132 + .../Resources/Pages/Content/Resources.it.resx | 132 + .../Resources/Pages/Content/Resources.km.resx | 132 + .../Resources/Pages/Content/Resources.nl.resx | 132 + .../Resources/Pages/Content/Resources.ru.resx | 132 + .../Resources/Pages/Content/Resources.sv.resx | 132 + .../Pages/Identity/Account/Account.ar.resx | 132 + .../Pages/Identity/Account/Account.de.resx | 132 + .../Pages/Identity/Account/Account.en.resx | 132 + .../Pages/Identity/Account/Account.es.resx | 132 + .../Pages/Identity/Account/Account.fr.resx | 132 + .../Pages/Identity/Account/Account.id.resx | 132 + .../Pages/Identity/Account/Account.it.resx | 132 + .../Pages/Identity/Account/Account.km.resx | 132 + .../Pages/Identity/Account/Account.nl.resx | 132 + .../Pages/Identity/Account/Account.ru.resx | 132 + .../Pages/Identity/Account/Account.sv.resx | 132 + .../Pages/Identity/Account/Profile.ar.resx | 162 + .../Pages/Identity/Account/Profile.de.resx | 162 + .../Pages/Identity/Account/Profile.en.resx | 162 + .../Pages/Identity/Account/Profile.es.resx | 162 + .../Pages/Identity/Account/Profile.fr.resx | 162 + .../Pages/Identity/Account/Profile.id.resx | 162 + .../Pages/Identity/Account/Profile.it.resx | 162 + .../Pages/Identity/Account/Profile.km.resx | 162 + .../Pages/Identity/Account/Profile.nl.resx | 162 + .../Pages/Identity/Account/Profile.ru.resx | 159 + .../Pages/Identity/Account/Profile.sv.resx | 162 + .../Pages/Identity/Account/Security.ar.resx | 159 + .../Pages/Identity/Account/Security.de.resx | 159 + .../Pages/Identity/Account/Security.en.resx | 159 + .../Pages/Identity/Account/Security.es.resx | 132 + .../Pages/Identity/Account/Security.fr.resx | 159 + .../Pages/Identity/Account/Security.id.resx | 138 + .../Pages/Identity/Account/Security.it.resx | 138 + .../Pages/Identity/Account/Security.km.resx | 132 + .../Pages/Identity/Account/Security.nl.resx | 159 + .../Pages/Identity/Account/Security.ru.resx | 138 + .../Pages/Identity/Account/Security.sv.resx | 138 + .../Pages/Identity/RegisterUserModal.ar.resx | 171 + .../Pages/Identity/RegisterUserModal.de.resx | 171 + .../Pages/Identity/RegisterUserModal.en.resx | 171 + .../Pages/Identity/RegisterUserModal.es.resx | 171 + .../Pages/Identity/RegisterUserModal.fr.resx | 171 + .../Pages/Identity/RegisterUserModal.id.resx | 171 + .../Pages/Identity/RegisterUserModal.it.resx | 148 + .../Pages/Identity/RegisterUserModal.km.resx | 171 + .../Pages/Identity/RegisterUserModal.nl.resx | 171 + .../Pages/Identity/RegisterUserModal.ru.resx | 171 + .../Pages/Identity/RegisterUserModal.sv.resx | 171 + .../Resources/Pages/Identity/Reset.ar.resx | 138 + .../Resources/Pages/Identity/Reset.de.resx | 138 + .../Resources/Pages/Identity/Reset.en.resx | 138 + .../Resources/Pages/Identity/Reset.es.resx | 138 + .../Resources/Pages/Identity/Reset.fr.resx | 138 + .../Resources/Pages/Identity/Reset.id.resx | 138 + .../Resources/Pages/Identity/Reset.it.resx | 138 + .../Resources/Pages/Identity/Reset.km.resx | 138 + .../Resources/Pages/Identity/Reset.nl.resx | 138 + .../Resources/Pages/Identity/Reset.ru.resx | 138 + .../Resources/Pages/Identity/Reset.sv.resx | 138 + .../Pages/Identity/RoleModal.ar.resx | 141 + .../Pages/Identity/RoleModal.de.resx | 141 + .../Pages/Identity/RoleModal.en.resx | 141 + .../Pages/Identity/RoleModal.es.resx | 141 + .../Pages/Identity/RoleModal.fr.resx | 141 + .../Pages/Identity/RoleModal.id.resx | 144 + .../Pages/Identity/RoleModal.it.resx | 141 + .../Pages/Identity/RoleModal.km.resx | 141 + .../Pages/Identity/RoleModal.nl.resx | 141 + .../Pages/Identity/RoleModal.ru.resx | 141 + .../Pages/Identity/RoleModal.sv.resx | 141 + .../Identity/Roles/RolePermissions.ar.resx | 165 + .../Identity/Roles/RolePermissions.de.resx | 165 + .../Identity/Roles/RolePermissions.en.resx | 165 + .../Identity/Roles/RolePermissions.es.resx | 165 + .../Identity/Roles/RolePermissions.fr.resx | 165 + .../Identity/Roles/RolePermissions.id.resx | 153 + .../Identity/Roles/RolePermissions.it.resx | 156 + .../Identity/Roles/RolePermissions.km.resx | 153 + .../Identity/Roles/RolePermissions.nl.resx | 165 + .../Identity/Roles/RolePermissions.ru.resx | 165 + .../Identity/Roles/RolePermissions.sv.resx | 153 + .../Pages/Identity/Roles/Roles.ar.resx | 171 + .../Pages/Identity/Roles/Roles.de.resx | 171 + .../Pages/Identity/Roles/Roles.en.resx | 171 + .../Pages/Identity/Roles/Roles.es.resx | 171 + .../Pages/Identity/Roles/Roles.fr.resx | 171 + .../Pages/Identity/Roles/Roles.id.resx | 162 + .../Pages/Identity/Roles/Roles.it.resx | 162 + .../Pages/Identity/Roles/Roles.km.resx | 156 + .../Pages/Identity/Roles/Roles.nl.resx | 171 + .../Pages/Identity/Roles/Roles.ru.resx | 171 + .../Pages/Identity/Roles/Roles.sv.resx | 162 + .../Pages/Identity/Users/UserProfile.ar.resx | 153 + .../Pages/Identity/Users/UserProfile.de.resx | 153 + .../Pages/Identity/Users/UserProfile.en.resx | 153 + .../Pages/Identity/Users/UserProfile.es.resx | 150 + .../Pages/Identity/Users/UserProfile.fr.resx | 153 + .../Pages/Identity/Users/UserProfile.id.resx | 153 + .../Pages/Identity/Users/UserProfile.it.resx | 153 + .../Pages/Identity/Users/UserProfile.km.resx | 150 + .../Pages/Identity/Users/UserProfile.nl.resx | 153 + .../Pages/Identity/Users/UserProfile.ru.resx | 153 + .../Pages/Identity/Users/UserProfile.sv.resx | 153 + .../Pages/Identity/Users/UserRoles.ar.resx | 147 + .../Pages/Identity/Users/UserRoles.de.resx | 147 + .../Pages/Identity/Users/UserRoles.en.resx | 147 + .../Pages/Identity/Users/UserRoles.es.resx | 150 + .../Pages/Identity/Users/UserRoles.fr.resx | 147 + .../Pages/Identity/Users/UserRoles.id.resx | 135 + .../Pages/Identity/Users/UserRoles.it.resx | 135 + .../Pages/Identity/Users/UserRoles.km.resx | 135 + .../Pages/Identity/Users/UserRoles.nl.resx | 147 + .../Pages/Identity/Users/UserRoles.ru.resx | 147 + .../Pages/Identity/Users/UserRoles.sv.resx | 135 + .../Pages/Identity/Users/Users.ar.resx | 192 + .../Pages/Identity/Users/Users.de.resx | 198 + .../Pages/Identity/Users/Users.en.resx | 198 + .../Pages/Identity/Users/Users.es.resx | 192 + .../Pages/Identity/Users/Users.fr.resx | 174 + .../Pages/Identity/Users/Users.id.resx | 177 + .../Pages/Identity/Users/Users.it.resx | 195 + .../Pages/Identity/Users/Users.km.resx | 174 + .../Pages/Identity/Users/Users.nl.resx | 192 + .../Pages/Identity/Users/Users.ru.resx | 192 + .../Pages/Identity/Users/Users.sv.resx | 177 + .../src/Client/Resources/Pages/Index.de.resx | 141 + .../src/Client/Resources/Pages/Index.en.resx | 141 + .../src/Client/Resources/Pages/Index.it.resx | 141 + .../Pages/Misc/AddEditDocumentModal.ar.resx | 156 + .../Pages/Misc/AddEditDocumentModal.de.resx | 156 + .../Pages/Misc/AddEditDocumentModal.en.resx | 156 + .../Pages/Misc/AddEditDocumentModal.es.resx | 156 + .../Pages/Misc/AddEditDocumentModal.fr.resx | 156 + .../Pages/Misc/AddEditDocumentModal.id.resx | 156 + .../Pages/Misc/AddEditDocumentModal.it.resx | 156 + .../Pages/Misc/AddEditDocumentModal.km.resx | 156 + .../Pages/Misc/AddEditDocumentModal.nl.resx | 156 + .../Pages/Misc/AddEditDocumentModal.ru.resx | 156 + .../Pages/Misc/AddEditDocumentModal.sv.resx | 156 + .../Misc/AddEditDocumentTypeModal.ar.resx | 144 + .../Misc/AddEditDocumentTypeModal.de.resx | 144 + .../Misc/AddEditDocumentTypeModal.en.resx | 144 + .../Misc/AddEditDocumentTypeModal.es.resx | 144 + .../Misc/AddEditDocumentTypeModal.fr.resx | 144 + .../Misc/AddEditDocumentTypeModal.km.resx | 144 + .../Misc/AddEditDocumentTypeModal.nl.resx | 144 + .../Misc/AddEditDocumentTypeModal.ru.resx | 144 + .../Pages/Misc/DocumentStore.ar.resx | 189 + .../Pages/Misc/DocumentStore.de.resx | 189 + .../Pages/Misc/DocumentStore.en.resx | 189 + .../Pages/Misc/DocumentStore.es.resx | 189 + .../Pages/Misc/DocumentStore.fr.resx | 189 + .../Pages/Misc/DocumentStore.id.resx | 180 + .../Pages/Misc/DocumentStore.it.resx | 180 + .../Pages/Misc/DocumentStore.km.resx | 180 + .../Pages/Misc/DocumentStore.nl.resx | 189 + .../Pages/Misc/DocumentStore.ru.resx | 189 + .../Pages/Misc/DocumentStore.sv.resx | 180 + .../Pages/Misc/DocumentTypes.ar.resx | 177 + .../Pages/Misc/DocumentTypes.de.resx | 177 + .../Pages/Misc/DocumentTypes.en.resx | 177 + .../Pages/Misc/DocumentTypes.es.resx | 177 + .../Pages/Misc/DocumentTypes.fr.resx | 177 + .../Pages/Misc/DocumentTypes.km.resx | 177 + .../Pages/Misc/DocumentTypes.nl.resx | 177 + .../Pages/Misc/DocumentTypes.ru.resx | 177 + .../Pages/Multitenancy/Tenants.de.resx | 132 + .../Pages/Multitenancy/Tenants.en.resx | 132 + .../Pages/Multitenancy/Tenants.it.resx | 132 + .../UpgradeSubscriptionModal.de.resx | 138 + .../UpgradeSubscriptionModal.en.resx | 138 + .../UpgradeSubscriptionModal.it.resx | 138 + .../Pages/Personal/AuditLogs.ar.resx | 207 + .../Pages/Personal/AuditLogs.de.resx | 207 + .../Pages/Personal/AuditLogs.en.resx | 207 + .../Pages/Personal/AuditLogs.es.resx | 207 + .../Pages/Personal/AuditLogs.fr.resx | 207 + .../Pages/Personal/AuditLogs.it.resx | 180 + .../Pages/Personal/AuditLogs.km.resx | 180 + .../Pages/Personal/AuditLogs.nl.resx | 207 + .../Pages/Personal/AuditLogs.ru.resx | 207 + .../Pages/Personal/AuditLogs.sv.resx | 180 + .../Pages/Personal/Dashboard.ar.resx | 189 + .../Pages/Personal/Dashboard.de.resx | 189 + .../Pages/Personal/Dashboard.en.resx | 189 + .../Pages/Personal/Dashboard.es.resx | 189 + .../Pages/Personal/Dashboard.fr.resx | 186 + .../Pages/Personal/Dashboard.id.resx | 150 + .../Pages/Personal/Dashboard.it.resx | 153 + .../Pages/Personal/Dashboard.km.resx | 150 + .../Pages/Personal/Dashboard.nl.resx | 189 + .../Pages/Personal/Dashboard.ru.resx | 189 + .../Pages/Personal/Dashboard.sv.resx | 150 + ...ExtendedAttributeModalLocalization.ar.resx | 180 + ...ExtendedAttributeModalLocalization.de.resx | 180 + ...ExtendedAttributeModalLocalization.en.resx | 180 + ...ExtendedAttributeModalLocalization.es.resx | 180 + ...ExtendedAttributeModalLocalization.fr.resx | 180 + ...ExtendedAttributeModalLocalization.id.resx | 180 + ...ExtendedAttributeModalLocalization.it.resx | 180 + ...ExtendedAttributeModalLocalization.km.resx | 180 + ...ExtendedAttributeModalLocalization.nl.resx | 180 + ...ExtendedAttributeModalLocalization.ru.resx | 180 + ...ExtendedAttributeModalLocalization.sv.resx | 180 + .../ExtendedAttributesLocalization.ar.resx | 213 + .../ExtendedAttributesLocalization.de.resx | 213 + .../ExtendedAttributesLocalization.en.resx | 213 + .../ExtendedAttributesLocalization.es.resx | 213 + .../ExtendedAttributesLocalization.fr.resx | 213 + .../ExtendedAttributesLocalization.id.resx | 213 + .../ExtendedAttributesLocalization.it.resx | 213 + .../ExtendedAttributesLocalization.km.resx | 213 + .../ExtendedAttributesLocalization.nl.resx | 213 + .../ExtendedAttributesLocalization.ru.resx | 213 + .../ExtendedAttributesLocalization.sv.resx | 213 + .../Components/ImportExcelModal.ar.resx | 132 + .../Components/ImportExcelModal.de.resx | 132 + .../Components/ImportExcelModal.en.resx | 132 + .../Components/ImportExcelModal.es.resx | 132 + .../Components/ImportExcelModal.fr.resx | 132 + .../Components/ImportExcelModal.id.resx | 132 + .../Components/ImportExcelModal.it.resx | 132 + .../Components/ImportExcelModal.km.resx | 132 + .../Components/ImportExcelModal.nl.resx | 132 + .../Components/ImportExcelModal.ru.resx | 132 + .../Components/ImportExcelModal.sv.resx | 132 + .../Components/LanguageSelector.ar.resx | 153 + .../Components/LanguageSelector.de.resx | 153 + .../Components/LanguageSelector.en.resx | 153 + .../Components/LanguageSelector.es.resx | 153 + .../Components/LanguageSelector.fr.resx | 153 + .../Components/LanguageSelector.id.resx | 153 + .../Components/LanguageSelector.it.resx | 153 + .../Components/LanguageSelector.nl.resx | 153 + .../Components/LanguageSelector.ru.resx | 153 + .../Shared/Dialogs/DeleteConfirmation.en.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.es.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.fr.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.id.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.it.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.km.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.nl.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.ru.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.sv.resx | 129 + .../Resources/Shared/Dialogs/Logout.en.resx | 126 + .../Resources/Shared/Dialogs/Logout.es.resx | 126 + .../Resources/Shared/Dialogs/Logout.fr.resx | 126 + .../Resources/Shared/Dialogs/Logout.id.resx | 126 + .../Resources/Shared/Dialogs/Logout.it.resx | 126 + .../Resources/Shared/Dialogs/Logout.km.resx | 126 + .../Resources/Shared/Dialogs/Logout.nl.resx | 126 + .../Resources/Shared/Dialogs/Logout.ru.resx | 126 + .../Resources/Shared/Dialogs/Logout.sv.resx | 126 + ...217\342\200\217DeleteConfirmation.ar.resx" | 129 + .../\342\200\217\342\200\217Logout.ar.resx" | 126 + .../Resources/Shared/MainLayout.de.resx | 180 + .../Resources/Shared/MainLayout.en.resx | 180 + .../Resources/Shared/MainLayout.es.resx | 177 + .../Resources/Shared/MainLayout.fr.resx | 180 + .../Resources/Shared/MainLayout.id.resx | 180 + .../Resources/Shared/MainLayout.it.resx | 180 + .../Resources/Shared/MainLayout.km.resx | 177 + .../Resources/Shared/MainLayout.nl.resx | 180 + .../Resources/Shared/MainLayout.ru.resx | 180 + .../Resources/Shared/MainLayout.sv.resx | 180 + .../Client/Resources/Shared/NavMenu.de.resx | 186 + .../Client/Resources/Shared/NavMenu.en.resx | 186 + .../Client/Resources/Shared/NavMenu.es.resx | 186 + .../Client/Resources/Shared/NavMenu.fr.resx | 186 + .../Client/Resources/Shared/NavMenu.id.resx | 186 + .../Client/Resources/Shared/NavMenu.it.resx | 186 + .../Client/Resources/Shared/NavMenu.km.resx | 165 + .../Client/Resources/Shared/NavMenu.nl.resx | 186 + .../Client/Resources/Shared/NavMenu.ru.resx | 186 + .../Client/Resources/Shared/NavMenu.sv.resx | 186 + .../Resources/Shared/NotFoundLayout.de.resx | 126 + .../Resources/Shared/NotFoundLayout.en.resx | 126 + .../Resources/Shared/NotFoundLayout.es.resx | 126 + .../Resources/Shared/NotFoundLayout.fr.resx | 126 + .../Resources/Shared/NotFoundLayout.id.resx | 126 + .../Resources/Shared/NotFoundLayout.it.resx | 126 + .../Resources/Shared/NotFoundLayout.km.resx | 126 + .../Resources/Shared/NotFoundLayout.nl.resx | 126 + .../Resources/Shared/NotFoundLayout.ru.resx | 126 + .../Resources/Shared/NotFoundLayout.sv.resx | 126 + .../Resources/Shared/SharedResource.de.resx | 156 + .../Resources/Shared/SharedResource.en.resx | 156 + .../Resources/Shared/SharedResource.it.resx | 156 + ...342\200\217\342\200\217MainLayout.ar.resx" | 180 + .../\342\200\217\342\200\217NavMenu.ar.resx" | 186 + ...200\217\342\200\217NotFoundLayout.ar.resx" | 126 + .../src/Client/Shared/ApiHelper.cs | 86 + .../src/Client/Shared/BaseLayout.razor | 33 + .../src/Client/Shared/BaseLayout.razor.cs | 49 + .../Client/Shared/DialogServiceExtensions.cs | 19 + .../src/Client/Shared/MainLayout.razor | 107 + .../src/Client/Shared/MainLayout.razor.cs | 63 + .../src/Client/Shared/NavMenu.razor | 55 + .../src/Client/Shared/NavMenu.razor.cs | 39 + .../src/Client/Shared/NotFound.razor | 56 + .../src/Client/Shared/SharedResource.cs | 5 + .../src/Client/_Imports.razor | 42 + .../wwwroot/appsettings.Development.json | 1 + .../src/Client/wwwroot/appsettings.json | 10 + .../src/Client/wwwroot/css/fsh.css | 72 + .../src/Client/wwwroot/favicon.ico | Bin 0 -> 18409 bytes .../Client/wwwroot/full-stack-hero-logo.png | Bin 0 -> 160036 bytes .../src/Client/wwwroot/index.html | 110 + .../src/Client/wwwroot/manifest.json | 21 + .../src/Client/wwwroot/service-worker.js | 4 + .../wwwroot/service-worker.published.js | 48 + .../src/Host/Host.csproj | 24 + .../src/Host/Pages/Error.cshtml | 44 + .../src/Host/Pages/Error.cshtml.cs | 19 + .../src/Host/Program.cs | 26 + .../src/Host/Properties/launchSettings.json | 30 + .../src/Host/appsettings.Development.json | 8 + .../src/Host/appsettings.json | 9 + .../ClaimsPrincipalExtensions.cs | 39 + .../src/Shared/Authorization/FSHClaims.cs | 11 + .../Shared/Authorization/FSHPermissions.cs | 80 + .../src/Shared/Authorization/FSHRoles.cs | 17 + .../src/Shared/Events/IEvent.cs | 5 + .../MultiTenancy/MultitenancyConstants.cs | 15 + .../Shared/Notifications/BasicNotification.cs | 15 + .../Notifications/INotificationMessage.cs | 5 + .../Shared/Notifications/JobNotification.cs | 8 + .../Notifications/NotificationConstants.cs | 6 + .../Notifications/StatsChangedNotification.cs | 5 + .../src/Shared/Shared.csproj | 7 + blazor-wasm-boilerplate-main/stylecop.json | 12 + dotnet.ruleset | 164 + global.json | 7 + icon.png | Bin 0 -> 153939 bytes scripts/nswag-regen.ps1 | 20 + scripts/pull-shared-from-webapi.ps1 | 40 + src/Client.Infrastructure/ApiClient/FSHApi.cs | 6849 +++++++++++++++++ .../ApiClient/IApiService.cs | 5 + .../ApiClient/nswag.json | 100 + .../Auth/AuthProvider.cs | 7 + .../Auth/AuthorizationServiceExtensions.cs | 10 + .../AzureAd/AzureAdAuthenticationService.cs | 34 + .../AzureAdAuthorizationMessageHandler.cs | 12 + .../AzureAd/AzureAdClaimsPrincipalFactory.cs | 73 + .../Auth/IAuthenticationService.cs | 16 + .../Auth/Jwt/AccessTokenProviderAccessor.cs | 17 + .../Jwt/JwtAuthenticationHeaderHandler.cs | 34 + .../Auth/Jwt/JwtAuthenticationService.cs | 222 + .../Auth/MustHavePermissionAttribute.cs | 10 + src/Client.Infrastructure/Auth/Startup.cs | 47 + .../Client.Infrastructure.csproj | 39 + .../Common/AccessTokenProviderExtensions.cs | 12 + .../Common/ApplicationConstants.cs | 15 + .../Common/ConfigNames.cs | 7 + .../Common/IAppService.cs | 5 + .../Common/LocalizationConstants.cs | 21 + .../Common/StorageConstants.cs | 14 + src/Client.Infrastructure/GlobalUsings.cs | 7 + .../Notifications/ConnectionState.cs | 8 + .../Notifications/ConnectionStateChanged.cs | 5 + .../Notifications/INotificationPublisher.cs | 8 + .../Notifications/NotificationPublisher.cs | 24 + .../Notifications/NotificationWrapper.cs | 12 + .../Notifications/Startup.cs | 34 + .../Preferences/ClientPreference.cs | 15 + .../Preferences/ClientPreferenceManager.cs | 137 + .../Preferences/FshTablePreference.cs | 11 + .../Preferences/IClientPreferenceManager.cs | 14 + .../Preferences/IPreference.cs | 6 + .../Preferences/IPreferenceManager.cs | 10 + src/Client.Infrastructure/Startup.cs | 81 + .../Theme/CustomColors.cs | 42 + .../Theme/CustomTypography.cs | 114 + src/Client.Infrastructure/Theme/DarkTheme.cs | 44 + src/Client.Infrastructure/Theme/LightTheme.cs | 31 + src/Client/App.razor | 23 + src/Client/Client.csproj | 35 + .../Components/Common/CustomValidation.cs | 51 + .../Components/Common/ErrorHandler.razor | 2 + .../Components/Common/ErrorHandler.razor.cs | 31 + .../Components/Common/FshCustomError.razor | 1 + src/Client/Components/Common/FshTable.cs | 39 + src/Client/Components/Common/FshTitle.razor | 8 + src/Client/Components/Common/PersonCard.razor | 19 + .../Components/Common/PersonCard.razor.cs | 46 + src/Client/Components/Common/TablePager.razor | 3 + .../Dialogs/DeleteConfirmation.razor | 31 + src/Client/Components/Dialogs/Logout.razor | 40 + .../Components/EntityTable/AddEditModal.razor | 51 + .../EntityTable/AddEditModal.razor.cs | 49 + .../EntityTable/EntityClientTableContext.cs | 67 + .../Components/EntityTable/EntityField.cs | 35 + .../EntityTable/EntityServerTableContext.cs | 73 + .../Components/EntityTable/EntityTable.razor | 158 + .../EntityTable/EntityTable.razor.cs | 321 + .../EntityTable/EntityTableContext.cs | 197 + .../Components/EntityTable/IAddEditModal.cs | 8 + .../EntityTable/PaginationResponse.cs | 9 + .../Localization/LanguageSelector.razor | 41 + .../NotificationConnection.razor | 3 + .../NotificationConnection.razor.cs | 153 + .../NotificationConnectionStatus.razor | 49 + .../Components/ThemeManager/ColorPanel.razor | 27 + .../ThemeManager/ColorPanel.razor.cs | 24 + .../ThemeManager/DarkModePanel.razor | 17 + .../ThemeManager/DarkModePanel.razor.cs | 24 + .../Components/ThemeManager/RadiusPanel.razor | 15 + .../ThemeManager/RadiusPanel.razor.cs | 28 + .../TableCustomizationPanel.razor | 19 + .../TableCustomizationPanel.razor.cs | 74 + .../Components/ThemeManager/ThemeButton.razor | 16 + .../ThemeManager/ThemeButton.razor.cs | 10 + .../Components/ThemeManager/ThemeDrawer.razor | 28 + .../ThemeManager/ThemeDrawer.razor.cs | 96 + .../Pages/Authentication/Authentication.razor | 74 + .../Pages/Authentication/ForgotPassword.razor | 45 + .../Authentication/ForgotPassword.razor.cs | 31 + src/Client/Pages/Authentication/Login.razor | 47 + .../Pages/Authentication/Login.razor.cs | 81 + .../Pages/Authentication/SelfRegister.razor | 74 + .../Authentication/SelfRegister.razor.cs | 58 + src/Client/Pages/Catalog/BrandAutocomplete.cs | 68 + src/Client/Pages/Catalog/Brands.razor | 52 + src/Client/Pages/Catalog/Products.razor | 78 + src/Client/Pages/Catalog/Products.razor.cs | 159 + .../Pages/Identity/Account/Account.razor | 33 + .../Pages/Identity/Account/Profile.razor | 84 + .../Pages/Identity/Account/Profile.razor.cs | 101 + .../Pages/Identity/Account/Security.razor | 41 + .../Pages/Identity/Account/Security.razor.cs | 72 + .../Identity/Roles/RolePermissions.razor | 75 + .../Identity/Roles/RolePermissions.razor.cs | 114 + src/Client/Pages/Identity/Roles/Roles.razor | 33 + .../Pages/Identity/Roles/Roles.razor.cs | 60 + .../Pages/Identity/Users/UserProfile.razor | 148 + .../Pages/Identity/Users/UserProfile.razor.cs | 74 + .../Pages/Identity/Users/UserRoles.razor | 67 + .../Pages/Identity/Users/UserRoles.razor.cs | 77 + src/Client/Pages/Identity/Users/Users.razor | 46 + .../Pages/Identity/Users/Users.razor.cs | 95 + src/Client/Pages/Index.razor | 95 + src/Client/Pages/Multitenancy/Tenants.razor | 107 + .../Pages/Multitenancy/Tenants.razor.cs | 121 + .../UpgradeSubscriptionModal.razor | 58 + src/Client/Pages/Personal/AuditLogs.razor | 131 + src/Client/Pages/Personal/AuditLogs.razor.cs | 71 + src/Client/Pages/Personal/Dashboard.razor | 65 + src/Client/Pages/Personal/Dashboard.razor.cs | 62 + src/Client/Program.cs | 30 + src/Client/Properties/launchSettings.json | 30 + .../Components/Common/TablePager.ar.resx | 126 + .../Components/Common/TablePager.de.resx | 126 + .../Components/Common/TablePager.en.resx | 126 + .../Components/Common/TablePager.es.resx | 126 + .../Components/Common/TablePager.fr.resx | 126 + .../Components/Common/TablePager.id.resx | 126 + .../Components/Common/TablePager.it.resx | 126 + .../Components/Common/TablePager.km.resx | 126 + .../Components/Common/TablePager.nl.resx | 126 + .../Components/Common/TablePager.ru.resx | 126 + .../Components/Common/TablePager.sv.resx | 126 + .../Resources/Pages/Account/Register.ar.resx | 147 + .../Resources/Pages/Account/Register.de.resx | 147 + .../Resources/Pages/Account/Register.en.resx | 147 + .../Resources/Pages/Account/Register.es.resx | 147 + .../Resources/Pages/Account/Register.fr.resx | 147 + .../Resources/Pages/Account/Register.id.resx | 147 + .../Resources/Pages/Account/Register.it.resx | 144 + .../Resources/Pages/Account/Register.km.resx | 147 + .../Resources/Pages/Account/Register.nl.resx | 147 + .../Resources/Pages/Account/Register.ru.resx | 147 + .../Resources/Pages/Account/Register.sv.resx | 147 + .../Resources/Pages/Account/Reset.ar.resx | 132 + .../Resources/Pages/Account/Reset.de.resx | 132 + .../Resources/Pages/Account/Reset.en.resx | 132 + .../Resources/Pages/Account/Reset.es.resx | 129 + .../Resources/Pages/Account/Reset.fr.resx | 132 + .../Resources/Pages/Account/Reset.id.resx | 132 + .../Resources/Pages/Account/Reset.it.resx | 132 + .../Resources/Pages/Account/Reset.km.resx | 129 + .../Resources/Pages/Account/Reset.nl.resx | 132 + .../Resources/Pages/Account/Reset.ru.resx | 132 + .../Resources/Pages/Account/Reset.sv.resx | 132 + .../Authentication/Authentication.ar.resx | 147 + .../Authentication/Authentication.de.resx | 147 + .../Authentication/Authentication.en.resx | 147 + .../Authentication/Authentication.es.resx | 147 + .../Authentication/Authentication.fr.resx | 147 + .../Authentication/Authentication.id.resx | 147 + .../Authentication/Authentication.it.resx | 147 + .../Authentication/Authentication.km.resx | 147 + .../Authentication/Authentication.nl.resx | 147 + .../Authentication/Authentication.ru.resx | 147 + .../Authentication/Authentication.sv.resx | 147 + .../Authentication/ForgotPassword.ar.resx | 135 + .../Authentication/ForgotPassword.de.resx | 135 + .../Authentication/ForgotPassword.en.resx | 135 + .../Authentication/ForgotPassword.es.resx | 132 + .../Authentication/ForgotPassword.fr.resx | 135 + .../Authentication/ForgotPassword.id.resx | 135 + .../Authentication/ForgotPassword.it.resx | 138 + .../Authentication/ForgotPassword.km.resx | 132 + .../Authentication/ForgotPassword.nl.resx | 135 + .../Authentication/ForgotPassword.ru.resx | 135 + .../Authentication/ForgotPassword.sv.resx | 135 + .../Pages/Authentication/Login.ar.resx | 159 + .../Pages/Authentication/Login.de.resx | 162 + .../Pages/Authentication/Login.en.resx | 162 + .../Pages/Authentication/Login.es.resx | 159 + .../Pages/Authentication/Login.fr.resx | 147 + .../Pages/Authentication/Login.id.resx | 159 + .../Pages/Authentication/Login.it.resx | 156 + .../Pages/Authentication/Login.km.resx | 147 + .../Pages/Authentication/Login.nl.resx | 156 + .../Pages/Authentication/Login.ru.resx | 159 + .../Pages/Authentication/Login.sv.resx | 159 + .../Pages/Authentication/Register.ar.resx | 150 + .../Pages/Authentication/Register.de.resx | 150 + .../Pages/Authentication/Register.en.resx | 150 + .../Pages/Authentication/Register.es.resx | 150 + .../Pages/Authentication/Register.fr.resx | 150 + .../Pages/Authentication/Register.id.resx | 150 + .../Pages/Authentication/Register.it.resx | 150 + .../Pages/Authentication/Register.km.resx | 150 + .../Pages/Authentication/Register.nl.resx | 150 + .../Pages/Authentication/Register.ru.resx | 150 + .../Pages/Authentication/Register.sv.resx | 150 + .../Pages/Catalog/AddEditBrandModal.ar.resx | 153 + .../Pages/Catalog/AddEditBrandModal.de.resx | 153 + .../Pages/Catalog/AddEditBrandModal.en.resx | 153 + .../Pages/Catalog/AddEditBrandModal.es.resx | 153 + .../Pages/Catalog/AddEditBrandModal.fr.resx | 153 + .../Pages/Catalog/AddEditBrandModal.id.resx | 153 + .../Pages/Catalog/AddEditBrandModal.it.resx | 133 + .../Pages/Catalog/AddEditBrandModal.km.resx | 153 + .../Pages/Catalog/AddEditBrandModal.nl.resx | 153 + .../Pages/Catalog/AddEditBrandModal.ru.resx | 153 + .../Pages/Catalog/AddEditProductModal.ar.resx | 168 + .../Pages/Catalog/AddEditProductModal.de.resx | 168 + .../Pages/Catalog/AddEditProductModal.en.resx | 168 + .../Pages/Catalog/AddEditProductModal.es.resx | 168 + .../Pages/Catalog/AddEditProductModal.fr.resx | 168 + .../Pages/Catalog/AddEditProductModal.id.resx | 168 + .../Pages/Catalog/AddEditProductModal.it.resx | 168 + .../Pages/Catalog/AddEditProductModal.km.resx | 168 + .../Pages/Catalog/AddEditProductModal.nl.resx | 168 + .../Pages/Catalog/AddEditProductModal.ru.resx | 168 + .../Pages/Catalog/AddEditProductModal.sv.resx | 168 + .../Resources/Pages/Catalog/Brands.ar.resx | 186 + .../Resources/Pages/Catalog/Brands.de.resx | 186 + .../Resources/Pages/Catalog/Brands.en.resx | 186 + .../Resources/Pages/Catalog/Brands.es.resx | 186 + .../Resources/Pages/Catalog/Brands.fr.resx | 186 + .../Resources/Pages/Catalog/Brands.id.resx | 177 + .../Resources/Pages/Catalog/Brands.it.resx | 177 + .../Resources/Pages/Catalog/Brands.km.resx | 174 + .../Resources/Pages/Catalog/Brands.nl.resx | 186 + .../Resources/Pages/Catalog/Brands.ru.resx | 186 + .../Resources/Pages/Catalog/Brands.sv.resx | 177 + .../Resources/Pages/Catalog/Products.ar.resx | 186 + .../Resources/Pages/Catalog/Products.de.resx | 192 + .../Resources/Pages/Catalog/Products.en.resx | 192 + .../Resources/Pages/Catalog/Products.es.resx | 186 + .../Resources/Pages/Catalog/Products.fr.resx | 186 + .../Resources/Pages/Catalog/Products.id.resx | 177 + .../Resources/Pages/Catalog/Products.it.resx | 180 + .../Resources/Pages/Catalog/Products.km.resx | 168 + .../Resources/Pages/Catalog/Products.nl.resx | 186 + .../Resources/Pages/Catalog/Products.ru.resx | 186 + .../Resources/Pages/Catalog/Products.sv.resx | 177 + .../Pages/Communication/Chat.ar.resx | 147 + .../Pages/Communication/Chat.de.resx | 147 + .../Pages/Communication/Chat.en.resx | 147 + .../Pages/Communication/Chat.es.resx | 147 + .../Pages/Communication/Chat.fr.resx | 147 + .../Pages/Communication/Chat.id.resx | 147 + .../Pages/Communication/Chat.it.resx | 147 + .../Pages/Communication/Chat.km.resx | 147 + .../Pages/Communication/Chat.nl.resx | 147 + .../Pages/Communication/Chat.ru.resx | 147 + .../Pages/Communication/Chat.sv.resx | 147 + .../Resources/Pages/Content/Home.ar.resx | 192 + .../Resources/Pages/Content/Home.de.resx | 192 + .../Resources/Pages/Content/Home.en.resx | 192 + .../Resources/Pages/Content/Home.es.resx | 192 + .../Resources/Pages/Content/Home.fr.resx | 192 + .../Resources/Pages/Content/Home.id.resx | 198 + .../Resources/Pages/Content/Home.it.resx | 195 + .../Resources/Pages/Content/Home.km.resx | 192 + .../Resources/Pages/Content/Home.nl.resx | 192 + .../Resources/Pages/Content/Home.ru.resx | 192 + .../Resources/Pages/Content/Home.sv.resx | 192 + .../Resources/Pages/Content/Resources.ar.resx | 132 + .../Resources/Pages/Content/Resources.de.resx | 132 + .../Resources/Pages/Content/Resources.en.resx | 132 + .../Resources/Pages/Content/Resources.es.resx | 132 + .../Resources/Pages/Content/Resources.fr.resx | 132 + .../Resources/Pages/Content/Resources.id.resx | 132 + .../Resources/Pages/Content/Resources.it.resx | 132 + .../Resources/Pages/Content/Resources.km.resx | 132 + .../Resources/Pages/Content/Resources.nl.resx | 132 + .../Resources/Pages/Content/Resources.ru.resx | 132 + .../Resources/Pages/Content/Resources.sv.resx | 132 + .../Pages/Identity/Account/Account.ar.resx | 132 + .../Pages/Identity/Account/Account.de.resx | 132 + .../Pages/Identity/Account/Account.en.resx | 132 + .../Pages/Identity/Account/Account.es.resx | 132 + .../Pages/Identity/Account/Account.fr.resx | 132 + .../Pages/Identity/Account/Account.id.resx | 132 + .../Pages/Identity/Account/Account.it.resx | 132 + .../Pages/Identity/Account/Account.km.resx | 132 + .../Pages/Identity/Account/Account.nl.resx | 132 + .../Pages/Identity/Account/Account.ru.resx | 132 + .../Pages/Identity/Account/Account.sv.resx | 132 + .../Pages/Identity/Account/Profile.ar.resx | 162 + .../Pages/Identity/Account/Profile.de.resx | 162 + .../Pages/Identity/Account/Profile.en.resx | 162 + .../Pages/Identity/Account/Profile.es.resx | 162 + .../Pages/Identity/Account/Profile.fr.resx | 162 + .../Pages/Identity/Account/Profile.id.resx | 162 + .../Pages/Identity/Account/Profile.it.resx | 162 + .../Pages/Identity/Account/Profile.km.resx | 162 + .../Pages/Identity/Account/Profile.nl.resx | 162 + .../Pages/Identity/Account/Profile.ru.resx | 159 + .../Pages/Identity/Account/Profile.sv.resx | 162 + .../Pages/Identity/Account/Security.ar.resx | 159 + .../Pages/Identity/Account/Security.de.resx | 159 + .../Pages/Identity/Account/Security.en.resx | 159 + .../Pages/Identity/Account/Security.es.resx | 132 + .../Pages/Identity/Account/Security.fr.resx | 159 + .../Pages/Identity/Account/Security.id.resx | 138 + .../Pages/Identity/Account/Security.it.resx | 138 + .../Pages/Identity/Account/Security.km.resx | 132 + .../Pages/Identity/Account/Security.nl.resx | 159 + .../Pages/Identity/Account/Security.ru.resx | 138 + .../Pages/Identity/Account/Security.sv.resx | 138 + .../Pages/Identity/RegisterUserModal.ar.resx | 171 + .../Pages/Identity/RegisterUserModal.de.resx | 171 + .../Pages/Identity/RegisterUserModal.en.resx | 171 + .../Pages/Identity/RegisterUserModal.es.resx | 171 + .../Pages/Identity/RegisterUserModal.fr.resx | 171 + .../Pages/Identity/RegisterUserModal.id.resx | 171 + .../Pages/Identity/RegisterUserModal.it.resx | 148 + .../Pages/Identity/RegisterUserModal.km.resx | 171 + .../Pages/Identity/RegisterUserModal.nl.resx | 171 + .../Pages/Identity/RegisterUserModal.ru.resx | 171 + .../Pages/Identity/RegisterUserModal.sv.resx | 171 + .../Resources/Pages/Identity/Reset.ar.resx | 138 + .../Resources/Pages/Identity/Reset.de.resx | 138 + .../Resources/Pages/Identity/Reset.en.resx | 138 + .../Resources/Pages/Identity/Reset.es.resx | 138 + .../Resources/Pages/Identity/Reset.fr.resx | 138 + .../Resources/Pages/Identity/Reset.id.resx | 138 + .../Resources/Pages/Identity/Reset.it.resx | 138 + .../Resources/Pages/Identity/Reset.km.resx | 138 + .../Resources/Pages/Identity/Reset.nl.resx | 138 + .../Resources/Pages/Identity/Reset.ru.resx | 138 + .../Resources/Pages/Identity/Reset.sv.resx | 138 + .../Pages/Identity/RoleModal.ar.resx | 141 + .../Pages/Identity/RoleModal.de.resx | 141 + .../Pages/Identity/RoleModal.en.resx | 141 + .../Pages/Identity/RoleModal.es.resx | 141 + .../Pages/Identity/RoleModal.fr.resx | 141 + .../Pages/Identity/RoleModal.id.resx | 144 + .../Pages/Identity/RoleModal.it.resx | 141 + .../Pages/Identity/RoleModal.km.resx | 141 + .../Pages/Identity/RoleModal.nl.resx | 141 + .../Pages/Identity/RoleModal.ru.resx | 141 + .../Pages/Identity/RoleModal.sv.resx | 141 + .../Identity/Roles/RolePermissions.ar.resx | 165 + .../Identity/Roles/RolePermissions.de.resx | 165 + .../Identity/Roles/RolePermissions.en.resx | 165 + .../Identity/Roles/RolePermissions.es.resx | 165 + .../Identity/Roles/RolePermissions.fr.resx | 165 + .../Identity/Roles/RolePermissions.id.resx | 153 + .../Identity/Roles/RolePermissions.it.resx | 156 + .../Identity/Roles/RolePermissions.km.resx | 153 + .../Identity/Roles/RolePermissions.nl.resx | 165 + .../Identity/Roles/RolePermissions.ru.resx | 165 + .../Identity/Roles/RolePermissions.sv.resx | 153 + .../Pages/Identity/Roles/Roles.ar.resx | 171 + .../Pages/Identity/Roles/Roles.de.resx | 171 + .../Pages/Identity/Roles/Roles.en.resx | 171 + .../Pages/Identity/Roles/Roles.es.resx | 171 + .../Pages/Identity/Roles/Roles.fr.resx | 171 + .../Pages/Identity/Roles/Roles.id.resx | 162 + .../Pages/Identity/Roles/Roles.it.resx | 162 + .../Pages/Identity/Roles/Roles.km.resx | 156 + .../Pages/Identity/Roles/Roles.nl.resx | 171 + .../Pages/Identity/Roles/Roles.ru.resx | 171 + .../Pages/Identity/Roles/Roles.sv.resx | 162 + .../Pages/Identity/Users/UserProfile.ar.resx | 153 + .../Pages/Identity/Users/UserProfile.de.resx | 153 + .../Pages/Identity/Users/UserProfile.en.resx | 153 + .../Pages/Identity/Users/UserProfile.es.resx | 150 + .../Pages/Identity/Users/UserProfile.fr.resx | 153 + .../Pages/Identity/Users/UserProfile.id.resx | 153 + .../Pages/Identity/Users/UserProfile.it.resx | 153 + .../Pages/Identity/Users/UserProfile.km.resx | 150 + .../Pages/Identity/Users/UserProfile.nl.resx | 153 + .../Pages/Identity/Users/UserProfile.ru.resx | 153 + .../Pages/Identity/Users/UserProfile.sv.resx | 153 + .../Pages/Identity/Users/UserRoles.ar.resx | 147 + .../Pages/Identity/Users/UserRoles.de.resx | 147 + .../Pages/Identity/Users/UserRoles.en.resx | 147 + .../Pages/Identity/Users/UserRoles.es.resx | 150 + .../Pages/Identity/Users/UserRoles.fr.resx | 147 + .../Pages/Identity/Users/UserRoles.id.resx | 135 + .../Pages/Identity/Users/UserRoles.it.resx | 135 + .../Pages/Identity/Users/UserRoles.km.resx | 135 + .../Pages/Identity/Users/UserRoles.nl.resx | 147 + .../Pages/Identity/Users/UserRoles.ru.resx | 147 + .../Pages/Identity/Users/UserRoles.sv.resx | 135 + .../Pages/Identity/Users/Users.ar.resx | 192 + .../Pages/Identity/Users/Users.de.resx | 198 + .../Pages/Identity/Users/Users.en.resx | 198 + .../Pages/Identity/Users/Users.es.resx | 192 + .../Pages/Identity/Users/Users.fr.resx | 174 + .../Pages/Identity/Users/Users.id.resx | 177 + .../Pages/Identity/Users/Users.it.resx | 195 + .../Pages/Identity/Users/Users.km.resx | 174 + .../Pages/Identity/Users/Users.nl.resx | 192 + .../Pages/Identity/Users/Users.ru.resx | 192 + .../Pages/Identity/Users/Users.sv.resx | 177 + src/Client/Resources/Pages/Index.de.resx | 141 + src/Client/Resources/Pages/Index.en.resx | 141 + src/Client/Resources/Pages/Index.it.resx | 141 + .../Pages/Misc/AddEditDocumentModal.ar.resx | 156 + .../Pages/Misc/AddEditDocumentModal.de.resx | 156 + .../Pages/Misc/AddEditDocumentModal.en.resx | 156 + .../Pages/Misc/AddEditDocumentModal.es.resx | 156 + .../Pages/Misc/AddEditDocumentModal.fr.resx | 156 + .../Pages/Misc/AddEditDocumentModal.id.resx | 156 + .../Pages/Misc/AddEditDocumentModal.it.resx | 156 + .../Pages/Misc/AddEditDocumentModal.km.resx | 156 + .../Pages/Misc/AddEditDocumentModal.nl.resx | 156 + .../Pages/Misc/AddEditDocumentModal.ru.resx | 156 + .../Pages/Misc/AddEditDocumentModal.sv.resx | 156 + .../Misc/AddEditDocumentTypeModal.ar.resx | 144 + .../Misc/AddEditDocumentTypeModal.de.resx | 144 + .../Misc/AddEditDocumentTypeModal.en.resx | 144 + .../Misc/AddEditDocumentTypeModal.es.resx | 144 + .../Misc/AddEditDocumentTypeModal.fr.resx | 144 + .../Misc/AddEditDocumentTypeModal.km.resx | 144 + .../Misc/AddEditDocumentTypeModal.nl.resx | 144 + .../Misc/AddEditDocumentTypeModal.ru.resx | 144 + .../Pages/Misc/DocumentStore.ar.resx | 189 + .../Pages/Misc/DocumentStore.de.resx | 189 + .../Pages/Misc/DocumentStore.en.resx | 189 + .../Pages/Misc/DocumentStore.es.resx | 189 + .../Pages/Misc/DocumentStore.fr.resx | 189 + .../Pages/Misc/DocumentStore.id.resx | 180 + .../Pages/Misc/DocumentStore.it.resx | 180 + .../Pages/Misc/DocumentStore.km.resx | 180 + .../Pages/Misc/DocumentStore.nl.resx | 189 + .../Pages/Misc/DocumentStore.ru.resx | 189 + .../Pages/Misc/DocumentStore.sv.resx | 180 + .../Pages/Misc/DocumentTypes.ar.resx | 177 + .../Pages/Misc/DocumentTypes.de.resx | 177 + .../Pages/Misc/DocumentTypes.en.resx | 177 + .../Pages/Misc/DocumentTypes.es.resx | 177 + .../Pages/Misc/DocumentTypes.fr.resx | 177 + .../Pages/Misc/DocumentTypes.km.resx | 177 + .../Pages/Misc/DocumentTypes.nl.resx | 177 + .../Pages/Misc/DocumentTypes.ru.resx | 177 + .../Pages/Multitenancy/Tenants.de.resx | 132 + .../Pages/Multitenancy/Tenants.en.resx | 132 + .../Pages/Multitenancy/Tenants.it.resx | 132 + .../UpgradeSubscriptionModal.de.resx | 138 + .../UpgradeSubscriptionModal.en.resx | 138 + .../UpgradeSubscriptionModal.it.resx | 138 + .../Pages/Personal/AuditLogs.ar.resx | 207 + .../Pages/Personal/AuditLogs.de.resx | 207 + .../Pages/Personal/AuditLogs.en.resx | 207 + .../Pages/Personal/AuditLogs.es.resx | 207 + .../Pages/Personal/AuditLogs.fr.resx | 207 + .../Pages/Personal/AuditLogs.it.resx | 180 + .../Pages/Personal/AuditLogs.km.resx | 180 + .../Pages/Personal/AuditLogs.nl.resx | 207 + .../Pages/Personal/AuditLogs.ru.resx | 207 + .../Pages/Personal/AuditLogs.sv.resx | 180 + .../Pages/Personal/Dashboard.ar.resx | 189 + .../Pages/Personal/Dashboard.de.resx | 189 + .../Pages/Personal/Dashboard.en.resx | 189 + .../Pages/Personal/Dashboard.es.resx | 189 + .../Pages/Personal/Dashboard.fr.resx | 186 + .../Pages/Personal/Dashboard.id.resx | 150 + .../Pages/Personal/Dashboard.it.resx | 153 + .../Pages/Personal/Dashboard.km.resx | 150 + .../Pages/Personal/Dashboard.nl.resx | 189 + .../Pages/Personal/Dashboard.ru.resx | 189 + .../Pages/Personal/Dashboard.sv.resx | 150 + ...ExtendedAttributeModalLocalization.ar.resx | 180 + ...ExtendedAttributeModalLocalization.de.resx | 180 + ...ExtendedAttributeModalLocalization.en.resx | 180 + ...ExtendedAttributeModalLocalization.es.resx | 180 + ...ExtendedAttributeModalLocalization.fr.resx | 180 + ...ExtendedAttributeModalLocalization.id.resx | 180 + ...ExtendedAttributeModalLocalization.it.resx | 180 + ...ExtendedAttributeModalLocalization.km.resx | 180 + ...ExtendedAttributeModalLocalization.nl.resx | 180 + ...ExtendedAttributeModalLocalization.ru.resx | 180 + ...ExtendedAttributeModalLocalization.sv.resx | 180 + .../ExtendedAttributesLocalization.ar.resx | 213 + .../ExtendedAttributesLocalization.de.resx | 213 + .../ExtendedAttributesLocalization.en.resx | 213 + .../ExtendedAttributesLocalization.es.resx | 213 + .../ExtendedAttributesLocalization.fr.resx | 213 + .../ExtendedAttributesLocalization.id.resx | 213 + .../ExtendedAttributesLocalization.it.resx | 213 + .../ExtendedAttributesLocalization.km.resx | 213 + .../ExtendedAttributesLocalization.nl.resx | 213 + .../ExtendedAttributesLocalization.ru.resx | 213 + .../ExtendedAttributesLocalization.sv.resx | 213 + .../Components/ImportExcelModal.ar.resx | 132 + .../Components/ImportExcelModal.de.resx | 132 + .../Components/ImportExcelModal.en.resx | 132 + .../Components/ImportExcelModal.es.resx | 132 + .../Components/ImportExcelModal.fr.resx | 132 + .../Components/ImportExcelModal.id.resx | 132 + .../Components/ImportExcelModal.it.resx | 132 + .../Components/ImportExcelModal.km.resx | 132 + .../Components/ImportExcelModal.nl.resx | 132 + .../Components/ImportExcelModal.ru.resx | 132 + .../Components/ImportExcelModal.sv.resx | 132 + .../Components/LanguageSelector.ar.resx | 153 + .../Components/LanguageSelector.de.resx | 153 + .../Components/LanguageSelector.en.resx | 153 + .../Components/LanguageSelector.es.resx | 153 + .../Components/LanguageSelector.fr.resx | 153 + .../Components/LanguageSelector.id.resx | 153 + .../Components/LanguageSelector.it.resx | 153 + .../Components/LanguageSelector.nl.resx | 153 + .../Components/LanguageSelector.ru.resx | 153 + .../Shared/Dialogs/DeleteConfirmation.en.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.es.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.fr.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.id.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.it.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.km.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.nl.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.ru.resx | 129 + .../Shared/Dialogs/DeleteConfirmation.sv.resx | 129 + .../Resources/Shared/Dialogs/Logout.en.resx | 126 + .../Resources/Shared/Dialogs/Logout.es.resx | 126 + .../Resources/Shared/Dialogs/Logout.fr.resx | 126 + .../Resources/Shared/Dialogs/Logout.id.resx | 126 + .../Resources/Shared/Dialogs/Logout.it.resx | 126 + .../Resources/Shared/Dialogs/Logout.km.resx | 126 + .../Resources/Shared/Dialogs/Logout.nl.resx | 126 + .../Resources/Shared/Dialogs/Logout.ru.resx | 126 + .../Resources/Shared/Dialogs/Logout.sv.resx | 126 + ...217\342\200\217DeleteConfirmation.ar.resx" | 129 + .../\342\200\217\342\200\217Logout.ar.resx" | 126 + .../Resources/Shared/MainLayout.de.resx | 180 + .../Resources/Shared/MainLayout.en.resx | 180 + .../Resources/Shared/MainLayout.es.resx | 177 + .../Resources/Shared/MainLayout.fr.resx | 180 + .../Resources/Shared/MainLayout.id.resx | 180 + .../Resources/Shared/MainLayout.it.resx | 180 + .../Resources/Shared/MainLayout.km.resx | 177 + .../Resources/Shared/MainLayout.nl.resx | 180 + .../Resources/Shared/MainLayout.ru.resx | 180 + .../Resources/Shared/MainLayout.sv.resx | 180 + src/Client/Resources/Shared/NavMenu.de.resx | 186 + src/Client/Resources/Shared/NavMenu.en.resx | 186 + src/Client/Resources/Shared/NavMenu.es.resx | 186 + src/Client/Resources/Shared/NavMenu.fr.resx | 186 + src/Client/Resources/Shared/NavMenu.id.resx | 186 + src/Client/Resources/Shared/NavMenu.it.resx | 186 + src/Client/Resources/Shared/NavMenu.km.resx | 165 + src/Client/Resources/Shared/NavMenu.nl.resx | 186 + src/Client/Resources/Shared/NavMenu.ru.resx | 186 + src/Client/Resources/Shared/NavMenu.sv.resx | 186 + .../Resources/Shared/NotFoundLayout.de.resx | 126 + .../Resources/Shared/NotFoundLayout.en.resx | 126 + .../Resources/Shared/NotFoundLayout.es.resx | 126 + .../Resources/Shared/NotFoundLayout.fr.resx | 126 + .../Resources/Shared/NotFoundLayout.id.resx | 126 + .../Resources/Shared/NotFoundLayout.it.resx | 126 + .../Resources/Shared/NotFoundLayout.km.resx | 126 + .../Resources/Shared/NotFoundLayout.nl.resx | 126 + .../Resources/Shared/NotFoundLayout.ru.resx | 126 + .../Resources/Shared/NotFoundLayout.sv.resx | 126 + .../Resources/Shared/SharedResource.de.resx | 156 + .../Resources/Shared/SharedResource.en.resx | 156 + .../Resources/Shared/SharedResource.it.resx | 156 + ...342\200\217\342\200\217MainLayout.ar.resx" | 180 + .../\342\200\217\342\200\217NavMenu.ar.resx" | 186 + ...200\217\342\200\217NotFoundLayout.ar.resx" | 126 + src/Client/Shared/ApiHelper.cs | 86 + src/Client/Shared/BaseLayout.razor | 33 + src/Client/Shared/BaseLayout.razor.cs | 49 + src/Client/Shared/DialogServiceExtensions.cs | 19 + src/Client/Shared/MainLayout.razor | 107 + src/Client/Shared/MainLayout.razor.cs | 63 + src/Client/Shared/NavMenu.razor | 55 + src/Client/Shared/NavMenu.razor.cs | 39 + src/Client/Shared/NotFound.razor | 56 + src/Client/Shared/SharedResource.cs | 5 + src/Client/_Imports.razor | 42 + .../wwwroot/appsettings.Development.json | 1 + src/Client/wwwroot/appsettings.json | 10 + src/Client/wwwroot/css/fsh.css | 72 + src/Client/wwwroot/favicon.ico | Bin 0 -> 18409 bytes src/Client/wwwroot/full-stack-hero-logo.png | Bin 0 -> 160036 bytes src/Client/wwwroot/index.html | 110 + src/Client/wwwroot/manifest.json | 21 + src/Client/wwwroot/service-worker.js | 4 + .../wwwroot/service-worker.published.js | 48 + src/Host/Host.csproj | 24 + src/Host/Pages/Error.cshtml | 44 + src/Host/Pages/Error.cshtml.cs | 19 + src/Host/Program.cs | 26 + src/Host/Properties/launchSettings.json | 30 + src/Host/appsettings.Development.json | 8 + src/Host/appsettings.json | 9 + .../ClaimsPrincipalExtensions.cs | 39 + src/Shared/Authorization/FSHClaims.cs | 11 + src/Shared/Authorization/FSHPermissions.cs | 80 + src/Shared/Authorization/FSHRoles.cs | 17 + src/Shared/Events/IEvent.cs | 5 + .../MultiTenancy/MultitenancyConstants.cs | 15 + src/Shared/Notifications/BasicNotification.cs | 15 + .../Notifications/INotificationMessage.cs | 5 + src/Shared/Notifications/JobNotification.cs | 8 + .../Notifications/NotificationConstants.cs | 6 + .../Notifications/StatsChangedNotification.cs | 5 + src/Shared/Shared.csproj | 7 + stylecop.json | 12 + 1236 files changed, 168834 insertions(+) create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .github/FUNDING.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/dotnet.yml create mode 100644 .gitignore create mode 100644 .template.config/icon.png create mode 100644 .template.config/ide.host.json create mode 100644 .template.config/template.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 Directory.Build.props create mode 100644 Directory.Build.targets create mode 100644 Dockerfile create mode 100644 FSH.BlazorWebAssembly.nuspec create mode 100644 LICENSE create mode 100644 README.md create mode 100644 RewardsPlus.BlazorWebAssembly.sln create mode 100644 blazor-wasm-boilerplate-main/.dockerignore create mode 100644 blazor-wasm-boilerplate-main/.editorconfig create mode 100644 blazor-wasm-boilerplate-main/.github/FUNDING.yml create mode 100644 blazor-wasm-boilerplate-main/.github/dependabot.yml create mode 100644 blazor-wasm-boilerplate-main/.github/workflows/dotnet.yml create mode 100644 blazor-wasm-boilerplate-main/.gitignore create mode 100644 blazor-wasm-boilerplate-main/.template.config/icon.png create mode 100644 blazor-wasm-boilerplate-main/.template.config/ide.host.json create mode 100644 blazor-wasm-boilerplate-main/.template.config/template.json create mode 100644 blazor-wasm-boilerplate-main/.vscode/launch.json create mode 100644 blazor-wasm-boilerplate-main/.vscode/settings.json create mode 100644 blazor-wasm-boilerplate-main/.vscode/tasks.json create mode 100644 blazor-wasm-boilerplate-main/Directory.Build.props create mode 100644 blazor-wasm-boilerplate-main/Directory.Build.targets create mode 100644 blazor-wasm-boilerplate-main/Dockerfile create mode 100644 blazor-wasm-boilerplate-main/FSH.BlazorWebAssembly.nuspec create mode 100644 blazor-wasm-boilerplate-main/FSH.BlazorWebAssembly.sln create mode 100644 blazor-wasm-boilerplate-main/LICENSE create mode 100644 blazor-wasm-boilerplate-main/README.md create mode 100644 blazor-wasm-boilerplate-main/dotnet.ruleset create mode 100644 blazor-wasm-boilerplate-main/global.json create mode 100644 blazor-wasm-boilerplate-main/icon.png create mode 100644 blazor-wasm-boilerplate-main/scripts/nswag-regen.ps1 create mode 100644 blazor-wasm-boilerplate-main/scripts/pull-shared-from-webapi.ps1 create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/ApiClient/FSHApi.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/ApiClient/IApiService.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/ApiClient/nswag.json create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AuthProvider.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AuthorizationServiceExtensions.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthenticationService.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthorizationMessageHandler.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AzureAd/AzureAdClaimsPrincipalFactory.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/IAuthenticationService.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Jwt/AccessTokenProviderAccessor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationHeaderHandler.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationService.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/MustHavePermissionAttribute.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Startup.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Client.Infrastructure.csproj create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/AccessTokenProviderExtensions.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/ApplicationConstants.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/ConfigNames.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/IAppService.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/LocalizationConstants.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/StorageConstants.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/GlobalUsings.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/ConnectionState.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/ConnectionStateChanged.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/INotificationPublisher.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/NotificationPublisher.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/NotificationWrapper.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/Startup.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/ClientPreference.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/ClientPreferenceManager.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/FshTablePreference.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/IClientPreferenceManager.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/IPreference.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/IPreferenceManager.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Startup.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/CustomColors.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/CustomTypography.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/DarkTheme.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/LightTheme.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/App.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Client.csproj create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/Common/CustomValidation.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/Common/ErrorHandler.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/Common/ErrorHandler.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/Common/FshCustomError.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/Common/FshTable.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/Common/FshTitle.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/Common/PersonCard.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/Common/PersonCard.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/Common/TablePager.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/Dialogs/DeleteConfirmation.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/Dialogs/Logout.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/AddEditModal.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/AddEditModal.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityClientTableContext.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityField.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityServerTableContext.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityTable.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityTable.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityTableContext.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/IAddEditModal.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/PaginationResponse.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/Localization/LanguageSelector.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/Notifications/NotificationConnection.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/Notifications/NotificationConnection.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/Notifications/NotificationConnectionStatus.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ColorPanel.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ColorPanel.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/DarkModePanel.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/DarkModePanel.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/RadiusPanel.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/RadiusPanel.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/TableCustomizationPanel.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/TableCustomizationPanel.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeButton.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeButton.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeDrawer.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeDrawer.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/Authentication.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/ForgotPassword.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/ForgotPassword.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/Login.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/Login.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/SelfRegister.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/SelfRegister.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/BrandAutocomplete.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/Brands.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/Products.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/Products.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Account.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Profile.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Profile.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Security.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Security.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/RolePermissions.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/RolePermissions.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/Roles.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/Roles.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserProfile.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserProfile.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserRoles.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserRoles.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/Users.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/Users.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Index.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Multitenancy/Tenants.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Multitenancy/Tenants.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Multitenancy/UpgradeSubscriptionModal.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Personal/AuditLogs.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Personal/AuditLogs.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Personal/Dashboard.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Pages/Personal/Dashboard.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Program.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Properties/launchSettings.json create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Index.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Index.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Index.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/Tenants.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/Tenants.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/Tenants.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.ar.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.sv.resx create mode 100644 "blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217DeleteConfirmation.ar.resx" create mode 100644 "blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217Logout.ar.resx" create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.es.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.fr.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.id.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.it.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.km.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.nl.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.ru.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.sv.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/SharedResource.de.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/SharedResource.en.resx create mode 100644 blazor-wasm-boilerplate-main/src/Client/Resources/Shared/SharedResource.it.resx create mode 100644 "blazor-wasm-boilerplate-main/src/Client/Resources/Shared/\342\200\217\342\200\217MainLayout.ar.resx" create mode 100644 "blazor-wasm-boilerplate-main/src/Client/Resources/Shared/\342\200\217\342\200\217NavMenu.ar.resx" create mode 100644 "blazor-wasm-boilerplate-main/src/Client/Resources/Shared/\342\200\217\342\200\217NotFoundLayout.ar.resx" create mode 100644 blazor-wasm-boilerplate-main/src/Client/Shared/ApiHelper.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Shared/BaseLayout.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Shared/BaseLayout.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Shared/DialogServiceExtensions.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Shared/MainLayout.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Shared/MainLayout.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Shared/NavMenu.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Shared/NavMenu.razor.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/Shared/NotFound.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/Shared/SharedResource.cs create mode 100644 blazor-wasm-boilerplate-main/src/Client/_Imports.razor create mode 100644 blazor-wasm-boilerplate-main/src/Client/wwwroot/appsettings.Development.json create mode 100644 blazor-wasm-boilerplate-main/src/Client/wwwroot/appsettings.json create mode 100644 blazor-wasm-boilerplate-main/src/Client/wwwroot/css/fsh.css create mode 100644 blazor-wasm-boilerplate-main/src/Client/wwwroot/favicon.ico create mode 100644 blazor-wasm-boilerplate-main/src/Client/wwwroot/full-stack-hero-logo.png create mode 100644 blazor-wasm-boilerplate-main/src/Client/wwwroot/index.html create mode 100644 blazor-wasm-boilerplate-main/src/Client/wwwroot/manifest.json create mode 100644 blazor-wasm-boilerplate-main/src/Client/wwwroot/service-worker.js create mode 100644 blazor-wasm-boilerplate-main/src/Client/wwwroot/service-worker.published.js create mode 100644 blazor-wasm-boilerplate-main/src/Host/Host.csproj create mode 100644 blazor-wasm-boilerplate-main/src/Host/Pages/Error.cshtml create mode 100644 blazor-wasm-boilerplate-main/src/Host/Pages/Error.cshtml.cs create mode 100644 blazor-wasm-boilerplate-main/src/Host/Program.cs create mode 100644 blazor-wasm-boilerplate-main/src/Host/Properties/launchSettings.json create mode 100644 blazor-wasm-boilerplate-main/src/Host/appsettings.Development.json create mode 100644 blazor-wasm-boilerplate-main/src/Host/appsettings.json create mode 100644 blazor-wasm-boilerplate-main/src/Shared/Authorization/ClaimsPrincipalExtensions.cs create mode 100644 blazor-wasm-boilerplate-main/src/Shared/Authorization/FSHClaims.cs create mode 100644 blazor-wasm-boilerplate-main/src/Shared/Authorization/FSHPermissions.cs create mode 100644 blazor-wasm-boilerplate-main/src/Shared/Authorization/FSHRoles.cs create mode 100644 blazor-wasm-boilerplate-main/src/Shared/Events/IEvent.cs create mode 100644 blazor-wasm-boilerplate-main/src/Shared/MultiTenancy/MultitenancyConstants.cs create mode 100644 blazor-wasm-boilerplate-main/src/Shared/Notifications/BasicNotification.cs create mode 100644 blazor-wasm-boilerplate-main/src/Shared/Notifications/INotificationMessage.cs create mode 100644 blazor-wasm-boilerplate-main/src/Shared/Notifications/JobNotification.cs create mode 100644 blazor-wasm-boilerplate-main/src/Shared/Notifications/NotificationConstants.cs create mode 100644 blazor-wasm-boilerplate-main/src/Shared/Notifications/StatsChangedNotification.cs create mode 100644 blazor-wasm-boilerplate-main/src/Shared/Shared.csproj create mode 100644 blazor-wasm-boilerplate-main/stylecop.json create mode 100644 dotnet.ruleset create mode 100644 global.json create mode 100644 icon.png create mode 100644 scripts/nswag-regen.ps1 create mode 100644 scripts/pull-shared-from-webapi.ps1 create mode 100644 src/Client.Infrastructure/ApiClient/FSHApi.cs create mode 100644 src/Client.Infrastructure/ApiClient/IApiService.cs create mode 100644 src/Client.Infrastructure/ApiClient/nswag.json create mode 100644 src/Client.Infrastructure/Auth/AuthProvider.cs create mode 100644 src/Client.Infrastructure/Auth/AuthorizationServiceExtensions.cs create mode 100644 src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthenticationService.cs create mode 100644 src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthorizationMessageHandler.cs create mode 100644 src/Client.Infrastructure/Auth/AzureAd/AzureAdClaimsPrincipalFactory.cs create mode 100644 src/Client.Infrastructure/Auth/IAuthenticationService.cs create mode 100644 src/Client.Infrastructure/Auth/Jwt/AccessTokenProviderAccessor.cs create mode 100644 src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationHeaderHandler.cs create mode 100644 src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationService.cs create mode 100644 src/Client.Infrastructure/Auth/MustHavePermissionAttribute.cs create mode 100644 src/Client.Infrastructure/Auth/Startup.cs create mode 100644 src/Client.Infrastructure/Client.Infrastructure.csproj create mode 100644 src/Client.Infrastructure/Common/AccessTokenProviderExtensions.cs create mode 100644 src/Client.Infrastructure/Common/ApplicationConstants.cs create mode 100644 src/Client.Infrastructure/Common/ConfigNames.cs create mode 100644 src/Client.Infrastructure/Common/IAppService.cs create mode 100644 src/Client.Infrastructure/Common/LocalizationConstants.cs create mode 100644 src/Client.Infrastructure/Common/StorageConstants.cs create mode 100644 src/Client.Infrastructure/GlobalUsings.cs create mode 100644 src/Client.Infrastructure/Notifications/ConnectionState.cs create mode 100644 src/Client.Infrastructure/Notifications/ConnectionStateChanged.cs create mode 100644 src/Client.Infrastructure/Notifications/INotificationPublisher.cs create mode 100644 src/Client.Infrastructure/Notifications/NotificationPublisher.cs create mode 100644 src/Client.Infrastructure/Notifications/NotificationWrapper.cs create mode 100644 src/Client.Infrastructure/Notifications/Startup.cs create mode 100644 src/Client.Infrastructure/Preferences/ClientPreference.cs create mode 100644 src/Client.Infrastructure/Preferences/ClientPreferenceManager.cs create mode 100644 src/Client.Infrastructure/Preferences/FshTablePreference.cs create mode 100644 src/Client.Infrastructure/Preferences/IClientPreferenceManager.cs create mode 100644 src/Client.Infrastructure/Preferences/IPreference.cs create mode 100644 src/Client.Infrastructure/Preferences/IPreferenceManager.cs create mode 100644 src/Client.Infrastructure/Startup.cs create mode 100644 src/Client.Infrastructure/Theme/CustomColors.cs create mode 100644 src/Client.Infrastructure/Theme/CustomTypography.cs create mode 100644 src/Client.Infrastructure/Theme/DarkTheme.cs create mode 100644 src/Client.Infrastructure/Theme/LightTheme.cs create mode 100644 src/Client/App.razor create mode 100644 src/Client/Client.csproj create mode 100644 src/Client/Components/Common/CustomValidation.cs create mode 100644 src/Client/Components/Common/ErrorHandler.razor create mode 100644 src/Client/Components/Common/ErrorHandler.razor.cs create mode 100644 src/Client/Components/Common/FshCustomError.razor create mode 100644 src/Client/Components/Common/FshTable.cs create mode 100644 src/Client/Components/Common/FshTitle.razor create mode 100644 src/Client/Components/Common/PersonCard.razor create mode 100644 src/Client/Components/Common/PersonCard.razor.cs create mode 100644 src/Client/Components/Common/TablePager.razor create mode 100644 src/Client/Components/Dialogs/DeleteConfirmation.razor create mode 100644 src/Client/Components/Dialogs/Logout.razor create mode 100644 src/Client/Components/EntityTable/AddEditModal.razor create mode 100644 src/Client/Components/EntityTable/AddEditModal.razor.cs create mode 100644 src/Client/Components/EntityTable/EntityClientTableContext.cs create mode 100644 src/Client/Components/EntityTable/EntityField.cs create mode 100644 src/Client/Components/EntityTable/EntityServerTableContext.cs create mode 100644 src/Client/Components/EntityTable/EntityTable.razor create mode 100644 src/Client/Components/EntityTable/EntityTable.razor.cs create mode 100644 src/Client/Components/EntityTable/EntityTableContext.cs create mode 100644 src/Client/Components/EntityTable/IAddEditModal.cs create mode 100644 src/Client/Components/EntityTable/PaginationResponse.cs create mode 100644 src/Client/Components/Localization/LanguageSelector.razor create mode 100644 src/Client/Components/Notifications/NotificationConnection.razor create mode 100644 src/Client/Components/Notifications/NotificationConnection.razor.cs create mode 100644 src/Client/Components/Notifications/NotificationConnectionStatus.razor create mode 100644 src/Client/Components/ThemeManager/ColorPanel.razor create mode 100644 src/Client/Components/ThemeManager/ColorPanel.razor.cs create mode 100644 src/Client/Components/ThemeManager/DarkModePanel.razor create mode 100644 src/Client/Components/ThemeManager/DarkModePanel.razor.cs create mode 100644 src/Client/Components/ThemeManager/RadiusPanel.razor create mode 100644 src/Client/Components/ThemeManager/RadiusPanel.razor.cs create mode 100644 src/Client/Components/ThemeManager/TableCustomizationPanel.razor create mode 100644 src/Client/Components/ThemeManager/TableCustomizationPanel.razor.cs create mode 100644 src/Client/Components/ThemeManager/ThemeButton.razor create mode 100644 src/Client/Components/ThemeManager/ThemeButton.razor.cs create mode 100644 src/Client/Components/ThemeManager/ThemeDrawer.razor create mode 100644 src/Client/Components/ThemeManager/ThemeDrawer.razor.cs create mode 100644 src/Client/Pages/Authentication/Authentication.razor create mode 100644 src/Client/Pages/Authentication/ForgotPassword.razor create mode 100644 src/Client/Pages/Authentication/ForgotPassword.razor.cs create mode 100644 src/Client/Pages/Authentication/Login.razor create mode 100644 src/Client/Pages/Authentication/Login.razor.cs create mode 100644 src/Client/Pages/Authentication/SelfRegister.razor create mode 100644 src/Client/Pages/Authentication/SelfRegister.razor.cs create mode 100644 src/Client/Pages/Catalog/BrandAutocomplete.cs create mode 100644 src/Client/Pages/Catalog/Brands.razor create mode 100644 src/Client/Pages/Catalog/Products.razor create mode 100644 src/Client/Pages/Catalog/Products.razor.cs create mode 100644 src/Client/Pages/Identity/Account/Account.razor create mode 100644 src/Client/Pages/Identity/Account/Profile.razor create mode 100644 src/Client/Pages/Identity/Account/Profile.razor.cs create mode 100644 src/Client/Pages/Identity/Account/Security.razor create mode 100644 src/Client/Pages/Identity/Account/Security.razor.cs create mode 100644 src/Client/Pages/Identity/Roles/RolePermissions.razor create mode 100644 src/Client/Pages/Identity/Roles/RolePermissions.razor.cs create mode 100644 src/Client/Pages/Identity/Roles/Roles.razor create mode 100644 src/Client/Pages/Identity/Roles/Roles.razor.cs create mode 100644 src/Client/Pages/Identity/Users/UserProfile.razor create mode 100644 src/Client/Pages/Identity/Users/UserProfile.razor.cs create mode 100644 src/Client/Pages/Identity/Users/UserRoles.razor create mode 100644 src/Client/Pages/Identity/Users/UserRoles.razor.cs create mode 100644 src/Client/Pages/Identity/Users/Users.razor create mode 100644 src/Client/Pages/Identity/Users/Users.razor.cs create mode 100644 src/Client/Pages/Index.razor create mode 100644 src/Client/Pages/Multitenancy/Tenants.razor create mode 100644 src/Client/Pages/Multitenancy/Tenants.razor.cs create mode 100644 src/Client/Pages/Multitenancy/UpgradeSubscriptionModal.razor create mode 100644 src/Client/Pages/Personal/AuditLogs.razor create mode 100644 src/Client/Pages/Personal/AuditLogs.razor.cs create mode 100644 src/Client/Pages/Personal/Dashboard.razor create mode 100644 src/Client/Pages/Personal/Dashboard.razor.cs create mode 100644 src/Client/Program.cs create mode 100644 src/Client/Properties/launchSettings.json create mode 100644 src/Client/Resources/Components/Common/TablePager.ar.resx create mode 100644 src/Client/Resources/Components/Common/TablePager.de.resx create mode 100644 src/Client/Resources/Components/Common/TablePager.en.resx create mode 100644 src/Client/Resources/Components/Common/TablePager.es.resx create mode 100644 src/Client/Resources/Components/Common/TablePager.fr.resx create mode 100644 src/Client/Resources/Components/Common/TablePager.id.resx create mode 100644 src/Client/Resources/Components/Common/TablePager.it.resx create mode 100644 src/Client/Resources/Components/Common/TablePager.km.resx create mode 100644 src/Client/Resources/Components/Common/TablePager.nl.resx create mode 100644 src/Client/Resources/Components/Common/TablePager.ru.resx create mode 100644 src/Client/Resources/Components/Common/TablePager.sv.resx create mode 100644 src/Client/Resources/Pages/Account/Register.ar.resx create mode 100644 src/Client/Resources/Pages/Account/Register.de.resx create mode 100644 src/Client/Resources/Pages/Account/Register.en.resx create mode 100644 src/Client/Resources/Pages/Account/Register.es.resx create mode 100644 src/Client/Resources/Pages/Account/Register.fr.resx create mode 100644 src/Client/Resources/Pages/Account/Register.id.resx create mode 100644 src/Client/Resources/Pages/Account/Register.it.resx create mode 100644 src/Client/Resources/Pages/Account/Register.km.resx create mode 100644 src/Client/Resources/Pages/Account/Register.nl.resx create mode 100644 src/Client/Resources/Pages/Account/Register.ru.resx create mode 100644 src/Client/Resources/Pages/Account/Register.sv.resx create mode 100644 src/Client/Resources/Pages/Account/Reset.ar.resx create mode 100644 src/Client/Resources/Pages/Account/Reset.de.resx create mode 100644 src/Client/Resources/Pages/Account/Reset.en.resx create mode 100644 src/Client/Resources/Pages/Account/Reset.es.resx create mode 100644 src/Client/Resources/Pages/Account/Reset.fr.resx create mode 100644 src/Client/Resources/Pages/Account/Reset.id.resx create mode 100644 src/Client/Resources/Pages/Account/Reset.it.resx create mode 100644 src/Client/Resources/Pages/Account/Reset.km.resx create mode 100644 src/Client/Resources/Pages/Account/Reset.nl.resx create mode 100644 src/Client/Resources/Pages/Account/Reset.ru.resx create mode 100644 src/Client/Resources/Pages/Account/Reset.sv.resx create mode 100644 src/Client/Resources/Pages/Authentication/Authentication.ar.resx create mode 100644 src/Client/Resources/Pages/Authentication/Authentication.de.resx create mode 100644 src/Client/Resources/Pages/Authentication/Authentication.en.resx create mode 100644 src/Client/Resources/Pages/Authentication/Authentication.es.resx create mode 100644 src/Client/Resources/Pages/Authentication/Authentication.fr.resx create mode 100644 src/Client/Resources/Pages/Authentication/Authentication.id.resx create mode 100644 src/Client/Resources/Pages/Authentication/Authentication.it.resx create mode 100644 src/Client/Resources/Pages/Authentication/Authentication.km.resx create mode 100644 src/Client/Resources/Pages/Authentication/Authentication.nl.resx create mode 100644 src/Client/Resources/Pages/Authentication/Authentication.ru.resx create mode 100644 src/Client/Resources/Pages/Authentication/Authentication.sv.resx create mode 100644 src/Client/Resources/Pages/Authentication/ForgotPassword.ar.resx create mode 100644 src/Client/Resources/Pages/Authentication/ForgotPassword.de.resx create mode 100644 src/Client/Resources/Pages/Authentication/ForgotPassword.en.resx create mode 100644 src/Client/Resources/Pages/Authentication/ForgotPassword.es.resx create mode 100644 src/Client/Resources/Pages/Authentication/ForgotPassword.fr.resx create mode 100644 src/Client/Resources/Pages/Authentication/ForgotPassword.id.resx create mode 100644 src/Client/Resources/Pages/Authentication/ForgotPassword.it.resx create mode 100644 src/Client/Resources/Pages/Authentication/ForgotPassword.km.resx create mode 100644 src/Client/Resources/Pages/Authentication/ForgotPassword.nl.resx create mode 100644 src/Client/Resources/Pages/Authentication/ForgotPassword.ru.resx create mode 100644 src/Client/Resources/Pages/Authentication/ForgotPassword.sv.resx create mode 100644 src/Client/Resources/Pages/Authentication/Login.ar.resx create mode 100644 src/Client/Resources/Pages/Authentication/Login.de.resx create mode 100644 src/Client/Resources/Pages/Authentication/Login.en.resx create mode 100644 src/Client/Resources/Pages/Authentication/Login.es.resx create mode 100644 src/Client/Resources/Pages/Authentication/Login.fr.resx create mode 100644 src/Client/Resources/Pages/Authentication/Login.id.resx create mode 100644 src/Client/Resources/Pages/Authentication/Login.it.resx create mode 100644 src/Client/Resources/Pages/Authentication/Login.km.resx create mode 100644 src/Client/Resources/Pages/Authentication/Login.nl.resx create mode 100644 src/Client/Resources/Pages/Authentication/Login.ru.resx create mode 100644 src/Client/Resources/Pages/Authentication/Login.sv.resx create mode 100644 src/Client/Resources/Pages/Authentication/Register.ar.resx create mode 100644 src/Client/Resources/Pages/Authentication/Register.de.resx create mode 100644 src/Client/Resources/Pages/Authentication/Register.en.resx create mode 100644 src/Client/Resources/Pages/Authentication/Register.es.resx create mode 100644 src/Client/Resources/Pages/Authentication/Register.fr.resx create mode 100644 src/Client/Resources/Pages/Authentication/Register.id.resx create mode 100644 src/Client/Resources/Pages/Authentication/Register.it.resx create mode 100644 src/Client/Resources/Pages/Authentication/Register.km.resx create mode 100644 src/Client/Resources/Pages/Authentication/Register.nl.resx create mode 100644 src/Client/Resources/Pages/Authentication/Register.ru.resx create mode 100644 src/Client/Resources/Pages/Authentication/Register.sv.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditBrandModal.ar.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditBrandModal.de.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditBrandModal.en.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditBrandModal.es.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditBrandModal.fr.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditBrandModal.id.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditBrandModal.it.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditBrandModal.km.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditBrandModal.nl.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditBrandModal.ru.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditProductModal.ar.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditProductModal.de.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditProductModal.en.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditProductModal.es.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditProductModal.fr.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditProductModal.id.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditProductModal.it.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditProductModal.km.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditProductModal.nl.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditProductModal.ru.resx create mode 100644 src/Client/Resources/Pages/Catalog/AddEditProductModal.sv.resx create mode 100644 src/Client/Resources/Pages/Catalog/Brands.ar.resx create mode 100644 src/Client/Resources/Pages/Catalog/Brands.de.resx create mode 100644 src/Client/Resources/Pages/Catalog/Brands.en.resx create mode 100644 src/Client/Resources/Pages/Catalog/Brands.es.resx create mode 100644 src/Client/Resources/Pages/Catalog/Brands.fr.resx create mode 100644 src/Client/Resources/Pages/Catalog/Brands.id.resx create mode 100644 src/Client/Resources/Pages/Catalog/Brands.it.resx create mode 100644 src/Client/Resources/Pages/Catalog/Brands.km.resx create mode 100644 src/Client/Resources/Pages/Catalog/Brands.nl.resx create mode 100644 src/Client/Resources/Pages/Catalog/Brands.ru.resx create mode 100644 src/Client/Resources/Pages/Catalog/Brands.sv.resx create mode 100644 src/Client/Resources/Pages/Catalog/Products.ar.resx create mode 100644 src/Client/Resources/Pages/Catalog/Products.de.resx create mode 100644 src/Client/Resources/Pages/Catalog/Products.en.resx create mode 100644 src/Client/Resources/Pages/Catalog/Products.es.resx create mode 100644 src/Client/Resources/Pages/Catalog/Products.fr.resx create mode 100644 src/Client/Resources/Pages/Catalog/Products.id.resx create mode 100644 src/Client/Resources/Pages/Catalog/Products.it.resx create mode 100644 src/Client/Resources/Pages/Catalog/Products.km.resx create mode 100644 src/Client/Resources/Pages/Catalog/Products.nl.resx create mode 100644 src/Client/Resources/Pages/Catalog/Products.ru.resx create mode 100644 src/Client/Resources/Pages/Catalog/Products.sv.resx create mode 100644 src/Client/Resources/Pages/Communication/Chat.ar.resx create mode 100644 src/Client/Resources/Pages/Communication/Chat.de.resx create mode 100644 src/Client/Resources/Pages/Communication/Chat.en.resx create mode 100644 src/Client/Resources/Pages/Communication/Chat.es.resx create mode 100644 src/Client/Resources/Pages/Communication/Chat.fr.resx create mode 100644 src/Client/Resources/Pages/Communication/Chat.id.resx create mode 100644 src/Client/Resources/Pages/Communication/Chat.it.resx create mode 100644 src/Client/Resources/Pages/Communication/Chat.km.resx create mode 100644 src/Client/Resources/Pages/Communication/Chat.nl.resx create mode 100644 src/Client/Resources/Pages/Communication/Chat.ru.resx create mode 100644 src/Client/Resources/Pages/Communication/Chat.sv.resx create mode 100644 src/Client/Resources/Pages/Content/Home.ar.resx create mode 100644 src/Client/Resources/Pages/Content/Home.de.resx create mode 100644 src/Client/Resources/Pages/Content/Home.en.resx create mode 100644 src/Client/Resources/Pages/Content/Home.es.resx create mode 100644 src/Client/Resources/Pages/Content/Home.fr.resx create mode 100644 src/Client/Resources/Pages/Content/Home.id.resx create mode 100644 src/Client/Resources/Pages/Content/Home.it.resx create mode 100644 src/Client/Resources/Pages/Content/Home.km.resx create mode 100644 src/Client/Resources/Pages/Content/Home.nl.resx create mode 100644 src/Client/Resources/Pages/Content/Home.ru.resx create mode 100644 src/Client/Resources/Pages/Content/Home.sv.resx create mode 100644 src/Client/Resources/Pages/Content/Resources.ar.resx create mode 100644 src/Client/Resources/Pages/Content/Resources.de.resx create mode 100644 src/Client/Resources/Pages/Content/Resources.en.resx create mode 100644 src/Client/Resources/Pages/Content/Resources.es.resx create mode 100644 src/Client/Resources/Pages/Content/Resources.fr.resx create mode 100644 src/Client/Resources/Pages/Content/Resources.id.resx create mode 100644 src/Client/Resources/Pages/Content/Resources.it.resx create mode 100644 src/Client/Resources/Pages/Content/Resources.km.resx create mode 100644 src/Client/Resources/Pages/Content/Resources.nl.resx create mode 100644 src/Client/Resources/Pages/Content/Resources.ru.resx create mode 100644 src/Client/Resources/Pages/Content/Resources.sv.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Account.ar.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Account.de.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Account.en.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Account.es.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Account.fr.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Account.id.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Account.it.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Account.km.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Account.nl.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Account.ru.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Account.sv.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Profile.ar.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Profile.de.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Profile.en.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Profile.es.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Profile.fr.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Profile.id.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Profile.it.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Profile.km.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Profile.nl.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Profile.ru.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Profile.sv.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Security.ar.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Security.de.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Security.en.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Security.es.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Security.fr.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Security.id.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Security.it.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Security.km.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Security.nl.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Security.ru.resx create mode 100644 src/Client/Resources/Pages/Identity/Account/Security.sv.resx create mode 100644 src/Client/Resources/Pages/Identity/RegisterUserModal.ar.resx create mode 100644 src/Client/Resources/Pages/Identity/RegisterUserModal.de.resx create mode 100644 src/Client/Resources/Pages/Identity/RegisterUserModal.en.resx create mode 100644 src/Client/Resources/Pages/Identity/RegisterUserModal.es.resx create mode 100644 src/Client/Resources/Pages/Identity/RegisterUserModal.fr.resx create mode 100644 src/Client/Resources/Pages/Identity/RegisterUserModal.id.resx create mode 100644 src/Client/Resources/Pages/Identity/RegisterUserModal.it.resx create mode 100644 src/Client/Resources/Pages/Identity/RegisterUserModal.km.resx create mode 100644 src/Client/Resources/Pages/Identity/RegisterUserModal.nl.resx create mode 100644 src/Client/Resources/Pages/Identity/RegisterUserModal.ru.resx create mode 100644 src/Client/Resources/Pages/Identity/RegisterUserModal.sv.resx create mode 100644 src/Client/Resources/Pages/Identity/Reset.ar.resx create mode 100644 src/Client/Resources/Pages/Identity/Reset.de.resx create mode 100644 src/Client/Resources/Pages/Identity/Reset.en.resx create mode 100644 src/Client/Resources/Pages/Identity/Reset.es.resx create mode 100644 src/Client/Resources/Pages/Identity/Reset.fr.resx create mode 100644 src/Client/Resources/Pages/Identity/Reset.id.resx create mode 100644 src/Client/Resources/Pages/Identity/Reset.it.resx create mode 100644 src/Client/Resources/Pages/Identity/Reset.km.resx create mode 100644 src/Client/Resources/Pages/Identity/Reset.nl.resx create mode 100644 src/Client/Resources/Pages/Identity/Reset.ru.resx create mode 100644 src/Client/Resources/Pages/Identity/Reset.sv.resx create mode 100644 src/Client/Resources/Pages/Identity/RoleModal.ar.resx create mode 100644 src/Client/Resources/Pages/Identity/RoleModal.de.resx create mode 100644 src/Client/Resources/Pages/Identity/RoleModal.en.resx create mode 100644 src/Client/Resources/Pages/Identity/RoleModal.es.resx create mode 100644 src/Client/Resources/Pages/Identity/RoleModal.fr.resx create mode 100644 src/Client/Resources/Pages/Identity/RoleModal.id.resx create mode 100644 src/Client/Resources/Pages/Identity/RoleModal.it.resx create mode 100644 src/Client/Resources/Pages/Identity/RoleModal.km.resx create mode 100644 src/Client/Resources/Pages/Identity/RoleModal.nl.resx create mode 100644 src/Client/Resources/Pages/Identity/RoleModal.ru.resx create mode 100644 src/Client/Resources/Pages/Identity/RoleModal.sv.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/RolePermissions.ar.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/RolePermissions.de.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/RolePermissions.en.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/RolePermissions.es.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/RolePermissions.fr.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/RolePermissions.id.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/RolePermissions.it.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/RolePermissions.km.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/RolePermissions.nl.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/RolePermissions.ru.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/RolePermissions.sv.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/Roles.ar.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/Roles.de.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/Roles.en.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/Roles.es.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/Roles.fr.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/Roles.id.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/Roles.it.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/Roles.km.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/Roles.nl.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/Roles.ru.resx create mode 100644 src/Client/Resources/Pages/Identity/Roles/Roles.sv.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserProfile.ar.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserProfile.de.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserProfile.en.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserProfile.es.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserProfile.fr.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserProfile.id.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserProfile.it.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserProfile.km.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserProfile.nl.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserProfile.ru.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserProfile.sv.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserRoles.ar.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserRoles.de.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserRoles.en.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserRoles.es.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserRoles.fr.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserRoles.id.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserRoles.it.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserRoles.km.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserRoles.nl.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserRoles.ru.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/UserRoles.sv.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/Users.ar.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/Users.de.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/Users.en.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/Users.es.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/Users.fr.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/Users.id.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/Users.it.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/Users.km.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/Users.nl.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/Users.ru.resx create mode 100644 src/Client/Resources/Pages/Identity/Users/Users.sv.resx create mode 100644 src/Client/Resources/Pages/Index.de.resx create mode 100644 src/Client/Resources/Pages/Index.en.resx create mode 100644 src/Client/Resources/Pages/Index.it.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentModal.ar.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentModal.de.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentModal.en.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentModal.es.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentModal.fr.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentModal.id.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentModal.it.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentModal.km.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentModal.nl.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentModal.ru.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentModal.sv.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ar.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.de.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.en.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.es.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.fr.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.km.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.nl.resx create mode 100644 src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ru.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentStore.ar.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentStore.de.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentStore.en.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentStore.es.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentStore.fr.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentStore.id.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentStore.it.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentStore.km.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentStore.nl.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentStore.ru.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentStore.sv.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentTypes.ar.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentTypes.de.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentTypes.en.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentTypes.es.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentTypes.fr.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentTypes.km.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentTypes.nl.resx create mode 100644 src/Client/Resources/Pages/Misc/DocumentTypes.ru.resx create mode 100644 src/Client/Resources/Pages/Multitenancy/Tenants.de.resx create mode 100644 src/Client/Resources/Pages/Multitenancy/Tenants.en.resx create mode 100644 src/Client/Resources/Pages/Multitenancy/Tenants.it.resx create mode 100644 src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.de.resx create mode 100644 src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.en.resx create mode 100644 src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.it.resx create mode 100644 src/Client/Resources/Pages/Personal/AuditLogs.ar.resx create mode 100644 src/Client/Resources/Pages/Personal/AuditLogs.de.resx create mode 100644 src/Client/Resources/Pages/Personal/AuditLogs.en.resx create mode 100644 src/Client/Resources/Pages/Personal/AuditLogs.es.resx create mode 100644 src/Client/Resources/Pages/Personal/AuditLogs.fr.resx create mode 100644 src/Client/Resources/Pages/Personal/AuditLogs.it.resx create mode 100644 src/Client/Resources/Pages/Personal/AuditLogs.km.resx create mode 100644 src/Client/Resources/Pages/Personal/AuditLogs.nl.resx create mode 100644 src/Client/Resources/Pages/Personal/AuditLogs.ru.resx create mode 100644 src/Client/Resources/Pages/Personal/AuditLogs.sv.resx create mode 100644 src/Client/Resources/Pages/Personal/Dashboard.ar.resx create mode 100644 src/Client/Resources/Pages/Personal/Dashboard.de.resx create mode 100644 src/Client/Resources/Pages/Personal/Dashboard.en.resx create mode 100644 src/Client/Resources/Pages/Personal/Dashboard.es.resx create mode 100644 src/Client/Resources/Pages/Personal/Dashboard.fr.resx create mode 100644 src/Client/Resources/Pages/Personal/Dashboard.id.resx create mode 100644 src/Client/Resources/Pages/Personal/Dashboard.it.resx create mode 100644 src/Client/Resources/Pages/Personal/Dashboard.km.resx create mode 100644 src/Client/Resources/Pages/Personal/Dashboard.nl.resx create mode 100644 src/Client/Resources/Pages/Personal/Dashboard.ru.resx create mode 100644 src/Client/Resources/Pages/Personal/Dashboard.sv.resx create mode 100644 src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ar.resx create mode 100644 src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.de.resx create mode 100644 src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.en.resx create mode 100644 src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.es.resx create mode 100644 src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.fr.resx create mode 100644 src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.id.resx create mode 100644 src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.it.resx create mode 100644 src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.km.resx create mode 100644 src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.nl.resx create mode 100644 src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ru.resx create mode 100644 src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.sv.resx create mode 100644 src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ar.resx create mode 100644 src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.de.resx create mode 100644 src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.en.resx create mode 100644 src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.es.resx create mode 100644 src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.fr.resx create mode 100644 src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.id.resx create mode 100644 src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.it.resx create mode 100644 src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.km.resx create mode 100644 src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.nl.resx create mode 100644 src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ru.resx create mode 100644 src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.sv.resx create mode 100644 src/Client/Resources/Shared/Components/ImportExcelModal.ar.resx create mode 100644 src/Client/Resources/Shared/Components/ImportExcelModal.de.resx create mode 100644 src/Client/Resources/Shared/Components/ImportExcelModal.en.resx create mode 100644 src/Client/Resources/Shared/Components/ImportExcelModal.es.resx create mode 100644 src/Client/Resources/Shared/Components/ImportExcelModal.fr.resx create mode 100644 src/Client/Resources/Shared/Components/ImportExcelModal.id.resx create mode 100644 src/Client/Resources/Shared/Components/ImportExcelModal.it.resx create mode 100644 src/Client/Resources/Shared/Components/ImportExcelModal.km.resx create mode 100644 src/Client/Resources/Shared/Components/ImportExcelModal.nl.resx create mode 100644 src/Client/Resources/Shared/Components/ImportExcelModal.ru.resx create mode 100644 src/Client/Resources/Shared/Components/ImportExcelModal.sv.resx create mode 100644 src/Client/Resources/Shared/Components/LanguageSelector.ar.resx create mode 100644 src/Client/Resources/Shared/Components/LanguageSelector.de.resx create mode 100644 src/Client/Resources/Shared/Components/LanguageSelector.en.resx create mode 100644 src/Client/Resources/Shared/Components/LanguageSelector.es.resx create mode 100644 src/Client/Resources/Shared/Components/LanguageSelector.fr.resx create mode 100644 src/Client/Resources/Shared/Components/LanguageSelector.id.resx create mode 100644 src/Client/Resources/Shared/Components/LanguageSelector.it.resx create mode 100644 src/Client/Resources/Shared/Components/LanguageSelector.nl.resx create mode 100644 src/Client/Resources/Shared/Components/LanguageSelector.ru.resx create mode 100644 src/Client/Resources/Shared/Dialogs/DeleteConfirmation.en.resx create mode 100644 src/Client/Resources/Shared/Dialogs/DeleteConfirmation.es.resx create mode 100644 src/Client/Resources/Shared/Dialogs/DeleteConfirmation.fr.resx create mode 100644 src/Client/Resources/Shared/Dialogs/DeleteConfirmation.id.resx create mode 100644 src/Client/Resources/Shared/Dialogs/DeleteConfirmation.it.resx create mode 100644 src/Client/Resources/Shared/Dialogs/DeleteConfirmation.km.resx create mode 100644 src/Client/Resources/Shared/Dialogs/DeleteConfirmation.nl.resx create mode 100644 src/Client/Resources/Shared/Dialogs/DeleteConfirmation.ru.resx create mode 100644 src/Client/Resources/Shared/Dialogs/DeleteConfirmation.sv.resx create mode 100644 src/Client/Resources/Shared/Dialogs/Logout.en.resx create mode 100644 src/Client/Resources/Shared/Dialogs/Logout.es.resx create mode 100644 src/Client/Resources/Shared/Dialogs/Logout.fr.resx create mode 100644 src/Client/Resources/Shared/Dialogs/Logout.id.resx create mode 100644 src/Client/Resources/Shared/Dialogs/Logout.it.resx create mode 100644 src/Client/Resources/Shared/Dialogs/Logout.km.resx create mode 100644 src/Client/Resources/Shared/Dialogs/Logout.nl.resx create mode 100644 src/Client/Resources/Shared/Dialogs/Logout.ru.resx create mode 100644 src/Client/Resources/Shared/Dialogs/Logout.sv.resx create mode 100644 "src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217DeleteConfirmation.ar.resx" create mode 100644 "src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217Logout.ar.resx" create mode 100644 src/Client/Resources/Shared/MainLayout.de.resx create mode 100644 src/Client/Resources/Shared/MainLayout.en.resx create mode 100644 src/Client/Resources/Shared/MainLayout.es.resx create mode 100644 src/Client/Resources/Shared/MainLayout.fr.resx create mode 100644 src/Client/Resources/Shared/MainLayout.id.resx create mode 100644 src/Client/Resources/Shared/MainLayout.it.resx create mode 100644 src/Client/Resources/Shared/MainLayout.km.resx create mode 100644 src/Client/Resources/Shared/MainLayout.nl.resx create mode 100644 src/Client/Resources/Shared/MainLayout.ru.resx create mode 100644 src/Client/Resources/Shared/MainLayout.sv.resx create mode 100644 src/Client/Resources/Shared/NavMenu.de.resx create mode 100644 src/Client/Resources/Shared/NavMenu.en.resx create mode 100644 src/Client/Resources/Shared/NavMenu.es.resx create mode 100644 src/Client/Resources/Shared/NavMenu.fr.resx create mode 100644 src/Client/Resources/Shared/NavMenu.id.resx create mode 100644 src/Client/Resources/Shared/NavMenu.it.resx create mode 100644 src/Client/Resources/Shared/NavMenu.km.resx create mode 100644 src/Client/Resources/Shared/NavMenu.nl.resx create mode 100644 src/Client/Resources/Shared/NavMenu.ru.resx create mode 100644 src/Client/Resources/Shared/NavMenu.sv.resx create mode 100644 src/Client/Resources/Shared/NotFoundLayout.de.resx create mode 100644 src/Client/Resources/Shared/NotFoundLayout.en.resx create mode 100644 src/Client/Resources/Shared/NotFoundLayout.es.resx create mode 100644 src/Client/Resources/Shared/NotFoundLayout.fr.resx create mode 100644 src/Client/Resources/Shared/NotFoundLayout.id.resx create mode 100644 src/Client/Resources/Shared/NotFoundLayout.it.resx create mode 100644 src/Client/Resources/Shared/NotFoundLayout.km.resx create mode 100644 src/Client/Resources/Shared/NotFoundLayout.nl.resx create mode 100644 src/Client/Resources/Shared/NotFoundLayout.ru.resx create mode 100644 src/Client/Resources/Shared/NotFoundLayout.sv.resx create mode 100644 src/Client/Resources/Shared/SharedResource.de.resx create mode 100644 src/Client/Resources/Shared/SharedResource.en.resx create mode 100644 src/Client/Resources/Shared/SharedResource.it.resx create mode 100644 "src/Client/Resources/Shared/\342\200\217\342\200\217MainLayout.ar.resx" create mode 100644 "src/Client/Resources/Shared/\342\200\217\342\200\217NavMenu.ar.resx" create mode 100644 "src/Client/Resources/Shared/\342\200\217\342\200\217NotFoundLayout.ar.resx" create mode 100644 src/Client/Shared/ApiHelper.cs create mode 100644 src/Client/Shared/BaseLayout.razor create mode 100644 src/Client/Shared/BaseLayout.razor.cs create mode 100644 src/Client/Shared/DialogServiceExtensions.cs create mode 100644 src/Client/Shared/MainLayout.razor create mode 100644 src/Client/Shared/MainLayout.razor.cs create mode 100644 src/Client/Shared/NavMenu.razor create mode 100644 src/Client/Shared/NavMenu.razor.cs create mode 100644 src/Client/Shared/NotFound.razor create mode 100644 src/Client/Shared/SharedResource.cs create mode 100644 src/Client/_Imports.razor create mode 100644 src/Client/wwwroot/appsettings.Development.json create mode 100644 src/Client/wwwroot/appsettings.json create mode 100644 src/Client/wwwroot/css/fsh.css create mode 100644 src/Client/wwwroot/favicon.ico create mode 100644 src/Client/wwwroot/full-stack-hero-logo.png create mode 100644 src/Client/wwwroot/index.html create mode 100644 src/Client/wwwroot/manifest.json create mode 100644 src/Client/wwwroot/service-worker.js create mode 100644 src/Client/wwwroot/service-worker.published.js create mode 100644 src/Host/Host.csproj create mode 100644 src/Host/Pages/Error.cshtml create mode 100644 src/Host/Pages/Error.cshtml.cs create mode 100644 src/Host/Program.cs create mode 100644 src/Host/Properties/launchSettings.json create mode 100644 src/Host/appsettings.Development.json create mode 100644 src/Host/appsettings.json create mode 100644 src/Shared/Authorization/ClaimsPrincipalExtensions.cs create mode 100644 src/Shared/Authorization/FSHClaims.cs create mode 100644 src/Shared/Authorization/FSHPermissions.cs create mode 100644 src/Shared/Authorization/FSHRoles.cs create mode 100644 src/Shared/Events/IEvent.cs create mode 100644 src/Shared/MultiTenancy/MultitenancyConstants.cs create mode 100644 src/Shared/Notifications/BasicNotification.cs create mode 100644 src/Shared/Notifications/INotificationMessage.cs create mode 100644 src/Shared/Notifications/JobNotification.cs create mode 100644 src/Shared/Notifications/NotificationConstants.cs create mode 100644 src/Shared/Notifications/StatsChangedNotification.cs create mode 100644 src/Shared/Shared.csproj create mode 100644 stylecop.json diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3729ff0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,25 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..c426b48 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,158 @@ +root = true + +[*] +roslynator_accessibility_modifiers = explicit +roslynator_use_anonymous_function_or_method_group = anonymous_function|method_group +roslynator_enum_has_flag_style = method +roslynator_object_creation_type_style = explicit|implicit|implicit_when_type_is_obvious + +indent_style = space + +trim_trailing_whitespace = true + +insert_final_newline = false + +[*.md] +trim_trailing_whitespace = false + +[*.json] +indent_size = 2 + +[*.cs] +dotnet_sort_system_directives_first = true:warning + +csharp_style_namespace_declarations = file_scoped:warning + +csharp_style_var_for_built_in_types = false:warning + +csharp_style_var_when_type_is_apparent = true:warning + +csharp_style_var_elsewhere = true:warning + +csharp_new_line_before_members_in_anonymous_types = true:warning + +# SA1623: Property summary documentation should match accessors +dotnet_diagnostic.SA1623.severity = none + +# SA1101: Prefix local calls with this +dotnet_diagnostic.SA1101.severity = none + +# SA1642: Constructor summary documentation should begin with standard text +dotnet_diagnostic.SA1642.severity = none + +# SA1309: Field names should not begin with underscore +dotnet_diagnostic.SA1309.severity = none + +# RCS1194: Implement exception constructors. +dotnet_diagnostic.RCS1194.severity = none + +# SA1000: Keywords should be spaced correctly +dotnet_diagnostic.SA1000.severity = none + +# SA1124: Do not use regions +dotnet_diagnostic.SA1124.severity = none + +# SA1413: Use trailing comma in multi-line initializers +dotnet_diagnostic.SA1413.severity = none + +# SA1201: Elements should appear in the correct order +dotnet_diagnostic.SA1201.severity = suggestion + +# SA1638: File header file name documentation should match file name +dotnet_diagnostic.SA1638.severity = warning + +# SA1633: File should have header +dotnet_diagnostic.SA1633.severity = none + +# SA1404: Code analysis suppression should have justification +dotnet_diagnostic.SA1404.severity = none + +# SA1206: Declaration keywords should follow order +dotnet_diagnostic.SA1206.severity = none + +# CA1040: Avoid empty interfaces +dotnet_diagnostic.CA1040.severity = none + +# RCS1012: Use explicit type instead of 'var' +dotnet_diagnostic.RCS1012.severity = none + +# RCS1008: Use explicit type instead of 'var' +dotnet_diagnostic.RCS1008.severity = none + +# CA1725 +dotnet_diagnostic.CA1725.severity = none + +# RCS1009: Use explicit type instead of 'var' +dotnet_diagnostic.RCS1009.severity = none + +# SA1402: File may only contain a single type +dotnet_diagnostic.SA1402.severity = suggestion + +# CA1711 +dotnet_diagnostic.CA1711.severity = none + +# CA1720: Identifier contains type name +dotnet_diagnostic.CA1720.severity = none + +# IDE0022: Use block body for methods +dotnet_diagnostic.IDE0022.severity = none + +# SA1011: Closing square brackets should be spaced correctly +dotnet_diagnostic.SA1011.severity = none + +# CA1721 +dotnet_diagnostic.CA1721.severity = none + +# SA1313: Parameter names should begin with lower-case letter +dotnet_diagnostic.SA1313.severity = none + +# SecurityIntelliSenseCS: MS Security rules violation +dotnet_diagnostic.SecurityIntelliSenseCS.severity = suggestion + +# SA1123: Do not place regions within elements +dotnet_diagnostic.SA1123.severity = none + +# RCS1046: Add suffix 'Async' to asynchronous method name +dotnet_diagnostic.RCS1046.severity = warning + +# SA1625: Element documentation should not be copied and pasted +dotnet_diagnostic.SA1625.severity = none + +# SCS9999 +dotnet_diagnostic.SCS9999.severity = none + +# RCS1090 Add call to 'ConfigureAwait' +dotnet_diagnostic.RCS1090.severity = none + +# RCS1170 Use read-only auto-implemented property +dotnet_diagnostic.RCS1170.severity = none + +# SA1649 +dotnet_diagnostic.SA1649.severity = none + +# RCS1021 Use expression-bodied lambda. +dotnet_diagnostic.RCS1021.severity = none + +# RCS1047 Remove suffix 'Async' from non-asynchronous method name. +# dotnet_diagnostic.RCS1047.severity = silent + +# SA1600 Elements should be documented +dotnet_diagnostic.SA1600.severity = silent + +# CS1591 Missing XML comment for publicly visible type or member +dotnet_diagnostic.CS1591.severity = none + +# SA1602: Enumeration items should be documented +dotnet_diagnostic.SA1602.severity = none + +# CA1720 Identifier 'Decimal' contains type name +dotnet_diagnostic.CA1720.severity = none + +# SA1601: Partial elements should be documented +dotnet_diagnostic.SA1601.severity = silent + +# CA1711 Rename type name UserEventHandler so that it does not end in 'EventHandler' +dotnet_diagnostic.CA1711.severity = none + +# CA1307: Specify StringComparison for clarity +dotnet_diagnostic.CA1307.severity = none \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..14b7856 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms +open_collective: fullstackhero +custom: ['https://www.buymeacoffee.com/codewithmukesh'] diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..03ec545 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "nuget" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml new file mode 100644 index 0000000..31607fa --- /dev/null +++ b/.github/workflows/dotnet.yml @@ -0,0 +1,25 @@ +name: .NET + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Setup .NET + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 6.0.x + - name: Restore dependencies + run: dotnet restore + - name: Build + run: dotnet build --no-restore + - name: Test + run: dotnet test --no-build --verbosity normal diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8afdcb6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,454 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# JetBrains Rider +.idea/ +*.sln.iml + +## +## Visual Studio Code +## +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json diff --git a/.template.config/icon.png b/.template.config/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9fa41873a242c485b6b8570e273e8246be3259 GIT binary patch literal 153939 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%0A&u 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[YRGava~CQ`0J#idFCTB7Mm6Cy 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 b46BggvoE43D^m*Khv?fQGX5 literal 0 HcmV?d00001 diff --git a/.template.config/ide.host.json b/.template.config/ide.host.json new file mode 100644 index 0000000..837778b --- /dev/null +++ b/.template.config/ide.host.json @@ -0,0 +1,5 @@ +{ + "$schema": "http://json.schemastore.org/vs-2017.3.host", + "order": 0, + "icon": "icon.png" +} \ No newline at end of file diff --git a/.template.config/template.json b/.template.config/template.json new file mode 100644 index 0000000..5fbff2b --- /dev/null +++ b/.template.config/template.json @@ -0,0 +1,51 @@ +{ + "$schema": "http://json.schemastore.org/template", + "author": "Mukesh Murugan", + "classifications": [ + "Blazor", + "WASM", + "WebAssembly", + "Clean Architecture", + "Boilerplate", + "macOS", + "Windows", + "Cloud", + "Web" + ], + "tags": { + "language": "C#", + "type": "project" + }, + "identity": "FullStackHero.BlazorWebAssembly.Boilerplate", + "name": "Blazor WebAssembly Boilerplate - FullStackHero", + "description": "Clean Architecture Boilerplate Template for .NET 6.0 Blazor WebAssembly built for FSH WebAPI with the goodness of MudBlazor Components.", + "shortName": "fsh-blazor", + "sourceName": "FSH.BlazorWebAssembly", + "preferNameDirectory": true, + "sources": [ + { + "source": "./", + "target": "./", + "exclude": [ + ".template.config/**" + ] + } + ], + "primaryOutputs": [ + { + "path": "./" + } + ], + "postActions": [ + { + "description": "Restore NuGet packages required by this project.", + "manualInstructions": [ + { + "text": "Run 'dotnet restore'" + } + ], + "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025", + "continueOnError": true + } + ] +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..cfcc0fe --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,12 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Launch and Debug Standalone Blazor WebAssembly App", + "type": "blazorwasm", + "request": "launch", + "cwd": "${workspaceFolder}/src/Host", + "url": "https://localhost:5002" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..fe20a1c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "razor.disableBlazorDebugPrompt": true, + "cSpell.words": [ + "Blazored", + "borderradius", + "Upto" + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..444731d --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/src/Host/Host.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/src/Host/Host.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "${workspaceFolder}/src/Host/Host.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..35a60b8 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,27 @@ + + + + $(MSBuildThisFileDirectory)dotnet.ruleset + false + false + true + $(OutputPath)$(AssemblyName).xml + true + enable + enable + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + \ No newline at end of file diff --git a/Directory.Build.targets b/Directory.Build.targets new file mode 100644 index 0000000..fd9797b --- /dev/null +++ b/Directory.Build.targets @@ -0,0 +1,5 @@ + + + $(OutputPath)$(AssemblyName).xml + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..52246cd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base +WORKDIR /app +EXPOSE 80 +EXPOSE 443 + +FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build +WORKDIR /src + +COPY ["src/Host/Host.csproj", "src/Host/"] +COPY ["src/Shared/Shared.csproj", "src/Shared/"] +COPY ["src/Client/Client.csproj", "src/Client/"] +COPY ["src/Client.Infrastructure/Client.Infrastructure.csproj", "src/Client.Infrastructure/"] + +RUN dotnet restore "src/Host/Host.csproj" + +COPY . . +WORKDIR "/src/src/Host" + +RUN dotnet publish "Host.csproj" -c Release --no-restore -o /app/publish + +FROM base AS final +WORKDIR /app + +COPY --from=build /app/publish . + +ENTRYPOINT ["dotnet", "RewardsPlus.BlazorWebAssembly.Host.dll"] \ No newline at end of file diff --git a/FSH.BlazorWebAssembly.nuspec b/FSH.BlazorWebAssembly.nuspec new file mode 100644 index 0000000..215e16a --- /dev/null +++ b/FSH.BlazorWebAssembly.nuspec @@ -0,0 +1,25 @@ + + + + FullStackHero.BlazorWebAssembly.Boilerplate + Blazor WebAssembly Boilerplate - FullStackHero + 0.0.1-rc + Mukesh Murugan + + Clean Architecture Boilerplate Template for .NET 6.0 Blazor WebAssembly built for FSH WebAPI with the goodness of MudBlazor Components. + + en-US + MIT + 2021 + https://fullstackhero.net/blazor-webassembly-boilerplate/general/getting-started/ + + + + + cleanarchitecture clean architecture blazor mukesh codewithmukesh fullstackhero solution csharp wasm webassembly mudblazor + ./content/icon.png + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6599f6d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 fullstackhero + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..10be676 --- /dev/null +++ b/README.md @@ -0,0 +1,82 @@ +[![GitHub](https://img.shields.io/github/license/fullstackhero/blazor-wasm-boilerplate?color=2da44e&style=flat-square)](https://github.com/fullstackhero/blazor-wasm-boilerplate/blob/main/LICENSE) +[![Discord](https://img.shields.io/discord/878181478972928011?color=%237289da&label=Discord&logo=discord&logoColor=%237289da&style=flat-square)](https://discord.gg/yQWpShsKrf) +[![Twitter](https://img.shields.io/twitter/follow/codewithmukesh?color=1DA1F2&label=Twitter&logo=Twitter&style=flat-square)](https://twitter.com/codewithmukesh) + +

+ fullstackhero +

+ +# Blazor WebAssembly Boilerplate +Built with .NET 6.0 and the goodness of MudBlazor Component Library. Incorporates the most essential Packages your projects will ever need. Follows Clean Architecture Principles. + +## Goals + +The goal of this repository is to help developers / companies kickstart their Web Application Development with a pre-built Blazor WebAssembly Boilerplate that includes several much needed components and features. + +> Note that this is a frontend / client application only! The backend for this application is available in a seperate repository. +> - Find fullstackhero's .NET 6 Web API Boilerplate here - https://github.com/fullstackhero/dotnet-webapi-boilerplate + +## Prerequisites + +- Make sure you have the API Running. Here is FSH Backend - https://github.com/fullstackhero/dotnet-webapi-boilerplate +- Once fullstackhero's .NET 6 Web API is up and running, run the Blazor WebAssembly Project to consume it's services. + +## Getting Started + +Open up your Command Prompt / Powershell and run the following command to install the solution template. + +```powershell +dotnet new --install FullStackHero.BlazorWebAssembly.Boilerplate +``` +or, if you want to use a specific version of the boilerplate, use + +```powershell +dotnet new --install FullStackHero.BlazorWebAssembly.Boilerplate::0.0.1-rc +``` +This would install the `fullstackhero Blazor WebAssembly Boilerplate` template globally on your machine. Do note that, at the time of writing this documentation, the latest available version is **0.0.1-rc** which is also one of the first stable pre-release version of the package. It is highly likely that there is already a newer version available when you are reading this. + +> *To get the latest version of the package, visit [nuget.org](https://www.nuget.org/packages/FullStackHero.BlazorWebAssembly.Boilerplate/)* +> +> *FullStackHero.BlazorWebAssembly.Boilerplate is now in pre-release state. You can find the latest version on NuGet.org* + +**FullStackHero.BlazorWebAssembly.Boilerplate::0.0.1-rc is compatible only with FullStackHero.WebAPI.Boilerplate::0.0.6-rc and above.** + +Get the .NET WebApi Boilerplate by running the following command + +``` +dotnet new --install FullStackHero.WebAPI.Boilerplate::0.0.6-rc +``` + +For more details on getting started, [read this article](https://fullstackhero.net/blazor-webassembly-boilerplate/general/getting-started/) + +## Community + +- Discord [@fullstackhero](https://discord.gg/gdgHRt4mMw) +- Facebook Page [@codewithmukesh](https://facebook.com/codewithmukesh) +- Youtube Channel [@codewithmukesh](https://youtube.com/c/codewithmukesh) + +## Contributors + +Submit your PR and join the elite list! + + + + + +## License + +This project is licensed with the [MIT license](LICENSE). + +## Support :star: + +Has this Project helped you learn something New? or Helped you at work? +Here are a few ways by which you can support. + +- Leave a star! :star: +- Recommend this awesome project to your colleagues. 🥇 +- Do consider endorsing me on LinkedIn for ASP.NET Core - [Connect via LinkedIn](https://codewithmukesh.com/linkedin) 🦸 +- Or, If you want to support this project in the long run, [consider buying me a coffee](https://www.buymeacoffee.com/codewithmukesh)! ☕ + +
+ +black-button diff --git a/RewardsPlus.BlazorWebAssembly.sln b/RewardsPlus.BlazorWebAssembly.sln new file mode 100644 index 0000000..2c94ebb --- /dev/null +++ b/RewardsPlus.BlazorWebAssembly.sln @@ -0,0 +1,62 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31808.319 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Host", "src\Host\Host.csproj", "{CB2F88F0-F072-420C-9B43-162C2C0773F5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Client", "src\Client\Client.csproj", "{D5DB6E8A-0161-4EF1-B4D9-467E9A7EF9A7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Shared", "src\Shared\Shared.csproj", "{0D7A7E2D-CCF4-496E-9F2B-141712F4C00F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Client.Infrastructure", "src\Client.Infrastructure\Client.Infrastructure.csproj", "{28E5DFC7-A05B-40DB-9E35-AC1E84C008A2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F6BE3160-F6ED-4E11-A33F-063DD9186D84}" + ProjectSection(SolutionItems) = preProject + .dockerignore = .dockerignore + .editorconfig = .editorconfig + .gitignore = .gitignore + Directory.Build.props = Directory.Build.props + Directory.Build.targets = Directory.Build.targets + Dockerfile = Dockerfile + dotnet.ruleset = dotnet.ruleset + global.json = global.json + stylecop.json = stylecop.json + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{F529F1FF-B2FD-46D5-80A1-D4C726230E40}" + ProjectSection(SolutionItems) = preProject + scripts\nswag-regen.ps1 = scripts\nswag-regen.ps1 + scripts\pull-shared-from-webapi.ps1 = scripts\pull-shared-from-webapi.ps1 + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CB2F88F0-F072-420C-9B43-162C2C0773F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CB2F88F0-F072-420C-9B43-162C2C0773F5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB2F88F0-F072-420C-9B43-162C2C0773F5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CB2F88F0-F072-420C-9B43-162C2C0773F5}.Release|Any CPU.Build.0 = Release|Any CPU + {D5DB6E8A-0161-4EF1-B4D9-467E9A7EF9A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5DB6E8A-0161-4EF1-B4D9-467E9A7EF9A7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5DB6E8A-0161-4EF1-B4D9-467E9A7EF9A7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5DB6E8A-0161-4EF1-B4D9-467E9A7EF9A7}.Release|Any CPU.Build.0 = Release|Any CPU + {0D7A7E2D-CCF4-496E-9F2B-141712F4C00F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D7A7E2D-CCF4-496E-9F2B-141712F4C00F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D7A7E2D-CCF4-496E-9F2B-141712F4C00F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D7A7E2D-CCF4-496E-9F2B-141712F4C00F}.Release|Any CPU.Build.0 = Release|Any CPU + {28E5DFC7-A05B-40DB-9E35-AC1E84C008A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {28E5DFC7-A05B-40DB-9E35-AC1E84C008A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28E5DFC7-A05B-40DB-9E35-AC1E84C008A2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {28E5DFC7-A05B-40DB-9E35-AC1E84C008A2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {175E8AA9-2BB6-41F9-ACE9-71733ED6EDFD} + EndGlobalSection +EndGlobal diff --git a/blazor-wasm-boilerplate-main/.dockerignore b/blazor-wasm-boilerplate-main/.dockerignore new file mode 100644 index 0000000..3729ff0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/.dockerignore @@ -0,0 +1,25 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/.editorconfig b/blazor-wasm-boilerplate-main/.editorconfig new file mode 100644 index 0000000..c426b48 --- /dev/null +++ b/blazor-wasm-boilerplate-main/.editorconfig @@ -0,0 +1,158 @@ +root = true + +[*] +roslynator_accessibility_modifiers = explicit +roslynator_use_anonymous_function_or_method_group = anonymous_function|method_group +roslynator_enum_has_flag_style = method +roslynator_object_creation_type_style = explicit|implicit|implicit_when_type_is_obvious + +indent_style = space + +trim_trailing_whitespace = true + +insert_final_newline = false + +[*.md] +trim_trailing_whitespace = false + +[*.json] +indent_size = 2 + +[*.cs] +dotnet_sort_system_directives_first = true:warning + +csharp_style_namespace_declarations = file_scoped:warning + +csharp_style_var_for_built_in_types = false:warning + +csharp_style_var_when_type_is_apparent = true:warning + +csharp_style_var_elsewhere = true:warning + +csharp_new_line_before_members_in_anonymous_types = true:warning + +# SA1623: Property summary documentation should match accessors +dotnet_diagnostic.SA1623.severity = none + +# SA1101: Prefix local calls with this +dotnet_diagnostic.SA1101.severity = none + +# SA1642: Constructor summary documentation should begin with standard text +dotnet_diagnostic.SA1642.severity = none + +# SA1309: Field names should not begin with underscore +dotnet_diagnostic.SA1309.severity = none + +# RCS1194: Implement exception constructors. +dotnet_diagnostic.RCS1194.severity = none + +# SA1000: Keywords should be spaced correctly +dotnet_diagnostic.SA1000.severity = none + +# SA1124: Do not use regions +dotnet_diagnostic.SA1124.severity = none + +# SA1413: Use trailing comma in multi-line initializers +dotnet_diagnostic.SA1413.severity = none + +# SA1201: Elements should appear in the correct order +dotnet_diagnostic.SA1201.severity = suggestion + +# SA1638: File header file name documentation should match file name +dotnet_diagnostic.SA1638.severity = warning + +# SA1633: File should have header +dotnet_diagnostic.SA1633.severity = none + +# SA1404: Code analysis suppression should have justification +dotnet_diagnostic.SA1404.severity = none + +# SA1206: Declaration keywords should follow order +dotnet_diagnostic.SA1206.severity = none + +# CA1040: Avoid empty interfaces +dotnet_diagnostic.CA1040.severity = none + +# RCS1012: Use explicit type instead of 'var' +dotnet_diagnostic.RCS1012.severity = none + +# RCS1008: Use explicit type instead of 'var' +dotnet_diagnostic.RCS1008.severity = none + +# CA1725 +dotnet_diagnostic.CA1725.severity = none + +# RCS1009: Use explicit type instead of 'var' +dotnet_diagnostic.RCS1009.severity = none + +# SA1402: File may only contain a single type +dotnet_diagnostic.SA1402.severity = suggestion + +# CA1711 +dotnet_diagnostic.CA1711.severity = none + +# CA1720: Identifier contains type name +dotnet_diagnostic.CA1720.severity = none + +# IDE0022: Use block body for methods +dotnet_diagnostic.IDE0022.severity = none + +# SA1011: Closing square brackets should be spaced correctly +dotnet_diagnostic.SA1011.severity = none + +# CA1721 +dotnet_diagnostic.CA1721.severity = none + +# SA1313: Parameter names should begin with lower-case letter +dotnet_diagnostic.SA1313.severity = none + +# SecurityIntelliSenseCS: MS Security rules violation +dotnet_diagnostic.SecurityIntelliSenseCS.severity = suggestion + +# SA1123: Do not place regions within elements +dotnet_diagnostic.SA1123.severity = none + +# RCS1046: Add suffix 'Async' to asynchronous method name +dotnet_diagnostic.RCS1046.severity = warning + +# SA1625: Element documentation should not be copied and pasted +dotnet_diagnostic.SA1625.severity = none + +# SCS9999 +dotnet_diagnostic.SCS9999.severity = none + +# RCS1090 Add call to 'ConfigureAwait' +dotnet_diagnostic.RCS1090.severity = none + +# RCS1170 Use read-only auto-implemented property +dotnet_diagnostic.RCS1170.severity = none + +# SA1649 +dotnet_diagnostic.SA1649.severity = none + +# RCS1021 Use expression-bodied lambda. +dotnet_diagnostic.RCS1021.severity = none + +# RCS1047 Remove suffix 'Async' from non-asynchronous method name. +# dotnet_diagnostic.RCS1047.severity = silent + +# SA1600 Elements should be documented +dotnet_diagnostic.SA1600.severity = silent + +# CS1591 Missing XML comment for publicly visible type or member +dotnet_diagnostic.CS1591.severity = none + +# SA1602: Enumeration items should be documented +dotnet_diagnostic.SA1602.severity = none + +# CA1720 Identifier 'Decimal' contains type name +dotnet_diagnostic.CA1720.severity = none + +# SA1601: Partial elements should be documented +dotnet_diagnostic.SA1601.severity = silent + +# CA1711 Rename type name UserEventHandler so that it does not end in 'EventHandler' +dotnet_diagnostic.CA1711.severity = none + +# CA1307: Specify StringComparison for clarity +dotnet_diagnostic.CA1307.severity = none \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/.github/FUNDING.yml b/blazor-wasm-boilerplate-main/.github/FUNDING.yml new file mode 100644 index 0000000..14b7856 --- /dev/null +++ b/blazor-wasm-boilerplate-main/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms +open_collective: fullstackhero +custom: ['https://www.buymeacoffee.com/codewithmukesh'] diff --git a/blazor-wasm-boilerplate-main/.github/dependabot.yml b/blazor-wasm-boilerplate-main/.github/dependabot.yml new file mode 100644 index 0000000..03ec545 --- /dev/null +++ b/blazor-wasm-boilerplate-main/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "nuget" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" diff --git a/blazor-wasm-boilerplate-main/.github/workflows/dotnet.yml b/blazor-wasm-boilerplate-main/.github/workflows/dotnet.yml new file mode 100644 index 0000000..31607fa --- /dev/null +++ b/blazor-wasm-boilerplate-main/.github/workflows/dotnet.yml @@ -0,0 +1,25 @@ +name: .NET + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Setup .NET + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 6.0.x + - name: Restore dependencies + run: dotnet restore + - name: Build + run: dotnet build --no-restore + - name: Test + run: dotnet test --no-build --verbosity normal diff --git a/blazor-wasm-boilerplate-main/.gitignore b/blazor-wasm-boilerplate-main/.gitignore new file mode 100644 index 0000000..8afdcb6 --- /dev/null +++ b/blazor-wasm-boilerplate-main/.gitignore @@ -0,0 +1,454 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# JetBrains Rider +.idea/ +*.sln.iml + +## +## Visual Studio Code +## +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json diff --git a/blazor-wasm-boilerplate-main/.template.config/icon.png b/blazor-wasm-boilerplate-main/.template.config/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9fa41873a242c485b6b8570e273e8246be3259 GIT binary patch literal 153939 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%0A&u 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[YRGava~CQ`0J#idFCTB7Mm6Cy z3J`Cm107KE&L^0)S))_a`NKF$b^tLp%<0f>8%D+Q3%1L+HFj=SeSrNQbjOz$>`+=B z0jbHfW{&&9Oe(eaf-%zOweK}CYUcvVm$W)?fXO`|GAKJjC;T3;MK=!^-_~iQ+lviA zV_b7JLT3zT*?keZN2>3GTl>Kc;~>+vfH8&!dby4b*$76Lae<1GS!IsZlk% zq-Pf&Qq|z5O>s-teAto~EjV^6H33K@W9l}y+dx=r?4df}vE~LmxbA6!b%bEtDGwx5 z(tP9cCvOjr)r`r%&mD~Y8jkz>HaDbu9*VebQRvRbsdTl`Ec@1XC@?}FKl06@HgxD|7Xl${Xg zVV4i64YU~k7@Q3tnoxMcP$*+$I};&G7R1-bx8_WgxZuTeK#8Oaph3?im`uS8b*X{i z_xLzFP1Tgh8jrfX}bnX zCWzo=jI(VDUjVMkOL}9*%i2*gBmDq>YB_Y z@&VHI%}x*%v?8K{6?gVGnTc{`R<4mit=a11tvi!kVJue0jjBXWa32sZJur{xJptau z8bBk*3*B0*mZl_c5uhyF3v(A-^QZwq1C#K>Ra5dV7@1ssJZ_kz;sSXIpdYzzM&s?} z@@u%FKUVIy67Qd-a2AHo$R9P-+y{F&r-G7798am*Xtd^;e}3AP%4Hhm0SGNEfUFh< zK$j;%@bqpQ2KoCF^zYQ{HPqw%yCw(f6FuVU=MHgXMer?0p=%lW)A2v|^wsUtg-uJJ z8Kc)4zCA~XtMvQEN$`~ZODwN@f4!9Km*-UTIKAyba?0!I;nG! z)1v)Y_QQBHO#lYM^9hsS7;hDBpwkN^aCYa9yGHq|_weo%0ru{>=?c>5Mv#WYUA{A@U$AA%j>b$^t-bntqIbY&rcx zM*5x5P3jq+#}{^90qg5CH}_iZ2Eax+-~4r6DKg{_2^`mUK(?A4z1DCbo1*Qx}C z`Mb+C`n~m-9n~J*JQ`|w>t;+cjcbkY&NF&{*P2V^y+*BBtluC}eb%Cu21Xi2-2#Tj zpx<2RZ4Ms8nQtw1NGEOm2UNL@xBr)dLCza!cx+&~_2M_h!l@7}4;6{oxE#P{8R@+b z)Ty`m#e=3hnizNgbkw3#h0W}JXbN+2H5n~7`pKw>ozli{%Y#17{dcf;&J(9!_JZ-- zmCXVt2u+rD4*HaAfGrrm37JDo-j)q8IwpIa;fEt_vJdz-fVt2kV=jteXMM_)=KRM* zVAU6HfMI_T1$`lQbs7n5{e<;p4HvI*v-+8lgZ$cMU`Ad&b_UmBC-@TfF>STFS}bV8g<< zjB0S0Q~UB#F(624K+8;EzC+wpjmuf2{mBXEib_z4x*bq(8M)bZL*sj`Snzpldt;?# zc)a|WR-?|d5>@NG(&uAZp?jj9FCD=}q(1L6j7YAFU=Qe?v#eOZ*ZvRs6LJZf9YY5W zA$!zf`qePXzukYr>hfd}<)?d{y!WRabJYi*%w5Uryk^nDvDz`!pKkpS&U6CC6i%eMT4}-_1>Mg!2F$TG~gg&FnbNS z7cODov3jBqDzkEn&#i+-K4QH+{`I=HY_)0sp7$51nv z;Wp%jr^7&D0$oTcPdP!n^?&$pVcLPvhhl&q2c|G3`H}qmAcK}90T(d6k3@kjP7YQp zLk9O!8*Km)DMF*I6_+jJtjuyeT#9!90wN+`lxX$=h;e(}#*Te&qhZu966h1dEuYZ5 z-$@AiG44+P?zU}G5Ku$9$T&A9O4S*3?Y`uiC!_EYwgTSJY1ZDT@jd!u zxUYv|+D2X>M?4889`AR?pg1EfK&)sbAeE%{FTj%7FWS4-m5C`rW?MVX{nv_T5&$SQ z5iZ%kJ|u_3Sj#zz&$JlRU$P6fk!u*pO)zuqJ@={=dbkEl;ZiqYnx{?`^_=o;u{aq| z-VeDA1MN?}39jMB*@M|zJ+;c8q1f_5_jd#B-fQlpubPpEQ8#?&1mGQj(no=M8-PF^ zzqj>TytrRZ7q?UC2~%LaywQ5DzS8mhqP2%dL^**4cHmo|5d%~DWc9tLZOaAQmEhsW zFSz2|Pnc#XCMyif@%YUa$*}fP$h~`VwJ_)EIh!J1C24CCzFbcMn|$B>X7gQ7uL3XH zKGg#?t-rMNEeF=Mi24`6fd{P+DR?KdtsE66H1+1b!FTjG2M@{XVY<^DpAKzu2n~4< z>4;NQu&lfpI_z6J|JtsF8EBRF+Zn@}CLJ;|9NTzQv2cyA)RS8~XWf+(L!Y3L>Y;CF zX5fq$XWC26r8L}3O|4&9v_hEA&fIj487oZm7QXlm_Jhj-#wkQIbb|{K--*6b?G`{m zYFjxN=_|9~)ya*Q?<)*;jbdm#P#5*;F~~amna{dxN4L2^li^KYsSmknvUzmCHKRQo z6MrwNzhhjsV4BbqCok&?Np@T_-AbDk(I}4XU|m>U-cBWgwMATN-GsTmhw%lO4vvu4 zSl`dhqI+)eaZtY+SBmq5>|6U}d8*HPE|32ywYg(84a*Aec{)fUm&2KOc zHS`TR?3t5gbt){Dp!3oOaT<0uS6rJSKy&uPhF|R;4xnN-0 z*ufJB|6S)Hzn>g>w$f|8dj98)_RXf{xY?VPpLXcrrW?znC@Bcm59y0IU!Ayq%A9_Gntb1)A#S;Mf;G9OR?GZ{&2p2s z+cg2|%+M%<=&!5dd?F^Zf)wZJpRYV-0G*se=E*uI@9NVxFR>U~&rjS<@-2y%hh4Lq z`uWIjE1bQ7r$D0)$qln1AVvR2qaOL7&XKH_+xR|5ysYVzhk`Dc=bjJv8fVUq4U&Yt0>$3dA zortWeN!uLTu_AEu*N{+v`1Saev2(gd#c4*P8-)m9{FczDr@R`T>*m&ygieCPev?TR z!=scdpL5)3`pvHj>JGWi1C2}J5gW0jZE!#ZElPXSi3{xN?^w41rL^9TVHBJ^UTcOn zI3g$k$el9D#OG6iYC3{OoBoZn99|-n2;7r@K6dX15!xkL1i996ymQdC8rH-*KDRnk zAqdQnQY>2{P~=(E?dyp?7s2$DueA5&qOh*vT$`I~h$fENAPg2YyM@zH8uQ}eZqH^_ zl`@j39ceR-Kt*T9T(NW?SA%rUq(=V(K;b>(4Bg$JeGeKQ%o)Sr$%omTtm*tf8!nqp zu8iEmbILOduE4PW{{9FL8Uuqwzzsb~mx0ru)Eu|VW0+o#CB`jmYg;sF)D&&@I)z?v z9cbQjFI0{4=Q~_e`%@{rcmrRzfei$C09g7r;Asz8%!4YXfE~{e6_Dj;z2v|htvU&0 zc?&od?f`oGYw%}zbp%g%St#N7!-DuSfnOc_1Idgqv-$|g=m9TROrr9d>CooZ^DRWO z7k2Wz(Q>Rn9DDHhfQ<9We*LrVqE4TZd}0#7_+f4sn<|gZDR)7o>SPcRUd1b*0p)UI$c8}w3iGL$3k8 zw!a;&X9MfXV1+Af(yTI-1Xv1>WBXEb)s$ZVn?83{pOnd zdj4tX%BZ$ZHnjtZ3D(n*1Iff)QRXj@n%0QaH1@JTx?P)h3-uNSi-GQ?+wO?U>GMwt z-0b0uP|XM=do3^4BD6U(Ce^I+A`oUBoH-KvYJ&?Bb}XM|e$THj(foUiGbTT>bPIwS zB%J@NwgP!37!iff%=QP4NHqiFY#|-wP=K`pP?pXdf%+N8`OW&^2_tF zT*Vm2aN#^}Fk7xv?=Z4(XA@HVU{AJpPuOoRl3#HH2K1ovcR>@AkFDMBZ}>2Na*^ZJ zs;gFl*gn5`P+FqujXB5(5FHVewP1*Vt zau?ARVxXoTtN%k2L|)GGpq+ibLWeq%$``hzEE>?Hx+de;K`P0=+bQP6iW9;qjLD&| zVZ5Wp|Kd8Zy944DEJa!f-}Yxbn!g=ZAM~0kr7r-d)5LCGcupkTRlR1VH5eRi8uA`h zob!o=X;12TbT;e?zRar|dJx%=2rxCBivp8L-|P>A-F+|aryxO7g1042`tTFx3OBE{ z5wDzMTSJ`PzX`B+n+%Bkq$?tV+fXu(=U$(q3?Ft&NjntStr#87?q38XfP~a8kh`IwM4u*0br#dSK6?n3v?)AvqoE&3)X-b6dRB<>~IM3cj{S(z^~RsHTVGUq8^0Uxz(?|2Uw@jy2W<*9(mkI7Wn}Z!_Z< zAlbWfqR>MM4oZo_RHUWlOdH9m!l3^Z<_JIi#3jky;EjUS3Q(94@0gvwQ)c-H`wuVZ zmvpa>RZxvBz&U$Ii7$9P#lnn1#lr!zpE2I(c(btJ*h-nArg^|v0;AQJBS*`26{pKBcO1rQ(ekUy&`O(AvE+HKxxm8c`i zhUH*j{y8okGN5q=h9A8?DR>H4l~Q%ylMie5`)=C3d#prv8o9?J$+_(P$|HTeabEu} zZA4mG0Ys{WvgIOwjFDNm)A4?v4f&$v&l092I1bYXCbPVO~U7&g)Kn-!FKf{jkC)8*#xgs!@anK%H|+gO;0Yu$a+8)jIe zqLHm_2NHs^A z(a@umvE;SO$NI&?-_mvt0%GfI1-D|QrJ&PbudAc;|L9r46$6mXZj`b#eX8nOT7}TW z-qMHIFw+yuTIqzf6^n=U6*17USCn(Sd#vC3YHoYZtmVkw=qCFXjR9(V1>;-bsuzn6 z@*;fto5A`Y(Oob|MY3={(5GKZjt!YrEo!wA#+bDYyvK+t4c44ttuAoYNd7kS{XE5P zwkw2uKG$jw?PIX|P!W!e;TG*DPJS-0aG8Ht$qe0Bzu<`hzt2H^r(jpt45s&B^;qcL z|7=J#@TT#t=;>@ttgr@-`GdNG{we~jXRLIdV~^z35Pr@Xjpe|8 z20cEor$vz5)Zc?e92&t5<7RDZ34Tjk1j>SO*1|Eq$#i~!wApk^zhj1%>jHLylYP$ zq>+0RoX#8c)Cs%bUEeRapzIROKz*83DV}EtL9y$g6|4o)8>z z3vaL}wH15*=$$JfSeeK{p8+otm7VVTvuyHdZgV@!_*GV5yT*Qi#590;z|>kp>J_;X zT3=D=uCki%FFQilRCKE~`d6Pk*^MpaT?8nU< ztfDBcReGDgX|r@?qVIut1As~@`mo{Lz%An@&o)02{u%H^!ELoyrZ)NrpnP1abIkL9 zmMP2$L1IcruY3wBj2qnO^vW5dXDxx2-5(TmsDb!c(v>iq9jF+tN;<%k!Q^K0@O+tw zEq<^2C#SXe3iM}r-7dL3Q7kJWo`-V$=O7O(Y4Nq8D1)&i1?#z|L1`d7p&i|pc*5Dg z?j&1nOE{+6Bt}e#Bl*2tOd_IMhDnQb;>JT`@Ob&=0f`ozNllP<}!s|QtC z$6C0Hu7Ipe%#Q`SYLgr95>iiV^4ZtrdRiJN6JH2h2vO91jOaMXFLFr^XNP#gG!T#J zdRK!pkkk%wM=FY}>4E&jV<)aPX|^dtvy9Rpn=0fT`?o8;nluh#9Z%x0)M1^}&lEgbj3d zNAa_dUOi^ag)1Yf3}H*!&|kst`gTs5I;zI1UNnQ#cKh`^)F;2a115m$Wb{KB=qF>t zm9ea6c1P9U;A#F*Dk}gV8M5|O@|iOhtoZidZtmpWC8JGR+|PZ!+5uGQVAi1jR+c$G#2WTu_oIs%FjD5y+mr9p z$=UWgyxQEBqRrCku2SESPMUjT5n7^TBNaiof)mlx^|vc# z{5EpM--&ybY~MVi`Eob3DJQzOh)oKF<(kN!@`5adTV+gwJ05;zk&9xHHD9;5f6nH( zH;056BKnyTt2zPngarT^ba_gtaNG6~lb+~IUT`OGL=%I?VV&ZN)FOAT`={@Xdu zp`U_gmXMgDOUD}5yoWzSfQqteb$xP4WrX9J9wQQ7l3I!=YI886zvCA{V`{OkNNbl52^ncJfP($X> z9I#DhwWBWx`o8AV6hAUm)RG1Pid2u*&yegylZ*r#+ww;TifiJIob=-m*b_~0zF`z5 zn`WvNH)V_HgJ&1dxSgdD4D%#%pS+hH?F|NTXddr@W*f{QX2%ny*8XX>{Q-p7^h%+M zMPZfFmFH5|F6xz-VsH-X=2Hn_5)2EJr0Q_c2zfSfI%<6PE1>q!7;}cu_4w=p2)BL$ zOXXlFh&fqAn8}U*85ZO`sy=V1q3#24hhJaD1A^pk^Ez!w1^-DhCWD({L$`#;b_U8( zm{0K+B2zh)Lvke{*wO@Igg=F7Snp?3#l7QveMK<@LsVJe@U$Cp9GyF~9d~y}-rZ;0 zkua7*c(6gj-D}6u+IUw!2=G=REiIP0%ltxVmq^2D0?AgHZR$))2Wgmeaja z{!5{b6@sY1vWO{+v-y!ZVZQeCE%FpXh9u^=GC9_oXiQFML=|6OJ+#SKj?j-vvcnYT z4caXAWqVaG7VX112O1V83ojTg4@kXU+O;S|Y`0Rl70WcH6VFzneon&1mgl-c{(IFt zkD>1#-`NDJm|FWjhpP(v_WUXf>xY>>=u3IaXc@7A=J%g^eE~gCHzY{CO-N4PnHU9Q;KaypOK{lxTM8a?X#EBiLNJ39rw_HTrb7DL!6~8d zwKJ!~(%bx;ALWunA^23DxrE=kE~0sl%;N&anxo4nyMvSD zBgGRXcGc9Wp0nALt*74pP>pMs%vh~(j11RLa|^7B{8(%<)NRe>8=v^w}M|9^u86&2=B~t{WOj{^DjvH1Gkoe=&7_LbGI)W9-BQtc-LfOA-{NIqo&G2QoBG-M94}Y1g z{oTv~s)K%B0(N)|2UYVKggPJKpDfcYOBrWf8plvQy6C6&#s0WfOqA7k> z;j^7M!N?i&^J&(&{{Ik*14B9U%|+`{7uCunfFD zgBI#NM@{+sjhZ2Kd<-RyB!Y-9J}39`eRW+;M+t_M@Ox{Tggs;GO+OZAxEM=A4i z=cr#T9@M#iQT1!LA*~fV(^cKq$2<3T=%e!{kw2$uv6rM02K(sv z?NS$z_YAgmA4)>m%sNEO=cq+}l&^FXph*j<)X$%N6+XcQKI-k)L4AHq>xk}!hHYw+ zIoWT~S7D|wdE-mIKHNW6&SWQFpJh06dlUZXQ~E#PYc^SP7-$zK@7bZlx(}LcnCJBx zT^37$q5;a6jq6pZ8#ibK-j%PS+2vqAGLAc2S6tsO&hYw)Lf%Qm@8U`dVqFCm?JZod z4PG7rSbNsO7*50MY8a3OUDf@9N4?aCYpq_5dW1FumjoxXFM(s-6#J#7*2gPzgQIS$ z%>f`tzw^q(HvHkjEBUlyey(%-jCotUf2(5q z@`=|nGPsI+kV>?ug(Fhz9*E?VqsTlJFCxPap)=ez{=E zSNkb_*!PF|*{l4^T3seN<*@bK^=ctVNIHZPI+Altvr^u36GLC#AOeEsw1m>c(C~ec zn_5N2s`&(jo`a}lVoH$W{;6xj^c=m01JAnT^`osumD57?n1F4pS=#@E`F)_u|$#TcrmH8@^hQaY&QEW3{EXd1nfZI2^ve+!Kqok98J<+E2r`ovoi(9Xc>t}dRA{Vq zG(Y=ys3h|FsF<@9sqLRFm@mr6gsN#*b=o)tipgn*^9ZS^YlC-p9J)^N@-m+}&_cVT z#`Q2WU>_N2Xqo$TkiYt@CXJLe($(g&^Ej=?W}2Y`bl36vVd)S%E)%J5kAVcV?uH$Z z>u-8*5ju(_7Ufxg9sPdeH;1;(M&%Kk*Br!5(o5ZfuYwrIhcuunwu@TMu&dIDlxl*4 zUI4tHePAj6Zq11n0ypFgB%=U`n6r0MvAp%=+v5?=3+qDM;mx?40&yZMzf1EHoW{bD z)0kY}+;oL&?tg>1|CVA7?S)z;Olx=e>CC5P{T}KyT0IMp!~xyo_!1cRq(Ry7N}U@` znfaDc9%K=1#5ZMkvs9I4fp`QR&0J>4x4|6haYp3uG41e_{_+%YWTeZgT1^U@bGY* zgr;S8Fm-hJK5)b7hH}csIkJ}a9T2#G4O?)nMWetRE^aJ*k}vpIiDebBa#bDXv%dqC zQyGz%Ddd59ph)hr+}ow~#q``%0rf5Sc@Cz(Z#<9WcFGs(wDJyR;sWfR?0a6n4%Pc+Gxk&#C;Eg(|h`D|yZzf4GW!8#(6S9e-GQ zzI&UU1M9}P zOh=1ARs{MIv{!j|!%)@)H0V_oRcnhCAtSLViD)EGY-LY34No*s07a1q1YiynDrf2@BmR!i0R~ANB}NTG7(f! z|FYwfj11znGGi>SAWlUCiXFR`lzB*)=QtnU|6cAB<*qGiB|H)b;q}pJV+jzeg;la_ z&}n7yXy>Sa3Iddvy#=RKuUre(88DK75=@mSlMrx7z9=JQDdPsT8WF{xH89a8?}})e zL3Cs=P17?l zi7d)v&R-ulyPp=5n*KHi>`Z31kZ*1jQ{PLiZhqj(PdV6Rc!*CF=_axOnQ|+6s`I^N z_mEB;!Y)Oj!av(|Z1xj1=$CzGmZdGE{6dP$yBCm|UNm%X`Z$s`!;uoMsZa#M6On_R zD&dkaY1b3wQW|MS&MRU)eLozRaF#2_G&P(<+j38m<*o2<7Y9SF41F#){|;Io$M?x@ zb8Z%BY}cSU&=sx6t&EB%o#F(vkqI-y68~M|{gdm!Vt_e49H6BAa0_)w+s~oBc z7TShf;4a5&Sj~?|);OG>>O!1b%KUQOdGn_BBrqY=w^F)lM|s$_xe#Yz41a6WwLD9B zt4`G{^niv8-be6DSfs@P-sKm8Xwd33JVKk1!yEv(!V;5phrqf&Vi( zdj}F80}H04m6zi=2kjikaML*cY6J%{XtD95q4BsB!t5pkM1EVfNCKM?Lh9AL1LUF2 zgEL%;d9cDtObECuCD*@rUk2{z+#{&hAmH3HhC92L)|h5c;?=0O97`t2qWpqshUEfq zadg4G-43Tw*~Dr}ULhL~`dZNRO||MD5yhWf^HtPLjMV)rWMxyd1;QR+;uX7f#7meK z2I^31M}<`$)n_xMiF~XCdz_G&Jz>ok;2J+YxRqGq+7-5{f4L)VLtF{^cOe3|U={l+ zu4KZY6g<&R>{ju5@4ApO_Fok2aBIPY_LtUIQ{kzC{W?f>3|pF~in@;lIk+2XskxmW zKtekDAbnUJe`Pe&31Q5wx9b*ML94WR(2%l%I!U~@R{iffxtab24YN*IbG0ra^St5; zsfoR!*8>L9N1Sw4VDc~(O<57O)a4D~trz+lA> zp!P}hTvsJ0)cPaUh^5l~l=)53EUk3V^1v!)&#oAKxwNq9>hWA|nP zIQbiY0Dh%y-RDG?7ID*A*-sn}OL@LZpaGJXd7Bv31)iFjozqIM6@xCzTMMyBI7yzp zkqQLZrCs6o;9Dq!Cl`rj`Pj^qm#)PpWb!;f7h#cDUd!_8 z>*S>yeVuZP!m}Sv{w~G?au6agIxyYbfSDw2D><^=yh}@Q-#zKqb}@F*2f?i4wH!^` zaAw3lekw}$ON~d6s^fF%Qy{)bx>fOH8LZSusKyb93lW~KT!BV;GqQUZgx&jit_^e- zx{pn2IO*a*I&MgYJ=z|eKQ2ZF84f*CS1=~tn}Y$NHHF!1YJTgYn@Mc zTGGb(av!z^EzT8>#yeL}d#II2yv2NlOu-G=LEQe^16_X3-^`P6G9|zv`OPbEG+tEZU*#(-`JM(w3Gk0?*MzQtHz^a0~{#8>_ zMR8wE?RnW^r~>uLeV*iFVRE}$m`n83wEm^uFRT3Zgy`8)c9$ZV57v7lhw9wh_Q)LH<HYx7~W4BhM~4Buumb*0#Lm6eGMAvGIjXAXxh zS(}vudFGwF<#AJaVy1zcuubSW4oLNpk*WwnK*ugu~kFdcK-8|cCf`g3vpSjn~knz zE{tB=67u~aPLCwJSK-dwJPNOHQ^3yKMUE}s6%&NHX7VA`Y!58KW1#U)S~>}!!a}i^ zVC%_sn#|Wv?vheDB;Bsv&^AiR9w1~hQ{h_v|LwOKI_`>jV9(_jtcocv5Srfa-W0e8 z4tuoxlYNlSH~$8NWRL_@vR@zU1m9n=z^HyUt`_8K2Ex$kQc^IE1~Eh|^jZIXaM;YE zfqi2qq|r1T3rn}g;5T?zGzlPq9OIRNkfxA$5yS%+C zHDHjsKk9kvD2!}H6I+LT07d1^6ZmQ2eoRAHbLQ5rfBcWxB?@V4fEK=ZD4vCp$=M4t zUxnYO5-nXS$9WT*1_>{^yiy^L%cxfySyGyOY2?w4ER}HL({X|*p$0HPkBLGmn13>8 z9o*g(;j8QBvA?5*O^ib3CfEi?2)Zz4U(F(EBT_RI?>fVdtp$+b>dwUIKJW7RAT+Ti z2(1#8O)IKb4@f!27+7J~evXX3=qI^5sYzyOMZS36Q-HQ84uTMdu{F37vlww(Zxl@0R>g)@Se-(cs-C?It}g;@H@ACR-YCP{>+`!{aEeI4dOO1dhi&#(4Xn=+4G2E& z!(3<~FAa(@H^T*+aZF}4i>aF0-aWA4Yb)GA^X%HClLE&IXiOiry`AH~ss@zu^2YK7 z4}3XZLfE%O_Y3J9*Q_?@E6c++f;m#e6*2V2YO+76pd1i(v8m}dE1Cq^GW3z%fldwx z_1t1dkPtm2v&sGY|7DgFypS|Hf*k_XeSi*Be8~F7{zd@42ye8w0r83}L6rnizFoT76a+ z=Fj+TiYGOZtz_GAPtV0qWh5^WwKdbVsCtC#S_kL92A(h&@5Q`dPGduGtx@ZCBc|A_ zPZcIxn4?*O!w&gELA2zioR4+WJc}y62-kqNet7g}9dV{esB*1WYuGDVUogRJ0QT{I z9cR%(pmNieYzAo>9UQL9xs{8`sEbHTFTC+`K}q7T4|BTC&oXpsKmeW%+ymDHXpRj^ zxURwOu={s4T=%ZSt@A$)3F=E}DT6T}WQ5fX$OU;v;SB~R3NULvC*B~1u#;vf zNy9^gkU))~>+`##?llxNU;u14PWhVuSYi}3BUR*&I8%DB5~Muv(OCfzo_12aory#D zG7kZ!*=WHLElyGLG>v;MhUp5e&hy*q^D{mYro%i>F2{fyc6mS?|E~YX+}4AkB4(s> zcFV<_ylQ_4DZ+-*W=B0sRzl=#qzIjJ5+P%Nvvxb{Kt++fLkUtxJA}D+-K(oM3X)$F zFy4M$XR^H4ZanhJfoE`kD1{s8z$|36ZpdbOzy9Oua-Eh6X{O10wVm-`$&I!~TE5A? zP>UGd$uu_j$Jzty3+3vbv3XXP8f-XZOMY$0U2M2vKR44K`?Q&%ACL^5{Y#Tn!IoB% zo_|n|P^hJOlkLB!X=$8_ZJ3$VGMoPOWg8Fe*3PB-J=d(BUzSO^4aB3kBm7E5k%7B9MAcYIC0 z7fFEsKk7qN@oQ*Vs3@c>yYy_>j#M;DPF9Kd>FKef9bu;A!+u&k3K(bPu6Qg>G9htf z)~0ebS!z}MhfT6(Me+tmab(`#l^0PPb~Oa3$le~rtodd37wXdTMPeN(IR3!8!s7us z^YD_GYyV)}sL2~#onOnTA}O`E=1hIDwF`Yt+%e{4%oGBbkQ0*BV1FRr>Cjl^Q< zI~@pQEfG?-k&uF=u8J#F=$ff%4ZuJ5D7W>@$o>&6Gv@5py&yEOj3nMzR) zEY^Eq+|FU<#94Jq`YC1Q_viw zma2lj3c{K)4OR1LwOdJaCrz(NS=-F|lFjT5g+q0FkHG%8wF#E(Yx0L<9Y`ZxIU99z z%LWYoF%q@9IR27Hb;G75^}wGNh0UIx`2o3~a$>ifrI;4`u&Z9V*Zv${h?9F5@F1M! zffw}J7ve9RR@GXk*ewzsyG^U=xs!e9^QoS;#2K!5??pvt$uvq!cpFQ~6T#?UOc z5ev%Y=oPNSEo7C=kp{r2rR6euVXkR9RBdl0MP4IA^5Lr|5{wuGIYD}%t^*kxp>JSN zk(X)zSV=tl2A8~n!>ko4GlDb~#LVlq>%A1O@$KXpd(m*KAD756HMs%$E2~*E5zgUw zuRGaVNa8!+Um<54?t7Nb%5SXOY^Xf90m--Sk@ahowt@3JRAh2fHg{P1r)ujFV$Mc& z4$JY5)TP7}Ddj{S#A(i&g4&a;#a;dW?6326_HbzK`pB#=Fce?jb z-}NZ{UjK;wVC24s(OI;xJ>>_{eWEIfXrhusDy+}d^pt9i&`S*T*v2+^@Oq&!l1W{& zB_Tv*Q&F(%N+=|>%CBfKZ!FL;3skxa*e<`dUV$U2XDS?ybPgw+f~(9P%3^2o3%|@R zwZ1g#!`Lk@K89FDOl}FHS?&2dTuMM>+}x@FB(f`Z3>#C?GnC9rr2*v6&V0mbU(v+D z{(skls9iC($t<5HVB33tu0IvM9)U>a={^zMI!SAT{D8JNs7$D=F0kkxuZ70dg;&0< z&B`0o^HuJ+Ti%65A7+hD|FHZkbU^6PD=Cw=(X4da=DCITLtsXq;@B!hU3SWm8&2ZJr%~l>Od06PA`(H|PJ8#+4&LSIa^;q4j zSLg4NEgojnN2FULjrXoqIlH%Bz8T)2KN?NE^892-Fzk1WMXlf~7F_3Y|2`MD{v(sF zNCmg%_pgB#3K<<@i`7&4IvHk#q>7iiyw@EZ+LXw6Bz>B)@WvK-n+tMT6GVy*GGs55P^3($Dpj3_c@cgmK$boV2TDPjggkU|n+o^qyZ!^}%6o$3|9v>t1L(glP8NFhKKKUhsX zg5((JikcmT7uzIgz;!Wmun&y4uIJz8lu0(Cqz#H1JMRXn<}Q`osPX_#?5SK;k0Sii zc+T|t_lUkd)3a;k8Z$yX5p*{TP1N?Xym)^aF2R-XWP`$J_qpj=aq$;(>FyUla=lJ{>5)UH)*jit;}qZ7fE#L(D)R3uT(;ljq?HYrwW&agaeu4V8ST+sv<)wI zs;YPUd$k`_F7fn~J99oG{cNY7?9Zotyh4)4o)Gh3_a>yfAhH>=NTS_bhILWvKPkxS zDmv{W&QH-51eI>@+iTP|j3NYl`O&U!PyM~vhMKP-Z70m9zK>pLSw6o)XTM4XK9q2z z96yDFtcBcQnSJhujmqX1z2T(N@v8B{oSSSolg~~br#(RU^xO!*K28q579e2rmI;yg zS;%AIx6T0Mv`*WVi(j^>t}nF)m<+o9`pGPwHlZV!@VQVQv%{`;7yGTUt8aAUo_)K# zgBAbac3TyAg+W%ptsLhtYfW6}%JG=%r6}v(9hHJLmcH2e-fG6pR6wr^(xUx-*=oQ( z3~RmiOAM5w=!iLX$d%P99>taa)~lin55lKk*NB=~b_yIUgEKJ!qa9PM|C~_ywL8Mo zU~e>5lhO-ef28%wqLdhk+VuaTMFuNoiEMq3aQ8SS6C!_c+GeEbMbheYREl>rMAvu zs#siYXnq?*JavP2N$XkAU4xaBp_44U0S#hg-EP zw?Xl>`?czNo`rU*J&QT!!Rpv zI^KN#=v3T|(JyLq^&byms=OD+T4%i8>YMYnp4;!KmpQV4>k&C_Kj!GWA*rsHc0HY4 zT0JCzBYVj`lUf-qH9u|2ACtc(U+<{i zYUo1Qzm-|eXhFB;#v&=w$HhVIZiv*@LS?PnpM z#tg;aqYwEOt<_@m@e>c5z3}y4zM63c{DdEJ_wD@gC`A$W!lnh~l<|1Z1}fJ}73D%M zbK`@Ot`5tSLYNvCSM!R{pj7^i=&1yP7bO=a;>i^2q7KDE>#x<1>(kq`?lmhDh)LPA zmx2n=@?^#62jv68?=u&EPW%`)$y=!+*;Kh_{p=7dI}k9(6z!M>+%)g|sikPOY zg}GBad2r{oflh4c!s-)dNzy=Z#4~^Fqm-6n@d)~hH?WE8j)6PW$1qc;5;zv@EizxM zczgZqm#;$S?~5{*3L*O@AH<%r{VrYVWx)0P&iwL^k3Q@$`+qgCzQEyR{?S7(q}b}> zOE+cyFO1kZ&q~Zzq!qj`R4k$&XmfG94j4@ zH2n@4jrTp+ED4wSk85%}eU^x}Qhqy>-_NIbS03WWlNeEkXYd0Qs0T+MwkvaaxX01< zrd5?Y8BL`NF+~9=`O@OIaePYuE>5w7YR;$m^@Q?$7Y)#KyJ$5O!;PG0_>mo+V$(2w;UFgVtq#?pB2Ha z&g*>G0@le-bg9ZrQ%g5i)`%>E16!{O??K`Bj0@HEGbX%}D@{HTffepN_w^O-7O#sZ zpVwt7GCNXaMO9?JH)4DTrGcjZ4fh;f_j#g$J_+{}H&R|X?waOTH7_o3Eu%@O0^%j9 zLz{AZmEQ`q%WrWaMQ!(%`&GtqZ2Am zAraM8yyJHJMkCYngx51!ISetP&cioVM`zh1$+xU9oH_5d*shp~l&@Xxdm5ff;(O6d zky1-|9prtuX?sptUD)aEq|O_G&oytLLS}H~ZVYuzwKi0_Ek%x9xPZN@cTzI&$sQ$X z^?nZpL(L-J9ztgKbzbd4$)k(=8=GQWjs9PISN@h{*7vP3%UmZdeKd8Rnli^mb8^d# zQ7fk$w4?^d1uQf7EkzR-baHvJl$vZPamh*zH^e0sMNLghaw$bzLNmq<6-p!mM4yA& z%==!~dtL88Fz2V63%JjHzRTzH{eJJW_y~$brw(qQ+m#(T>SJN$(F;pAban2bg&8A% zfg9d)8=4XZ&rnD14gedz!qR0~Z zYY!>5*U#9>6yrUe6bLt{&%d-mUk9Pz5Uqk*_>AQ?sHpH=`aTGS zTopD^NVvn+jb2~G;uR}+ruj6j_4=g~h{I()y*hCmcZa-xRq&RE39?)i^!;EsJ~fOb zp%z?5=LhN<)3)*4cj-;8EF?1S3JZcTw{dmV%80n08h+@Tl1ysfn9La{=d3lNF3K+b zVgcRV(mZ~(K^&H?{(AHutV^VI%KFwt{xKh4oN?!>XJHOzviCw|?w%|;& z4E#{zoMyB}yNbw!;RK-Tk0HdpSYgHl1I=&ib_GERtSx29BS31mTp4S8|I<(XOg zJbCRNpZ7-IDaNzgA^28yJZBfy8tQ zW>#ON90y-Wq*fiK0=yb6$0OrJ-3z{K-4VqJ$!18OEFl-RELbF|*b2fTL*}YSM9!-s z7||pr`^{cO6Ml7Bb4()*I%%3QIoek<&@*{TXhTq+jtGRowR6$40)8ju_$3cD5oz^v&_zmys!ny zCK(CW$w(j}qZ+|52=M}T6`S6G*(IO3W^OvZoT1AxPUSDrgZY29-{s*d0P0N&TH<$! zEUi#3^Mw|;T?fz4;1L7M+R(ths-G$6Zl<=c-kygWSk)X^OA(zavXM%RZ{zIBi1-Ge zp5`N+)G=wOX5Uz<6e`IDaFe?OLr8Nxk%t{eAjk<5YB-xH$jd=+qOg<{UomOGx=elQ zD0KkN!Eo@-+MyOE7iHE%E8u?$cs#0EzWEwuqQ!=NU>|ev z0b#|eR&jLD;Yxp&538{3Q2Kq|m?PggA2OM6B~2)~|2xFKF!J`@CrCq$4J$9^baX6h zA`?QaH`u0DZ?C0x<1c;+q>l$PCjax$Rp)S-Rm2<#m*i~?9MVFF-;?t%u_RMO6JzhR&W*ds|1yL{pjSED4YgwVZVOEv zf-Fy|;OO0v!8-%xLvt_I48@88Tqz;rCp&oI2qd@3;7{533>eS{jK2zA`R)cUTW2!@ z^L3hH#1GeX0d8JjC!53mItFufX*z9SLj1X4#@RGSBj8@07=Bmo)yQXHKCcE)U6bIf_ATseI#6`o#G}Y&| zyz%a5a}m0kdrq(ues9PJ%Ga3SgCz>i?`n{{N6?`c1pUR>Rl#imET4FyFDMVYZ9CIA z#k&i<&ULd7YMP_IOC%nun)C|iH5exFMmc}f6ifet3Vh-& zI>@_%<2`#2?Z;la@9@hXpH80HGcQ*_tR{x_!v#igr%h0by} zOCxAJ8OQ(~coHhDeTlc~&JE3rzsUYOdNzyq1ktm9Gn>5WMN^L^Kc)x_o1;C09p2cSoAQ`B?VzDVmk;;R17B^v-zCyC+j@tAK3I4p5w~q!O z7EuBJ7t4gY7=mzku&kC!O#N9&{kn=^ktZ(A&_(-wYc_RUS%n^e#=>uN5Z&iVgMS; z`be$~&3=U*DLSC`+^z*9D!2jT==@6_4UqToki=)t^kIdSTGCE;%3holKc}_NV0bJn zk%EfSLto~`4TL1;hDfZvb{{oOzYdubE9^l6pilTa*)g3srv~MGy`iSpVZ)F(pHI~~ zh72+*;dg?PWJrGY?~Dsh&R?TfGz(se^Q}MOB5n`3;5n!@A!LtojlWEttm;LOocKdb zQ|p$#nxZ@t)j8#?JzofYh@tDF^hm_MPOj^Nb7qR$PNTSB1AF`!j`s!t5W>9)HMQD6 z&EK>LuU!ILMK8W=&cUB;_Ii3)nDKL!R>cIkrjwShn%(IiEAMVn$m3%kL_i;Pz7-H7 z9tPWNA^{-s13hDdzQRFUyznOlyDAWf`kc6pY@$52 z|9N=mk0IjsHY>0BSZxG8SEs`XdQT|>pWQ~A3D)Q&1*QxsYlgm2&pebqCf1}n7_2U1 zyU_3ug{}s>_WF8&y`!70E={iN zX$m~80@;jr*whurWS30O_AP)tby)a_}>d$DW zZ7m#ppjVSg=9S{ot#l}qrbuzKp+W8jPqezmaipbwOm6j8`tGD)p}TN?`-BM65>qe- zQvNd$5Go5_=c(C73Vg2pDBr*O*ekedOag`fd}UG&VlG4*sb_E}^a>Gn5qgtn%M|Un z1^g%4M2Yz=6+S$4Id)!udvPy?`GqnP%XPy>9n*t?#nW&0`z9=<**nh63_bES?Mv(Q z%x)ujL+Lxq|7|+{*l6$BOX6qmSsdSl)fr!U5%E(e*)Gn*3ejG9pCuiZF2 zJTcEEZgKef{CYm(`9ejgQQTWB11q2xmswMP;JKW=d9vM`Yj#-?(PA<6#fOGvK^&;c zx;lMr(t%rSkTAatVnMH)IP4eJ_${s9d*P_h+A<#VePmjD`lMd~uX@A*g8AIick}Ps z49FsfMMLHLYd%3)Q;sKYV`{46xb8>u^Mwz9_>b{HJ%s&U^qrK{MQNwT$1iRK*3Ilm z2wNI+$kPH*?qRCpU~cviq}sm6nPa9Y;G`8$yIQ#;!Mi5cS!5%xl)%x6_m6CZ^kRy$ z(0Y9-%@tEKge|syHp|*HCb05IBAx1~(+tWn!a&I9m6gW6=|=^d)R>6QmZ`J`m|p%u z20&3)uZ^%cZ3dEq0GlhztBo+A?+r30GrC-vEzqO&(E3}TZ$Ehl)se9JI8lmz3uZpL zZu}U$0=K+bhpB){o!2s>I0P-?2dSPiAWtVX+&`*BJUkKkC16?DlQf{HQO-v;3G1BM z5dLRJwd$}i<-n|8ur%@f+F((bpTShl;Ug8j=jo+JR;eH-7nRpRVuL=_5&L`?zZETU z$+vWCKSG?OcE_%rQFwxrjLYVde|2LDx)F}GSgk;+F~+G%mynDk<$w7--oBL!$zgB0L1yYiyFHW8f03t}sJWoGU2NYgtBGE6{hYY^= z&`vS=)>qpVgN%cz*r~Pn@*h^+{40b_=!Dr(AHp+Rd{G!9Zmj5oYsTb@m4vT_ZodQ; zxyg})pWUW3P@LP6q4#?P*_im1#9~Wg3lVRfv%8@4<)WV@_rG;qyNa?9HX5V3JN}y^ z@aT{Qqai89p2D0v+d4^IS$(ZnpFWi22T3jrbJat@yUO-|IyUHNxq+^&dEbPM9z$hJ z_7hunZp8j$MS335O%}-bmVR$P3fRC!j&^bkE!$I=>;QdsE+D?9T#om9uXufO@i0u< z$-Q*+LwTSS9I1j24cH0Kuk%;$S`RyNmhR6Q)FMhE2)3}2Gv?Qx29oDK!UY#p^PEWmzg%0X+z6Ey z^;VL=NF{m#oJl}6s&->(+)^yG;K#9|ux>!rx4stM49XxYe^;xQKl&Lf$z>Oed>AaB zxG%%~Hf+=amGLg)W2$RJeOySl;%}x3lf$4y?d};d8#7=P9?Uu*_bRPIO-TMD-;8!H z2sjhTgn$d#?D_h>Fb!nwzjM$|wZ}YyRY3)$E7QcYRG2_BIoCz&dp49#b6had#OiG( z?C~wbXqOqm_Dy4WD4X-tff15?Sk5fXyGLB1Fj-Vo+4+H8DkD3!)=5JXwEssAo?p;o zHMiNXH3;=gx*O%Ynf)Qj{eh)S@Yq?vZrInrXELgD+TYibRVW-b^$Q>)80gOXx|=Gx zXTG&K#18syDGp{|TVXUd2&yO~WexZQ-5@y^1~;5y{yMb6ziQVv&w79^W5@6;X!Ncj zyoGa)X#I$TBP3}j#`)-PI1{d3sI5Be@fFL* zw;sf`ps6^#GtP7UMtSV^nc%%RB5iQ5qE=}y&6Bv|8b8smG2*7jbFnduEJK$Ukza1* zLWxS{1;S2eqhW{#Rk>ip2_uW4)|-dWpE zH>y1ds)uB!1#8&!shI@HdK{?*&8@|k3p}N1Oih>Uc9i8;qsFQD&I0}$_3?jsf&`Gh zjJmP-lk7H77!i3uX12uC?kQ=pD-Wgw z-5eWC^Mp3`ZT1D1c3Ql9?HZX$z(gN->Rs65lss&{oUo7sDmeLLk>yL=B8Jni??`iG zC^txJ)9#SU=BPWPVHt~;fAZf&*CI9!)z4pwr7d3RKFtMH9+pWqtAKrV){VdoGTi*j zMcEwIc|4icU}_0t^Z!QPGU;X(Jtz=nlLHH14POlclJY}vEKa}otc4yosAUjM5Q(f%bomUkJaB$b+UCzWJ90)#O_S%_t`!BI z>(W!W(83P5LZdmJW^^56wRLB$K+^ zov&YgF+!tVAhn*ZGov1R?QdZ|?KHQwgE8UWSJzw&JD#lP1YYlV!83px0Dy3&b-uHgmo^H3cOY(oI#E$|^a2lDUMS^+M>lY8evX1o& zsa!D6X}!%Jf48|vMHj4rUvCy*NzD31KbS$hev#+|_H b46BggvoE43D^m*Khv?fQGX5 literal 0 HcmV?d00001 diff --git a/blazor-wasm-boilerplate-main/.template.config/ide.host.json b/blazor-wasm-boilerplate-main/.template.config/ide.host.json new file mode 100644 index 0000000..837778b --- /dev/null +++ b/blazor-wasm-boilerplate-main/.template.config/ide.host.json @@ -0,0 +1,5 @@ +{ + "$schema": "http://json.schemastore.org/vs-2017.3.host", + "order": 0, + "icon": "icon.png" +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/.template.config/template.json b/blazor-wasm-boilerplate-main/.template.config/template.json new file mode 100644 index 0000000..5fbff2b --- /dev/null +++ b/blazor-wasm-boilerplate-main/.template.config/template.json @@ -0,0 +1,51 @@ +{ + "$schema": "http://json.schemastore.org/template", + "author": "Mukesh Murugan", + "classifications": [ + "Blazor", + "WASM", + "WebAssembly", + "Clean Architecture", + "Boilerplate", + "macOS", + "Windows", + "Cloud", + "Web" + ], + "tags": { + "language": "C#", + "type": "project" + }, + "identity": "FullStackHero.BlazorWebAssembly.Boilerplate", + "name": "Blazor WebAssembly Boilerplate - FullStackHero", + "description": "Clean Architecture Boilerplate Template for .NET 6.0 Blazor WebAssembly built for FSH WebAPI with the goodness of MudBlazor Components.", + "shortName": "fsh-blazor", + "sourceName": "FSH.BlazorWebAssembly", + "preferNameDirectory": true, + "sources": [ + { + "source": "./", + "target": "./", + "exclude": [ + ".template.config/**" + ] + } + ], + "primaryOutputs": [ + { + "path": "./" + } + ], + "postActions": [ + { + "description": "Restore NuGet packages required by this project.", + "manualInstructions": [ + { + "text": "Run 'dotnet restore'" + } + ], + "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025", + "continueOnError": true + } + ] +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/.vscode/launch.json b/blazor-wasm-boilerplate-main/.vscode/launch.json new file mode 100644 index 0000000..cfcc0fe --- /dev/null +++ b/blazor-wasm-boilerplate-main/.vscode/launch.json @@ -0,0 +1,12 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Launch and Debug Standalone Blazor WebAssembly App", + "type": "blazorwasm", + "request": "launch", + "cwd": "${workspaceFolder}/src/Host", + "url": "https://localhost:5002" + } + ] +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/.vscode/settings.json b/blazor-wasm-boilerplate-main/.vscode/settings.json new file mode 100644 index 0000000..fe20a1c --- /dev/null +++ b/blazor-wasm-boilerplate-main/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "razor.disableBlazorDebugPrompt": true, + "cSpell.words": [ + "Blazored", + "borderradius", + "Upto" + ] +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/.vscode/tasks.json b/blazor-wasm-boilerplate-main/.vscode/tasks.json new file mode 100644 index 0000000..444731d --- /dev/null +++ b/blazor-wasm-boilerplate-main/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/src/Host/Host.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/src/Host/Host.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "${workspaceFolder}/src/Host/Host.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/Directory.Build.props b/blazor-wasm-boilerplate-main/Directory.Build.props new file mode 100644 index 0000000..35a60b8 --- /dev/null +++ b/blazor-wasm-boilerplate-main/Directory.Build.props @@ -0,0 +1,27 @@ + + + + $(MSBuildThisFileDirectory)dotnet.ruleset + false + false + true + $(OutputPath)$(AssemblyName).xml + true + enable + enable + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/Directory.Build.targets b/blazor-wasm-boilerplate-main/Directory.Build.targets new file mode 100644 index 0000000..fd9797b --- /dev/null +++ b/blazor-wasm-boilerplate-main/Directory.Build.targets @@ -0,0 +1,5 @@ + + + $(OutputPath)$(AssemblyName).xml + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/Dockerfile b/blazor-wasm-boilerplate-main/Dockerfile new file mode 100644 index 0000000..2ff39bb --- /dev/null +++ b/blazor-wasm-boilerplate-main/Dockerfile @@ -0,0 +1,26 @@ +FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base +WORKDIR /app +EXPOSE 80 +EXPOSE 443 + +FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build +WORKDIR /src + +COPY ["src/Host/Host.csproj", "src/Host/"] +COPY ["src/Shared/Shared.csproj", "src/Shared/"] +COPY ["src/Client/Client.csproj", "src/Client/"] +COPY ["src/Client.Infrastructure/Client.Infrastructure.csproj", "src/Client.Infrastructure/"] + +RUN dotnet restore "src/Host/Host.csproj" + +COPY . . +WORKDIR "/src/src/Host" + +RUN dotnet publish "Host.csproj" -c Release --no-restore -o /app/publish + +FROM base AS final +WORKDIR /app + +COPY --from=build /app/publish . + +ENTRYPOINT ["dotnet", "FSH.BlazorWebAssembly.Host.dll"] \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/FSH.BlazorWebAssembly.nuspec b/blazor-wasm-boilerplate-main/FSH.BlazorWebAssembly.nuspec new file mode 100644 index 0000000..215e16a --- /dev/null +++ b/blazor-wasm-boilerplate-main/FSH.BlazorWebAssembly.nuspec @@ -0,0 +1,25 @@ + + + + FullStackHero.BlazorWebAssembly.Boilerplate + Blazor WebAssembly Boilerplate - FullStackHero + 0.0.1-rc + Mukesh Murugan + + Clean Architecture Boilerplate Template for .NET 6.0 Blazor WebAssembly built for FSH WebAPI with the goodness of MudBlazor Components. + + en-US + MIT + 2021 + https://fullstackhero.net/blazor-webassembly-boilerplate/general/getting-started/ + + + + + cleanarchitecture clean architecture blazor mukesh codewithmukesh fullstackhero solution csharp wasm webassembly mudblazor + ./content/icon.png + + + + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/FSH.BlazorWebAssembly.sln b/blazor-wasm-boilerplate-main/FSH.BlazorWebAssembly.sln new file mode 100644 index 0000000..2c94ebb --- /dev/null +++ b/blazor-wasm-boilerplate-main/FSH.BlazorWebAssembly.sln @@ -0,0 +1,62 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31808.319 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Host", "src\Host\Host.csproj", "{CB2F88F0-F072-420C-9B43-162C2C0773F5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Client", "src\Client\Client.csproj", "{D5DB6E8A-0161-4EF1-B4D9-467E9A7EF9A7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Shared", "src\Shared\Shared.csproj", "{0D7A7E2D-CCF4-496E-9F2B-141712F4C00F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Client.Infrastructure", "src\Client.Infrastructure\Client.Infrastructure.csproj", "{28E5DFC7-A05B-40DB-9E35-AC1E84C008A2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F6BE3160-F6ED-4E11-A33F-063DD9186D84}" + ProjectSection(SolutionItems) = preProject + .dockerignore = .dockerignore + .editorconfig = .editorconfig + .gitignore = .gitignore + Directory.Build.props = Directory.Build.props + Directory.Build.targets = Directory.Build.targets + Dockerfile = Dockerfile + dotnet.ruleset = dotnet.ruleset + global.json = global.json + stylecop.json = stylecop.json + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{F529F1FF-B2FD-46D5-80A1-D4C726230E40}" + ProjectSection(SolutionItems) = preProject + scripts\nswag-regen.ps1 = scripts\nswag-regen.ps1 + scripts\pull-shared-from-webapi.ps1 = scripts\pull-shared-from-webapi.ps1 + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CB2F88F0-F072-420C-9B43-162C2C0773F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CB2F88F0-F072-420C-9B43-162C2C0773F5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB2F88F0-F072-420C-9B43-162C2C0773F5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CB2F88F0-F072-420C-9B43-162C2C0773F5}.Release|Any CPU.Build.0 = Release|Any CPU + {D5DB6E8A-0161-4EF1-B4D9-467E9A7EF9A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5DB6E8A-0161-4EF1-B4D9-467E9A7EF9A7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5DB6E8A-0161-4EF1-B4D9-467E9A7EF9A7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5DB6E8A-0161-4EF1-B4D9-467E9A7EF9A7}.Release|Any CPU.Build.0 = Release|Any CPU + {0D7A7E2D-CCF4-496E-9F2B-141712F4C00F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D7A7E2D-CCF4-496E-9F2B-141712F4C00F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D7A7E2D-CCF4-496E-9F2B-141712F4C00F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D7A7E2D-CCF4-496E-9F2B-141712F4C00F}.Release|Any CPU.Build.0 = Release|Any CPU + {28E5DFC7-A05B-40DB-9E35-AC1E84C008A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {28E5DFC7-A05B-40DB-9E35-AC1E84C008A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28E5DFC7-A05B-40DB-9E35-AC1E84C008A2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {28E5DFC7-A05B-40DB-9E35-AC1E84C008A2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {175E8AA9-2BB6-41F9-ACE9-71733ED6EDFD} + EndGlobalSection +EndGlobal diff --git a/blazor-wasm-boilerplate-main/LICENSE b/blazor-wasm-boilerplate-main/LICENSE new file mode 100644 index 0000000..6599f6d --- /dev/null +++ b/blazor-wasm-boilerplate-main/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 fullstackhero + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/blazor-wasm-boilerplate-main/README.md b/blazor-wasm-boilerplate-main/README.md new file mode 100644 index 0000000..10be676 --- /dev/null +++ b/blazor-wasm-boilerplate-main/README.md @@ -0,0 +1,82 @@ +[![GitHub](https://img.shields.io/github/license/fullstackhero/blazor-wasm-boilerplate?color=2da44e&style=flat-square)](https://github.com/fullstackhero/blazor-wasm-boilerplate/blob/main/LICENSE) +[![Discord](https://img.shields.io/discord/878181478972928011?color=%237289da&label=Discord&logo=discord&logoColor=%237289da&style=flat-square)](https://discord.gg/yQWpShsKrf) +[![Twitter](https://img.shields.io/twitter/follow/codewithmukesh?color=1DA1F2&label=Twitter&logo=Twitter&style=flat-square)](https://twitter.com/codewithmukesh) + +

+ fullstackhero +

+ +# Blazor WebAssembly Boilerplate +Built with .NET 6.0 and the goodness of MudBlazor Component Library. Incorporates the most essential Packages your projects will ever need. Follows Clean Architecture Principles. + +## Goals + +The goal of this repository is to help developers / companies kickstart their Web Application Development with a pre-built Blazor WebAssembly Boilerplate that includes several much needed components and features. + +> Note that this is a frontend / client application only! The backend for this application is available in a seperate repository. +> - Find fullstackhero's .NET 6 Web API Boilerplate here - https://github.com/fullstackhero/dotnet-webapi-boilerplate + +## Prerequisites + +- Make sure you have the API Running. Here is FSH Backend - https://github.com/fullstackhero/dotnet-webapi-boilerplate +- Once fullstackhero's .NET 6 Web API is up and running, run the Blazor WebAssembly Project to consume it's services. + +## Getting Started + +Open up your Command Prompt / Powershell and run the following command to install the solution template. + +```powershell +dotnet new --install FullStackHero.BlazorWebAssembly.Boilerplate +``` +or, if you want to use a specific version of the boilerplate, use + +```powershell +dotnet new --install FullStackHero.BlazorWebAssembly.Boilerplate::0.0.1-rc +``` +This would install the `fullstackhero Blazor WebAssembly Boilerplate` template globally on your machine. Do note that, at the time of writing this documentation, the latest available version is **0.0.1-rc** which is also one of the first stable pre-release version of the package. It is highly likely that there is already a newer version available when you are reading this. + +> *To get the latest version of the package, visit [nuget.org](https://www.nuget.org/packages/FullStackHero.BlazorWebAssembly.Boilerplate/)* +> +> *FullStackHero.BlazorWebAssembly.Boilerplate is now in pre-release state. You can find the latest version on NuGet.org* + +**FullStackHero.BlazorWebAssembly.Boilerplate::0.0.1-rc is compatible only with FullStackHero.WebAPI.Boilerplate::0.0.6-rc and above.** + +Get the .NET WebApi Boilerplate by running the following command + +``` +dotnet new --install FullStackHero.WebAPI.Boilerplate::0.0.6-rc +``` + +For more details on getting started, [read this article](https://fullstackhero.net/blazor-webassembly-boilerplate/general/getting-started/) + +## Community + +- Discord [@fullstackhero](https://discord.gg/gdgHRt4mMw) +- Facebook Page [@codewithmukesh](https://facebook.com/codewithmukesh) +- Youtube Channel [@codewithmukesh](https://youtube.com/c/codewithmukesh) + +## Contributors + +Submit your PR and join the elite list! + + + + + +## License + +This project is licensed with the [MIT license](LICENSE). + +## Support :star: + +Has this Project helped you learn something New? or Helped you at work? +Here are a few ways by which you can support. + +- Leave a star! :star: +- Recommend this awesome project to your colleagues. 🥇 +- Do consider endorsing me on LinkedIn for ASP.NET Core - [Connect via LinkedIn](https://codewithmukesh.com/linkedin) 🦸 +- Or, If you want to support this project in the long run, [consider buying me a coffee](https://www.buymeacoffee.com/codewithmukesh)! ☕ + +
+ +black-button diff --git a/blazor-wasm-boilerplate-main/dotnet.ruleset b/blazor-wasm-boilerplate-main/dotnet.ruleset new file mode 100644 index 0000000..3010e47 --- /dev/null +++ b/blazor-wasm-boilerplate-main/dotnet.ruleset @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/global.json b/blazor-wasm-boilerplate-main/global.json new file mode 100644 index 0000000..f443bd4 --- /dev/null +++ b/blazor-wasm-boilerplate-main/global.json @@ -0,0 +1,7 @@ +{ + "sdk": { + "version": "6.0", + "rollForward": "latestMajor", + "allowPrerelease": true + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/icon.png b/blazor-wasm-boilerplate-main/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9fa41873a242c485b6b8570e273e8246be3259 GIT binary patch literal 153939 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%0A&u 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[YRGava~CQ`0J#idFCTB7Mm6Cy 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 b46BggvoE43D^m*Khv?fQGX5 literal 0 HcmV?d00001 diff --git a/blazor-wasm-boilerplate-main/scripts/nswag-regen.ps1 b/blazor-wasm-boilerplate-main/scripts/nswag-regen.ps1 new file mode 100644 index 0000000..bf62c4a --- /dev/null +++ b/blazor-wasm-boilerplate-main/scripts/nswag-regen.ps1 @@ -0,0 +1,20 @@ +# This script is cross-platform, supporting all OSes that PowerShell Core/7 runs on. + +$currentDirectory = Get-Location +$rootDirectory = git rev-parse --show-toplevel +$hostDirectory = Join-Path -Path $rootDirectory -ChildPath 'src/Host' +$infrastructurePrj = Join-Path -Path $rootDirectory -ChildPath 'src/Client.Infrastructure/Client.Infrastructure.csproj' + +Write-Host "Make sure you have run the FSH.WebApi project. `n" +Write-Host "Press any key to continue... `n" +$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); + +Set-Location -Path $hostDirectory +Write-Host "Host Directory is $hostDirectory `n" + +<# Run command #> +dotnet build -t:NSwag $infrastructurePrj + +Set-Location -Path $currentDirectory +Write-Host -NoNewLine 'NSwag Regenerated. Press any key to continue...'; +$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); diff --git a/blazor-wasm-boilerplate-main/scripts/pull-shared-from-webapi.ps1 b/blazor-wasm-boilerplate-main/scripts/pull-shared-from-webapi.ps1 new file mode 100644 index 0000000..35dd0ab --- /dev/null +++ b/blazor-wasm-boilerplate-main/scripts/pull-shared-from-webapi.ps1 @@ -0,0 +1,40 @@ +# This script is cross-platform, supporting all OSes that PowerShell Core/7 runs on. + +$rootDirectory = git rev-parse --show-toplevel +$sourcePath = Join-Path -Path $rootDirectory -ChildPath '..\dotnet-webapi-boilerplate\src\Core\Shared' +$destinationPath = Join-Path -Path $rootDirectory -ChildPath 'src\Shared' + +$excludes = @('bin', 'obj') + +Write-Host "Pull changes from the Fullstackhero WebApi Shared Project" +write-Host "---------------------------------------------------------" +Write-Host + +If ($null -eq $sourcePath) { + Write-Error "Error! The expected path of WebApi Shared Project does not exist: $sourcePath" + Exit 1 +} + +if ($null -eq (Resolve-Path $destinationPath)) { + # Ensure the destination exists + try + { + New-Item -Path $destinationPath -ItemType Directory -ErrorAction Stop | Out-Null + } + catch + { + Write-Error "Error! Unable to create output path \"$destinationPath\"" + Exit 1 + } +} + +Write-Host "WARNING! This will delete everything in the shared project ($($destinationPath | Resolve-Path))" +Write-Host "and then copy over the whole project from the webapi repository ($($sourcePath | Resolve-Path))" +Write-Host +Read-Host -Prompt "Press ENTER to continue" + +Remove-Item -Path "$destinationPath" -Recurse -Force +Copy-Item -Path (Get-Item -Path "$sourcePath" -Exclude $excludes).FullName -Destination "$destinationPath" -Recurse -Force + +Write-Host "Changes have been pulled." +Write-Host \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/ApiClient/FSHApi.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/ApiClient/FSHApi.cs new file mode 100644 index 0000000..a74762b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/ApiClient/FSHApi.cs @@ -0,0 +1,6849 @@ +//---------------------- +// +// Generated using the NSwag toolchain v13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org) +// +//---------------------- + +#nullable enable + +#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended." +#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword." +#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?' +#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ... +#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..." +#pragma warning disable 8073 // Disable "CS8073 The result of the expression is always 'false' since a value of type 'T' is never equal to 'null' of type 'T?'" +#pragma warning disable 3016 // Disable "CS3016 Arrays as attribute arguments is not CLS-compliant" +#pragma warning disable 8603 // Disable "CS8603 Possible null reference return" + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient +{ + using System = global::System; + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface ITenantsClient : IApiService + { + /// + /// Get a list of all tenants. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetListAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a list of all tenants. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetListAsync(System.Threading.CancellationToken cancellationToken); + + /// + /// Create a new tenant. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateTenantRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create a new tenant. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateTenantRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Get tenant details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get tenant details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Activate a tenant. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ActivateAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Activate a tenant. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ActivateAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Deactivate a tenant. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeactivateAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Deactivate a tenant. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeactivateAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Upgrade a tenant's subscription. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpgradeSubscriptionAsync(string? id, UpgradeSubscriptionRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Upgrade a tenant's subscription. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpgradeSubscriptionAsync(string? id, UpgradeSubscriptionRequest request, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class TenantsClient : ITenantsClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public TenantsClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Get a list of all tenants. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetListAsync() + { + return GetListAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a list of all tenants. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetListAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tenants"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Create a new tenant. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task CreateAsync(CreateTenantRequest request) + { + return CreateAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create a new tenant. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task CreateAsync(CreateTenantRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tenants"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get tenant details. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetAsync(string? id) + { + return GetAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get tenant details. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tenants/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Activate a tenant. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ActivateAsync(string? id) + { + return ActivateAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Activate a tenant. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ActivateAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tenants/{id}/activate"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Deactivate a tenant. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeactivateAsync(string? id) + { + return DeactivateAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Deactivate a tenant. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeactivateAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tenants/{id}/deactivate"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Upgrade a tenant's subscription. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpgradeSubscriptionAsync(string? id, UpgradeSubscriptionRequest request) + { + return UpgradeSubscriptionAsync(id, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Upgrade a tenant's subscription. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpgradeSubscriptionAsync(string? id, UpgradeSubscriptionRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tenants/{id}/upgrade"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface IRolesClient : IApiService + { + /// + /// Get a list of all roles. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetListAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a list of all roles. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetListAsync(System.Threading.CancellationToken cancellationToken); + + /// + /// Create or update a role. + /// + /// A server side error occurred. + System.Threading.Tasks.Task RegisterRoleAsync(CreateOrUpdateRoleRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create or update a role. + /// + /// A server side error occurred. + System.Threading.Tasks.Task RegisterRoleAsync(CreateOrUpdateRoleRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Get role details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetByIdAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get role details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetByIdAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Delete a role. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete a role. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Get role details with its permissions. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetByIdWithPermissionsAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get role details with its permissions. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetByIdWithPermissionsAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Update a role's permissions. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdatePermissionsAsync(string? id, UpdateRolePermissionsRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a role's permissions. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdatePermissionsAsync(string? id, UpdateRolePermissionsRequest request, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class RolesClient : IRolesClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public RolesClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Get a list of all roles. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetListAsync() + { + return GetListAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a list of all roles. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetListAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/roles"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Create or update a role. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task RegisterRoleAsync(CreateOrUpdateRoleRequest request) + { + return RegisterRoleAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create or update a role. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task RegisterRoleAsync(CreateOrUpdateRoleRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/roles"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get role details. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetByIdAsync(string? id) + { + return GetByIdAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get role details. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetByIdAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/roles/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Delete a role. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteAsync(string? id) + { + return DeleteAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete a role. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/roles/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get role details with its permissions. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetByIdWithPermissionsAsync(string? id) + { + return GetByIdWithPermissionsAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get role details with its permissions. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetByIdWithPermissionsAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/roles/{id}/permissions"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Update a role's permissions. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpdatePermissionsAsync(string? id, UpdateRolePermissionsRequest request) + { + return UpdatePermissionsAsync(id, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a role's permissions. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpdatePermissionsAsync(string? id, UpdateRolePermissionsRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/roles/{id}/permissions"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface ITokensClient : IApiService + { + /// + /// Request an access token using credentials. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task GetTokenAsync(string tenant, TokenRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Request an access token using credentials. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task GetTokenAsync(string tenant, TokenRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Request an access token using a refresh token. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task RefreshAsync(string tenant, RefreshTokenRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Request an access token using a refresh token. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task RefreshAsync(string tenant, RefreshTokenRequest request, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class TokensClient : ITokensClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public TokensClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Request an access token using credentials. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetTokenAsync(string tenant, TokenRequest request) + { + return GetTokenAsync(tenant, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Request an access token using credentials. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetTokenAsync(string tenant, TokenRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tokens"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + + if (tenant == null) + throw new System.ArgumentNullException("tenant"); + request_.Headers.TryAddWithoutValidation("tenant", ConvertToString(tenant, System.Globalization.CultureInfo.InvariantCulture)); + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Request an access token using a refresh token. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual System.Threading.Tasks.Task RefreshAsync(string tenant, RefreshTokenRequest request) + { + return RefreshAsync(tenant, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Request an access token using a refresh token. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task RefreshAsync(string tenant, RefreshTokenRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tokens/refresh"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + + if (tenant == null) + throw new System.ArgumentNullException("tenant"); + request_.Headers.TryAddWithoutValidation("tenant", ConvertToString(tenant, System.Globalization.CultureInfo.InvariantCulture)); + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface IUsersClient : IApiService + { + /// + /// Get list of all users. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetListAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get list of all users. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetListAsync(System.Threading.CancellationToken cancellationToken); + + /// + /// Creates a new user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateUserRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Creates a new user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateUserRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Get a user's details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetByIdAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a user's details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetByIdAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Get a user's roles. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetRolesAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a user's roles. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetRolesAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Update a user's assigned roles. + /// + /// A server side error occurred. + System.Threading.Tasks.Task AssignRolesAsync(string? id, UserRolesRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a user's assigned roles. + /// + /// A server side error occurred. + System.Threading.Tasks.Task AssignRolesAsync(string? id, UserRolesRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Anonymous user creates a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task SelfRegisterAsync(string tenant, CreateUserRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Anonymous user creates a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task SelfRegisterAsync(string tenant, CreateUserRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Toggle a user's active status. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ToggleStatusAsync(string? id, ToggleUserStatusRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Toggle a user's active status. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ToggleStatusAsync(string? id, ToggleUserStatusRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Confirm email address for a user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ConfirmEmailAsync(string? tenant, string? userId, string? code); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Confirm email address for a user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ConfirmEmailAsync(string? tenant, string? userId, string? code, System.Threading.CancellationToken cancellationToken); + + /// + /// Confirm phone number for a user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ConfirmPhoneNumberAsync(string? userId, string? code); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Confirm phone number for a user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ConfirmPhoneNumberAsync(string? userId, string? code, System.Threading.CancellationToken cancellationToken); + + /// + /// Request a pasword reset email for a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task ForgotPasswordAsync(string tenant, ForgotPasswordRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Request a pasword reset email for a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task ForgotPasswordAsync(string tenant, ForgotPasswordRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Reset a user's password. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ResetPasswordAsync(ResetPasswordRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Reset a user's password. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ResetPasswordAsync(ResetPasswordRequest request, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UsersClient : IUsersClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public UsersClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Get list of all users. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetListAsync() + { + return GetListAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get list of all users. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetListAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Creates a new user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task CreateAsync(CreateUserRequest request) + { + return CreateAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Creates a new user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task CreateAsync(CreateUserRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get a user's details. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetByIdAsync(string? id) + { + return GetByIdAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a user's details. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetByIdAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get a user's roles. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetRolesAsync(string? id) + { + return GetRolesAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a user's roles. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetRolesAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/{id}/roles"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Update a user's assigned roles. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task AssignRolesAsync(string? id, UserRolesRequest request) + { + return AssignRolesAsync(id, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a user's assigned roles. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task AssignRolesAsync(string? id, UserRolesRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/{id}/roles"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Anonymous user creates a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual System.Threading.Tasks.Task SelfRegisterAsync(string tenant, CreateUserRequest request) + { + return SelfRegisterAsync(tenant, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Anonymous user creates a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task SelfRegisterAsync(string tenant, CreateUserRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/self-register"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + + if (tenant == null) + throw new System.ArgumentNullException("tenant"); + request_.Headers.TryAddWithoutValidation("tenant", ConvertToString(tenant, System.Globalization.CultureInfo.InvariantCulture)); + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Toggle a user's active status. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ToggleStatusAsync(string? id, ToggleUserStatusRequest request) + { + return ToggleStatusAsync(id, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Toggle a user's active status. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ToggleStatusAsync(string? id, ToggleUserStatusRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/{id}/toggle-status"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Confirm email address for a user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ConfirmEmailAsync(string? tenant, string? userId, string? code) + { + return ConfirmEmailAsync(tenant, userId, code, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Confirm email address for a user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ConfirmEmailAsync(string? tenant, string? userId, string? code, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/confirm-email?"); + if (tenant != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("tenant") + "=").Append(System.Uri.EscapeDataString(ConvertToString(tenant, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (userId != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("userId") + "=").Append(System.Uri.EscapeDataString(ConvertToString(userId, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (code != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("code") + "=").Append(System.Uri.EscapeDataString(ConvertToString(code, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Confirm phone number for a user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ConfirmPhoneNumberAsync(string? userId, string? code) + { + return ConfirmPhoneNumberAsync(userId, code, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Confirm phone number for a user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ConfirmPhoneNumberAsync(string? userId, string? code, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/confirm-phone-number?"); + if (userId != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("userId") + "=").Append(System.Uri.EscapeDataString(ConvertToString(userId, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (code != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("code") + "=").Append(System.Uri.EscapeDataString(ConvertToString(code, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Request a pasword reset email for a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ForgotPasswordAsync(string tenant, ForgotPasswordRequest request) + { + return ForgotPasswordAsync(tenant, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Request a pasword reset email for a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ForgotPasswordAsync(string tenant, ForgotPasswordRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/forgot-password"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + + if (tenant == null) + throw new System.ArgumentNullException("tenant"); + request_.Headers.TryAddWithoutValidation("tenant", ConvertToString(tenant, System.Globalization.CultureInfo.InvariantCulture)); + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Reset a user's password. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ResetPasswordAsync(ResetPasswordRequest request) + { + return ResetPasswordAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Reset a user's password. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ResetPasswordAsync(ResetPasswordRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/reset-password"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface IPersonalClient : IApiService + { + /// + /// Get profile details of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetProfileAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get profile details of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetProfileAsync(System.Threading.CancellationToken cancellationToken); + + /// + /// Update profile details of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdateProfileAsync(UpdateUserRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update profile details of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdateProfileAsync(UpdateUserRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Change password of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ChangePasswordAsync(ChangePasswordRequest model); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Change password of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ChangePasswordAsync(ChangePasswordRequest model, System.Threading.CancellationToken cancellationToken); + + /// + /// Get permissions of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetPermissionsAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get permissions of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetPermissionsAsync(System.Threading.CancellationToken cancellationToken); + + /// + /// Get audit logs of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetLogsAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get audit logs of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetLogsAsync(System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class PersonalClient : IPersonalClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public PersonalClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Get profile details of currently logged in user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetProfileAsync() + { + return GetProfileAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get profile details of currently logged in user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetProfileAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/personal/profile"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Update profile details of currently logged in user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpdateProfileAsync(UpdateUserRequest request) + { + return UpdateProfileAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update profile details of currently logged in user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpdateProfileAsync(UpdateUserRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/personal/profile"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Change password of currently logged in user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ChangePasswordAsync(ChangePasswordRequest model) + { + return ChangePasswordAsync(model, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Change password of currently logged in user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ChangePasswordAsync(ChangePasswordRequest model, System.Threading.CancellationToken cancellationToken) + { + if (model == null) + throw new System.ArgumentNullException("model"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/personal/change-password"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(model, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get permissions of currently logged in user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetPermissionsAsync() + { + return GetPermissionsAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get permissions of currently logged in user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetPermissionsAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/personal/permissions"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get audit logs of currently logged in user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetLogsAsync() + { + return GetLogsAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get audit logs of currently logged in user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetLogsAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/personal/logs"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface IDashboardClient : IApiService + { + /// + /// Get statistics for the dashboard. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get statistics for the dashboard. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class DashboardClient : IDashboardClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public DashboardClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Get statistics for the dashboard. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetAsync() + { + return GetAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get statistics for the dashboard. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/dashboard"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface IBrandsClient : IApiService + { + /// + /// Search brands using available filters. + /// + /// A server side error occurred. + System.Threading.Tasks.Task SearchAsync(SearchBrandsRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Search brands using available filters. + /// + /// A server side error occurred. + System.Threading.Tasks.Task SearchAsync(SearchBrandsRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Get brand details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(System.Guid id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get brand details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(System.Guid id, System.Threading.CancellationToken cancellationToken); + + /// + /// Update a brand. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateBrandRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a brand. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateBrandRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Delete a brand. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteAsync(System.Guid id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete a brand. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteAsync(System.Guid id, System.Threading.CancellationToken cancellationToken); + + /// + /// Create a new brand. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateBrandRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create a new brand. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateBrandRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Generate a number of random brands. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GenerateRandomAsync(GenerateRandomBrandRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Generate a number of random brands. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GenerateRandomAsync(GenerateRandomBrandRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Delete the brands generated with the generate-random call. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteRandomAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete the brands generated with the generate-random call. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteRandomAsync(System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class BrandsClient : IBrandsClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public BrandsClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Search brands using available filters. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task SearchAsync(SearchBrandsRequest request) + { + return SearchAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Search brands using available filters. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task SearchAsync(SearchBrandsRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/brands/search"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get brand details. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetAsync(System.Guid id) + { + return GetAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get brand details. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetAsync(System.Guid id, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/brands/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Update a brand. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateBrandRequest request) + { + return UpdateAsync(id, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a brand. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateBrandRequest request, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/brands/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Delete a brand. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteAsync(System.Guid id) + { + return DeleteAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete a brand. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteAsync(System.Guid id, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/brands/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Create a new brand. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task CreateAsync(CreateBrandRequest request) + { + return CreateAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create a new brand. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task CreateAsync(CreateBrandRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/brands"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Generate a number of random brands. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GenerateRandomAsync(GenerateRandomBrandRequest request) + { + return GenerateRandomAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Generate a number of random brands. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GenerateRandomAsync(GenerateRandomBrandRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/brands/generate-random"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Delete the brands generated with the generate-random call. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteRandomAsync() + { + return DeleteRandomAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete the brands generated with the generate-random call. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteRandomAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/brands/delete-random"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface IProductsClient : IApiService + { + /// + /// Search products using available filters. + /// + /// A server side error occurred. + System.Threading.Tasks.Task SearchAsync(SearchProductsRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Search products using available filters. + /// + /// A server side error occurred. + System.Threading.Tasks.Task SearchAsync(SearchProductsRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Get product details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(System.Guid id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get product details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(System.Guid id, System.Threading.CancellationToken cancellationToken); + + /// + /// Update a product. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateProductRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a product. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateProductRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Delete a product. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteAsync(System.Guid id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete a product. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteAsync(System.Guid id, System.Threading.CancellationToken cancellationToken); + + /// + /// Get product details via dapper. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetDapperAsync(System.Guid? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get product details via dapper. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetDapperAsync(System.Guid? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Create a new product. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateProductRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create a new product. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateProductRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Export a products. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ExportAsync(ExportProductsRequest filter); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Export a products. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ExportAsync(ExportProductsRequest filter, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ProductsClient : IProductsClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public ProductsClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Search products using available filters. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task SearchAsync(SearchProductsRequest request) + { + return SearchAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Search products using available filters. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task SearchAsync(SearchProductsRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/products/search"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get product details. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetAsync(System.Guid id) + { + return GetAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get product details. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetAsync(System.Guid id, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/products/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Update a product. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateProductRequest request) + { + return UpdateAsync(id, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a product. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateProductRequest request, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/products/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Delete a product. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteAsync(System.Guid id) + { + return DeleteAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete a product. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteAsync(System.Guid id, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/products/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get product details via dapper. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetDapperAsync(System.Guid? id) + { + return GetDapperAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get product details via dapper. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetDapperAsync(System.Guid? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/products/dapper?"); + if (id != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("id") + "=").Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Create a new product. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task CreateAsync(CreateProductRequest request) + { + return CreateAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create a new product. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task CreateAsync(CreateProductRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/products"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Export a products. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ExportAsync(ExportProductsRequest filter) + { + return ExportAsync(filter, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Export a products. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ExportAsync(ExportProductsRequest filter, System.Threading.CancellationToken cancellationToken) + { + if (filter == null) + throw new System.ArgumentNullException("filter"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/products/export"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(filter, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/octet-stream")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200 || status_ == 206) + { + var responseStream_ = response_.Content == null ? System.IO.Stream.Null : await response_.Content.ReadAsStreamAsync().ConfigureAwait(false); + var fileResponse_ = new FileResponse(status_, headers_, responseStream_, null, response_); + disposeClient_ = false; disposeResponse_ = false; // response and client are disposed by FileResponse + return fileResponse_; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class TenantDto + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("connectionString", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? ConnectionString { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("adminEmail", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string AdminEmail { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("isActive", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool IsActive { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("validUpto", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTime ValidUpto { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Issuer { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class HttpValidationProblemDetails : ProblemDetails + { + [Newtonsoft.Json.JsonProperty("errors", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.IDictionary> Errors { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ProblemDetails + { + [Newtonsoft.Json.JsonProperty("type", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Type { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("title", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Title { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int? Status { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("detail", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Detail { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("instance", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Instance { get; set; } = default!; + + private System.Collections.Generic.IDictionary _additionalProperties = new System.Collections.Generic.Dictionary(); + + [Newtonsoft.Json.JsonExtensionData] + public System.Collections.Generic.IDictionary AdditionalProperties + { + get { return _additionalProperties; } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ErrorResult + { + [Newtonsoft.Json.JsonProperty("messages", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection? Messages { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("source", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Source { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("exception", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Exception { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("errorId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? ErrorId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("supportMessage", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? SupportMessage { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("statusCode", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int StatusCode { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateTenantRequest + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("connectionString", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? ConnectionString { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("adminEmail", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.RegularExpression(@"^[^@]+@[^@]+$")] + public string AdminEmail { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Issuer { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpgradeSubscriptionRequest + { + [Newtonsoft.Json.JsonProperty("tenantId", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string TenantId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("extendedExpiryDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTime ExtendedExpiryDate { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class RoleDto + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("permissions", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection? Permissions { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpdateRolePermissionsRequest + { + [Newtonsoft.Json.JsonProperty("roleId", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string RoleId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("permissions", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public System.Collections.Generic.ICollection Permissions { get; set; } = new System.Collections.ObjectModel.Collection(); + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateOrUpdateRoleRequest + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class TokenResponse + { + [Newtonsoft.Json.JsonProperty("token", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Token { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("refreshToken", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string RefreshToken { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("refreshTokenExpiryTime", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTime RefreshTokenExpiryTime { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class TokenRequest + { + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.RegularExpression(@"^[^@]+@[^@]+$")] + public string Email { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("password", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Password { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class RefreshTokenRequest + { + [Newtonsoft.Json.JsonProperty("token", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Token { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("refreshToken", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string RefreshToken { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UserDetailsDto + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("userName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? UserName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("firstName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? FirstName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("lastName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? LastName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Email { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("isActive", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool IsActive { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("emailConfirmed", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool EmailConfirmed { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("phoneNumber", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? PhoneNumber { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("imageUrl", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? ImageUrl { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UserRoleDto + { + [Newtonsoft.Json.JsonProperty("roleId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? RoleId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("roleName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? RoleName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("enabled", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool Enabled { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UserRolesRequest + { + [Newtonsoft.Json.JsonProperty("userRoles", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection UserRoles { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateUserRequest + { + [Newtonsoft.Json.JsonProperty("firstName", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string FirstName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("lastName", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string LastName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.RegularExpression(@"^[^@]+@[^@]+$")] + public string Email { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("userName", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string UserName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("password", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Password { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("confirmPassword", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string ConfirmPassword { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("phoneNumber", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? PhoneNumber { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ToggleUserStatusRequest + { + [Newtonsoft.Json.JsonProperty("activateUser", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool ActivateUser { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("userId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? UserId { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ForgotPasswordRequest + { + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.RegularExpression(@"^[^@]+@[^@]+$")] + public string Email { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ResetPasswordRequest + { + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Email { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("password", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Password { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("token", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Token { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpdateUserRequest + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("firstName", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(75, MinimumLength = 1)] + public string FirstName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("lastName", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(75, MinimumLength = 1)] + public string LastName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("phoneNumber", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? PhoneNumber { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.RegularExpression(@"^[^@]+@[^@]+$")] + public string Email { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("image", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public FileUploadRequest? Image { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("deleteCurrentImage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool DeleteCurrentImage { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class FileUploadRequest + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(150, MinimumLength = 1)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("extension", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(5, MinimumLength = 1)] + public string Extension { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("data", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Data { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ChangePasswordRequest + { + [Newtonsoft.Json.JsonProperty("password", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Password { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("newPassword", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string NewPassword { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("confirmNewPassword", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ConfirmNewPassword { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class AuditDto + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("userId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid UserId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("type", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Type { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("tableName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? TableName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("dateTime", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTime DateTime { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("oldValues", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? OldValues { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("newValues", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? NewValues { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("affectedColumns", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? AffectedColumns { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("primaryKey", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? PrimaryKey { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class StatsDto + { + [Newtonsoft.Json.JsonProperty("productCount", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int ProductCount { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("brandCount", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int BrandCount { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("userCount", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int UserCount { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("roleCount", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int RoleCount { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("dataEnterBarChart", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection DataEnterBarChart { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("productByBrandTypePieChart", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.IDictionary? ProductByBrandTypePieChart { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ChartSeries + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("data", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection? Data { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class PaginationResponseOfBrandDto + { + [Newtonsoft.Json.JsonProperty("data", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Data { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("currentPage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int CurrentPage { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("totalPages", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int TotalPages { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("totalCount", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int TotalCount { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("pageSize", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int PageSize { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("hasPreviousPage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool HasPreviousPage { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("hasNextPage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool HasNextPage { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class BrandDto + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class SearchBrandsRequest : PaginationFilter + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class PaginationFilter : BaseFilter + { + [Newtonsoft.Json.JsonProperty("pageNumber", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int PageNumber { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("pageSize", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int PageSize { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("orderBy", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection? OrderBy { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class BaseFilter + { + /// + /// Column Wise Search is Supported. + /// + [Newtonsoft.Json.JsonProperty("advancedSearch", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Search? AdvancedSearch { get; set; } = default!; + + /// + /// Keyword to Search in All the available columns of the Resource. + /// + [Newtonsoft.Json.JsonProperty("keyword", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Keyword { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Search + { + [Newtonsoft.Json.JsonProperty("fields", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Fields { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("keyword", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Keyword { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateBrandRequest + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(75, MinimumLength = 1)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpdateBrandRequest + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(75, MinimumLength = 1)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class GenerateRandomBrandRequest + { + [Newtonsoft.Json.JsonProperty("nSeed", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int NSeed { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class PaginationResponseOfProductDto + { + [Newtonsoft.Json.JsonProperty("data", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Data { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("currentPage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int CurrentPage { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("totalPages", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int TotalPages { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("totalCount", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int TotalCount { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("pageSize", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int PageSize { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("hasPreviousPage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool HasPreviousPage { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("hasNextPage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool HasNextPage { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ProductDto + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("rate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public decimal Rate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("imagePath", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? ImagePath { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("brandId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid BrandId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("brandName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string BrandName { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class SearchProductsRequest : PaginationFilter + { + [Newtonsoft.Json.JsonProperty("brandId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid? BrandId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("minimumRate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public decimal? MinimumRate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("maximumRate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public decimal? MaximumRate { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ProductDetailsDto + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("rate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public decimal Rate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("imagePath", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? ImagePath { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("brand", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public BrandDto Brand { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateProductRequest + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(75, MinimumLength = 1)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("rate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [System.ComponentModel.DataAnnotations.Range(1.0D, double.MaxValue)] + public decimal Rate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("brandId", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public System.Guid BrandId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("image", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public FileUploadRequest? Image { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpdateProductRequest + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(75, MinimumLength = 1)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("rate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [System.ComponentModel.DataAnnotations.Range(1.0D, double.MaxValue)] + public decimal Rate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("brandId", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public System.Guid BrandId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("deleteCurrentImage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool DeleteCurrentImage { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("image", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public FileUploadRequest? Image { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ExportProductsRequest : BaseFilter + { + [Newtonsoft.Json.JsonProperty("brandId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid? BrandId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("minimumRate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public decimal? MinimumRate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("maximumRate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public decimal? MaximumRate { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class FileResponse : System.IDisposable + { + private System.IDisposable? _client; + private System.IDisposable? _response; + + public int StatusCode { get; private set; } + + public System.Collections.Generic.IReadOnlyDictionary> Headers { get; private set; } + + public System.IO.Stream Stream { get; private set; } + + public bool IsPartial + { + get { return StatusCode == 206; } + } + + public FileResponse(int statusCode, System.Collections.Generic.IReadOnlyDictionary> headers, System.IO.Stream stream, System.IDisposable? client, System.IDisposable? response) + { + StatusCode = statusCode; + Headers = headers; + Stream = stream; + _client = client; + _response = response; + } + + public void Dispose() + { + Stream.Dispose(); + if (_response != null) + _response.Dispose(); + if (_client != null) + _client.Dispose(); + } + } + + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ApiException : System.Exception + { + public int StatusCode { get; private set; } + + public string? Response { get; private set; } + + public System.Collections.Generic.IReadOnlyDictionary> Headers { get; private set; } + + public ApiException(string message, int statusCode, string? response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Exception? innerException) + : base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + ((response == null) ? "(null)" : response.Substring(0, response.Length >= 512 ? 512 : response.Length)), innerException) + { + StatusCode = statusCode; + Response = response; + Headers = headers; + } + + public override string ToString() + { + return string.Format("HTTP Response: \n\n{0}\n\n{1}", Response, base.ToString()); + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ApiException : ApiException + { + public TResult Result { get; private set; } + + public ApiException(string message, int statusCode, string? response, System.Collections.Generic.IReadOnlyDictionary> headers, TResult result, System.Exception? innerException) + : base(message, statusCode, response, headers, innerException) + { + Result = result; + } + } + +} + +#pragma warning restore 1591 +#pragma warning restore 1573 +#pragma warning restore 472 +#pragma warning restore 114 +#pragma warning restore 108 +#pragma warning restore 3016 +#pragma warning restore 8603 \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/ApiClient/IApiService.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/ApiClient/IApiService.cs new file mode 100644 index 0000000..424beb4 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/ApiClient/IApiService.cs @@ -0,0 +1,5 @@ +namespace FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; + +public interface IApiService +{ +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/ApiClient/nswag.json b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/ApiClient/nswag.json new file mode 100644 index 0000000..47351c6 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/ApiClient/nswag.json @@ -0,0 +1,100 @@ +{ + "runtime": "Net60", + "defaultVariables": null, + "documentGenerator": { + "fromDocument": { + "json": "", + "url": "https://localhost:5001/swagger/v1/swagger.json", + "output": null, + "newLineBehavior": "Auto" + } + }, + "codeGenerators": { + "openApiToCSharpClient": { + "clientBaseClass": null, + "configurationClass": null, + "generateClientClasses": true, + "generateClientInterfaces": true, + "clientBaseInterface": "IApiService", + "injectHttpClient": true, + "disposeHttpClient": false, + "protectedMethods": [], + "generateExceptionClasses": true, + "exceptionClass": "ApiException", + "wrapDtoExceptions": true, + "useHttpClientCreationMethod": false, + "httpClientType": "System.Net.Http.HttpClient", + "useHttpRequestMessageCreationMethod": false, + "useBaseUrl": false, + "generateBaseUrlProperty": true, + "generateSyncMethods": false, + "generatePrepareRequestAndProcessResponseAsAsyncMethods": false, + "exposeJsonSerializerSettings": false, + "clientClassAccessModifier": "public", + "typeAccessModifier": "public", + "generateContractsOutput": false, + "contractsNamespace": null, + "contractsOutputFilePath": null, + "parameterDateTimeFormat": "s", + "parameterDateFormat": "yyyy-MM-dd", + "generateUpdateJsonSerializerSettingsMethod": true, + "useRequestAndResponseSerializationSettings": false, + "serializeTypeInformation": false, + "queryNullValue": "", + "className": "{controller}Client", + "operationGenerationMode": "MultipleClientsFromOperationId", + "additionalNamespaceUsages": [], + "additionalContractNamespaceUsages": [], + "generateOptionalParameters": false, + "generateJsonMethods": false, + "enforceFlagEnums": false, + "parameterArrayType": "System.Collections.Generic.IEnumerable", + "parameterDictionaryType": "System.Collections.Generic.IDictionary", + "responseArrayType": "System.Collections.Generic.ICollection", + "responseDictionaryType": "System.Collections.Generic.IDictionary", + "wrapResponses": false, + "wrapResponseMethods": [], + "generateResponseClasses": true, + "responseClass": "SwaggerResponse", + "namespace": "FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient", + "requiredPropertiesMustBeDefined": true, + "dateType": "System.DateTimeOffset", + "jsonConverters": null, + "anyType": "object", + "dateTimeType": "System.DateTime", + "timeType": "System.TimeSpan", + "timeSpanType": "System.TimeSpan", + "arrayType": "System.Collections.Generic.ICollection", + "arrayInstanceType": "System.Collections.ObjectModel.Collection", + "dictionaryType": "System.Collections.Generic.IDictionary", + "dictionaryInstanceType": "System.Collections.Generic.Dictionary", + "arrayBaseType": "System.Collections.ObjectModel.Collection", + "dictionaryBaseType": "System.Collections.Generic.Dictionary", + "classStyle": "Poco", + "jsonLibrary": "NewtonsoftJson", + "generateDefaultValues": true, + "generateDataAnnotations": true, + "excludedTypeNames": [], + "excludedParameterNames": [], + "handleReferences": false, + "generateImmutableArrayProperties": false, + "generateImmutableDictionaryProperties": false, + "jsonSerializerSettingsTransformationMethod": null, + "inlineNamedArrays": false, + "inlineNamedDictionaries": false, + "inlineNamedTuples": true, + "inlineNamedAny": false, + "generateDtoTypes": true, + "generateOptionalPropertiesAsNullable": false, + "generateNullableReferenceTypes": true, + "templateDirectory": null, + "typeNameGeneratorType": null, + "propertyNameGeneratorType": null, + "enumNameGeneratorType": null, + "serviceHost": null, + "serviceSchemes": null, + "output": "FSHApi.cs", + "newLineBehavior": "Auto" + } + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AuthProvider.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AuthProvider.cs new file mode 100644 index 0000000..c8c739a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AuthProvider.cs @@ -0,0 +1,7 @@ +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Auth; + +public enum AuthProvider +{ + Jwt, + AzureAd +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AuthorizationServiceExtensions.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AuthorizationServiceExtensions.cs new file mode 100644 index 0000000..52fe9d8 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AuthorizationServiceExtensions.cs @@ -0,0 +1,10 @@ +using FSH.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Auth; + +public static class AuthorizationServiceExtensions +{ + public static async Task HasPermissionAsync(this IAuthorizationService service, ClaimsPrincipal user, string action, string resource) => + (await service.AuthorizeAsync(user, null, FSHPermission.NameFor(action, resource))).Succeeded; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthenticationService.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthenticationService.cs new file mode 100644 index 0000000..dcb9bf5 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthenticationService.cs @@ -0,0 +1,34 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Auth.AzureAd; + +internal class AzureAdAuthenticationService : IAuthenticationService +{ + private readonly SignOutSessionStateManager _signOut; + private readonly NavigationManager _navigation; + + public AzureAdAuthenticationService(SignOutSessionStateManager signOut, NavigationManager navigation) => + (_signOut, _navigation) = (signOut, navigation); + + public AuthProvider ProviderType => AuthProvider.AzureAd; + + public void NavigateToExternalLogin(string returnUrl) => + _navigation.NavigateTo($"authentication/login?returnUrl={Uri.EscapeDataString(returnUrl)}"); + + public Task LoginAsync(string tenantId, TokenRequest request) => + throw new NotImplementedException(); + + public async Task LogoutAsync() + { + await _signOut.SetSignOutState(); + _navigation.NavigateTo("authentication/logout"); + } + + public Task ReLoginAsync(string returnUrl) + { + NavigateToExternalLogin(returnUrl); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthorizationMessageHandler.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthorizationMessageHandler.cs new file mode 100644 index 0000000..d9177a1 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthorizationMessageHandler.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Auth.AzureAd; + +public class AzureAdAuthorizationMessageHandler : AuthorizationMessageHandler +{ + public AzureAdAuthorizationMessageHandler(IAccessTokenProvider provider, NavigationManager navigation, IConfiguration config) + : base(provider, navigation) => ConfigureHandler( + new[] { config[ConfigNames.ApiBaseUrl] }, + new[] { config[$"{nameof(AuthProvider.AzureAd)}:{ConfigNames.ApiScope}"] }); +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AzureAd/AzureAdClaimsPrincipalFactory.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AzureAd/AzureAdClaimsPrincipalFactory.cs new file mode 100644 index 0000000..22e869c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/AzureAd/AzureAdClaimsPrincipalFactory.cs @@ -0,0 +1,73 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal; +using Microsoft.Extensions.DependencyInjection; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Auth.AzureAd; + +internal class AzureAdClaimsPrincipalFactory : AccountClaimsPrincipalFactory +{ + // Can't work with actual services in the constructor here, have to + // use IServiceProvider, otherwise the app hangs at startup. + // The culprit is probably HttpClient, as this class is instantiated + // at startup while the HttpClient is being (or not even) created. + private readonly IServiceProvider _services; + + public AzureAdClaimsPrincipalFactory(IAccessTokenProviderAccessor accessor, IServiceProvider services) + : base(accessor) => + _services = services; + + public override async ValueTask CreateUserAsync(RemoteUserAccount account, RemoteAuthenticationUserOptions options) + { + var principal = await base.CreateUserAsync(account, options); + + if (principal.Identity?.IsAuthenticated is true) + { + var userDetails = await _services.GetRequiredService().GetProfileAsync(); + + var userIdentity = (ClaimsIdentity)principal.Identity; + + if (!string.IsNullOrWhiteSpace(userDetails.Email) && !userIdentity.HasClaim(c => c.Type == ClaimTypes.Email)) + { + userIdentity.AddClaim(new Claim(ClaimTypes.Email, userDetails.Email)); + } + + if (!string.IsNullOrWhiteSpace(userDetails.PhoneNumber) && !userIdentity.HasClaim(c => c.Type == ClaimTypes.MobilePhone)) + { + userIdentity.AddClaim(new Claim(ClaimTypes.MobilePhone, userDetails.PhoneNumber)); + } + + if (!string.IsNullOrWhiteSpace(userDetails.FirstName) && !userIdentity.HasClaim(c => c.Type == ClaimTypes.Name)) + { + userIdentity.AddClaim(new Claim(ClaimTypes.Name, userDetails.FirstName)); + } + + if (!string.IsNullOrWhiteSpace(userDetails.LastName) && !userIdentity.HasClaim(c => c.Type == ClaimTypes.Surname)) + { + userIdentity.AddClaim(new Claim(ClaimTypes.Surname, userDetails.LastName)); + } + + if (!userIdentity.HasClaim(c => c.Type == FSHClaims.Fullname)) + { + userIdentity.AddClaim(new Claim(FSHClaims.Fullname, $"{userDetails.FirstName} {userDetails.LastName}")); + } + + if (!userIdentity.HasClaim(c => c.Type == ClaimTypes.NameIdentifier)) + { + userIdentity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userDetails.Id.ToString())); + } + + if (!string.IsNullOrWhiteSpace(userDetails.ImageUrl) && !userIdentity.HasClaim(c => c.Type == FSHClaims.ImageUrl) && userDetails.ImageUrl is not null) + { + userIdentity.AddClaim(new Claim(FSHClaims.ImageUrl, userDetails.ImageUrl)); + } + + var permissions = await _services.GetRequiredService().GetPermissionsAsync(); + + userIdentity.AddClaims(permissions.Select(permission => new Claim(FSHClaims.Permission, permission))); + } + + return principal; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/IAuthenticationService.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/IAuthenticationService.cs new file mode 100644 index 0000000..5cef8d4 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/IAuthenticationService.cs @@ -0,0 +1,16 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Auth; + +public interface IAuthenticationService +{ + AuthProvider ProviderType { get; } + + void NavigateToExternalLogin(string returnUrl); + + Task LoginAsync(string tenantId, TokenRequest request); + + Task LogoutAsync(); + + Task ReLoginAsync(string returnUrl); +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Jwt/AccessTokenProviderAccessor.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Jwt/AccessTokenProviderAccessor.cs new file mode 100644 index 0000000..83c3ee6 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Jwt/AccessTokenProviderAccessor.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal; +using Microsoft.Extensions.DependencyInjection; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Auth.Jwt; + +internal class AccessTokenProviderAccessor : IAccessTokenProviderAccessor +{ + private readonly IServiceProvider _provider; + private IAccessTokenProvider? _tokenProvider; + + public AccessTokenProviderAccessor(IServiceProvider provider) => + _provider = provider; + + public IAccessTokenProvider TokenProvider => + _tokenProvider ??= _provider.GetRequiredService(); +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationHeaderHandler.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationHeaderHandler.cs new file mode 100644 index 0000000..69c33f6 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationHeaderHandler.cs @@ -0,0 +1,34 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Auth.Jwt; + +public class JwtAuthenticationHeaderHandler : DelegatingHandler +{ + private readonly IAccessTokenProviderAccessor _tokenProviderAccessor; + private readonly NavigationManager _navigation; + + public JwtAuthenticationHeaderHandler(IAccessTokenProviderAccessor tokenProviderAccessor, NavigationManager navigation) + { + _tokenProviderAccessor = tokenProviderAccessor; + _navigation = navigation; + } + + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + // skip token endpoints + if (request.RequestUri?.AbsolutePath.Contains("/tokens") is not true) + { + if (await _tokenProviderAccessor.TokenProvider.GetAccessTokenAsync() is string token) + { + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); + } + else + { + _navigation.NavigateTo("/login"); + } + } + + return await base.SendAsync(request, cancellationToken); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationService.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationService.cs new file mode 100644 index 0000000..5723573 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationService.cs @@ -0,0 +1,222 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Auth.Jwt; + +public class JwtAuthenticationService : AuthenticationStateProvider, IAuthenticationService, IAccessTokenProvider +{ + private readonly SemaphoreSlim _semaphore = new(1, 1); + + private readonly ILocalStorageService _localStorage; + private readonly ITokensClient _tokensClient; + private readonly IPersonalClient _personalClient; + private readonly NavigationManager _navigation; + + public AuthProvider ProviderType => AuthProvider.Jwt; + + public JwtAuthenticationService(ILocalStorageService localStorage, IPersonalClient personalClient, ITokensClient tokensClient, NavigationManager navigation) + { + _localStorage = localStorage; + _personalClient = personalClient; + _tokensClient = tokensClient; + _navigation = navigation; + } + + public override async Task GetAuthenticationStateAsync() + { + string cachedToken = await GetCachedAuthTokenAsync(); + if (string.IsNullOrWhiteSpace(cachedToken)) + { + return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity())); + } + + // Generate claimsIdentity from cached token + var claimsIdentity = new ClaimsIdentity(GetClaimsFromJwt(cachedToken), "jwt"); + + // Add cached permissions as claims + if (await GetCachedPermissionsAsync() is List cachedPermissions) + { + claimsIdentity.AddClaims(cachedPermissions.Select(p => new Claim(FSHClaims.Permission, p))); + } + + return new AuthenticationState(new ClaimsPrincipal(claimsIdentity)); + } + + public void NavigateToExternalLogin(string returnUrl) => + throw new NotImplementedException(); + + public async Task LoginAsync(string tenantId, TokenRequest request) + { + var tokenResponse = await _tokensClient.GetTokenAsync(tenantId, request); + + string? token = tokenResponse.Token; + string? refreshToken = tokenResponse.RefreshToken; + + if (string.IsNullOrWhiteSpace(token) || string.IsNullOrWhiteSpace(refreshToken)) + { + return false; + } + + await CacheAuthTokens(token, refreshToken); + + // Get permissions for the current user and add them to the cache + var permissions = await _personalClient.GetPermissionsAsync(); + await CachePermissions(permissions); + + NotifyAuthenticationStateChanged(GetAuthenticationStateAsync()); + + return true; + } + + public async Task LogoutAsync() + { + await ClearCacheAsync(); + + NotifyAuthenticationStateChanged(GetAuthenticationStateAsync()); + + _navigation.NavigateTo("/login"); + } + + public async Task ReLoginAsync(string returnUrl) + { + await LogoutAsync(); + _navigation.NavigateTo(returnUrl); + } + + public async ValueTask RequestAccessToken() + { + var authState = await GetAuthenticationStateAsync(); + if (authState.User.Identity?.IsAuthenticated is not true) + { + return new AccessTokenResult(AccessTokenResultStatus.RequiresRedirect, null, "/login"); + } + + // We make sure the access token is only refreshed by one thread at a time. The other ones have to wait. + await _semaphore.WaitAsync(); + try + { + string? token = await GetCachedAuthTokenAsync(); + + // Check if token needs to be refreshed (when its expiration time is less than 1 minute away) + var expTime = authState.User.GetExpiration(); + var diff = expTime - DateTime.UtcNow; + if (diff.TotalMinutes <= 1) + { + string? refreshToken = await GetCachedRefreshTokenAsync(); + (bool succeeded, var response) = await TryRefreshTokenAsync(new RefreshTokenRequest { Token = token, RefreshToken = refreshToken }); + if (!succeeded) + { + return new AccessTokenResult(AccessTokenResultStatus.RequiresRedirect, null, "/login"); + } + + token = response?.Token; + } + + return new AccessTokenResult(AccessTokenResultStatus.Success, new AccessToken() { Value = token }, string.Empty); + } + finally + { + _semaphore.Release(); + } + } + + public ValueTask RequestAccessToken(AccessTokenRequestOptions options) => + RequestAccessToken(); + + private async Task<(bool Succeeded, TokenResponse? Token)> TryRefreshTokenAsync(RefreshTokenRequest request) + { + var authState = await GetAuthenticationStateAsync(); + string? tenantKey = authState.User.GetTenant(); + if (string.IsNullOrWhiteSpace(tenantKey)) + { + throw new InvalidOperationException("Can't refresh token when user is not logged in!"); + } + + try + { + var tokenResponse = await _tokensClient.RefreshAsync(tenantKey, request); + + await CacheAuthTokens(tokenResponse.Token, tokenResponse.RefreshToken); + + return (true, tokenResponse); + } + catch (ApiException) + { + return (false, null); + } + } + + private async ValueTask CacheAuthTokens(string? token, string? refreshToken) + { + await _localStorage.SetItemAsync(StorageConstants.Local.AuthToken, token); + await _localStorage.SetItemAsync(StorageConstants.Local.RefreshToken, refreshToken); + } + + private ValueTask CachePermissions(ICollection permissions) => + _localStorage.SetItemAsync(StorageConstants.Local.Permissions, permissions); + + private async Task ClearCacheAsync() + { + await _localStorage.RemoveItemAsync(StorageConstants.Local.AuthToken); + await _localStorage.RemoveItemAsync(StorageConstants.Local.RefreshToken); + await _localStorage.RemoveItemAsync(StorageConstants.Local.Permissions); + } + + private ValueTask GetCachedAuthTokenAsync() => + _localStorage.GetItemAsync(StorageConstants.Local.AuthToken); + + private ValueTask GetCachedRefreshTokenAsync() => + _localStorage.GetItemAsync(StorageConstants.Local.RefreshToken); + + private ValueTask> GetCachedPermissionsAsync() => + _localStorage.GetItemAsync>(StorageConstants.Local.Permissions); + + private IEnumerable GetClaimsFromJwt(string jwt) + { + var claims = new List(); + string payload = jwt.Split('.')[1]; + byte[] jsonBytes = ParseBase64WithoutPadding(payload); + var keyValuePairs = JsonSerializer.Deserialize>(jsonBytes); + + if (keyValuePairs is not null) + { + keyValuePairs.TryGetValue(ClaimTypes.Role, out object? roles); + + if (roles is not null) + { + string? rolesString = roles.ToString(); + if (!string.IsNullOrEmpty(rolesString)) + { + if (rolesString.Trim().StartsWith("[")) + { + string[]? parsedRoles = JsonSerializer.Deserialize(rolesString); + + if (parsedRoles is not null) + { + claims.AddRange(parsedRoles.Select(role => new Claim(ClaimTypes.Role, role))); + } + } + else + { + claims.Add(new Claim(ClaimTypes.Role, rolesString)); + } + } + + keyValuePairs.Remove(ClaimTypes.Role); + } + + claims.AddRange(keyValuePairs.Select(kvp => new Claim(kvp.Key, kvp.Value.ToString() ?? string.Empty))); + } + + return claims; + } + + private byte[] ParseBase64WithoutPadding(string payload) + { + payload = payload.Trim().Replace('-', '+').Replace('_', '/'); + string base64 = payload.PadRight(payload.Length + ((4 - (payload.Length % 4)) % 4), '='); + return Convert.FromBase64String(base64); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/MustHavePermissionAttribute.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/MustHavePermissionAttribute.cs new file mode 100644 index 0000000..c18b66b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/MustHavePermissionAttribute.cs @@ -0,0 +1,10 @@ +using FSH.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Auth; + +public class MustHavePermissionAttribute : AuthorizeAttribute +{ + public MustHavePermissionAttribute(string action, string resource) => + Policy = FSHPermission.NameFor(action, resource); +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Startup.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Startup.cs new file mode 100644 index 0000000..74c0c70 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Auth/Startup.cs @@ -0,0 +1,47 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.Auth.AzureAd; +using FSH.BlazorWebAssembly.Client.Infrastructure.Auth.Jwt; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal; +using Microsoft.Extensions.DependencyInjection; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Auth; + +internal static class Startup +{ + public static IServiceCollection AddAuthentication(this IServiceCollection services, IConfiguration config) => + config[nameof(AuthProvider)] switch + { + // AzureAd + nameof(AuthProvider.AzureAd) => services + .AddScoped() + .AddScoped() + .AddMsalAuthentication(options => + { + config.Bind(nameof(AuthProvider.AzureAd), options.ProviderOptions.Authentication); + options.ProviderOptions.DefaultAccessTokenScopes.Add( + config[$"{nameof(AuthProvider.AzureAd)}:{ConfigNames.ApiScope}"]); + options.ProviderOptions.LoginMode = "redirect"; + }) + .AddAccountClaimsPrincipalFactory() + .Services, + + // Jwt + _ => services + .AddScoped() + .AddScoped(sp => (IAuthenticationService)sp.GetRequiredService()) + .AddScoped(sp => (IAccessTokenProvider)sp.GetRequiredService()) + .AddScoped() + .AddScoped() + }; + + public static IHttpClientBuilder AddAuthenticationHandler(this IHttpClientBuilder builder, IConfiguration config) => + config[nameof(AuthProvider)] switch + { + // AzureAd + nameof(AuthProvider.AzureAd) => + builder.AddHttpMessageHandler(), + + // Jwt + _ => builder.AddHttpMessageHandler() + }; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Client.Infrastructure.csproj b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Client.Infrastructure.csproj new file mode 100644 index 0000000..e1301f9 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Client.Infrastructure.csproj @@ -0,0 +1,39 @@ + + + + net6.0 + FSH.BlazorWebAssembly.Client.Infrastructure + FSH.BlazorWebAssembly.Client.Infrastructure + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/AccessTokenProviderExtensions.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/AccessTokenProviderExtensions.cs new file mode 100644 index 0000000..417c925 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/AccessTokenProviderExtensions.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Common; + +public static class AccessTokenProviderExtensions +{ + public static async Task GetAccessTokenAsync(this IAccessTokenProvider tokenProvider) => + (await tokenProvider.RequestAccessToken()) + .TryGetToken(out var token) + ? token.Value + : null; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/ApplicationConstants.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/ApplicationConstants.cs new file mode 100644 index 0000000..05fe79a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/ApplicationConstants.cs @@ -0,0 +1,15 @@ +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Common; + +public static class ApplicationConstants +{ + public static readonly List SupportedImageFormats = new() + { + ".jpeg", + ".jpg", + ".png" + }; + public static readonly string StandardImageFormat = "image/jpeg"; + public static readonly int MaxImageWidth = 1500; + public static readonly int MaxImageHeight = 1500; + public static readonly long MaxAllowedSize = 1000000; // Allows Max File Size of 1 Mb. +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/ConfigNames.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/ConfigNames.cs new file mode 100644 index 0000000..cf6d2b8 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/ConfigNames.cs @@ -0,0 +1,7 @@ +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Common; + +public static class ConfigNames +{ + public const string ApiBaseUrl = "ApiBaseUrl"; + public const string ApiScope = "ApiScope"; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/IAppService.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/IAppService.cs new file mode 100644 index 0000000..520bf7e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/IAppService.cs @@ -0,0 +1,5 @@ +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Common; + +public interface IAppService +{ +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/LocalizationConstants.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/LocalizationConstants.cs new file mode 100644 index 0000000..093af42 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/LocalizationConstants.cs @@ -0,0 +1,21 @@ +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Common; + +public record LanguageCode(string Code, string DisplayName, bool IsRTL = false); + +public static class LocalizationConstants +{ + public static readonly LanguageCode[] SupportedLanguages = + { + new("en-US", "English"), + new("fr-FR", "French"), + new("km_KH", "Khmer"), + new("de-DE", "German"), + new("nl-NL", "Dutch - Netherlands"), + new("es-ES", "Spanish"), + new("ru-RU", "Russian"), + new("sv-SE", "Swedish"), + new("id-ID", "Indonesia"), + new("it-IT", "Italian"), + new("ar", "عربي", true) + }; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/StorageConstants.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/StorageConstants.cs new file mode 100644 index 0000000..b0cf4fc --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Common/StorageConstants.cs @@ -0,0 +1,14 @@ +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Common; + +public static class StorageConstants +{ + public static class Local + { + public static string Preference = "clientPreference"; + + public static string AuthToken = "authToken"; + public static string RefreshToken = "refreshToken"; + public static string ImageUri = "userImageURL"; + public static string Permissions = "permissions"; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/GlobalUsings.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/GlobalUsings.cs new file mode 100644 index 0000000..d093b73 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/GlobalUsings.cs @@ -0,0 +1,7 @@ +global using System.Net.Http.Headers; +global using System.Security.Claims; +global using System.Text.Json; +global using Blazored.LocalStorage; +global using FSH.BlazorWebAssembly.Client.Infrastructure.Common; +global using Microsoft.AspNetCore.Components.Authorization; +global using Microsoft.Extensions.Configuration; diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/ConnectionState.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/ConnectionState.cs new file mode 100644 index 0000000..e1b3a4b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/ConnectionState.cs @@ -0,0 +1,8 @@ +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Notifications; + +public enum ConnectionState +{ + Connected, + Connecting, + Disconnected +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/ConnectionStateChanged.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/ConnectionStateChanged.cs new file mode 100644 index 0000000..5246e54 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/ConnectionStateChanged.cs @@ -0,0 +1,5 @@ +using FSH.WebApi.Shared.Notifications; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Notifications; + +public record ConnectionStateChanged(ConnectionState State, string? Message) : INotificationMessage; \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/INotificationPublisher.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/INotificationPublisher.cs new file mode 100644 index 0000000..54e8aba --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/INotificationPublisher.cs @@ -0,0 +1,8 @@ +using FSH.WebApi.Shared.Notifications; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Notifications; + +public interface INotificationPublisher +{ + Task PublishAsync(INotificationMessage notification); +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/NotificationPublisher.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/NotificationPublisher.cs new file mode 100644 index 0000000..9ab414b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/NotificationPublisher.cs @@ -0,0 +1,24 @@ +using FSH.WebApi.Shared.Notifications; +using MediatR; +using Microsoft.Extensions.Logging; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Notifications; + +public class NotificationPublisher : INotificationPublisher +{ + private readonly ILogger _logger; + private readonly IPublisher _mediator; + + public NotificationPublisher(ILogger logger, IPublisher mediator) => + (_logger, _mediator) = (logger, mediator); + + public Task PublishAsync(INotificationMessage notification) + { + _logger.LogInformation("Publishing Notification : {notification}", notification.GetType().Name); + return _mediator.Publish(CreateNotificationWrapper(notification)); + } + + private INotification CreateNotificationWrapper(INotificationMessage notification) => + (INotification)Activator.CreateInstance( + typeof(NotificationWrapper<>).MakeGenericType(notification.GetType()), notification)!; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/NotificationWrapper.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/NotificationWrapper.cs new file mode 100644 index 0000000..ccb1a84 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/NotificationWrapper.cs @@ -0,0 +1,12 @@ +using FSH.WebApi.Shared.Notifications; +using MediatR; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Notifications; + +public class NotificationWrapper : INotification + where TNotificationMessage : INotificationMessage +{ + public NotificationWrapper(TNotificationMessage notification) => Notification = notification; + + public TNotificationMessage Notification { get; } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/Startup.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/Startup.cs new file mode 100644 index 0000000..1784064 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Notifications/Startup.cs @@ -0,0 +1,34 @@ +using FSH.WebApi.Shared.Notifications; +using MediatR; +using MediatR.Courier; +using MediatR.Courier.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Notifications; + +internal static class Startup +{ + public static IServiceCollection AddNotifications(this IServiceCollection services) + { + // Add mediator processing of notifications + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + + services + .AddMediatR(assemblies) + .AddCourier(assemblies) + .AddTransient(); + + // Register handlers for all INotificationMessages + foreach (var eventType in assemblies + .SelectMany(a => a.GetTypes()) + .Where(t => t.GetInterfaces().Any(i => i == typeof(INotificationMessage)))) + { + services.AddSingleton( + typeof(INotificationHandler<>).MakeGenericType( + typeof(NotificationWrapper<>).MakeGenericType(eventType)), + serviceProvider => serviceProvider.GetRequiredService(typeof(MediatRCourier))); + } + + return services; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/ClientPreference.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/ClientPreference.cs new file mode 100644 index 0000000..2bbabe3 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/ClientPreference.cs @@ -0,0 +1,15 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.Theme; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Preferences; + +public class ClientPreference : IPreference +{ + public bool IsDarkMode { get; set; } + public bool IsRTL { get; set; } + public bool IsDrawerOpen { get; set; } + public string PrimaryColor { get; set; } = CustomColors.Light.Primary; + public string SecondaryColor { get; set; } = CustomColors.Light.Secondary; + public double BorderRadius { get; set; } = 5; + public string LanguageCode { get; set; } = LocalizationConstants.SupportedLanguages.FirstOrDefault()?.Code ?? "en-US"; + public FshTablePreference TablePreference { get; set; } = new FshTablePreference(); +} diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/ClientPreferenceManager.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/ClientPreferenceManager.cs new file mode 100644 index 0000000..b4a4dbe --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/ClientPreferenceManager.cs @@ -0,0 +1,137 @@ +using System.Text.RegularExpressions; +using FSH.BlazorWebAssembly.Client.Infrastructure.Theme; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Preferences; + +public class ClientPreferenceManager : IClientPreferenceManager +{ + private readonly ILocalStorageService _localStorageService; + + public ClientPreferenceManager( + ILocalStorageService localStorageService) + { + _localStorageService = localStorageService; + } + + public async Task ToggleDarkModeAsync() + { + if (await GetPreference() is ClientPreference preference) + { + preference.IsDarkMode = !preference.IsDarkMode; + await SetPreference(preference); + return !preference.IsDarkMode; + } + + return false; + } + + public async Task ToggleDrawerAsync() + { + if (await GetPreference() is ClientPreference preference) + { + preference.IsDrawerOpen = !preference.IsDrawerOpen; + await SetPreference(preference); + return preference.IsDrawerOpen; + } + + return false; + } + + public async Task ToggleLayoutDirectionAsync() + { + if (await GetPreference() is ClientPreference preference) + { + preference.IsRTL = !preference.IsRTL; + await SetPreference(preference); + return preference.IsRTL; + } + + return false; + } + + public async Task ChangeLanguageAsync(string languageCode) + { + if (await GetPreference() is ClientPreference preference) + { + var language = Array.Find(LocalizationConstants.SupportedLanguages, a => a.Code == languageCode); + if (language?.Code is not null) + { + preference.LanguageCode = language.Code; + preference.IsRTL = language.IsRTL; + } + else + { + preference.LanguageCode = "en-EN"; + preference.IsRTL = false; + } + + await SetPreference(preference); + return true; + } + + return false; + } + + public async Task GetCurrentThemeAsync() + { + if (await GetPreference() is ClientPreference preference) + { + if (preference.IsDarkMode) return new DarkTheme(); + } + + return new LightTheme(); + } + + public async Task GetPrimaryColorAsync() + { + if (await GetPreference() is ClientPreference preference) + { + string colorCode = preference.PrimaryColor; + if (Regex.Match(colorCode, "^#(?:[0-9a-fA-F]{3,4}){1,2}$").Success) + { + return colorCode; + } + else + { + preference.PrimaryColor = CustomColors.Light.Primary; + await SetPreference(preference); + return preference.PrimaryColor; + } + } + + return CustomColors.Light.Primary; + } + + public async Task IsRTL() + { + if (await GetPreference() is ClientPreference preference) + { + return preference.IsRTL; + } + + return false; + } + + public async Task IsDrawerOpen() + { + if (await GetPreference() is ClientPreference preference) + { + return preference.IsDrawerOpen; + } + + return false; + } + + public static string Preference = "clientPreference"; + + public async Task GetPreference() + { + return await _localStorageService.GetItemAsync(Preference) ?? new ClientPreference(); + } + + public async Task SetPreference(IPreference preference) + { + await _localStorageService.SetItemAsync(Preference, preference as ClientPreference); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/FshTablePreference.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/FshTablePreference.cs new file mode 100644 index 0000000..8ba0c18 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/FshTablePreference.cs @@ -0,0 +1,11 @@ +using FSH.WebApi.Shared.Notifications; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Preferences; + +public class FshTablePreference : INotificationMessage +{ + public bool IsDense { get; set; } + public bool IsStriped { get; set; } + public bool HasBorder { get; set; } + public bool IsHoverable { get; set; } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/IClientPreferenceManager.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/IClientPreferenceManager.cs new file mode 100644 index 0000000..a871866 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/IClientPreferenceManager.cs @@ -0,0 +1,14 @@ +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Preferences; + +public interface IClientPreferenceManager : IPreferenceManager +{ + Task GetCurrentThemeAsync(); + + Task ToggleDarkModeAsync(); + + Task ToggleDrawerAsync(); + + Task ToggleLayoutDirectionAsync(); +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/IPreference.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/IPreference.cs new file mode 100644 index 0000000..42135ac --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/IPreference.cs @@ -0,0 +1,6 @@ +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Preferences; + +public interface IPreference +{ + // public string LanguageCode { get; set; } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/IPreferenceManager.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/IPreferenceManager.cs new file mode 100644 index 0000000..83d79b6 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Preferences/IPreferenceManager.cs @@ -0,0 +1,10 @@ +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Preferences; + +public interface IPreferenceManager : IAppService +{ + Task SetPreference(IPreference preference); + + Task GetPreference(); + + Task ChangeLanguageAsync(string languageCode); +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Startup.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Startup.cs new file mode 100644 index 0000000..c94cae1 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Startup.cs @@ -0,0 +1,81 @@ +using System.Globalization; +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Infrastructure.Auth; +using FSH.BlazorWebAssembly.Client.Infrastructure.Notifications; +using FSH.BlazorWebAssembly.Client.Infrastructure.Preferences; +using FSH.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.DependencyInjection; +using MudBlazor; +using MudBlazor.Services; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure; + +public static class Startup +{ + private const string ClientName = "FullStackHero.API"; + + public static IServiceCollection AddClientServices(this IServiceCollection services, IConfiguration config) => + services + .AddLocalization(options => options.ResourcesPath = "Resources") + .AddBlazoredLocalStorage() + .AddMudServices(configuration => + { + configuration.SnackbarConfiguration.PositionClass = Defaults.Classes.Position.BottomRight; + configuration.SnackbarConfiguration.HideTransitionDuration = 100; + configuration.SnackbarConfiguration.ShowTransitionDuration = 100; + configuration.SnackbarConfiguration.VisibleStateDuration = 3000; + configuration.SnackbarConfiguration.ShowCloseIcon = false; + }) + .AddScoped() + .AutoRegisterInterfaces() + .AutoRegisterInterfaces() + .AddNotifications() + .AddAuthentication(config) + .AddAuthorizationCore(RegisterPermissionClaims) + + // Add Api Http Client. + .AddHttpClient(ClientName, client => + { + client.DefaultRequestHeaders.AcceptLanguage.Clear(); + client.DefaultRequestHeaders.AcceptLanguage.ParseAdd(CultureInfo.DefaultThreadCurrentCulture?.TwoLetterISOLanguageName); + client.BaseAddress = new Uri(config[ConfigNames.ApiBaseUrl]); + }) + .AddAuthenticationHandler(config) + .Services + .AddScoped(sp => sp.GetRequiredService().CreateClient(ClientName)); + + private static void RegisterPermissionClaims(AuthorizationOptions options) + { + foreach (var permission in FSHPermissions.All) + { + options.AddPolicy(permission.Name, policy => policy.RequireClaim(FSHClaims.Permission, permission.Name)); + } + } + + public static IServiceCollection AutoRegisterInterfaces(this IServiceCollection services) + { + var @interface = typeof(T); + + var types = @interface + .Assembly + .GetExportedTypes() + .Where(t => t.IsClass && !t.IsAbstract) + .Select(t => new + { + Service = t.GetInterface($"I{t.Name}"), + Implementation = t + }) + .Where(t => t.Service != null); + + foreach (var type in types) + { + if (@interface.IsAssignableFrom(type.Service)) + { + services.AddTransient(type.Service, type.Implementation); + } + } + + return services; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/CustomColors.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/CustomColors.cs new file mode 100644 index 0000000..6448269 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/CustomColors.cs @@ -0,0 +1,42 @@ +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Theme; + +public static class CustomColors +{ + public static readonly List ThemeColors = new() + { + Light.Primary, + Colors.Blue.Default, + Colors.BlueGrey.Default, + Colors.Purple.Default, + Colors.Orange.Default, + Colors.Red.Default, + Colors.Amber.Default, + Colors.DeepPurple.Default, + Colors.Pink.Default, + Colors.Indigo.Default, + Colors.LightBlue.Default, + Colors.Cyan.Default, + }; + + public static class Light + { + public const string Primary = "#3eaf7c"; + public const string Secondary = "#2196f3"; + public const string Background = "#FFF"; + public const string AppbarBackground = "#FFF"; + public const string AppbarText = "#6e6e6e"; + } + + public static class Dark + { + public const string Primary = "#3eaf7c"; + public const string Secondary = "#2196f3"; + public const string Background = "#1b1f22"; + public const string AppbarBackground = "#1b1f22"; + public const string DrawerBackground = "#121212"; + public const string Surface = "#202528"; + public const string Disabled = "#545454"; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/CustomTypography.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/CustomTypography.cs new file mode 100644 index 0000000..0b33533 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/CustomTypography.cs @@ -0,0 +1,114 @@ +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Theme; + +public static class CustomTypography +{ + public static Typography FSHTypography => new Typography() + { + Default = new Default() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = ".875rem", + FontWeight = 200, + LineHeight = 1.43, + LetterSpacing = ".01071em" + }, + H1 = new H1() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "6rem", + FontWeight = 300, + LineHeight = 1.167, + LetterSpacing = "-.01562em" + }, + H2 = new H2() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "3.75rem", + FontWeight = 300, + LineHeight = 1.2, + LetterSpacing = "-.00833em" + }, + H3 = new H3() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "3rem", + FontWeight = 400, + LineHeight = 1.167, + LetterSpacing = "0" + }, + H4 = new H4() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "2.125rem", + FontWeight = 400, + LineHeight = 1.235, + LetterSpacing = ".00735em" + }, + H5 = new H5() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "1.5rem", + FontWeight = 400, + LineHeight = 1.334, + LetterSpacing = "0" + }, + H6 = new H6() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "1.25rem", + FontWeight = 400, + LineHeight = 1.6, + LetterSpacing = ".0075em" + }, + Button = new Button() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = ".875rem", + FontWeight = 400, + LineHeight = 1.75, + LetterSpacing = ".02857em" + }, + Body1 = new Body1() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "1rem", + FontWeight = 400, + LineHeight = 1.5, + LetterSpacing = ".00938em" + }, + Body2 = new Body2() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = ".875rem", + FontWeight = 400, + LineHeight = 1.43, + LetterSpacing = ".01071em" + }, + Caption = new Caption() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = ".75rem", + FontWeight = 200, + LineHeight = 1.66, + LetterSpacing = ".03333em" + }, + Subtitle1 = new Subtitle1() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "1rem", + FontWeight = 400, + LineHeight = 1.57, + LetterSpacing = ".00714em" + }, + Subtitle2 = new Subtitle2() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = ".875rem", + FontWeight = 400, + LineHeight = 1.57, + LetterSpacing = ".00714em" + } + }; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/DarkTheme.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/DarkTheme.cs new file mode 100644 index 0000000..ff1b6aa --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/DarkTheme.cs @@ -0,0 +1,44 @@ +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Theme; + +public class DarkTheme : MudTheme +{ + public DarkTheme() + { + Palette = new Palette() + { + Primary = CustomColors.Dark.Primary, + Secondary = CustomColors.Dark.Secondary, + Success = CustomColors.Dark.Primary, + Black = "#27272f", + Background = CustomColors.Dark.Background, + BackgroundGrey = "#27272f", + Surface = CustomColors.Dark.Surface, + DrawerBackground = CustomColors.Dark.DrawerBackground, + DrawerText = "rgba(255,255,255, 0.50)", + AppbarBackground = CustomColors.Dark.AppbarBackground, + AppbarText = "rgba(255,255,255, 0.70)", + TextPrimary = "rgba(255,255,255, 0.70)", + TextSecondary = "rgba(255,255,255, 0.50)", + ActionDefault = "#adadb1", + ActionDisabled = "rgba(255,255,255, 0.26)", + ActionDisabledBackground = "rgba(255,255,255, 0.12)", + DrawerIcon = "rgba(255,255,255, 0.50)", + TableLines = "#e0e0e036", + Dark = CustomColors.Dark.DrawerBackground, + Divider = "#e0e0e036", + OverlayDark = "hsl(0deg 0% 0% / 75%)", + TextDisabled = CustomColors.Dark.Disabled + }; + + LayoutProperties = new LayoutProperties() + { + DefaultBorderRadius = "5px", + }; + + Typography = CustomTypography.FSHTypography; + Shadows = new Shadow(); + ZIndex = new ZIndex() { Drawer = 1300 }; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/LightTheme.cs b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/LightTheme.cs new file mode 100644 index 0000000..8093aa4 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client.Infrastructure/Theme/LightTheme.cs @@ -0,0 +1,31 @@ +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Infrastructure.Theme; + +public class LightTheme : MudTheme +{ + public LightTheme() + { + Palette = new Palette() + { + Primary = CustomColors.Light.Primary, + Secondary = CustomColors.Light.Secondary, + Background = CustomColors.Light.Background, + AppbarBackground = CustomColors.Light.AppbarBackground, + AppbarText = CustomColors.Light.AppbarText, + DrawerBackground = CustomColors.Light.Background, + DrawerText = "rgba(0,0,0, 0.7)", + Success = CustomColors.Light.Primary, + TableLines = "#e0e0e029", + OverlayDark = "hsl(0deg 0% 0% / 75%)" + }; + LayoutProperties = new LayoutProperties() + { + DefaultBorderRadius = "5px" + }; + + Typography = CustomTypography.FSHTypography; + Shadows = new Shadow(); + ZIndex = new ZIndex() { Drawer = 1300 }; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/App.razor b/blazor-wasm-boilerplate-main/src/Client/App.razor new file mode 100644 index 0000000..8fd8903 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/App.razor @@ -0,0 +1,23 @@ + + + + + + @if (@context.User.Identity?.IsAuthenticated is true) + { +

You are not authorized to be here.

+ } + else + { + + } +
+
+
+ + +

Sorry, there's nothing at this address.

+
+
+
+
\ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Client.csproj b/blazor-wasm-boilerplate-main/src/Client/Client.csproj new file mode 100644 index 0000000..08fec69 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Client.csproj @@ -0,0 +1,35 @@ + + + + net6.0 + FSH.BlazorWebAssembly.Client + FSH.BlazorWebAssembly.Client + service-worker-assets.js + true + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/Common/CustomValidation.cs b/blazor-wasm-boilerplate-main/src/Client/Components/Common/CustomValidation.cs new file mode 100644 index 0000000..5a16322 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/Common/CustomValidation.cs @@ -0,0 +1,51 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; + +namespace FSH.BlazorWebAssembly.Client.Components.Common; + +// See https://docs.microsoft.com/en-us/aspnet/core/blazor/forms-validation?view=aspnetcore-6.0#server-validation-with-a-validator-component +public class CustomValidation : ComponentBase +{ + private ValidationMessageStore? _messageStore; + + [CascadingParameter] + private EditContext? CurrentEditContext { get; set; } + + protected override void OnInitialized() + { + if (CurrentEditContext is null) + { + throw new InvalidOperationException( + $"{nameof(CustomValidation)} requires a cascading " + + $"parameter of type {nameof(EditContext)}. " + + $"For example, you can use {nameof(CustomValidation)} " + + $"inside an {nameof(EditForm)}."); + } + + _messageStore = new(CurrentEditContext); + + CurrentEditContext.OnValidationRequested += (s, e) => + _messageStore?.Clear(); + CurrentEditContext.OnFieldChanged += (s, e) => + _messageStore?.Clear(e.FieldIdentifier); + } + + public void DisplayErrors(IDictionary> errors) + { + if (CurrentEditContext is not null && errors is not null) + { + foreach (var err in errors) + { + _messageStore?.Add(CurrentEditContext.Field(err.Key), err.Value); + } + + CurrentEditContext.NotifyValidationStateChanged(); + } + } + + public void ClearErrors() + { + _messageStore?.Clear(); + CurrentEditContext?.NotifyValidationStateChanged(); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/Common/ErrorHandler.razor b/blazor-wasm-boilerplate-main/src/Client/Components/Common/ErrorHandler.razor new file mode 100644 index 0000000..9467791 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/Common/ErrorHandler.razor @@ -0,0 +1,2 @@ +@inherits ErrorBoundary +@ChildContent \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/Common/ErrorHandler.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Components/Common/ErrorHandler.razor.cs new file mode 100644 index 0000000..a0ed8d6 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/Common/ErrorHandler.razor.cs @@ -0,0 +1,31 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.Auth; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Components.Common; + +public partial class ErrorHandler +{ + [Inject] + public IAuthenticationService AuthService { get; set; } = default!; + + public List _receivedExceptions = new(); + + protected override async Task OnErrorAsync(Exception exception) + { + _receivedExceptions.Add(exception); + switch (exception) + { + case UnauthorizedAccessException: + await AuthService.LogoutAsync(); + Snackbar.Add("Authentication Failed", Severity.Error); + break; + } + } + + public new void Recover() + { + _receivedExceptions.Clear(); + base.Recover(); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/Common/FshCustomError.razor b/blazor-wasm-boilerplate-main/src/Client/Components/Common/FshCustomError.razor new file mode 100644 index 0000000..827318b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/Common/FshCustomError.razor @@ -0,0 +1 @@ +Oopsie !! 😔 \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/Common/FshTable.cs b/blazor-wasm-boilerplate-main/src/Client/Components/Common/FshTable.cs new file mode 100644 index 0000000..f661f11 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/Common/FshTable.cs @@ -0,0 +1,39 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.Notifications; +using FSH.BlazorWebAssembly.Client.Infrastructure.Preferences; +using MediatR.Courier; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Components.Common; + +public class FshTable : MudTable +{ + [Inject] + private IClientPreferenceManager ClientPreferences { get; set; } = default!; + [Inject] + protected ICourier Courier { get; set; } = default!; + + protected override async Task OnInitializedAsync() + { + if (await ClientPreferences.GetPreference() is ClientPreference clientPreference) + { + SetTablePreference(clientPreference.TablePreference); + } + + Courier.SubscribeWeak>(wrapper => + { + SetTablePreference(wrapper.Notification); + StateHasChanged(); + }); + + await base.OnInitializedAsync(); + } + + private void SetTablePreference(FshTablePreference tablePreference) + { + Dense = tablePreference.IsDense; + Striped = tablePreference.IsStriped; + Bordered = tablePreference.HasBorder; + Hover = tablePreference.IsHoverable; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/Common/FshTitle.razor b/blazor-wasm-boilerplate-main/src/Client/Components/Common/FshTitle.razor new file mode 100644 index 0000000..e696be9 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/Common/FshTitle.razor @@ -0,0 +1,8 @@ +@Title +@Description + +@code +{ + [Parameter] public string? Title { get; set; } + [Parameter] public string? Description { get; set; } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/Common/PersonCard.razor b/blazor-wasm-boilerplate-main/src/Client/Components/Common/PersonCard.razor new file mode 100644 index 0000000..d17630e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/Common/PersonCard.razor @@ -0,0 +1,19 @@ + + + + @if (string.IsNullOrEmpty(this.ImageUri)) + { + @FullName?.ToUpper().FirstOrDefault() + + } + else + { + + } + + + @FullName + @Email + + + diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/Common/PersonCard.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Components/Common/PersonCard.razor.cs new file mode 100644 index 0000000..7498f08 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/Common/PersonCard.razor.cs @@ -0,0 +1,46 @@ +using System.Security.Claims; +using FSH.BlazorWebAssembly.Client.Infrastructure.Common; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; + +namespace FSH.BlazorWebAssembly.Client.Components.Common; + +public partial class PersonCard +{ + [Parameter] + public string? Class { get; set; } + [Parameter] + public string? Style { get; set; } + + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + + private string? UserId { get; set; } + private string? Email { get; set; } + private string? FullName { get; set; } + private string? ImageUri { get; set; } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + await LoadUserData(); + } + } + + private async Task LoadUserData() + { + var user = (await AuthState).User; + if (user.Identity?.IsAuthenticated == true) + { + if (string.IsNullOrEmpty(UserId)) + { + FullName = user.GetFullName(); + UserId = user.GetUserId(); + Email = user.GetEmail(); + ImageUri = string.IsNullOrEmpty(user?.GetImageUrl()) ? string.Empty : (Config[ConfigNames.ApiBaseUrl] + user?.GetImageUrl()); + StateHasChanged(); + } + } + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/Common/TablePager.razor b/blazor-wasm-boilerplate-main/src/Client/Components/Common/TablePager.razor new file mode 100644 index 0000000..c5fdc78 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/Common/TablePager.razor @@ -0,0 +1,3 @@ +@inject IStringLocalizer L + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/Dialogs/DeleteConfirmation.razor b/blazor-wasm-boilerplate-main/src/Client/Components/Dialogs/DeleteConfirmation.razor new file mode 100644 index 0000000..f08d440 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/Dialogs/DeleteConfirmation.razor @@ -0,0 +1,31 @@ +@inject IStringLocalizer L + + + + + + @L["Delete Confirmation"] + + + + @ContentText + + + @L["Cancel"] + @L["Confirm"] + + + +@code { + [CascadingParameter] + MudDialogInstance MudDialog { get; set; } = default!; + + [Parameter] + public string? ContentText { get; set; } + + void Submit() + { + MudDialog.Close(DialogResult.Ok(true)); + } + void Cancel() => MudDialog.Cancel(); +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/Dialogs/Logout.razor b/blazor-wasm-boilerplate-main/src/Client/Components/Dialogs/Logout.razor new file mode 100644 index 0000000..a660e8e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/Dialogs/Logout.razor @@ -0,0 +1,40 @@ +@namespace FSH.BlazorWebAssembly.Client.Shared.Dialogs + +@inject IStringLocalizer L +@inject IAuthenticationService AuthService + + + + + + @L["Logout Confirmation"] + + + + @ContentText + + + @L["Cancel"] + @ButtonText + + + +@code { + [Parameter] public string? ContentText { get; set; } + + [Parameter] public string? ButtonText { get; set; } + + [Parameter] public Color Color { get; set; } + + [CascadingParameter] MudDialogInstance MudDialog { get; set; } = default!; + + async Task Submit() + { + await AuthService.LogoutAsync(); + Snackbar.Add(@L["Logged out"], Severity.Info); + MudDialog.Close(DialogResult.Ok(true)); + } + + void Cancel() => + MudDialog.Cancel(); +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/AddEditModal.razor b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/AddEditModal.razor new file mode 100644 index 0000000..ea086f5 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/AddEditModal.razor @@ -0,0 +1,51 @@ +@typeparam TRequest + +@inject IStringLocalizer L + + + + + + + @if (IsCreate) + { + + } + else + { + + } + @Title + + + + + + + + + @ChildContent(RequestModel) + + + + + + + @L["Cancel"] + + @if (IsCreate) + { + + @L["Save"] + + } + else + { + + @L["Update"] + + } + + + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/AddEditModal.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/AddEditModal.razor.cs new file mode 100644 index 0000000..197c487 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/AddEditModal.razor.cs @@ -0,0 +1,49 @@ +using FSH.BlazorWebAssembly.Client.Components.Common; +using FSH.BlazorWebAssembly.Client.Shared; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Components.EntityTable; + +public partial class AddEditModal : IAddEditModal +{ + [Parameter] + [EditorRequired] + public RenderFragment ChildContent { get; set; } = default!; + [Parameter] + [EditorRequired] + public TRequest RequestModel { get; set; } = default!; + [Parameter] + [EditorRequired] + public Func SaveFunc { get; set; } = default!; + [Parameter] + public Func? OnInitializedFunc { get; set; } + [Parameter] + [EditorRequired] + public string Title { get; set; } = default!; + [Parameter] + public bool IsCreate { get; set; } + [Parameter] + public string? SuccessMessage { get; set; } + + [CascadingParameter] + private MudDialogInstance MudDialog { get; set; } = default!; + + private CustomValidation? _customValidation; + + public void ForceRender() => StateHasChanged(); + + protected override Task OnInitializedAsync() => + OnInitializedFunc is not null + ? OnInitializedFunc() + : Task.CompletedTask; + + private async Task SaveAsync() + { + if (await ApiHelper.ExecuteCallGuardedAsync( + () => SaveFunc(RequestModel), Snackbar, _customValidation, SuccessMessage)) + { + MudDialog.Close(); + } + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityClientTableContext.cs b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityClientTableContext.cs new file mode 100644 index 0000000..2013d7b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityClientTableContext.cs @@ -0,0 +1,67 @@ +namespace FSH.BlazorWebAssembly.Client.Components.EntityTable; + +/// +/// Initialization Context for the EntityTable Component. +/// Use this one if you want to use Client Paging, Sorting and Filtering. +/// +public class EntityClientTableContext + : EntityTableContext +{ + /// + /// A function that loads all the data for the table from the api and returns a ListResult of TEntity. + /// + public Func?>> LoadDataFunc { get; } + + /// + /// A function that returns a boolean which indicates whether the supplied entity meets the search criteria + /// (the supplied string is the search string entered). + /// + public Func SearchFunc { get; } + + public EntityClientTableContext( + List> fields, + Func?>> loadDataFunc, + Func searchFunc, + Func? idFunc = null, + Func>? getDefaultsFunc = null, + Func? createFunc = null, + Func>? getDetailsFunc = null, + Func? updateFunc = null, + Func? deleteFunc = null, + string? entityName = null, + string? entityNamePlural = null, + string? entityResource = null, + string? searchAction = null, + string? createAction = null, + string? updateAction = null, + string? deleteAction = null, + string? exportAction = null, + Func? editFormInitializedFunc = null, + Func? hasExtraActionsFunc = null, + Func? canUpdateEntityFunc = null, + Func? canDeleteEntityFunc = null) + : base( + fields, + idFunc, + getDefaultsFunc, + createFunc, + getDetailsFunc, + updateFunc, + deleteFunc, + entityName, + entityNamePlural, + entityResource, + searchAction, + createAction, + updateAction, + deleteAction, + exportAction, + editFormInitializedFunc, + hasExtraActionsFunc, + canUpdateEntityFunc, + canDeleteEntityFunc) + { + LoadDataFunc = loadDataFunc; + SearchFunc = searchFunc; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityField.cs b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityField.cs new file mode 100644 index 0000000..75bf119 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityField.cs @@ -0,0 +1,35 @@ +using Microsoft.AspNetCore.Components; + +namespace FSH.BlazorWebAssembly.Client.Components.EntityTable; + +public record EntityField(Func ValueFunc, string DisplayName, string SortLabel = "", Type? Type = null, RenderFragment? Template = null) +{ + /// + /// A function that returns the actual value of this field from the supplied entity. + /// + public Func ValueFunc { get; init; } = ValueFunc; + + /// + /// The string that's shown on the UI for this field. + /// + public string DisplayName { get; init; } = DisplayName; + + /// + /// The string that's sent to the api as property to sort on for this field. + /// This is only relevant when using server side sorting. + /// + public string SortLabel { get; init; } = SortLabel; + + /// + /// The type of the field. Default is string, but when boolean, it shows as a checkbox. + /// + public Type? Type { get; init; } = Type; + + /// + /// When supplied this template will be used for this field in stead of the default template. + /// For an example on how to do this, see . + /// + public RenderFragment? Template { get; init; } = Template; + + public bool CheckedForSearch { get; set; } = true; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityServerTableContext.cs b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityServerTableContext.cs new file mode 100644 index 0000000..317d2d3 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityServerTableContext.cs @@ -0,0 +1,73 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; + +namespace FSH.BlazorWebAssembly.Client.Components.EntityTable; + +/// +/// Initialization Context for the EntityTable Component. +/// Use this one if you want to use Server Paging, Sorting and Filtering. +/// +public class EntityServerTableContext + : EntityTableContext +{ + /// + /// A function that loads the specified page from the api with the specified search criteria + /// and returns a PaginatedResult of TEntity. + /// + public Func>> SearchFunc { get; } + + /// + /// A function that exports the specified data from the API. + /// + public Func>? ExportFunc { get; } + + public bool EnableAdvancedSearch { get; } + + public EntityServerTableContext( + List> fields, + Func>> searchFunc, + Func>? exportFunc = null, + bool enableAdvancedSearch = false, + Func? idFunc = null, + Func>? getDefaultsFunc = null, + Func? createFunc = null, + Func>? getDetailsFunc = null, + Func? updateFunc = null, + Func? deleteFunc = null, + string? entityName = null, + string? entityNamePlural = null, + string? entityResource = null, + string? searchAction = null, + string? createAction = null, + string? updateAction = null, + string? deleteAction = null, + string? exportAction = null, + Func? editFormInitializedFunc = null, + Func? hasExtraActionsFunc = null, + Func? canUpdateEntityFunc = null, + Func? canDeleteEntityFunc = null) + : base( + fields, + idFunc, + getDefaultsFunc, + createFunc, + getDetailsFunc, + updateFunc, + deleteFunc, + entityName, + entityNamePlural, + entityResource, + searchAction, + createAction, + updateAction, + deleteAction, + exportAction, + editFormInitializedFunc, + hasExtraActionsFunc, + canUpdateEntityFunc, + canDeleteEntityFunc) + { + SearchFunc = searchFunc; + ExportFunc = exportFunc; + EnableAdvancedSearch = enableAdvancedSearch; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityTable.razor b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityTable.razor new file mode 100644 index 0000000..68221bd --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityTable.razor @@ -0,0 +1,158 @@ +@typeparam TEntity +@typeparam TId +@typeparam TRequest + +@inject IJSRuntime JS +@inject IStringLocalizer L + + + + + + + @if (_canSearch && (Context.AdvancedSearchEnabled || AdvancedSearchContent is not null)) + { + + + + @if (Context.AdvancedSearchEnabled) + { +
+ + @foreach (var field in Context.Fields) + { + + } +
+ } + @AdvancedSearchContent + +
+ } + + + + +
+ @if (_canCreate) + { + @L["Create"] + } + @if (_canExport) + { + @L["Export"] + } + @L["Reload"] +
+ + @if (_canSearch && !_advancedSearchExpanded) + { + + + } +
+ + + @if (Context.Fields is not null) + { + foreach (var field in Context.Fields) + { + + @if (Context.IsClientContext) + { + @field.DisplayName + } + else + { + @field.DisplayName + } + + } + } + @L["Actions"] + + + + @foreach (var field in Context.Fields) + { + + @if (field.Template is not null) + { + @field.Template(context) + } + else if (field.Type == typeof(bool)) + { + + } + else + { + + } + + } + + @if (ActionsContent is not null) + { + @ActionsContent(context) + } + else if (HasActions) + { + + @if (CanUpdateEntity(context)) + { + @L["Edit"] + } + @if (CanDeleteEntity(context)) + { + @L["Delete"] + } + @if (ExtraActions is not null) + { + @ExtraActions(context) + } + + } + else + { + + @L["No Allowed Actions"] + + } + + + + + + + +
+ +
+ + + +
\ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityTable.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityTable.razor.cs new file mode 100644 index 0000000..63ec907 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityTable.razor.cs @@ -0,0 +1,321 @@ +using FSH.BlazorWebAssembly.Client.Components.Dialogs; +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Infrastructure.Auth; +using FSH.BlazorWebAssembly.Client.Shared; +using Mapster; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.JSInterop; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Components.EntityTable; + +public partial class EntityTable + where TRequest : new() +{ + [Parameter] + [EditorRequired] + public EntityTableContext Context { get; set; } = default!; + + [Parameter] + public bool Loading { get; set; } + + [Parameter] + public string? SearchString { get; set; } + [Parameter] + public EventCallback SearchStringChanged { get; set; } + + [Parameter] + public RenderFragment? AdvancedSearchContent { get; set; } + + [Parameter] + public RenderFragment? ActionsContent { get; set; } + [Parameter] + public RenderFragment? ExtraActions { get; set; } + [Parameter] + public RenderFragment? ChildRowContent { get; set; } + + [Parameter] + public RenderFragment? EditFormContent { get; set; } + + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + + private bool _canSearch; + private bool _canCreate; + private bool _canUpdate; + private bool _canDelete; + private bool _canExport; + + private bool _advancedSearchExpanded; + + private MudTable _table = default!; + private IEnumerable? _entityList; + private int _totalItems; + + protected override async Task OnInitializedAsync() + { + var state = await AuthState; + _canSearch = await CanDoActionAsync(Context.SearchAction, state); + _canCreate = await CanDoActionAsync(Context.CreateAction, state); + _canUpdate = await CanDoActionAsync(Context.UpdateAction, state); + _canDelete = await CanDoActionAsync(Context.DeleteAction, state); + _canExport = await CanDoActionAsync(Context.ExportAction, state); + + await LocalLoadDataAsync(); + } + + public Task ReloadDataAsync() => + Context.IsClientContext + ? LocalLoadDataAsync() + : ServerLoadDataAsync(); + + private async Task CanDoActionAsync(string? action, AuthenticationState state) => + !string.IsNullOrWhiteSpace(action) && + ((bool.TryParse(action, out bool isTrue) && isTrue) || // check if action equals "True", then it's allowed + (Context.EntityResource is { } resource && await AuthService.HasPermissionAsync(state.User, action, resource))); + + private bool HasActions => _canUpdate || _canDelete || (Context.HasExtraActionsFunc is not null && Context.HasExtraActionsFunc()); + private bool CanUpdateEntity(TEntity entity) => _canUpdate && (Context.CanUpdateEntityFunc is null || Context.CanUpdateEntityFunc(entity)); + private bool CanDeleteEntity(TEntity entity) => _canDelete && (Context.CanDeleteEntityFunc is null || Context.CanDeleteEntityFunc(entity)); + + // Client side paging/filtering + private bool LocalSearch(TEntity entity) => + Context.ClientContext?.SearchFunc is { } searchFunc + ? searchFunc(SearchString, entity) + : string.IsNullOrWhiteSpace(SearchString); + + private async Task LocalLoadDataAsync() + { + if (Loading || Context.ClientContext is null) + { + return; + } + + Loading = true; + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => Context.ClientContext.LoadDataFunc(), Snackbar) + is List result) + { + _entityList = result; + } + + Loading = false; + } + + // Server Side paging/filtering + + private async Task OnSearchStringChanged(string? text = null) + { + await SearchStringChanged.InvokeAsync(SearchString); + + await ServerLoadDataAsync(); + } + + private async Task ServerLoadDataAsync() + { + if (Context.IsServerContext) + { + await _table.ReloadServerData(); + } + } + + private Func>>? ServerReloadFunc => + Context.IsServerContext ? ServerReload : null; + + private async Task> ServerReload(TableState state) + { + if (!Loading && Context.ServerContext is not null) + { + Loading = true; + + var filter = GetPaginationFilter(state); + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => Context.ServerContext.SearchFunc(filter), Snackbar) + is { } result) + { + _totalItems = result.TotalCount; + _entityList = result.Data; + } + + Loading = false; + } + + return new TableData { TotalItems = _totalItems, Items = _entityList }; + } + + private async Task ExportAsync() + { + if (!Loading && Context.ServerContext is not null) + { + if (Context.ServerContext.ExportFunc is not null) + { + Loading = true; + + var filter = GetBaseFilter(); + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => Context.ServerContext.ExportFunc(filter), Snackbar) + is { } result) + { + using var streamRef = new DotNetStreamReference(result.Stream); + await JS.InvokeVoidAsync("downloadFileFromStream", $"{Context.EntityNamePlural}.xlsx", streamRef); + } + + Loading = false; + } + } + } + + private PaginationFilter GetPaginationFilter(TableState state) + { + string[]? orderings = null; + if (!string.IsNullOrEmpty(state.SortLabel)) + { + orderings = state.SortDirection == SortDirection.None + ? new[] { $"{state.SortLabel}" } + : new[] { $"{state.SortLabel} {state.SortDirection}" }; + } + + var filter = new PaginationFilter + { + PageSize = state.PageSize, + PageNumber = state.Page + 1, + Keyword = SearchString, + OrderBy = orderings ?? Array.Empty() + }; + + if (!Context.AllColumnsChecked) + { + filter.AdvancedSearch = new() + { + Fields = Context.SearchFields, + Keyword = filter.Keyword + }; + filter.Keyword = null; + } + + return filter; + } + + private BaseFilter GetBaseFilter() + { + var filter = new BaseFilter + { + Keyword = SearchString, + }; + + if (!Context.AllColumnsChecked) + { + filter.AdvancedSearch = new() + { + Fields = Context.SearchFields, + Keyword = filter.Keyword + }; + filter.Keyword = null; + } + + return filter; + } + + private async Task InvokeModal(TEntity? entity = default) + { + bool isCreate = entity is null; + + var parameters = new DialogParameters() + { + { nameof(AddEditModal.ChildContent), EditFormContent }, + { nameof(AddEditModal.OnInitializedFunc), Context.EditFormInitializedFunc }, + { nameof(AddEditModal.IsCreate), isCreate } + }; + + Func saveFunc; + TRequest requestModel; + string title, successMessage; + + if (isCreate) + { + _ = Context.CreateFunc ?? throw new InvalidOperationException("CreateFunc can't be null!"); + + saveFunc = Context.CreateFunc; + + requestModel = + Context.GetDefaultsFunc is not null + && await ApiHelper.ExecuteCallGuardedAsync( + () => Context.GetDefaultsFunc(), Snackbar) + is { } defaultsResult + ? defaultsResult + : new TRequest(); + + title = $"{L["Create"]} {Context.EntityName}"; + successMessage = $"{Context.EntityName} {L["Created"]}"; + } + else + { + _ = Context.IdFunc ?? throw new InvalidOperationException("IdFunc can't be null!"); + _ = Context.UpdateFunc ?? throw new InvalidOperationException("UpdateFunc can't be null!"); + + var id = Context.IdFunc(entity!); + + saveFunc = request => Context.UpdateFunc(id, request); + + requestModel = + Context.GetDetailsFunc is not null + && await ApiHelper.ExecuteCallGuardedAsync( + () => Context.GetDetailsFunc(id!), + Snackbar) + is { } detailsResult + ? detailsResult + : entity!.Adapt(); + + title = $"{L["Edit"]} {Context.EntityName}"; + successMessage = $"{Context.EntityName} {L["Updated"]}"; + } + + parameters.Add(nameof(AddEditModal.SaveFunc), saveFunc); + parameters.Add(nameof(AddEditModal.RequestModel), requestModel); + parameters.Add(nameof(AddEditModal.Title), title); + parameters.Add(nameof(AddEditModal.SuccessMessage), successMessage); + + var dialog = DialogService.ShowModal>(parameters); + + Context.SetAddEditModalRef(dialog); + + var result = await dialog.Result; + + if (!result.Cancelled) + { + await ReloadDataAsync(); + } + } + + private async Task Delete(TEntity entity) + { + _ = Context.IdFunc ?? throw new InvalidOperationException("IdFunc can't be null!"); + TId id = Context.IdFunc(entity); + + string deleteContent = L["You're sure you want to delete {0} with id '{1}'?"]; + var parameters = new DialogParameters + { + { nameof(DeleteConfirmation.ContentText), string.Format(deleteContent, Context.EntityName, id) } + }; + var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true, DisableBackdropClick = true }; + var dialog = DialogService.Show(L["Delete"], parameters, options); + var result = await dialog.Result; + if (!result.Cancelled) + { + _ = Context.DeleteFunc ?? throw new InvalidOperationException("DeleteFunc can't be null!"); + + await ApiHelper.ExecuteCallGuardedAsync( + () => Context.DeleteFunc(id), + Snackbar); + + await ReloadDataAsync(); + } + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityTableContext.cs b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityTableContext.cs new file mode 100644 index 0000000..7054adc --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/EntityTableContext.cs @@ -0,0 +1,197 @@ +using FSH.WebApi.Shared.Authorization; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Components.EntityTable; + +/// +/// Abstract base class for the initialization Context of the EntityTable Component. +/// +/// The type of the entity. +/// The type of the id of the entity. +/// The type of the Request which is used on the AddEditModal and which is sent with the CreateFunc and UpdateFunc. +public abstract class EntityTableContext +{ + /// + /// The columns you want to display on the table. + /// + public List> Fields { get; } + + /// + /// A function that returns the Id of the entity. This is only needed when using the CRUD functionality. + /// + public Func? IdFunc { get; } + + /// + /// A function that executes the GetDefaults method on the api (or supplies defaults locally) and returns + /// a Task of Result of TRequest. When not supplied, a TRequest is simply newed up. + /// No need to check for error messages or api exceptions. These are automatically handled by the component. + /// + public Func>? GetDefaultsFunc { get; } + + /// + /// A function that executes the Create method on the api with the supplied entity and returns a Task of Result. + /// No need to check for error messages or api exceptions. These are automatically handled by the component. + /// + public Func? CreateFunc { get; } + + /// + /// A function that executes the GetDetails method on the api with the supplied Id and returns a Task of Result of TRequest. + /// No need to check for error messages or api exceptions. These are automatically handled by the component. + /// When not supplied, the TEntity out of the _entityList is supplied using the IdFunc and converted using mapster. + /// + public Func>? GetDetailsFunc { get; } + + /// + /// A function that executes the Update method on the api with the supplied entity and returns a Task of Result. + /// When not supplied, the TEntity from the list is mapped to TCreateRequest using mapster. + /// No need to check for error messages or api exceptions. These are automatically handled by the component. + /// + public Func? UpdateFunc { get; } + + /// + /// A function that executes the Delete method on the api with the supplied entity id and returns a Task of Result. + /// No need to check for error messages or api exceptions. These are automatically handled by the component. + /// + public Func? DeleteFunc { get; } + + /// + /// The name of the entity. This is used in the title of the add/edit modal and delete confirmation. + /// + public string? EntityName { get; } + + /// + /// The plural name of the entity. This is used in the "Search for ..." placeholder. + /// + public string? EntityNamePlural { get; } + + /// + /// The FSHResource that is representing this entity. This is used in combination with the xxActions to check for permissions. + /// + public string? EntityResource { get; } + + /// + /// The FSHAction name of the search permission. This is FSHAction.Search by default. + /// When empty, no search functionality will be available. + /// When the string is "true", search funtionality will be enabled, + /// otherwise it will only be enabled if the user has permission for this action on the EntityResource. + /// + public string SearchAction { get; } + + /// + /// The permission name of the create permission. This is FSHAction.Create by default. + /// When empty, no create functionality will be available. + /// When the string "true", create funtionality will be enabled, + /// otherwise it will only be enabled if the user has permission for this action on the EntityResource. + /// + public string CreateAction { get; } + + /// + /// The permission name of the update permission. This is FSHAction.Update by default. + /// When empty, no update functionality will be available. + /// When the string is "true", update funtionality will be enabled, + /// otherwise it will only be enabled if the user has permission for this action on the EntityResource. + /// + public string UpdateAction { get; } + + /// + /// The permission name of the delete permission. This is FSHAction.Delete by default. + /// When empty, no delete functionality will be available. + /// When the string is "true", delete funtionality will be enabled, + /// otherwise it will only be enabled if the user has permission for this action on the EntityResource. + /// + public string DeleteAction { get; } + + /// + /// The permission name of the export permission. This is FSHAction.Export by default. + /// + public string ExportAction { get; } + + /// + /// Use this if you want to run initialization during OnInitialized of the AddEdit form. + /// + public Func? EditFormInitializedFunc { get; } + + /// + /// Use this if you want to check for permissions of content in the ExtraActions RenderFragment. + /// The extra actions won't be available when this returns false. + /// + public Func? HasExtraActionsFunc { get; set; } + + /// + /// Use this if you want to disable the update functionality for specific entities in the table. + /// + public Func? CanUpdateEntityFunc { get; set; } + + /// + /// Use this if you want to disable the delete functionality for specific entities in the table. + /// + public Func? CanDeleteEntityFunc { get; set; } + + public EntityTableContext( + List> fields, + Func? idFunc, + Func>? getDefaultsFunc, + Func? createFunc, + Func>? getDetailsFunc, + Func? updateFunc, + Func? deleteFunc, + string? entityName, + string? entityNamePlural, + string? entityResource, + string? searchAction, + string? createAction, + string? updateAction, + string? deleteAction, + string? exportAction, + Func? editFormInitializedFunc, + Func? hasExtraActionsFunc, + Func? canUpdateEntityFunc, + Func? canDeleteEntityFunc) + { + EntityResource = entityResource; + Fields = fields; + EntityName = entityName; + EntityNamePlural = entityNamePlural; + IdFunc = idFunc; + GetDefaultsFunc = getDefaultsFunc; + CreateFunc = createFunc; + GetDetailsFunc = getDetailsFunc; + UpdateFunc = updateFunc; + DeleteFunc = deleteFunc; + SearchAction = searchAction ?? FSHAction.Search; + CreateAction = createAction ?? FSHAction.Create; + UpdateAction = updateAction ?? FSHAction.Update; + DeleteAction = deleteAction ?? FSHAction.Delete; + ExportAction = exportAction ?? FSHAction.Export; + EditFormInitializedFunc = editFormInitializedFunc; + HasExtraActionsFunc = hasExtraActionsFunc; + CanUpdateEntityFunc = canUpdateEntityFunc; + CanDeleteEntityFunc = canDeleteEntityFunc; + } + + // AddEdit modal + private IDialogReference? _addEditModalRef; + + internal void SetAddEditModalRef(IDialogReference dialog) => + _addEditModalRef = dialog; + + public IAddEditModal AddEditModal => + _addEditModalRef?.Dialog as IAddEditModal + ?? throw new InvalidOperationException("AddEditModal is only available when the modal is shown."); + + // Shortcuts + public EntityClientTableContext? ClientContext => this as EntityClientTableContext; + public EntityServerTableContext? ServerContext => this as EntityServerTableContext; + public bool IsClientContext => ClientContext is not null; + public bool IsServerContext => ServerContext is not null; + + // Advanced Search + public bool AllColumnsChecked => + Fields.All(f => f.CheckedForSearch); + public void AllColumnsCheckChanged(bool checkAll) => + Fields.ForEach(f => f.CheckedForSearch = checkAll); + public bool AdvancedSearchEnabled => + ServerContext?.EnableAdvancedSearch is true; + public List SearchFields => + Fields.Where(f => f.CheckedForSearch).Select(f => f.SortLabel).ToList(); +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/IAddEditModal.cs b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/IAddEditModal.cs new file mode 100644 index 0000000..397d81d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/IAddEditModal.cs @@ -0,0 +1,8 @@ +namespace FSH.BlazorWebAssembly.Client.Components.EntityTable; + +public interface IAddEditModal +{ + TRequest RequestModel { get; } + bool IsCreate { get; } + void ForceRender(); +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/PaginationResponse.cs b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/PaginationResponse.cs new file mode 100644 index 0000000..404eb6a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/EntityTable/PaginationResponse.cs @@ -0,0 +1,9 @@ +namespace FSH.BlazorWebAssembly.Client.Components.EntityTable; + +public class PaginationResponse +{ + public List Data { get; set; } = default!; + public int TotalCount { get; set; } + public int CurrentPage { get; set; } = 1; + public int PageSize { get; set; } = 10; +} diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/Localization/LanguageSelector.razor b/blazor-wasm-boilerplate-main/src/Client/Components/Localization/LanguageSelector.razor new file mode 100644 index 0000000..0305761 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/Localization/LanguageSelector.razor @@ -0,0 +1,41 @@ +@inject IStringLocalizer L + + + + @foreach (var language in LocalizationConstants.SupportedLanguages) + { + if (language.Code == CurrentLanguage) + { + @L[language.DisplayName] + } + else + { + @L[language.DisplayName] + } + } + + + +@code { + public string? CurrentLanguage { get; set; } = "en-US"; + + protected override async Task OnInitializedAsync() + { + var currentPreference = await ClientPreferences.GetPreference() as ClientPreference; + if (currentPreference != null) + { + CurrentLanguage = currentPreference.LanguageCode; + } + else + { + CurrentLanguage = "en-US"; + } + + } + private async Task ChangeLanguageAsync(string languageCode) + { + var result = await ClientPreferences.ChangeLanguageAsync(languageCode); + Navigation.NavigateTo(Navigation.Uri, forceLoad: true); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/Notifications/NotificationConnection.razor b/blazor-wasm-boilerplate-main/src/Client/Components/Notifications/NotificationConnection.razor new file mode 100644 index 0000000..6d04cdf --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/Notifications/NotificationConnection.razor @@ -0,0 +1,3 @@ + + @ChildContent + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/Notifications/NotificationConnection.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Components/Notifications/NotificationConnection.razor.cs new file mode 100644 index 0000000..f5e7904 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/Notifications/NotificationConnection.razor.cs @@ -0,0 +1,153 @@ +using System.Net; +using System.Reflection; +using System.Text.Json; +using System.Text.Json.Nodes; +using FSH.BlazorWebAssembly.Client.Infrastructure.Auth; +using FSH.BlazorWebAssembly.Client.Infrastructure.Common; +using FSH.BlazorWebAssembly.Client.Infrastructure.Notifications; +using FSH.WebApi.Shared.Notifications; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; +using Microsoft.AspNetCore.SignalR.Client; + +namespace FSH.BlazorWebAssembly.Client.Components.Notifications; + +public partial class NotificationConnection : IDisposable, IAsyncDisposable +{ + [Parameter] + public RenderFragment ChildContent { get; set; } = default!; + [Inject] + private IAccessTokenProvider TokenProvider { get; set; } = default!; + [Inject] + private INotificationPublisher Publisher { get; set; } = default!; + [Inject] + private IAuthenticationService AuthService { get; set; } = default!; + [Inject] + private ILogger Logger { get; set; } = default!; + + private readonly CancellationTokenSource _cts = new(); + private IDisposable? _subscription; + private HubConnection? _hubConnection; + + public ConnectionState ConnectionState => + _hubConnection?.State switch + { + HubConnectionState.Connected => ConnectionState.Connected, + HubConnectionState.Disconnected => ConnectionState.Disconnected, + _ => ConnectionState.Connecting + }; + + public string? ConnectionId => _hubConnection?.ConnectionId; + + protected override Task OnInitializedAsync() + { + _hubConnection = new HubConnectionBuilder() + .WithUrl($"{Config[ConfigNames.ApiBaseUrl]}notifications", options => + options.AccessTokenProvider = + () => TokenProvider.GetAccessTokenAsync()) + .WithAutomaticReconnect(new IndefiniteRetryPolicy()) + .Build(); + + _hubConnection.Reconnecting += ex => + OnConnectionStateChangedAsync(ConnectionState.Connecting, ex?.Message); + + _hubConnection.Reconnected += id => + OnConnectionStateChangedAsync(ConnectionState.Connected, id); + + _hubConnection.Closed += async ex => + { + await OnConnectionStateChangedAsync(ConnectionState.Disconnected, ex?.Message); + + // This shouldn't happen with the IndefiniteRetryPolicy configured above, + // but just in case it does, we wait a bit and restart the connection again. + await Task.Delay(5000, _cts.Token); + await ConnectWithRetryAsync(_cts.Token); + }; + + _subscription = _hubConnection.On(NotificationConstants.NotificationFromServer, (notificationTypeName, notificationJson) => + { + if (Assembly.GetAssembly(typeof(INotificationMessage))!.GetType(notificationTypeName) + is { } notificationType + && notificationJson.Deserialize( + notificationType, + new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }) + is INotificationMessage notification) + { + return Publisher.PublishAsync(notification); + } + + Logger.LogError("Invalid Notification Received ({name}).", notificationTypeName); + + return Task.CompletedTask; + }); + + // launch the signalR connection in the background. + // see https://www.dotnetcurry.com/aspnet-core/realtime-app-using-blazor-webassembly-signalr-csharp9 + _ = ConnectWithRetryAsync(_cts.Token); + + return base.OnInitializedAsync(); + } + + protected virtual Task OnConnectionStateChangedAsync(ConnectionState state, string? message) + { + return Publisher.PublishAsync(new ConnectionStateChanged(state, message)); + } + + private async Task ConnectWithRetryAsync(CancellationToken cancellationToken) + { + _ = _hubConnection ?? throw new InvalidOperationException("HubConnection can't be null."); + + // Keep trying to until we can start or the token is canceled. + while (true) + { + try + { + await _hubConnection.StartAsync(cancellationToken); + await OnConnectionStateChangedAsync(ConnectionState.Connected, _hubConnection.ConnectionId); + return; + } + catch when (cancellationToken.IsCancellationRequested) + { + return; + } + catch (HttpRequestException requestException) when (requestException.StatusCode == HttpStatusCode.Unauthorized) + { + // This shouldn't happen, but just in case, redirect to logout. + await AuthService.LogoutAsync(); + return; + } + catch + { + // Try again in a few seconds. This could be an incremental interval + await Task.Delay(5000, cancellationToken); + } + } + } + + public void Dispose() + { + _cts.Cancel(); + _cts.Dispose(); + _subscription?.Dispose(); + } + + public async ValueTask DisposeAsync() + { + if (_hubConnection is not null) + { + await _hubConnection.DisposeAsync(); + } + } +} + +internal class IndefiniteRetryPolicy : IRetryPolicy +{ + public TimeSpan? NextRetryDelay(RetryContext retryContext) => + retryContext.PreviousRetryCount switch + { + 0 => TimeSpan.Zero, + 1 => TimeSpan.FromSeconds(2), + 2 => TimeSpan.FromSeconds(5), + _ => TimeSpan.FromSeconds(10) + }; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/Notifications/NotificationConnectionStatus.razor b/blazor-wasm-boilerplate-main/src/Client/Components/Notifications/NotificationConnectionStatus.razor new file mode 100644 index 0000000..78bea4a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/Notifications/NotificationConnectionStatus.razor @@ -0,0 +1,49 @@ +@inject ICourier Courier + + + + + +@code { + public string TooltipText { get; set; } = "No Connection"; + public string Icon { get; set; } = Icons.Filled.SignalWifi0Bar; + public Color IconColor { get; set; } = Color.Error; + + [CascadingParameter] private NotificationConnection _notifications { get; set; } = default!; + + protected override void OnInitialized() + { + SetConnectionState(_notifications.ConnectionState, _notifications.ConnectionId); + + Courier.SubscribeWeak>(wrapper => + { + SetConnectionState(wrapper.Notification.State, wrapper.Notification.Message); + StateHasChanged(); + }); + } + + private void SetConnectionState(ConnectionState state, string? message) + { + switch (state) + { + case ConnectionState.Connected: + TooltipText = $"Connected to Server with ConnectionId {message}"; + Icon = @Icons.Filled.SignalWifiStatusbar4Bar; + IconColor = Color.Success; + break; + + case ConnectionState.Connecting: + TooltipText = $"(Re)connecting... ({message})."; + Icon = @Icons.Filled.SignalWifiStatusbarConnectedNoInternet4; + IconColor = Color.Warning; + break; + + case ConnectionState.Disconnected: + TooltipText = $"Connection Closed ({message})."; + Icon = @Icons.Filled.SignalWifiOff; + IconColor = Color.Error; + break; + } + StateHasChanged(); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ColorPanel.razor b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ColorPanel.razor new file mode 100644 index 0000000..2b90017 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ColorPanel.razor @@ -0,0 +1,27 @@ + + +
+ @ColorType + + +
+
+ + + + + @foreach (var color in Colors) + { + + +
+
+
+
+ } +
+
+
+
+
\ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ColorPanel.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ColorPanel.razor.cs new file mode 100644 index 0000000..b375554 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ColorPanel.razor.cs @@ -0,0 +1,24 @@ +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Components.ThemeManager; + +public partial class ColorPanel +{ + [Parameter] + public List Colors { get; set; } = new(); + + [Parameter] + public string ColorType { get; set; } = string.Empty; + + [Parameter] + public Color CurrentColor { get; set; } + + [Parameter] + public EventCallback OnColorClicked { get; set; } + + protected async Task ColorClicked(string color) + { + await OnColorClicked.InvokeAsync(color); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/DarkModePanel.razor b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/DarkModePanel.razor new file mode 100644 index 0000000..1f983fc --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/DarkModePanel.razor @@ -0,0 +1,17 @@ + + +
+ @if (_isDarkMode) + { + Light Mode + } + else + { + Dark Mode + } + +
+
+
\ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/DarkModePanel.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/DarkModePanel.razor.cs new file mode 100644 index 0000000..44ba401 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/DarkModePanel.razor.cs @@ -0,0 +1,24 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.Preferences; +using Microsoft.AspNetCore.Components; + +namespace FSH.BlazorWebAssembly.Client.Components.ThemeManager; + +public partial class DarkModePanel +{ + private bool _isDarkMode; + + protected override async Task OnInitializedAsync() + { + if (await ClientPreferences.GetPreference() is not ClientPreference themePreference) themePreference = new ClientPreference(); + _isDarkMode = themePreference.IsDarkMode; + } + + [Parameter] + public EventCallback OnIconClicked { get; set; } + + private async Task ToggleDarkMode() + { + _isDarkMode = !_isDarkMode; + await OnIconClicked.InvokeAsync(_isDarkMode); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/RadiusPanel.razor b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/RadiusPanel.razor new file mode 100644 index 0000000..56e42f2 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/RadiusPanel.razor @@ -0,0 +1,15 @@ + + +
+ Border Radius + @Radius.ToString() + +
+
+ + + @Radius.ToString() + +
\ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/RadiusPanel.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/RadiusPanel.razor.cs new file mode 100644 index 0000000..ffef58d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/RadiusPanel.razor.cs @@ -0,0 +1,28 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.Preferences; +using Microsoft.AspNetCore.Components; + +namespace FSH.BlazorWebAssembly.Client.Components.ThemeManager; + +public partial class RadiusPanel +{ + [Parameter] + public double Radius { get; set; } + + [Parameter] + public double MaxValue { get; set; } = 30; + + [Parameter] + public EventCallback OnSliderChanged { get; set; } + + protected override async Task OnInitializedAsync() + { + if (await ClientPreferences.GetPreference() is not ClientPreference themePreference) themePreference = new ClientPreference(); + Radius = themePreference.BorderRadius; + } + + private async Task ChangedSelection(ChangeEventArgs args) + { + Radius = int.Parse(args?.Value?.ToString() ?? "0"); + await OnSliderChanged.InvokeAsync(Radius); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/TableCustomizationPanel.razor b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/TableCustomizationPanel.razor new file mode 100644 index 0000000..e10ea10 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/TableCustomizationPanel.razor @@ -0,0 +1,19 @@ + + +
+ Table Customization + T + +
+
+ + + + + + +
\ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/TableCustomizationPanel.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/TableCustomizationPanel.razor.cs new file mode 100644 index 0000000..e4b3c63 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/TableCustomizationPanel.razor.cs @@ -0,0 +1,74 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.Notifications; +using FSH.BlazorWebAssembly.Client.Infrastructure.Preferences; +using Microsoft.AspNetCore.Components; + +namespace FSH.BlazorWebAssembly.Client.Components.ThemeManager; + +public partial class TableCustomizationPanel +{ + [Parameter] + public bool IsDense { get; set; } + [Parameter] + public bool IsStriped { get; set; } + [Parameter] + public bool HasBorder { get; set; } + [Parameter] + public bool IsHoverable { get; set; } + [Inject] + protected INotificationPublisher Notifications { get; set; } = default!; + + private FshTablePreference _tablePreference = new(); + + protected override async Task OnInitializedAsync() + { + if (await ClientPreferences.GetPreference() is ClientPreference clientPreference) + { + _tablePreference = clientPreference.TablePreference; + } + + IsDense = _tablePreference.IsDense; + IsStriped = _tablePreference.IsStriped; + HasBorder = _tablePreference.HasBorder; + IsHoverable = _tablePreference.IsHoverable; + } + + [Parameter] + public EventCallback OnDenseSwitchToggled { get; set; } + + [Parameter] + public EventCallback OnStripedSwitchToggled { get; set; } + + [Parameter] + public EventCallback OnBorderdedSwitchToggled { get; set; } + + [Parameter] + public EventCallback OnHoverableSwitchToggled { get; set; } + + private async Task ToggleDenseSwitch() + { + _tablePreference.IsDense = !_tablePreference.IsDense; + await OnDenseSwitchToggled.InvokeAsync(_tablePreference.IsDense); + await Notifications.PublishAsync(_tablePreference); + } + + private async Task ToggleStripedSwitch() + { + _tablePreference.IsStriped = !_tablePreference.IsStriped; + await OnStripedSwitchToggled.InvokeAsync(_tablePreference.IsStriped); + await Notifications.PublishAsync(_tablePreference); + } + + private async Task ToggleBorderedSwitch() + { + _tablePreference.HasBorder = !_tablePreference.HasBorder; + await OnBorderdedSwitchToggled.InvokeAsync(_tablePreference.HasBorder); + await Notifications.PublishAsync(_tablePreference); + } + + private async Task ToggleHoverableSwitch() + { + _tablePreference.IsHoverable = !_tablePreference.IsHoverable; + await OnHoverableSwitchToggled.InvokeAsync(_tablePreference.IsHoverable); + await Notifications.PublishAsync(_tablePreference); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeButton.razor b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeButton.razor new file mode 100644 index 0000000..364ecc5 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeButton.razor @@ -0,0 +1,16 @@ +
+ + + +
+ + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeButton.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeButton.razor.cs new file mode 100644 index 0000000..2131465 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeButton.razor.cs @@ -0,0 +1,10 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; + +namespace FSH.BlazorWebAssembly.Client.Components.ThemeManager; + +public partial class ThemeButton +{ + [Parameter] + public EventCallback OnClick { get; set; } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeDrawer.razor b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeDrawer.razor new file mode 100644 index 0000000..1ee685d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeDrawer.razor @@ -0,0 +1,28 @@ + + + + Theme Manager + + + + + +
+ + + + + + + +
+
+ \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeDrawer.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeDrawer.razor.cs new file mode 100644 index 0000000..8ef41f5 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Components/ThemeManager/ThemeDrawer.razor.cs @@ -0,0 +1,96 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.Preferences; +using FSH.BlazorWebAssembly.Client.Infrastructure.Theme; +using Microsoft.AspNetCore.Components; + +namespace FSH.BlazorWebAssembly.Client.Components.ThemeManager; + +public partial class ThemeDrawer +{ + [Parameter] + public bool ThemeDrawerOpen { get; set; } + + [Parameter] + public EventCallback ThemeDrawerOpenChanged { get; set; } + + [EditorRequired] + [Parameter] + public ClientPreference ThemePreference { get; set; } = default!; + + [EditorRequired] + [Parameter] + public EventCallback ThemePreferenceChanged { get; set; } + + private readonly List _colors = CustomColors.ThemeColors; + + private async Task UpdateThemePrimaryColor(string color) + { + if (ThemePreference is not null) + { + ThemePreference.PrimaryColor = color; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } + + private async Task UpdateThemeSecondaryColor(string color) + { + if (ThemePreference is not null) + { + ThemePreference.SecondaryColor = color; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } + + private async Task UpdateBorderRadius(double radius) + { + if (ThemePreference is not null) + { + ThemePreference.BorderRadius = radius; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } + + private async Task ToggleDarkLightMode(bool isDarkMode) + { + if (ThemePreference is not null) + { + ThemePreference.IsDarkMode = isDarkMode; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } + + private async Task ToggleEntityTableDense(bool isDense) + { + if (ThemePreference is not null) + { + ThemePreference.TablePreference.IsDense = isDense; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } + + private async Task ToggleEntityTableStriped(bool isStriped) + { + if (ThemePreference is not null) + { + ThemePreference.TablePreference.IsStriped = isStriped; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } + + private async Task ToggleEntityTableBorder(bool hasBorder) + { + if (ThemePreference is not null) + { + ThemePreference.TablePreference.HasBorder = hasBorder; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } + + private async Task ToggleEntityTableHoverable(bool isHoverable) + { + if (ThemePreference is not null) + { + ThemePreference.TablePreference.IsHoverable = isHoverable; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/Authentication.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/Authentication.razor new file mode 100644 index 0000000..08b90bc --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/Authentication.razor @@ -0,0 +1,74 @@ +@page "/authentication/{action}" +@attribute [AllowAnonymous] + +@inject IStringLocalizer L + + + @* Override the different child items to adapt them to our own style + I've done this for LogOutSucceeded now, already added the rest but with the defaults (and localization). *@ + + + + @L["You were successfully logged out."] + + + + + @L["Click here to log back in"]. + + + + + @L["Logging you in..."] + + + @L["Checking permissions..."] + + + + + @L["Sorry, your login failed. Please try again or contact support."] + + + @if (GetMessage() is string message && !string.IsNullOrWhiteSpace(message)) + { + + @message + + } + + + @L["Logging you out..."] + + + @L["Logging you out..."] + + + @L["Sorry, log out operation failed. Please try again or contact support."] + + + @L["Retrieving profile..."] + + + @L["Registering account..."] + + + +@code { + [Parameter] public string? Action { get; set; } + + private void GoHome() => Navigation.NavigateTo("/"); + + private string? GetMessage() + { + var query = Navigation.ToAbsoluteUri(Navigation.Uri).Query; + + if (!string.IsNullOrWhiteSpace(query) + && QueryHelpers.ParseQuery(query).TryGetValue("message", out var message)) + { + return message.ToString(); + } + + return null; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/ForgotPassword.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/ForgotPassword.razor new file mode 100644 index 0000000..73d9b51 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/ForgotPassword.razor @@ -0,0 +1,45 @@ +@page "/account/forgot-password" +@attribute [AllowAnonymous] +@inject IStringLocalizer L +@inject IStringLocalizer LS + + + + + + + + +
+ +
+
+ @L["Forgot Password?"] + + @L["We can help you by resetting your password."] +
+
+
+
+ + + + + + + + + + + + + + + @L["Forgot Password"] + +
+
\ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/ForgotPassword.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/ForgotPassword.razor.cs new file mode 100644 index 0000000..005815f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/ForgotPassword.razor.cs @@ -0,0 +1,31 @@ +using FSH.BlazorWebAssembly.Client.Components.Common; +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Shared; +using FSH.WebApi.Shared.Multitenancy; +using Microsoft.AspNetCore.Components; + +namespace FSH.BlazorWebAssembly.Client.Pages.Authentication; + +public partial class ForgotPassword +{ + private readonly ForgotPasswordRequest _forgotPasswordRequest = new(); + private CustomValidation? _customValidation; + private bool BusySubmitting { get; set; } + + [Inject] + private IUsersClient UsersClient { get; set; } = default!; + + private string Tenant { get; set; } = MultitenancyConstants.Root.Id; + + private async Task SubmitAsync() + { + BusySubmitting = true; + + await ApiHelper.ExecuteCallGuardedAsync( + () => UsersClient.ForgotPasswordAsync(Tenant, _forgotPasswordRequest), + Snackbar, + _customValidation); + + BusySubmitting = false; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/Login.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/Login.razor new file mode 100644 index 0000000..2ca6929 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/Login.razor @@ -0,0 +1,47 @@ +@page "/login" +@attribute [AllowAnonymous] +@inject IStringLocalizer L +@inject IStringLocalizer LS + +
+ +
+
+ Sign In + @L["Enter your credentials to get started."] + +
+
+ + + + + + + + + + + + + + + + @L["Register?"] + + + @L["Forgot password?"] + + + @L["Sign In"] + + + @L["Fill Administrator Credentials"] + + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/Login.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/Login.razor.cs new file mode 100644 index 0000000..33b7e7d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/Login.razor.cs @@ -0,0 +1,81 @@ +using FSH.BlazorWebAssembly.Client.Components.Common; +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Infrastructure.Auth; +using FSH.BlazorWebAssembly.Client.Shared; +using FSH.WebApi.Shared.Multitenancy; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Pages.Authentication; + +public partial class Login +{ + [CascadingParameter] + public Task AuthState { get; set; } = default!; + [Inject] + public IAuthenticationService AuthService { get; set; } = default!; + + private CustomValidation? _customValidation; + + public bool BusySubmitting { get; set; } + + private readonly TokenRequest _tokenRequest = new(); + private string TenantId { get; set; } = string.Empty; + private bool _passwordVisibility; + private InputType _passwordInput = InputType.Password; + private string _passwordInputIcon = Icons.Material.Filled.VisibilityOff; + + protected override async Task OnInitializedAsync() + { + if (AuthService.ProviderType == AuthProvider.AzureAd) + { + AuthService.NavigateToExternalLogin(Navigation.Uri); + return; + } + + var authState = await AuthState; + if (authState.User.Identity?.IsAuthenticated is true) + { + Navigation.NavigateTo("/"); + } + } + + private void TogglePasswordVisibility() + { + if (_passwordVisibility) + { + _passwordVisibility = false; + _passwordInputIcon = Icons.Material.Filled.VisibilityOff; + _passwordInput = InputType.Password; + } + else + { + _passwordVisibility = true; + _passwordInputIcon = Icons.Material.Filled.Visibility; + _passwordInput = InputType.Text; + } + } + + private void FillAdministratorCredentials() + { + _tokenRequest.Email = MultitenancyConstants.Root.EmailAddress; + _tokenRequest.Password = MultitenancyConstants.DefaultPassword; + TenantId = MultitenancyConstants.Root.Id; + } + + private async Task SubmitAsync() + { + BusySubmitting = true; + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => AuthService.LoginAsync(TenantId, _tokenRequest), + Snackbar, + _customValidation)) + { + Snackbar.Add($"Logged in as {_tokenRequest.Email}", Severity.Info); + } + + BusySubmitting = false; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/SelfRegister.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/SelfRegister.razor new file mode 100644 index 0000000..975e15e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/SelfRegister.razor @@ -0,0 +1,74 @@ +@page "/users/self-register" +@attribute [AllowAnonymous] +@inject IStringLocalizer L +@inject IStringLocalizer LS + + + + + + + + +
+ +
+
+ + @L["New User Registration"] + + @L["Enter your details below to set up your new account"] +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @L["Register"] + + +
+
\ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/SelfRegister.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/SelfRegister.razor.cs new file mode 100644 index 0000000..613b3ec --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Authentication/SelfRegister.razor.cs @@ -0,0 +1,58 @@ +using FSH.BlazorWebAssembly.Client.Components.Common; +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Shared; +using FSH.WebApi.Shared.Multitenancy; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Pages.Authentication; + +public partial class SelfRegister +{ + private readonly CreateUserRequest _createUserRequest = new(); + private CustomValidation? _customValidation; + private bool BusySubmitting { get; set; } + + [Inject] + private IUsersClient UsersClient { get; set; } = default!; + + private string Tenant { get; set; } = MultitenancyConstants.Root.Id; + + private bool _passwordVisibility; + private InputType _passwordInput = InputType.Password; + private string _passwordInputIcon = Icons.Material.Filled.VisibilityOff; + + private async Task SubmitAsync() + { + BusySubmitting = true; + + string? sucessMessage = await ApiHelper.ExecuteCallGuardedAsync( + () => UsersClient.SelfRegisterAsync(Tenant, _createUserRequest), + Snackbar, + _customValidation); + + if (sucessMessage != null) + { + Snackbar.Add(sucessMessage, Severity.Info); + Navigation.NavigateTo("/login"); + } + + BusySubmitting = false; + } + + private void TogglePasswordVisibility() + { + if (_passwordVisibility) + { + _passwordVisibility = false; + _passwordInputIcon = Icons.Material.Filled.VisibilityOff; + _passwordInput = InputType.Password; + } + else + { + _passwordVisibility = true; + _passwordInputIcon = Icons.Material.Filled.Visibility; + _passwordInput = InputType.Text; + } + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/BrandAutocomplete.cs b/blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/BrandAutocomplete.cs new file mode 100644 index 0000000..7720bcf --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/BrandAutocomplete.cs @@ -0,0 +1,68 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Shared; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Localization; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Pages.Catalog; + +public class BrandAutocomplete : MudAutocomplete +{ + [Inject] + private IStringLocalizer L { get; set; } = default!; + [Inject] + private IBrandsClient BrandsClient { get; set; } = default!; + [Inject] + private ISnackbar Snackbar { get; set; } = default!; + + private List _brands = new(); + + // supply default parameters, but leave the possibility to override them + public override Task SetParametersAsync(ParameterView parameters) + { + Label = L["Brand"]; + Variant = Variant.Filled; + Dense = true; + Margin = Margin.Dense; + ResetValueOnEmptyText = true; + SearchFunc = SearchBrands; + ToStringFunc = GetBrandName; + Clearable = true; + return base.SetParametersAsync(parameters); + } + + // when the value parameter is set, we have to load that one brand to be able to show the name + // we can't do that in OnInitialized because of a strange bug (https://github.com/MudBlazor/MudBlazor/issues/3818) + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender && + _value != default && + await ApiHelper.ExecuteCallGuardedAsync( + () => BrandsClient.GetAsync(_value), Snackbar) is { } brand) + { + _brands.Add(brand); + ForceRender(true); + } + } + + private async Task> SearchBrands(string value) + { + var filter = new SearchBrandsRequest + { + PageSize = 10, + AdvancedSearch = new() { Fields = new[] { "name" }, Keyword = value } + }; + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => BrandsClient.SearchAsync(filter), Snackbar) + is PaginationResponseOfBrandDto response) + { + _brands = response.Data.ToList(); + } + + return _brands.Select(x => x.Id); + } + + private string GetBrandName(Guid id) => + _brands.Find(b => b.Id == id)?.Name ?? string.Empty; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/Brands.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/Brands.razor new file mode 100644 index 0000000..fe23833 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/Brands.razor @@ -0,0 +1,52 @@ +@page "/catalog/brands" +@attribute [MustHavePermission(FSHAction.View, FSHResource.Brands)] + +@inject IStringLocalizer L +@inject IBrandsClient BrandsClient + + + + + + + @if (!Context.AddEditModal.IsCreate) + { + + + + } + + + + + + + + + + +@code +{ + protected EntityServerTableContext Context { get; set; } = default!; + + protected override void OnInitialized() => + Context = new( + entityName: L["Brand"], + entityNamePlural: L["Brands"], + entityResource: FSHResource.Brands, + fields: new() + { + new(brand => brand.Id, L["Id"], "Id"), + new(brand => brand.Name, L["Name"], "Name"), + new(brand => brand.Description, L["Description"], "Description"), + }, + idFunc: brand => brand.Id, + searchFunc: async filter => (await BrandsClient + .SearchAsync(filter.Adapt())) + .Adapt>(), + createFunc: async brand => await BrandsClient.CreateAsync(brand.Adapt()), + updateFunc: async (id, brand) => await BrandsClient.UpdateAsync(id, brand), + deleteFunc: async id => await BrandsClient.DeleteAsync(id), + exportAction: string.Empty); +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/Products.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/Products.razor new file mode 100644 index 0000000..89b083e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/Products.razor @@ -0,0 +1,78 @@ +@page "/catalog/products" +@attribute [MustHavePermission(FSHAction.View, FSHResource.Products)] + +@inject IStringLocalizer L + + + + + + + + @L["Minimum Rate"]: @_searchMinimumRate.ToString() + @L["Maximum Rate"]: @_searchMaximumRate.ToString() + + + + @if (!Context.AddEditModal.IsCreate) + { + + + + } + + + + + + + + + + + + + + + @if(!string.IsNullOrEmpty(context.ImageInBytes)) + { + + } + else + { + + } + + +
+ + @L["Upload"] + + @if(!Context.AddEditModal.IsCreate && !string.IsNullOrEmpty(context.ImagePath) && string.IsNullOrEmpty(context.ImageInBytes)) + { + + @L["View"] + + + + @L["Delete"] + + } + @if(!string.IsNullOrEmpty(context.ImageInBytes)) + { + + @L["Clear"] + + } +
+
+
+
+ +
\ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/Products.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/Products.razor.cs new file mode 100644 index 0000000..079dd06 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Catalog/Products.razor.cs @@ -0,0 +1,159 @@ +using FSH.BlazorWebAssembly.Client.Components.EntityTable; +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Infrastructure.Common; +using FSH.WebApi.Shared.Authorization; +using Mapster; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Pages.Catalog; + +public partial class Products +{ + [Inject] + protected IProductsClient ProductsClient { get; set; } = default!; + [Inject] + protected IBrandsClient BrandsClient { get; set; } = default!; + + protected EntityServerTableContext Context { get; set; } = default!; + + private EntityTable _table = default!; + + protected override void OnInitialized() => + Context = new( + entityName: L["Product"], + entityNamePlural: L["Products"], + entityResource: FSHResource.Products, + fields: new() + { + new(prod => prod.Id, L["Id"], "Id"), + new(prod => prod.Name, L["Name"], "Name"), + new(prod => prod.BrandName, L["Brand"], "Brand.Name"), + new(prod => prod.Description, L["Description"], "Description"), + new(prod => prod.Rate, L["Rate"], "Rate") + }, + enableAdvancedSearch: true, + idFunc: prod => prod.Id, + searchFunc: async filter => + { + var productFilter = filter.Adapt(); + + productFilter.BrandId = SearchBrandId == default ? null : SearchBrandId; + productFilter.MinimumRate = SearchMinimumRate; + productFilter.MaximumRate = SearchMaximumRate; + + var result = await ProductsClient.SearchAsync(productFilter); + return result.Adapt>(); + }, + createFunc: async prod => + { + if (!string.IsNullOrEmpty(prod.ImageInBytes)) + { + prod.Image = new FileUploadRequest() { Data = prod.ImageInBytes, Extension = prod.ImageExtension ?? string.Empty, Name = $"{prod.Name}_{Guid.NewGuid():N}" }; + } + + await ProductsClient.CreateAsync(prod.Adapt()); + prod.ImageInBytes = string.Empty; + }, + updateFunc: async (id, prod) => + { + if (!string.IsNullOrEmpty(prod.ImageInBytes)) + { + prod.DeleteCurrentImage = true; + prod.Image = new FileUploadRequest() { Data = prod.ImageInBytes, Extension = prod.ImageExtension ?? string.Empty, Name = $"{prod.Name}_{Guid.NewGuid():N}" }; + } + + await ProductsClient.UpdateAsync(id, prod.Adapt()); + prod.ImageInBytes = string.Empty; + }, + exportFunc: async filter => + { + var exportFilter = filter.Adapt(); + + exportFilter.BrandId = SearchBrandId == default ? null : SearchBrandId; + exportFilter.MinimumRate = SearchMinimumRate; + exportFilter.MaximumRate = SearchMaximumRate; + + return await ProductsClient.ExportAsync(exportFilter); + }, + deleteFunc: async id => await ProductsClient.DeleteAsync(id)); + + // Advanced Search + + private Guid _searchBrandId; + private Guid SearchBrandId + { + get => _searchBrandId; + set + { + _searchBrandId = value; + _ = _table.ReloadDataAsync(); + } + } + + private decimal _searchMinimumRate; + private decimal SearchMinimumRate + { + get => _searchMinimumRate; + set + { + _searchMinimumRate = value; + _ = _table.ReloadDataAsync(); + } + } + + private decimal _searchMaximumRate = 9999; + private decimal SearchMaximumRate + { + get => _searchMaximumRate; + set + { + _searchMaximumRate = value; + _ = _table.ReloadDataAsync(); + } + } + + // TODO : Make this as a shared service or something? Since it's used by Profile Component also for now, and literally any other component that will have image upload. + // The new service should ideally return $"data:{ApplicationConstants.StandardImageFormat};base64,{Convert.ToBase64String(buffer)}" + private async Task UploadFiles(InputFileChangeEventArgs e) + { + if (e.File != null) + { + string? extension = Path.GetExtension(e.File.Name); + if (!ApplicationConstants.SupportedImageFormats.Contains(extension.ToLower())) + { + Snackbar.Add("Image Format Not Supported.", Severity.Error); + return; + } + + Context.AddEditModal.RequestModel.ImageExtension = extension; + var imageFile = await e.File.RequestImageFileAsync(ApplicationConstants.StandardImageFormat, ApplicationConstants.MaxImageWidth, ApplicationConstants.MaxImageHeight); + byte[]? buffer = new byte[imageFile.Size]; + await imageFile.OpenReadStream(ApplicationConstants.MaxAllowedSize).ReadAsync(buffer); + Context.AddEditModal.RequestModel.ImageInBytes = $"data:{ApplicationConstants.StandardImageFormat};base64,{Convert.ToBase64String(buffer)}"; + Context.AddEditModal.ForceRender(); + } + } + + public void ClearImageInBytes() + { + Context.AddEditModal.RequestModel.ImageInBytes = string.Empty; + Context.AddEditModal.ForceRender(); + } + + public void SetDeleteCurrentImageFlag() + { + Context.AddEditModal.RequestModel.ImageInBytes = string.Empty; + Context.AddEditModal.RequestModel.ImagePath = string.Empty; + Context.AddEditModal.RequestModel.DeleteCurrentImage = true; + Context.AddEditModal.ForceRender(); + } +} + +public class ProductViewModel : UpdateProductRequest +{ + public string? ImagePath { get; set; } + public string? ImageInBytes { get; set; } + public string? ImageExtension { get; set; } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Account.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Account.razor new file mode 100644 index 0000000..4d89ede --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Account.razor @@ -0,0 +1,33 @@ +@page "/account" + +@inject IStringLocalizer L + + + + + + + + @if (!SecurityTabHidden) + { + + + + } + + +@code +{ + [Inject] + public IAuthenticationService AuthService { get; set; } = default!; + + public bool SecurityTabHidden { get; set; } = false; + + protected override void OnInitialized() + { + if (AuthService.ProviderType == AuthProvider.AzureAd) + { + SecurityTabHidden = true; + } + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Profile.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Profile.razor new file mode 100644 index 0000000..006b27b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Profile.razor @@ -0,0 +1,84 @@ +@inject IStringLocalizer L + + + + + +
+ @if (!string.IsNullOrEmpty(_imageUrl)) + { + + } + else + { + @_firstLetterOfName + } +
+ @_profileModel.FirstName @_profileModel.LastName + @_profileModel.Email +
+ + +
+
+ + + + + + @L["Profile Details"] + + + + + + + + + + + + + + + + + + + + + + @L["Save Changes"] + + + + +
\ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Profile.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Profile.razor.cs new file mode 100644 index 0000000..0f78259 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Profile.razor.cs @@ -0,0 +1,101 @@ +using System.Security.Claims; +using FSH.BlazorWebAssembly.Client.Components.Common; +using FSH.BlazorWebAssembly.Client.Components.Dialogs; +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Infrastructure.Auth; +using FSH.BlazorWebAssembly.Client.Infrastructure.Common; +using FSH.BlazorWebAssembly.Client.Shared; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.AspNetCore.Components.Forms; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Pages.Identity.Account; + +public partial class Profile +{ + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthenticationService AuthService { get; set; } = default!; + [Inject] + protected IPersonalClient PersonalClient { get; set; } = default!; + + private readonly UpdateUserRequest _profileModel = new(); + + private string? _imageUrl; + private string? _userId; + private char _firstLetterOfName; + + private CustomValidation? _customValidation; + + protected override async Task OnInitializedAsync() + { + if ((await AuthState).User is { } user) + { + _userId = user.GetUserId(); + _profileModel.Email = user.GetEmail() ?? string.Empty; + _profileModel.FirstName = user.GetFirstName() ?? string.Empty; + _profileModel.LastName = user.GetSurname() ?? string.Empty; + _profileModel.PhoneNumber = user.GetPhoneNumber(); + _imageUrl = string.IsNullOrEmpty(user?.GetImageUrl()) ? string.Empty : (Config[ConfigNames.ApiBaseUrl] + user?.GetImageUrl()); + if (_userId is not null) _profileModel.Id = _userId; + } + + if (_profileModel.FirstName?.Length > 0) + { + _firstLetterOfName = _profileModel.FirstName.ToUpper().FirstOrDefault(); + } + } + + private async Task UpdateProfileAsync() + { + if (await ApiHelper.ExecuteCallGuardedAsync( + () => PersonalClient.UpdateProfileAsync(_profileModel), Snackbar, _customValidation)) + { + Snackbar.Add(L["Your Profile has been updated. Please Login again to Continue."], Severity.Success); + await AuthService.ReLoginAsync(Navigation.Uri); + } + } + + private async Task UploadFiles(InputFileChangeEventArgs e) + { + var file = e.File; + if (file is not null) + { + string? extension = Path.GetExtension(file.Name); + if (!ApplicationConstants.SupportedImageFormats.Contains(extension.ToLower())) + { + Snackbar.Add("Image Format Not Supported.", Severity.Error); + return; + } + + string? fileName = $"{_userId}-{Guid.NewGuid():N}"; + fileName = fileName[..Math.Min(fileName.Length, 90)]; + var imageFile = await file.RequestImageFileAsync(ApplicationConstants.StandardImageFormat, ApplicationConstants.MaxImageWidth, ApplicationConstants.MaxImageHeight); + byte[]? buffer = new byte[imageFile.Size]; + await imageFile.OpenReadStream(ApplicationConstants.MaxAllowedSize).ReadAsync(buffer); + string? base64String = $"data:{ApplicationConstants.StandardImageFormat};base64,{Convert.ToBase64String(buffer)}"; + _profileModel.Image = new FileUploadRequest() { Name = fileName, Data = base64String, Extension = extension }; + + await UpdateProfileAsync(); + } + } + + public async Task RemoveImageAsync() + { + string deleteContent = L["You're sure you want to delete your Profile Image?"]; + var parameters = new DialogParameters + { + { nameof(DeleteConfirmation.ContentText), deleteContent } + }; + var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true, DisableBackdropClick = true }; + var dialog = DialogService.Show(L["Delete"], parameters, options); + var result = await dialog.Result; + if (!result.Cancelled) + { + _profileModel.DeleteCurrentImage = true; + await UpdateProfileAsync(); + } + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Security.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Security.razor new file mode 100644 index 0000000..c63d189 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Security.razor @@ -0,0 +1,41 @@ +@inject IStringLocalizer L + + + + + + @L["Change Password"] + + + + + + + + + + + + + + + + + + + + @L["Change Password"] + + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Security.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Security.razor.cs new file mode 100644 index 0000000..15f2668 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Account/Security.razor.cs @@ -0,0 +1,72 @@ +using FSH.BlazorWebAssembly.Client.Components.Common; +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Shared; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Pages.Identity.Account; + +public partial class Security +{ + [Inject] + public IPersonalClient PersonalClient { get; set; } = default!; + + private readonly ChangePasswordRequest _passwordModel = new(); + + private CustomValidation? _customValidation; + + private async Task ChangePasswordAsync() + { + if (await ApiHelper.ExecuteCallGuardedAsync( + () => PersonalClient.ChangePasswordAsync(_passwordModel), + Snackbar, + _customValidation, + L["Password Changed!"])) + { + _passwordModel.Password = string.Empty; + _passwordModel.NewPassword = string.Empty; + _passwordModel.ConfirmNewPassword = string.Empty; + } + } + + private bool _currentPasswordVisibility; + private InputType _currentPasswordInput = InputType.Password; + private string _currentPasswordInputIcon = Icons.Material.Filled.VisibilityOff; + private bool _newPasswordVisibility; + private InputType _newPasswordInput = InputType.Password; + private string _newPasswordInputIcon = Icons.Material.Filled.VisibilityOff; + + private void TogglePasswordVisibility(bool newPassword) + { + if (newPassword) + { + if (_newPasswordVisibility) + { + _newPasswordVisibility = false; + _newPasswordInputIcon = Icons.Material.Filled.VisibilityOff; + _newPasswordInput = InputType.Password; + } + else + { + _newPasswordVisibility = true; + _newPasswordInputIcon = Icons.Material.Filled.Visibility; + _newPasswordInput = InputType.Text; + } + } + else + { + if (_currentPasswordVisibility) + { + _currentPasswordVisibility = false; + _currentPasswordInputIcon = Icons.Material.Filled.VisibilityOff; + _currentPasswordInput = InputType.Password; + } + else + { + _currentPasswordVisibility = true; + _currentPasswordInputIcon = Icons.Material.Filled.Visibility; + _currentPasswordInput = InputType.Text; + } + } + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/RolePermissions.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/RolePermissions.razor new file mode 100644 index 0000000..c51c397 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/RolePermissions.razor @@ -0,0 +1,75 @@ +@page "/roles/{Id}/permissions" +@attribute [MustHavePermission(FSHAction.View, FSHResource.RoleClaims)] + +@inject IStringLocalizer L + + + +@if (!_loaded) +{ + +} +else +{ + + @foreach (var group in _groupedRoleClaims.Keys) + { + var selectedRoleClaimsInGroup = _groupedRoleClaims[group].Where(c => c.Enabled).ToList(); + var allRoleClaimsInGroup = _groupedRoleClaims[group].ToList(); + + + +
+ @L["Back"] + + @if (_canEditRoleClaims) + { + @L["Update Permissions"] + + } +
+ + @if (_canSearchRoleClaims) + { + + + } +
+ + + + @L["Permission Name"] + + + + @L["Description"] + + + @L["Status"] + + + + + + + + + + + + + + + + + + +
+
+ } +
+} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/RolePermissions.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/RolePermissions.razor.cs new file mode 100644 index 0000000..6371dd9 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/RolePermissions.razor.cs @@ -0,0 +1,114 @@ +using System.Security.Claims; +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Infrastructure.Auth; +using FSH.BlazorWebAssembly.Client.Shared; +using FSH.WebApi.Shared.Authorization; +using FSH.WebApi.Shared.Multitenancy; +using Mapster; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Pages.Identity.Roles; + +public partial class RolePermissions +{ + [Parameter] + public string Id { get; set; } = default!; // from route + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + [Inject] + protected IRolesClient RolesClient { get; set; } = default!; + + private Dictionary> _groupedRoleClaims = default!; + + public string _title = string.Empty; + public string _description = string.Empty; + + private string _searchString = string.Empty; + + private bool _canEditRoleClaims; + private bool _canSearchRoleClaims; + private bool _loaded; + + static RolePermissions() => TypeAdapterConfig.NewConfig().MapToConstructor(true); + + protected override async Task OnInitializedAsync() + { + var state = await AuthState; + _canEditRoleClaims = await AuthService.HasPermissionAsync(state.User, FSHAction.Update, FSHResource.RoleClaims); + _canSearchRoleClaims = await AuthService.HasPermissionAsync(state.User, FSHAction.View, FSHResource.RoleClaims); + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => RolesClient.GetByIdWithPermissionsAsync(Id), Snackbar) + is RoleDto role && role.Permissions is not null) + { + _title = string.Format(L["{0} Permissions"], role.Name); + _description = string.Format(L["Manage {0} Role Permissions"], role.Name); + + var permissions = state.User.GetTenant() == MultitenancyConstants.Root.Id + ? FSHPermissions.All + : FSHPermissions.Admin; + + _groupedRoleClaims = permissions + .GroupBy(p => p.Resource) + .ToDictionary(g => g.Key, g => g.Select(p => + { + var permission = p.Adapt(); + permission.Enabled = role.Permissions.Contains(permission.Name); + return permission; + }).ToList()); + } + + _loaded = true; + } + + private Color GetGroupBadgeColor(int selected, int all) + { + if (selected == 0) + return Color.Error; + + if (selected == all) + return Color.Success; + + return Color.Info; + } + + private async Task SaveAsync() + { + var allPermissions = _groupedRoleClaims.Values.SelectMany(a => a); + var selectedPermissions = allPermissions.Where(a => a.Enabled); + var request = new UpdateRolePermissionsRequest() + { + RoleId = Id, + Permissions = selectedPermissions.Where(x => x.Enabled).Select(x => x.Name).ToList(), + }; + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => RolesClient.UpdatePermissionsAsync(request.RoleId, request), + Snackbar, + successMessage: L["Updated Permissions."]) + is not null) + { + Navigation.NavigateTo("/roles"); + } + } + + private bool Search(PermissionViewModel permission) => + string.IsNullOrWhiteSpace(_searchString) + || permission.Name.Contains(_searchString, StringComparison.OrdinalIgnoreCase) is true + || permission.Description.Contains(_searchString, StringComparison.OrdinalIgnoreCase) is true; +} + +public record PermissionViewModel : FSHPermission +{ + public bool Enabled { get; set; } + + public PermissionViewModel(string Description, string Action, string Resource, bool IsBasic = false, bool IsRoot = false) + : base(Description, Action, Resource, IsBasic, IsRoot) + { + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/Roles.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/Roles.razor new file mode 100644 index 0000000..c24582a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/Roles.razor @@ -0,0 +1,33 @@ +@page "/roles" +@attribute [MustHavePermission(FSHAction.View, FSHResource.Roles)] + +@inject IStringLocalizer L + + + + + + + @if (_canViewRoleClaims) + { + @L["Manage Permission"] + } + + + + @if (!Context.AddEditModal.IsCreate) + { + + + + } + + + + + + + + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/Roles.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/Roles.razor.cs new file mode 100644 index 0000000..0ee166f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Roles/Roles.razor.cs @@ -0,0 +1,60 @@ +using FSH.BlazorWebAssembly.Client.Components.EntityTable; +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Infrastructure.Auth; +using FSH.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; + +namespace FSH.BlazorWebAssembly.Client.Pages.Identity.Roles; + +public partial class Roles +{ + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + [Inject] + private IRolesClient RolesClient { get; set; } = default!; + + protected EntityClientTableContext Context { get; set; } = default!; + + private bool _canViewRoleClaims; + + protected override async Task OnInitializedAsync() + { + var state = await AuthState; + _canViewRoleClaims = await AuthService.HasPermissionAsync(state.User, FSHAction.View, FSHResource.RoleClaims); + + Context = new( + entityName: L["Role"], + entityNamePlural: L["Roles"], + entityResource: FSHResource.Roles, + searchAction: FSHAction.View, + fields: new() + { + new(role => role.Id, L["Id"]), + new(role => role.Name, L["Name"]), + new(role => role.Description, L["Description"]) + }, + idFunc: role => role.Id, + loadDataFunc: async () => (await RolesClient.GetListAsync()).ToList(), + searchFunc: (searchString, role) => + string.IsNullOrWhiteSpace(searchString) + || role.Name?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true + || role.Description?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true, + createFunc: async role => await RolesClient.RegisterRoleAsync(role), + updateFunc: async (_, role) => await RolesClient.RegisterRoleAsync(role), + deleteFunc: async id => await RolesClient.DeleteAsync(id), + hasExtraActionsFunc: () => _canViewRoleClaims, + canUpdateEntityFunc: e => !FSHRoles.IsDefault(e.Name), + canDeleteEntityFunc: e => !FSHRoles.IsDefault(e.Name), + exportAction: string.Empty); + } + + private void ManagePermissions(string? roleId) + { + ArgumentNullException.ThrowIfNull(roleId, nameof(roleId)); + Navigation.NavigateTo($"/roles/{roleId}/permissions"); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserProfile.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserProfile.razor new file mode 100644 index 0000000..5eeaddf --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserProfile.razor @@ -0,0 +1,148 @@ +@page "/users/{Id}/profile" +@attribute [MustHavePermission(FSHAction.View, FSHResource.Users)] + +@inject IStringLocalizer _localizer + + +@if (!_loaded) +{ + +} +else +{ + + + @if (_canToggleUserStatus) + { + + + + + @_localizer["Administrator Settings."] + @_localizer["This is an Administrator Only View."] + + + + + + + + @_localizer["Save Changes"] + + + + + + } + + + + +
+ @if (!string.IsNullOrEmpty(_imageUrl)) + { + + } + else + { + @_firstLetterOfName + + } +
+ @_firstName @_lastName + @_email +
+ +
+ @if (!string.IsNullOrEmpty(_imageUrl)) + { + + @_localizer["View"] + + } +
+ +
+
+
+ + + + + @_localizer["Public Profile"] + + + + + + @_firstName + + + @_lastName + + + @_phoneNumber + + + + @_email + + + + + +
+} + +@code +{ +public class CustomStringToBoolConverter : BoolConverter + { + + public CustomStringToBoolConverter() + { + SetFunc = OnSet; + GetFunc = OnGet; + } + private string TrueString = "User Active"; + private string FalseString = "no, at all"; + private string NullString = "I don't know"; + + private string OnGet(bool? value) + { + try + { + return (value == true) ? TrueString : FalseString; + } + catch (Exception e) + { + UpdateGetError("Conversion error: " + e.Message); + return NullString; + } + } + + private bool? OnSet(string arg) + { + if (arg == null) + return null; + try + { + if (arg == TrueString) + return true; + if (arg == FalseString) + return false; + else + return null; + } + catch (FormatException e) + { + UpdateSetError("Conversion error: " + e.Message); + return null; + } + } + + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserProfile.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserProfile.razor.cs new file mode 100644 index 0000000..04511d3 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserProfile.razor.cs @@ -0,0 +1,74 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Infrastructure.Auth; +using FSH.BlazorWebAssembly.Client.Infrastructure.Common; +using FSH.BlazorWebAssembly.Client.Shared; +using FSH.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; + +namespace FSH.BlazorWebAssembly.Client.Pages.Identity.Users; + +public partial class UserProfile +{ + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + [Inject] + protected IUsersClient UsersClient { get; set; } = default!; + + [Parameter] + public string? Id { get; set; } + [Parameter] + public string? Title { get; set; } + [Parameter] + public string? Description { get; set; } + + private bool _active; + private bool _emailConfirmed; + private char _firstLetterOfName; + private string? _firstName; + private string? _lastName; + private string? _phoneNumber; + private string? _email; + private string? _imageUrl; + private bool _loaded; + private bool _canToggleUserStatus; + + private async Task ToggleUserStatus() + { + var request = new ToggleUserStatusRequest { ActivateUser = _active, UserId = Id }; + await ApiHelper.ExecuteCallGuardedAsync(() => UsersClient.ToggleStatusAsync(Id, request), Snackbar); + Navigation.NavigateTo("/users"); + } + + [Parameter] + public string? ImageUrl { get; set; } + + protected override async Task OnInitializedAsync() + { + if (await ApiHelper.ExecuteCallGuardedAsync( + () => UsersClient.GetByIdAsync(Id), Snackbar) + is UserDetailsDto user) + { + _firstName = user.FirstName; + _lastName = user.LastName; + _email = user.Email; + _phoneNumber = user.PhoneNumber; + _active = user.IsActive; + _emailConfirmed = user.EmailConfirmed; + _imageUrl = string.IsNullOrEmpty(user.ImageUrl) ? string.Empty : (Config[ConfigNames.ApiBaseUrl] + user.ImageUrl); + Title = $"{_firstName} {_lastName}'s {_localizer["Profile"]}"; + Description = _email; + if (_firstName?.Length > 0) + { + _firstLetterOfName = _firstName.ToUpper().FirstOrDefault(); + } + } + + var state = await AuthState; + _canToggleUserStatus = await AuthService.HasPermissionAsync(state.User, FSHAction.Update, FSHResource.Users); + _loaded = true; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserRoles.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserRoles.razor new file mode 100644 index 0000000..bc82479 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserRoles.razor @@ -0,0 +1,67 @@ +@page "/users/{Id}/roles" +@attribute [MustHavePermission(FSHAction.View, FSHResource.UserRoles)] + +@inject IStringLocalizer L + + + +@if (!_loaded) +{ + +} +else +{ + + +
+ + @L["Back"] + + @if (_canEditUsers) + { + + @L["Update"] + + } +
+ + @if (_canSearchRoles) + { + + + } +
+ + + @L["Role Name"] + + + + @L["Description"] + + + + @L["Status"] + + + + + + + + + + + + + + + + + + +
+} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserRoles.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserRoles.razor.cs new file mode 100644 index 0000000..1b0664b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/UserRoles.razor.cs @@ -0,0 +1,77 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Infrastructure.Auth; +using FSH.BlazorWebAssembly.Client.Shared; +using FSH.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; + +namespace FSH.BlazorWebAssembly.Client.Pages.Identity.Users; + +public partial class UserRoles +{ + [Parameter] + public string? Id { get; set; } + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + [Inject] + protected IUsersClient UsersClient { get; set; } = default!; + + private List _userRolesList = default!; + + private string _title = string.Empty; + private string _description = string.Empty; + + private string _searchString = string.Empty; + + private bool _canEditUsers; + private bool _canSearchRoles; + private bool _loaded; + + protected override async Task OnInitializedAsync() + { + var state = await AuthState; + _canEditUsers = await AuthService.HasPermissionAsync(state.User, FSHAction.Update, FSHResource.Users); + _canSearchRoles = await AuthService.HasPermissionAsync(state.User, FSHAction.View, FSHResource.UserRoles); + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => UsersClient.GetByIdAsync(Id), Snackbar) + is UserDetailsDto user) + { + _title = $"{user.FirstName} {user.LastName}"; + _description = string.Format(L["Manage {0} {1}'s Roles"], user.FirstName, user.LastName); + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => UsersClient.GetRolesAsync(user.Id.ToString()), Snackbar) + is ICollection response) + { + _userRolesList = response.ToList(); + } + } + + _loaded = true; + } + + private async Task SaveAsync() + { + var request = new UserRolesRequest() + { + UserRoles = _userRolesList + }; + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => UsersClient.AssignRolesAsync(Id, request), + Snackbar, + successMessage: L["Updated User Roles."]) + is not null) + { + Navigation.NavigateTo("/users"); + } + } + + private bool Search(UserRoleDto userRole) => + string.IsNullOrWhiteSpace(_searchString) + || userRole.RoleName?.Contains(_searchString, StringComparison.OrdinalIgnoreCase) is true; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/Users.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/Users.razor new file mode 100644 index 0000000..f2d93ec --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/Users.razor @@ -0,0 +1,46 @@ +@page "/users" +@attribute [MustHavePermission(FSHAction.View, FSHResource.Users)] + +@inject IStringLocalizer L + + + + + + @L["View Profile"] + @if (_canViewRoles) + { + @L["Manage Roles"] + } + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/Users.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/Users.razor.cs new file mode 100644 index 0000000..c041739 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Identity/Users/Users.razor.cs @@ -0,0 +1,95 @@ +using FSH.BlazorWebAssembly.Client.Components.EntityTable; +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Infrastructure.Auth; +using FSH.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Pages.Identity.Users; + +public partial class Users +{ + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + + [Inject] + protected IUsersClient UsersClient { get; set; } = default!; + + protected EntityClientTableContext Context { get; set; } = default!; + + private bool _canExportUsers; + private bool _canViewRoles; + + // Fields for editform + protected string Password { get; set; } = string.Empty; + protected string ConfirmPassword { get; set; } = string.Empty; + + private bool _passwordVisibility; + private InputType _passwordInput = InputType.Password; + private string _passwordInputIcon = Icons.Material.Filled.VisibilityOff; + + protected override async Task OnInitializedAsync() + { + var user = (await AuthState).User; + _canExportUsers = await AuthService.HasPermissionAsync(user, FSHAction.Export, FSHResource.Users); + _canViewRoles = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.UserRoles); + + Context = new( + entityName: L["User"], + entityNamePlural: L["Users"], + entityResource: FSHResource.Users, + searchAction: FSHAction.View, + updateAction: string.Empty, + deleteAction: string.Empty, + fields: new() + { + new(user => user.FirstName, L["First Name"]), + new(user => user.LastName, L["Last Name"]), + new(user => user.UserName, L["UserName"]), + new(user => user.Email, L["Email"]), + new(user => user.PhoneNumber, L["PhoneNumber"]), + new(user => user.EmailConfirmed, L["Email Confirmation"], Type: typeof(bool)), + new(user => user.IsActive, L["Active"], Type: typeof(bool)) + }, + idFunc: user => user.Id, + loadDataFunc: async () => (await UsersClient.GetListAsync()).ToList(), + searchFunc: (searchString, user) => + string.IsNullOrWhiteSpace(searchString) + || user.FirstName?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true + || user.LastName?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true + || user.Email?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true + || user.PhoneNumber?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true + || user.UserName?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true, + createFunc: user => UsersClient.CreateAsync(user), + hasExtraActionsFunc: () => true, + exportAction: string.Empty); + } + + private void ViewProfile(in Guid userId) => + Navigation.NavigateTo($"/users/{userId}/profile"); + + private void ManageRoles(in Guid userId) => + Navigation.NavigateTo($"/users/{userId}/roles"); + + private void TogglePasswordVisibility() + { + if (_passwordVisibility) + { + _passwordVisibility = false; + _passwordInputIcon = Icons.Material.Filled.VisibilityOff; + _passwordInput = InputType.Password; + } + else + { + _passwordVisibility = true; + _passwordInputIcon = Icons.Material.Filled.Visibility; + _passwordInput = InputType.Text; + } + + Context.AddEditModal.ForceRender(); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Index.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Index.razor new file mode 100644 index 0000000..42798ac --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Index.razor @@ -0,0 +1,95 @@ +@page "/home" +@page "/" + +@inject IStringLocalizer L + + + + +
+ +
+
+ + @L["fullstackhero's"] + @L["Blazor WebAssembly Boilerplate"] + + + + + @L["Built with the goodness of"] MudBlazor @L["Component Library"]. + + + @L["Compatible with"] fullstackhero .NET WebAPI Boilerplate v1. + + + +
+ @L["Get Started"] + @L["Star on GitHub"] +
+
+ + @L["Version 1.0"] + + + + + @L["In case you are stuck anywhere or have any queries regarding this implementation, I have compiled a Quick Start Guide for you reference."] + @L["Read The Guide"] + + + + + + + + + @L["Here are few articles that should help you get started with Blazor."] + + + + + + + + + + + + @L["Application Claims of the currently logged in user."] + + @if (Claims is not null) + { + @foreach (var claim in Claims) + { + + + @claim.Type + + @claim.Value + + } + } + + + + + + @L["Liked this Boilerplate? Star us on Github!"] + +
+
+ +@code { + [CascadingParameter] + public Task AuthState { get; set; } = default!; + + public IEnumerable? Claims { get; set; } + + protected override async Task OnInitializedAsync() + { + var authState = await AuthState; + Claims = authState.User.Claims; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Multitenancy/Tenants.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Multitenancy/Tenants.razor new file mode 100644 index 0000000..3f3da22 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Multitenancy/Tenants.razor @@ -0,0 +1,107 @@ +@page "/tenants" +@attribute [MustHavePermission(FSHAction.View, FSHResource.Tenants)] + +@inject IStringLocalizer L +@inject IAuthenticationService Authentication + + + + + + + + + + + + + + + + + + @if (Authentication.ProviderType == AuthProvider.AzureAd) + { + + + + } + + + @if(_canUpgrade) + { + @L["Upgrade Subscription"] + } + + @((context.ShowDetails == true) ? L["Hide"] : L["Show"]) @L["Tenant Details"] + + @if (_canModify) + { + @if (!context.IsActive) + { + @L["Activate Tenant"] + } + else + { + @L["Deactivate Tenant"] + } + } + + + + @if (context.ShowDetails) + { + + + + + + @L["Details for Tenant"] : + @context.Id + + + + + + + + @if(string.IsNullOrEmpty(context.ConnectionString?.Trim())) + { + @L["Shared Database"] + } + else + { + + + } + + @if (Authentication.ProviderType == AuthProvider.AzureAd) + { + + + + + } + +
@L["Connection String"] + + @context.ConnectionString?.Trim() + +
@L["Issuer"] + + + @context.Issuer?.Trim() + + +
+
+
+ +
+ } +
+ +
\ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Multitenancy/Tenants.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Pages/Multitenancy/Tenants.razor.cs new file mode 100644 index 0000000..d18eb13 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Multitenancy/Tenants.razor.cs @@ -0,0 +1,121 @@ +using FSH.BlazorWebAssembly.Client.Components.EntityTable; +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Infrastructure.Auth; +using FSH.BlazorWebAssembly.Client.Shared; +using FSH.WebApi.Shared.Authorization; +using Mapster; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Pages.Multitenancy; + +public partial class Tenants +{ + [Inject] + private ITenantsClient TenantsClient { get; set; } = default!; + private string? _searchString; + protected EntityClientTableContext Context { get; set; } = default!; + private List _tenants = new(); + public EntityTable EntityTable { get; set; } = default!; + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + + private bool _canUpgrade; + private bool _canModify; + + protected override async Task OnInitializedAsync() + { + Context = new( + entityName: L["Tenant"], + entityNamePlural: L["Tenants"], + entityResource: FSHResource.Tenants, + searchAction: FSHAction.View, + deleteAction: string.Empty, + updateAction: string.Empty, + fields: new() + { + new(tenant => tenant.Id, L["Id"]), + new(tenant => tenant.Name, L["Name"]), + new(tenant => tenant.AdminEmail, L["Admin Email"]), + new(tenant => tenant.ValidUpto.ToString("MMM dd, yyyy"), L["Valid Upto"]), + new(tenant => tenant.IsActive, L["Active"], Type: typeof(bool)) + }, + loadDataFunc: async () => _tenants = (await TenantsClient.GetListAsync()).Adapt>(), + searchFunc: (searchString, tenantDto) => + string.IsNullOrWhiteSpace(searchString) + || tenantDto.Name.Contains(searchString, StringComparison.OrdinalIgnoreCase), + createFunc: tenant => TenantsClient.CreateAsync(tenant.Adapt()), + hasExtraActionsFunc: () => true, + exportAction: string.Empty); + + var state = await AuthState; + _canUpgrade = await AuthService.HasPermissionAsync(state.User, FSHAction.UpgradeSubscription, FSHResource.Tenants); + _canModify = await AuthService.HasPermissionAsync(state.User, FSHAction.Update, FSHResource.Tenants); + } + + private void ViewTenantDetails(string id) + { + var tenant = _tenants.First(f => f.Id == id); + tenant.ShowDetails = !tenant.ShowDetails; + foreach (var otherTenants in _tenants.Except(new[] { tenant })) + { + otherTenants.ShowDetails = false; + } + } + + private async Task ViewUpgradeSubscriptionModalAsync(string id) + { + var tenant = _tenants.First(f => f.Id == id); + var parameters = new DialogParameters + { + { + nameof(UpgradeSubscriptionModal.Request), + new UpgradeSubscriptionRequest + { + TenantId = tenant.Id, + ExtendedExpiryDate = tenant.ValidUpto + } + } + }; + var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true, DisableBackdropClick = true }; + var dialog = DialogService.Show(L["Upgrade Subscription"], parameters, options); + var result = await dialog.Result; + if (!result.Cancelled) + { + await EntityTable.ReloadDataAsync(); + } + } + + private async Task DeactivateTenantAsync(string id) + { + if (await ApiHelper.ExecuteCallGuardedAsync( + () => TenantsClient.DeactivateAsync(id), + Snackbar, + null, + L["Tenant Deactivated."]) is not null) + { + await EntityTable.ReloadDataAsync(); + } + } + + private async Task ActivateTenantAsync(string id) + { + if (await ApiHelper.ExecuteCallGuardedAsync( + () => TenantsClient.ActivateAsync(id), + Snackbar, + null, + L["Tenant Activated."]) is not null) + { + await EntityTable.ReloadDataAsync(); + } + } + + public class TenantDetail : TenantDto + { + public bool ShowDetails { get; set; } + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Multitenancy/UpgradeSubscriptionModal.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Multitenancy/UpgradeSubscriptionModal.razor new file mode 100644 index 0000000..48921de --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Multitenancy/UpgradeSubscriptionModal.razor @@ -0,0 +1,58 @@ +@inject IStringLocalizer L +@inject ITenantsClient TenantsClient + + + + + + + @L["Upgrade Subscription"] + + + + + + + + + + + + + + + + + @L["Cancel"] + @L["Upgrade"] + + + + +@code +{ + [Parameter] public UpgradeSubscriptionRequest Request { get; set; } = new(); + [CascadingParameter] private MudDialogInstance MudDialog { get; set; } = default!; + DateTime? date = DateTime.Today; + + protected override void OnInitialized() => + date = Request.ExtendedExpiryDate; + + private async Task UpgradeSubscriptionAsync() + { + Request.ExtendedExpiryDate = date.HasValue ? date.Value : Request.ExtendedExpiryDate; + if (await ApiHelper.ExecuteCallGuardedAsync( + () => TenantsClient.UpgradeSubscriptionAsync(Request.TenantId, Request), + Snackbar, + null, + L["Upgraded Subscription."]) is not null) + { + MudDialog.Close(); + } + } + + public void Cancel() + { + MudDialog.Cancel(); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Personal/AuditLogs.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Personal/AuditLogs.razor new file mode 100644 index 0000000..d10503a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Personal/AuditLogs.razor @@ -0,0 +1,131 @@ +@page "/audit-logs" + +@inject IStringLocalizer L + + + + + + + @L["Search in Old Values"] + @L["Search in New Values"] + + + @L["Clear"] + @L["Cancel"] + @L["Ok"] + + + + + + @((context.ShowDetails == true) ? L["Hide"] : L["Show"]) @L["Trail Details"] + + + + @if (context.ShowDetails) + { + + + + + + @L["Details for Trail ID"] : @context.Id + + + + + + @if (!string.IsNullOrEmpty(context.AffectedColumns)) + { + + + + + } + + + + + @if (!string.IsNullOrEmpty(context.OldValues)) + { + + + + + } + @if (!string.IsNullOrEmpty(context.NewValues)) + { + + + + + } + +
@L["Columns Affected"] + + @foreach (var column in context.AffectedColumns.Trim('[').Trim(']').Split(',')) + { + @column.Replace('"', ' ').Trim() + } + +
@L["Primary Key"] + + @context.PrimaryKey?.Trim('{').Trim('}').Replace('"', ' ').Trim() + +
@L["Old Values"] + + + @foreach (var value in context.OldValues.Trim('{').Trim('}').Split(',')) + { + @if (_searchInOldValues) + { + + + + } + else + { + @value.Replace('"', ' ').Trim() + } + } + +
@L["New Values"] + + + @foreach (var value in context.NewValues.Trim('{').Trim('}').Split(',')) + { + @if (_searchInNewValues) + { + + + + } + else + { + @value.Replace('"', ' ').Trim() + } + } + +
+
+
+ +
+ } +
+ +
+ +@code { + private RenderFragment DateFieldTemplate => trail => __builder => + { + + @L["Local"] : @trail.LocalTime.ToString("G") + + + @L["UTC"] : @trail.DateTime.ToString("G") + + }; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Personal/AuditLogs.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Pages/Personal/AuditLogs.razor.cs new file mode 100644 index 0000000..3f6460c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Personal/AuditLogs.razor.cs @@ -0,0 +1,71 @@ +using FSH.BlazorWebAssembly.Client.Components.EntityTable; +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using Mapster; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Pages.Personal; + +public partial class AuditLogs +{ + [Inject] + private IPersonalClient PersonalClient { get; set; } = default!; + + protected EntityClientTableContext Context { get; set; } = default!; + + private string? _searchString; + private MudDateRangePicker _dateRangePicker = default!; + private DateRange? _dateRange; + private bool _searchInOldValues; + private bool _searchInNewValues; + private List _trails = new(); + + // Configure Automapper + static AuditLogs() => + TypeAdapterConfig.NewConfig().Map( + dest => dest.LocalTime, + src => DateTime.SpecifyKind(src.DateTime, DateTimeKind.Utc).ToLocalTime()); + + protected override void OnInitialized() + { + Context = new( + entityNamePlural: L["Trails"], + searchAction: true.ToString(), + fields: new() + { + new(audit => audit.Id, L["Id"]), + new(audit => audit.TableName, L["Table Name"]), + new(audit => audit.DateTime, L["Date"], Template: DateFieldTemplate), + new(audit => audit.Type, L["Type"]) + }, + loadDataFunc: async () => _trails = (await PersonalClient.GetLogsAsync()).Adapt>(), + searchFunc: (searchString, trail) => + (string.IsNullOrWhiteSpace(searchString) // check Search String + || trail.TableName?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true + || (_searchInOldValues && + trail.OldValues?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true) + || (_searchInNewValues && + trail.NewValues?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true)) + && ((_dateRange?.Start is null && _dateRange?.End is null) // check Date Range + || (_dateRange?.Start is not null && _dateRange.End is null && trail.DateTime >= _dateRange.Start) + || (_dateRange?.Start is null && _dateRange?.End is not null && trail.DateTime <= _dateRange.End + new TimeSpan(0, 11, 59, 59, 999)) + || (trail.DateTime >= _dateRange!.Start && trail.DateTime <= _dateRange.End + new TimeSpan(0, 11, 59, 59, 999))), + hasExtraActionsFunc: () => true); + } + + private void ShowBtnPress(Guid id) + { + var trail = _trails.First(f => f.Id == id); + trail.ShowDetails = !trail.ShowDetails; + foreach (var otherTrail in _trails.Except(new[] { trail })) + { + otherTrail.ShowDetails = false; + } + } + + public class RelatedAuditTrail : AuditDto + { + public bool ShowDetails { get; set; } + public DateTime LocalTime { get; set; } + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Personal/Dashboard.razor b/blazor-wasm-boilerplate-main/src/Client/Pages/Personal/Dashboard.razor new file mode 100644 index 0000000..5e2fd94 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Personal/Dashboard.razor @@ -0,0 +1,65 @@ +@page "/dashboard" +@attribute [MustHavePermission(FSHAction.View, FSHResource.Dashboard)] + +@inject IStringLocalizer L + + + +@if (!_loaded) +{ + +} +else +{ + + + + +
+ @L["Products"] + @ProductCount +
+
+
+ + + +
+ @L["Brands"] + @BrandCount +
+
+
+ + + +
+ @L["Registered Users"] + + @UserCount +
+
+
+ + + +
+ @L["Registered Roles"] + + @RoleCount +
+
+
+ + + + + +
+} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Pages/Personal/Dashboard.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Pages/Personal/Dashboard.razor.cs new file mode 100644 index 0000000..4fcadd5 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Pages/Personal/Dashboard.razor.cs @@ -0,0 +1,62 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using FSH.BlazorWebAssembly.Client.Infrastructure.Notifications; +using FSH.BlazorWebAssembly.Client.Shared; +using FSH.WebApi.Shared.Notifications; +using MediatR.Courier; +using Microsoft.AspNetCore.Components; + +namespace FSH.BlazorWebAssembly.Client.Pages.Personal; + +public partial class Dashboard +{ + [Parameter] + public int ProductCount { get; set; } + [Parameter] + public int BrandCount { get; set; } + [Parameter] + public int UserCount { get; set; } + [Parameter] + public int RoleCount { get; set; } + + [Inject] + private IDashboardClient DashboardClient { get; set; } = default!; + [Inject] + private ICourier Courier { get; set; } = default!; + + private readonly string[] _dataEnterBarChartXAxisLabels = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + private readonly List _dataEnterBarChartSeries = new(); + private bool _loaded; + + protected override async Task OnInitializedAsync() + { + Courier.SubscribeWeak>(async _ => + { + await LoadDataAsync(); + StateHasChanged(); + }); + + await LoadDataAsync(); + + _loaded = true; + } + + private async Task LoadDataAsync() + { + if (await ApiHelper.ExecuteCallGuardedAsync( + () => DashboardClient.GetAsync(), + Snackbar) + is StatsDto statsDto) + { + ProductCount = statsDto.ProductCount; + BrandCount = statsDto.BrandCount; + UserCount = statsDto.UserCount; + RoleCount = statsDto.RoleCount; + foreach (var item in statsDto.DataEnterBarChart) + { + _dataEnterBarChartSeries + .RemoveAll(x => x.Name.Equals(item.Name, StringComparison.OrdinalIgnoreCase)); + _dataEnterBarChartSeries.Add(new MudBlazor.ChartSeries { Name = item.Name, Data = item.Data?.ToArray() }); + } + } + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Program.cs b/blazor-wasm-boilerplate-main/src/Client/Program.cs new file mode 100644 index 0000000..ebd6774 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Program.cs @@ -0,0 +1,30 @@ +using System.Globalization; +using FSH.BlazorWebAssembly.Client; +using FSH.BlazorWebAssembly.Client.Infrastructure; +using FSH.BlazorWebAssembly.Client.Infrastructure.Common; +using FSH.BlazorWebAssembly.Client.Infrastructure.Preferences; +using Microsoft.AspNetCore.Components.Web; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; + +var builder = WebAssemblyHostBuilder.CreateDefault(args); + +builder.RootComponents.Add("#app"); +builder.RootComponents.Add("head::after"); + +builder.Services.AddClientServices(builder.Configuration); + +var host = builder.Build(); + +var storageService = host.Services.GetRequiredService(); +if (storageService != null) +{ + CultureInfo culture; + if (await storageService.GetPreference() is ClientPreference preference) + culture = new CultureInfo(preference.LanguageCode); + else + culture = new CultureInfo(LocalizationConstants.SupportedLanguages.FirstOrDefault()?.Code ?? "en-US"); + CultureInfo.DefaultThreadCurrentCulture = culture; + CultureInfo.DefaultThreadCurrentUICulture = culture; +} + +await host.RunAsync(); \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Properties/launchSettings.json b/blazor-wasm-boilerplate-main/src/Client/Properties/launchSettings.json new file mode 100644 index 0000000..ec01420 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Properties/launchSettings.json @@ -0,0 +1,30 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:21716", + "sslPort": 44331 + } + }, + "profiles": { + "FSH.BlazorWebAssembly": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:5002;http://localhost:5003", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.ar.resx new file mode 100644 index 0000000..61567a8 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.ar.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} من {all_items} + + + صف لكل صفحة + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.de.resx new file mode 100644 index 0000000..bce5fdf --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.de.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} von {all_items} + + + Zeilen je Seite: + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.en.resx new file mode 100644 index 0000000..eef54b7 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.en.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} of {all_items} + + + Rows per page: + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.es.resx new file mode 100644 index 0000000..9971ad9 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.es.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} de {all_items} + + + Registros por página: + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.fr.resx new file mode 100644 index 0000000..4ed5249 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.fr.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} sur {all_items} + + + Lignes par page : + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.id.resx new file mode 100644 index 0000000..b45e839 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.id.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} dari {all_items} + + + Baris per halaman: + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.it.resx new file mode 100644 index 0000000..338aa89 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.it.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} di {all_items} + + + Righe per pagina: + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.km.resx new file mode 100644 index 0000000..ba27d45 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.km.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} នៃ {all_items} + + + ជួរដេកក្នុងមួយទំព័រ៖ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.nl.resx new file mode 100644 index 0000000..bac82ce --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.nl.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} of {all_items} + + + Rijen per pagina: + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.ru.resx new file mode 100644 index 0000000..7a5d02c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.ru.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} из {all_items} + + + Строк на странице: + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.sv.resx new file mode 100644 index 0000000..d28249a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Components/Common/TablePager.sv.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} of {all_items} + + + Rader per sida: + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.ar.resx new file mode 100644 index 0000000..bc64cb0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.ar.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + هل لديك حساب؟ + + + بريد الالكتروني + + + أوافق على الشروط والخصوصية + + + كلمه السر + + + رقم الهاتف + + + اشتراك + + + تسجيل الدخول + + + اشتراك + + + اسم المستخدم + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.de.resx new file mode 100644 index 0000000..59166f3 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.de.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Bereits registriert? + + + E-Mail + + + Ich stimme den Nutzungs- und Datenschutzbedingungen zu. + + + Passwort + + + Telefon + + + Registrieren + + + Anmelden + + + Registrieren + + + Benutzername + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.en.resx new file mode 100644 index 0000000..d8c326d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.en.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Already have an account? + + + E-mail + + + I agree to the terms and privacy + + + Password + + + Phone Number + + + Register + + + Sign In + + + Sign Up + + + Username + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.es.resx new file mode 100644 index 0000000..8ff1bdf --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.es.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ¿Ya tiene una cuenta? + + + Correo + + + Acepto los términos y condiciones + + + Contraseña + + + Teléfono + + + Registrarse + + + Ingresar + + + Registrarse + + + Usuario + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.fr.resx new file mode 100644 index 0000000..e912e94 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.fr.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Vous possédez déjà un compte ? + + + Courriel + + + J'accepte les conditions d'utilisation et la politique de confidentialité + + + Mot de passe + + + Numéro de téléphone + + + S'inscrire + + + Se connecter + + + S'inscrire + + + Nom d'utilisateur + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.id.resx new file mode 100644 index 0000000..a9f2a0d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.id.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Sudah punya akun? + + + E-mail + + + Saya setuju akan ketentuan dan kebijakan privasi + + + Sandi + + + Nomor Telepon + + + Daftar + + + Masuk + + + Daftar + + + Nama pengguna + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.it.resx new file mode 100644 index 0000000..9cb4fdc --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.it.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Sei già registrato? + + + E-Mail + + + Accetto i termini e la privacy + + + Telefono + + + Registrati + + + Accedi + + + Iscriviti + + + Utente + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.km.resx new file mode 100644 index 0000000..f6f8870 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.km.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + មានគណនីរួចហើយ? + + + អ៊ីមែល + + + ខ្ញុំយល់ស្របនឹងលក្ខខណ្ឌនិងភាពឯកជន + + + លេខសម្ងាត់ + + + លេខទូរស័ព្ទ + + + ចុះឈ្មោះ + + + ចូល + + + ចុះ​ឈ្មោះ + + + ឈ្មោះ​អ្នកប្រើប្រាស់ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.nl.resx new file mode 100644 index 0000000..0be70ca --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.nl.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Heb je al een account? + + + E-mail + + + Ik ga akkoord met de voorwaarden en privacy + + + Wachtwoord + + + Telefoonnummer + + + Registreren + + + Aanmelden + + + Inschrijven + + + Gebruikersnaam + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.ru.resx new file mode 100644 index 0000000..1ac7f04 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.ru.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Уже имеете аккаунт? + + + E-mail + + + Я согласен с условиями и конфиденциальностью + + + Пароль + + + Номер телефона + + + Зарегистрировать + + + Авторизация + + + Регистрация + + + Username + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.sv.resx new file mode 100644 index 0000000..a8984ec --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Register.sv.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Har du redan ett konto? + + + Epost + + + Jag godkänner villkoren och integriteten + + + Lösenord + + + Telefonnummer + + + Registrera + + + Logga In + + + Bli Medlem + + + Användarnamn + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.ar.resx new file mode 100644 index 0000000..dfc9fd2 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.ar.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أوافق على الشروط والخصوصية + + + كلمة مرور جديدة + + + ضع كلمة مرور جديدة + + + لم يتم العثور على الرمز! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.de.resx new file mode 100644 index 0000000..530dfed --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.de.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ich stimme den Nutzungs- und Datenschutzbestimmungen zu. + + + Neues Passwort + + + Neues Passwort festlegen + + + Token nicht gefunden! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.en.resx new file mode 100644 index 0000000..51f60ad --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.en.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + I agree to the terms and privacy + + + New Password + + + Set new password + + + Token Not Found! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.es.resx new file mode 100644 index 0000000..f6f44bc --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.es.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acepto los términos y condiciones + + + Nueva contraseña + + + Establecer contraseña + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.fr.resx new file mode 100644 index 0000000..8019f31 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.fr.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + J'accepte les conditions d'utilisation et la politique de confidentialité + + + Nouveau mot de passe + + + Définir le nouveau mot de passe + + + Jeton introuvable ! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.id.resx new file mode 100644 index 0000000..d169911 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.id.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Saya setuju akan ketentuan dan kebijakan privasi + + + Sandi baru + + + Atur sandi baru + + + Token Tidak Ditemukan! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.it.resx new file mode 100644 index 0000000..0d29f14 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.it.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Accetto i termini e la privacy + + + Nuova Password + + + Token non trovato! + + + Imposta nuova password + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.km.resx new file mode 100644 index 0000000..e302b84 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.km.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ខ្ញុំយល់ស្របនឹងលក្ខខណ្ឌនិងភាពឯកជន + + + ពាក្យសម្ងាត់​ថ្មី + + + កំណត់ពាក្យសម្ងាត់ថ្មី + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.nl.resx new file mode 100644 index 0000000..30f308e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.nl.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ik ga akkoord met de voorwaarden en privacy + + + Nieuw wachtwoord + + + Nieuw wachtwoord instellen + + + Token niet gevonden! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.ru.resx new file mode 100644 index 0000000..acf21ac --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.ru.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Я согласен с условиями и конфиденциальностью + + + Новый пароль + + + Установить новый пароль + + + Токен не найден! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.sv.resx new file mode 100644 index 0000000..f1f44a3 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Account/Reset.sv.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Jag godkänner villkoren och integriteten + + + Nytt Lösenord + + + Det nya lösenordet + + + Token hittades inte! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.ar.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.ar.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.de.resx new file mode 100644 index 0000000..94f8d99 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.de.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Du wurdest erfolgreich ausgeloggt. + + + Klicke hier, um dich wieder einzuloggen. + + + Du wirst eingeloggt... + + + Überprüfe Berechtigungen... + + + Entschuldigung, dein Login ist fehlgeschlagen. Versuche es noch einmal oder kontaktiere den Support. + + + Du wirst ausgeloggt... + + + Entschuldigung, dein Logout ist fehlgeschlagen. Versuche es noch einmal oder kontaktiere den Support. + + + Profil wird abgerufen... + + + Konto wird registriert... + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.en.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.en.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.es.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.es.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.fr.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.fr.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.id.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.id.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.it.resx new file mode 100644 index 0000000..c015459 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.it.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Sei stato disconnesso con successo. + + + Clicca qui per accedere indietro + + + Registrarti in ... + + + Controllo Autorizzazioni ... + + + Siamo spiacenti, il tuo login è fallito. Si prega di riprovare o contattare il supporto. + + + Disattivandoti ... + + + Siamo spiacenti, operazione di disconnessione fallito. Si prega di riprovare o contattare il supporto. + + + Recupero del profilo ... + + + Registrazione dell'account ... + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.km.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.km.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.nl.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.nl.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.ru.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.ru.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.sv.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Authentication.sv.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.ar.resx new file mode 100644 index 0000000..14e0972 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.ar.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + تم! + + + البريد الإلكتروني + + + أدخل عنوان البريد الإلكتروني المرتبط بحسابك وستتلقى رسالة بريد إلكتروني تحتوي على رابط لإعادة تعيين كلمة المرور الخاصة بك + + + هل نسيت كلمة السر? + + + إعادة تعيين كلمة المرور + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.de.resx new file mode 100644 index 0000000..f949b86 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.de.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Fertig! + + + E-Mail + + + E-Mail-Adresse eingeben, mit welcher das Konto verknüpft ist, um eine E-Mail zum zurücksetzen des Passworts zu erhalten. + + + Passwort vergessen? + + + Passwort zurücksetzen + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.en.resx new file mode 100644 index 0000000..5e4f57a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.en.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Done! + + + E-Mail + + + Enter the email address linked to your account and you will recieve an email containing a link to reset your password + + + Forgot password? + + + Reset Password + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.es.resx new file mode 100644 index 0000000..31824cf --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.es.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Correo + + + Ingresa la dirección de correo vinculada a su cuenta y recibirá un correo con un enlace para blanquear la contraseña + + + ¿Olvidó su contraseña? + + + Blanquear contraseña + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.fr.resx new file mode 100644 index 0000000..d887377 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.fr.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Terminé ! + + + Courriel + + + Sasissez le courriel lié à votre compte et vous y recevrez un message contenant un lien pour réinitialiser votre mot de passe + + + Mot de passe oublié ? + + + Réinitialiser le mot de passe + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.id.resx new file mode 100644 index 0000000..52c8afd --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.id.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Selesai! + + + E-Mail + + + Masukkan alamat email yang terhubung ke akun anda dan anda akan menerima email berisi link untuk mereset password anda + + + Lupa password? + + + Reset Password + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.it.resx new file mode 100644 index 0000000..b300815 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.it.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Password dimenticata? + + + E-Mail + + + Ripristina Password + + + Fatto! + + + Inserisci l'indirizzo E-Mail collegato al tuo utente e riceverai un link per il ripristino della password. + + + Possiamo aiutarti ripristinando la password. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.km.resx new file mode 100644 index 0000000..b574e84 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.km.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + អ៊ីម៉ែល + + + បញ្ចូលអាសយដ្ឋានអ៊ីមែលដែលភ្ជាប់ទៅគណនីរបស់អ្នកហើយអ្នកនឹងទទួលបានអ៊ីមែលដែលមានតំណភ្ជាប់ដើម្បីកំណត់លេខសម្ងាត់របស់អ្នកឡើងវិញ + + + ភ្លេច​លេខសំងាត់​? + + + កំណត់ពាក្យសម្ងាត់ឡើងវិញ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.nl.resx new file mode 100644 index 0000000..d725b6c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.nl.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + E-mail + + + Voer het e-mailadres in dat aan uw account is gekoppeld en u ontvangt een e-mail met een link om uw wachtwoord opnieuw in te stellen + + + Wachtwoord vergeten? + + + Wachtwoord opnieuw instellen + + + Klaar! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.ru.resx new file mode 100644 index 0000000..9ff2cdc --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.ru.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Готово! + + + E-Mail + + + Введите email-адрес, прикреплённый к вашему аккаунту, и вы получите письмо, соржащее ссылку для сброса вашего пароля + + + Забыли пароль? + + + Сбросить пароль + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.sv.resx new file mode 100644 index 0000000..7553815 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/ForgotPassword.sv.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Klart! + + + Epost + + + Fyll i din Epost-adress kopplat till ditt konto och du får ett mail med en länk för att nollställa ditt lösenord. + + + Glömt Lösenord? + + + Nollställ Lösenord + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.ar.resx new file mode 100644 index 0000000..a30f0a0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.ar.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + تسجيل الدخول مع أوراق الاعتماد الخاصة بك. + + + ليس لديك حساب؟ + + + بريد الالكتروني + + + البريد الالكتروني مطلوب! + + + قم بتعبئة بيانات اعتماد المسؤول + + + املأ بيانات اعتماد المستخدم الأساسية + + + هل نسيت كلمة السر؟ + + + كلمه السر + + + كلمة المرور مطلوبة! + + + سجل هنا + + + تذكرنى؟ + + + تسجيل الدخول + + + عنوان + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.de.resx new file mode 100644 index 0000000..4812f2f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.de.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Mit Zugangsdaten anmelden + + + Du hast noch keine Konto? + + + E-Mail + + + E-Mail wird benötigt. + + + Gib deine Zugangsdaten + + + Mit Zugangsdaten des Administrators ausfüllen + + + Mit Basis-Zugangsdaten ausfüllen + + + Passwort vergessen? + + + Passwort + + + Passwort wird benötigt! + + + Registriere dich hier + + + Zugangsdaten speichern? + + + Anmelden + + + Anmelden + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.en.resx new file mode 100644 index 0000000..e13f761 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.en.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Login with your Credentials. + + + Don't have an account? + + + E-mail + + + Email is required! + + + Enter your credentials to get started. + + + Fill Administrator Credentials + + + Fill Basic User Credentials + + + Forgot password? + + + Password + + + Password is required! + + + Register here + + + Remember me? + + + Sign In + + + Sign In + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.es.resx new file mode 100644 index 0000000..3c5e771 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.es.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ingrese con sus credenciales. + + + ¿No tiene una cuenta? + + + Correo + + + El Correo es requerido! + + + Completar con Credenciales Administrador + + + Completar con Credenciales Usuario + + + ¿Olvidó su Contraseña? + + + Contraseña + + + La Contraseña es requerida! + + + Registrarse aquí + + + ¿Recordarme? + + + Ingresar + + + Ingresar + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.fr.resx new file mode 100644 index 0000000..8692631 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.fr.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Connectez-vous avec vos identifiants. + + + Courriel + + + Un courriel est requis ! + + + Mot de passe oublié ? + + + Mot de passe + + + Mot de passe requis ! + + + Se souvenir de moi ? + + + Connexion + + + Connexion + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.id.resx new file mode 100644 index 0000000..28006ca --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.id.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Masuk dengan Kredensial Anda. + + + Tidak punya akun? + + + E-mail + + + Email wajib diisi! + + + Isi Kredensial Administrator + + + Isi Kredensial Pengguna Basic + + + Lupa sandi? + + + Sandi + + + Sandi wajib diisi! + + + Daftar di sini + + + Ingat saya? + + + Masuk + + + Masuk + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.it.resx new file mode 100644 index 0000000..bb48a76 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.it.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Accedi con le tue credenziali. + + + E-Mail + + + È richiesto un indirizzo E-Mail + + + Inserisci le tue credenziali per iniziare. + + + Utilizza credenziali amministrative + + + Utilizza credenziali utente base + + + Password dimenticata? + + + Password + + + È richiesta una password! + + + Ricordati di me? + + + Accedi + + + Accedi + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.km.resx new file mode 100644 index 0000000..1bf008e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.km.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ឡុកចូលប្រព័ន្ធជាមួយលេខកូដសម្ងាត់អ្នក + + + អ៊ីម៉ែល + + + ត្រូវការបំពេញអ៊ីម៉ែល + + + ភ្លេចលេខកូដសម្ងាត់? + + + លេខកូដសម្ងាត់ + + + ត្រូវការបំពេញលេខកូដសម្ងាត់ + + + ចងចាំក្នុងប្រព័ន្ធ? + + + ឡុកចូល + + + ឡុកចូល + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.nl.resx new file mode 100644 index 0000000..e0d271e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.nl.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Log in met uw inloggegevens. + + + E-mail + + + E-mail is vereist! + + + Wachtwoord vergeten? + + + Wachtwoord + + + Wachtwoord is vereist! + + + Aanmelden + + + Aanmelden + + + Heb je geen account? + + + Beheerdersreferenties invullen + + + Basisgebruikersreferenties invullen + + + Schrijf je hier in + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.ru.resx new file mode 100644 index 0000000..ad69eb7 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.ru.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Авторизуйтесь с помощью ваших учётных данных. + + + У вас ещё нет аккаунта? + + + E-mail + + + Email обязателен! + + + Заполнить учётными данными администратора + + + Заполнить учётными данными пользователя с базовыми правами + + + Забыли пароль? + + + Пароль + + + Пароль обязателен! + + + Зарегистрируйтесь здесь + + + Запомнить меня? + + + Авторизоваться + + + Авторизация + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.sv.resx new file mode 100644 index 0000000..d236777 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Login.sv.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Logga in med dina uppgifter + + + Har du inget konto? + + + Epost + + + Epost är obligatoriskt + + + Fyll i Administratör Användaruppgifter + + + Fyll i Grundläggande Användaruppgifter + + + Glömt Lösenord? + + + Lösenord + + + Lösenord är obligatoriskt! + + + Registrera här + + + Kom ihåg mig? + + + Logga In + + + Logga In + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.ar.resx new file mode 100644 index 0000000..94332f5 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.ar.resx @@ -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 + + + هل لديك حساب؟ + + + تأكيد كلمة المرور + + + بريد الالكتروني + + + الاسم الأول + + + الكنية + + + كلمه السر + + + رقم الهاتف + + + يسجل + + + تسجيل الدخول + + + اسم االمستخدم + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.de.resx new file mode 100644 index 0000000..1bfb8a3 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.de.resx @@ -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 + + + Du hast schon ein Konto? + + + Passwort bestätigen + + + E-Mail + + + Vorname + + + Nachname + + + Passwort + + + Telefonnummer + + + Registrieren + + + Einloggen + + + Benutzername + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.en.resx new file mode 100644 index 0000000..fe26547 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.en.resx @@ -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 + + + Already have an account? + + + Confirm Password + + + E-mail + + + First Name + + + Last Name + + + Password + + + Phone Number + + + Register + + + Sign In + + + User Name + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.es.resx new file mode 100644 index 0000000..8010e7c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.es.resx @@ -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 + + + ¿Ya tiene una cuenta? + + + Confirmar Contraseña + + + Correo + + + Nombre + + + Apellido + + + Contraseña + + + Número de Teléfono + + + Registrarse + + + Ingresar + + + Nombre de Usuario + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.fr.resx new file mode 100644 index 0000000..41e6323 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.fr.resx @@ -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 + + + Vous possédez déjà un compte ? + + + Confirmation du mot de passe + + + Courriel + + + Prénom + + + Nom + + + Mot de passe + + + Numéro de téléphone + + + S'inscrire + + + Se connecter + + + Nom d'utilisateur + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.id.resx new file mode 100644 index 0000000..bbc2810 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.id.resx @@ -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 + + + Sudah punya akun? + + + Konfirmasi Password + + + E-mail + + + Nama Depan + + + Nama Belakang + + + Sandi + + + Nomor Telepon + + + Daftar + + + Masuk + + + User Name + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.it.resx new file mode 100644 index 0000000..86387eb --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.it.resx @@ -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 + + + Hai già un account? + + + Conferma Password + + + E-mail + + + Nome + + + Cognome + + + Accetto i termini e la privacy + + + Telefono + + + Registrati + + + Registrati + + + Username + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.km.resx new file mode 100644 index 0000000..0cf656e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.km.resx @@ -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 + + + មានគណនីរួចហើយ? + + + បញ្ជាក់លេខកូដសម្ងាត់ + + + អ៊ីម៉ែល + + + នាមខ្លួន + + + នាមត្រកូល + + + លេខកូដសម្ងាត់ + + + លេខទូរស័ព្ទ + + + ចុះឈ្មោះ + + + ឡុកចូល + + + ឈ្មោះអ្នកប្រើប្រាស់ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.nl.resx new file mode 100644 index 0000000..e355b93 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.nl.resx @@ -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 + + + Heb je al een account? + + + Wachtwoord bevestigen + + + E-mail + + + Voornaam + + + Achternaam + + + Wachtwoord + + + Telefoonnummer + + + Registreren + + + Aanmelden + + + Gebruikersnaam + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.ru.resx new file mode 100644 index 0000000..6d4d7ed --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.ru.resx @@ -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 + + + У вас уже есть аккаунт? + + + Подтверждение пароля + + + E-mail + + + Имя + + + Фамилия + + + Пароль + + + Номер телефона + + + Зарегистрировать + + + Авторизоваться + + + User Name + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.sv.resx new file mode 100644 index 0000000..d3ac6a2 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Authentication/Register.sv.resx @@ -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 + + + Har du redan ett konto? + + + Bekräfta lösenord + + + E-post + + + Förnamn + + + Efternamn + + + Lösenord + + + Telefonnummer + + + Registrera dig + + + Logga In + + + Användarnamn + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.ar.resx new file mode 100644 index 0000000..32a2c4e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.ar.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أضف العلامة التجارية + + + تم حفظ العلامة التجارية! + + + تم تحديث العلامة التجارية! + + + إلغاء + + + وصف + + + المعرّف + + + اسم + + + حفظ + + + ضريبة + + + تحديث + + + تحديث العلامة التجارية + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.de.resx new file mode 100644 index 0000000..618b6ed --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.de.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Marke hinzufügen + + + Marke gespeichert! + + + Marke aktualisiert! + + + Abbrechen + + + Beschreibung + + + Id + + + Name + + + Speichern + + + Steuer + + + Aktualisieren + + + Martke Aktualisieren + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.en.resx new file mode 100644 index 0000000..b8de313 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.en.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Brand + + + Brand Saved! + + + Brand Updated! + + + Cancel + + + Description + + + Id + + + Name + + + Save + + + Tax + + + Update + + + Update Brand + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.es.resx new file mode 100644 index 0000000..bb9b491 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.es.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Agregar Marca + + + Marca Guardada! + + + Marca Actualizada! + + + Cancelar + + + Descripción + + + Id + + + Nombre + + + Guardar + + + Impuestos + + + Actualizar + + + Actualizar Marca + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.fr.resx new file mode 100644 index 0000000..732642a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.fr.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ajouter une marque + + + Marque enregistrée ! + + + Marque mise à jour ! + + + Annuler + + + Description + + + Identifiant + + + Nom + + + Sauvegarder + + + Taxe + + + Mettre à jour + + + Édition d'une marque + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.id.resx new file mode 100644 index 0000000..635c20b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.id.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tambah Merek + + + Merek Tersimpan! + + + Merek Diperbarui! + + + Batal + + + Deskripsi + + + Id + + + Nama + + + Simpan + + + Pajak + + + Perbarui + + + Perbarui Merek + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.it.resx new file mode 100644 index 0000000..56dc1eb --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.it.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Nuova marca + + + Marca salvata! + + + Marca aggiornata! + + + Annulla + + + Descrizione + + + Id + + + Nome + + + Salva + + + Imposta + + + Aggiorna + + + Aggiorna marca + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.km.resx new file mode 100644 index 0000000..f29d99f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.km.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បន្ថែមម៉ាក + + + ម៉ាកបានរក្សាទុក! + + + ម៉ាកបានធ្វើបច្ចុប្បន្នភាព + + + បោះបង់ + + + ការពិពណ៌នា + + + លេខកូដសម្ងាល់ + + + ឈ្មោះ + + + រក្សាទុក + + + ពន្ធ + + + បច្ចុប្បន្នភាព + + + បច្ចុប្បន្នភាពម៉ាក + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.nl.resx new file mode 100644 index 0000000..13c6a94 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.nl.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Merk toevoegen + + + Merk gered! + + + Merk bijgewerkt! + + + Annuleren + + + Beschrijving + + + Id + + + Naam + + + Opslaan + + + Belasting + + + Update + + + Merk bijwerken + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.ru.resx new file mode 100644 index 0000000..2e506f3 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditBrandModal.ru.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Добавить бренд + + + Бренд сохранён + + + Бренд обновлён + + + Отмена + + + Описание + + + Id + + + Наименование + + + Сохранить + + + Сбор + + + Обновить + + + Обновить бренд + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.ar.resx new file mode 100644 index 0000000..bcb9ce0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.ar.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أضف منتج + + + الشفره + + + ماركة + + + إلغاء + + + حذف + + + وصف + + + المعرّف + + + اسم + + + تم حفظ المنتج! + + + تم تحديث المنتج! + + + تقييم + + + حفظ + + + تحديث + + + تحديث المنتج + + + تحميل + + + عرض + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.de.resx new file mode 100644 index 0000000..1bf6eaa --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.de.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Produkt hinzufügen + + + Strichcode + + + Marke + + + Abbrechen + + + Löschen + + + Beschreibung + + + Id + + + Name + + + Produkte gespeichert + + + Produkt aktualisiert + + + Bewertung + + + Speichern + + + Aktualisieren + + + Produkt aktualisieren + + + Upload + + + Ansicht + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.en.resx new file mode 100644 index 0000000..ef00fca --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.en.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Product + + + Barcode + + + Brand + + + Cancel + + + Delete + + + Description + + + Id + + + Name + + + Product Saved! + + + Product Updated! + + + Rate + + + Save + + + Update + + + Update Product + + + Upload + + + View + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.es.resx new file mode 100644 index 0000000..1dabb2f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.es.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Agregar Producto + + + Código de barra + + + Marca + + + Cancelar + + + Eliminar + + + Descripción + + + Id + + + Nombre + + + Producto Guardado! + + + Producto Actualizado! + + + Precio + + + Guardar + + + Actualizar + + + Actualizar Producto + + + Subir + + + Ver + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.fr.resx new file mode 100644 index 0000000..4ba8a22 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.fr.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ajouter un produit + + + Code barre + + + Marque + + + Annuler + + + Supprimer + + + Description + + + Identifiant + + + Nom + + + Produit enregistré ! + + + Produit mis à jour ! + + + Note + + + Sauvegarder + + + Mettre à jour + + + Édition d'un produit + + + Téléverser + + + Voir + + diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.id.resx new file mode 100644 index 0000000..770fbfa --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.id.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tambah Produk + + + Barcode + + + Merek + + + Batal + + + Hapus + + + Deskripsi + + + Id + + + Nama + + + Produk Tersimpan! + + + Produk Diperbarui! + + + Nilai + + + Simpan + + + Perbarui + + + Perbarui Produk + + + Unggah + + + View + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.it.resx new file mode 100644 index 0000000..1d11a75 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.it.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aggiungi prodotto + + + Barcode + + + Marca + + + Annulla + + + Elimina + + + Descrizione + + + Id + + + Nome + + + Prodotto Salvato! + + + Prodotto Aggiornato! + + + Vota + + + Salva + + + Aggiorna + + + Aggiorna Prodotto + + + Carica + + + View + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.km.resx new file mode 100644 index 0000000..06f7050 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.km.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បន្ថែមផលិតផល + + + បាកូដ + + + ម៉ាក + + + បោះបង់ + + + លុប + + + ការពិពណ៌នា + + + លេខកូដសម្ងាល់ + + + ឈ្មោះ + + + ផលិតផលបានរក្សាទុក + + + ផលិតផលបានធ្វើបច្ចុប្បន្នភាព + + + អត្រា + + + រក្សាទុក + + + បច្ចុប្បន្នភាព + + + ធ្វើបច្ចុប្បន្នភាពផលិតផល + + + ផ្ទុកឡើង + + + បង្ហាញ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.nl.resx new file mode 100644 index 0000000..f81d047 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.nl.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Product toevoegen + + + Barcode + + + Merk + + + Annuleren + + + Verwijderen + + + Beschrijving + + + Id + + + Naam + + + Product opgeslagen! + + + Product bijgewerkt! + + + Verhouding + + + Opslaan + + + Update + + + Product bijwerken + + + Uploaden + + + Bekijken + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.ru.resx new file mode 100644 index 0000000..58dbb12 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.ru.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Добавить продукт + + + Баркод + + + Бренд + + + Отмена + + + Удалить + + + Описание + + + Id + + + Наименование + + + Продукт сохранён + + + Продукт обновлён + + + Рейтинг + + + Сохранить + + + Обновить + + + Обновить продукт + + + Загрузить + + + Просмотр + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.sv.resx new file mode 100644 index 0000000..1882727 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/AddEditProductModal.sv.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Lägg till produkt + + + Streckkod + + + Varumärke + + + Avbryt + + + Radera + + + Beskrivning + + + Id + + + Namn + + + Produkt Sparad! + + + Produkt Uppdaterad! + + + Betygsätt + + + Spara + + + Uppdatera + + + Uppdatera Produkt + + + Ladda upp + + + View + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.ar.resx new file mode 100644 index 0000000..45c2a98 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.ar.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أجراءات + + + أضف العلامة التجارية + + + يحدها + + + العلامات التجارية + + + تصدير الماركات + + + إنشاء + + + حذف + + + حذف المحتوى + + + كثيف + + + وصف + + + تعديل + + + تصدير + + + تم تصدير العلامات التجارية المفلترة + + + المعرّف + + + استيراد + + + إدارة العلامات التجارية. + + + اسم + + + لا توجد إجراءات مسموح بها + + + إعادة تحميل + + + ابحث عن العلامات التجارية + + + مخطط + + + ضريبة + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.de.resx new file mode 100644 index 0000000..88c287c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.de.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Marke hinzufügen + + + Gerahmt + + + Marken + + + Marken exportiert + + + Hinzufügen + + + Löschen + + + Inhalt löschen + + + Schmal + + + Beschreibung + + + Bearbeiten + + + Exportieren + + + Gefilterte Marken exportiert + + + Id + + + Importieren + + + Marken verwalten. + + + Name + + + Keine Aktionen erlaubt + + + Neu laden + + + Nach Marken suchen + + + Gebändert + + + Steuer + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.en.resx new file mode 100644 index 0000000..27b237c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.en.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Add Brand + + + Bordered + + + Brands + + + Brands exported + + + Create + + + Delete + + + Delete Content + + + Dense + + + Description + + + Edit + + + Export + + + Filtered Brands exported + + + Id + + + Import + + + Manage Brands. + + + Name + + + No Allowed Actions + + + Reload + + + Search for Brands + + + Striped + + + Tax + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.es.resx new file mode 100644 index 0000000..35aebe0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.es.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acciones + + + Agregar Marca + + + Bordeado + + + Marcas + + + Marcas Exportadas + + + Crear + + + Borrar + + + ¿Desea eliminar el registro? + + + Denso + + + Descripción + + + Editar + + + Exportar + + + Marcas filtradas exportadas + + + Id + + + Importar + + + Gestionar Marcas + + + Nombre + + + Acciones no Permitidas + + + Recargar + + + Buscar Marcas + + + Rayado + + + Impuestos + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.fr.resx new file mode 100644 index 0000000..5ccf553 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.fr.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Ajouter un marque + + + Avec bordures + + + Marques + + + Marques exportées + + + Créer + + + Supprimer + + + Supprimer la marque + + + Dense + + + Description + + + Éditer + + + Exporter + + + Marques filtrées exportées + + + Identifiant + + + Importer + + + Gérer les marques + + + Nom + + + Aucune action autorisée + + + Recharger + + + Chercher des marques + + + Rayé + + + Taxe + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.id.resx new file mode 100644 index 0000000..81a2f01 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.id.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tindakan + + + Tambah Merek + + + Merek + + + Brands exported + + + Tambah + + + Hapus + + + Hapus Konten + + + Deskripsi + + + Sunting + + + Ekspor + + + Filtered Brands exported + + + Id + + + Import + + + Kelola Merek. + + + Nama + + + No Allowed Actions + + + Muat Ulang + + + Cari Merek + + + Pajak + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.it.resx new file mode 100644 index 0000000..346068b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.it.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Azioni + + + Aggiungi marca + + + Marche + + + Brands exported + + + Crea + + + Elimina + + + Cancella contenuto + + + Descrizione + + + Modifica + + + Export + + + Filtered Brands exported + + + Id + + + Import + + + Gestione marca. + + + Nome + + + Nessuna azione consentita + + + Ricarica + + + Ricerca marche + + + Imposta + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.km.resx new file mode 100644 index 0000000..20a35b7 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.km.resx @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + មុខងារ + + + បន្ថែមម៉ាក + + + ម៉ាក + + + ម៉ាកបាននាំចេញ + + + បង្កើត + + + លុប + + + ការពិពណ៌នា + + + កែប្រែ + + + នាំចេញ + + + ច្រោះម៉ាកបាននាំចេញ + + + លេខកូដសម្ងាល់ + + + Import + + + គ្រប់គ្រងម៉ាក + + + ឈ្មោះ + + + មិនមានសិទ្ធិ + + + ផ្ទុកឡើងវិញ + + + ស្វែងរកម៉ាក + + + ពន្ធ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.nl.resx new file mode 100644 index 0000000..d3e5aec --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.nl.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acties + + + Merk toevoegen + + + Grenst aan + + + Merken + + + Geëxporteerde merken + + + Aanmaken + + + Verwijderen + + + Inhoud verwijderen + + + Dicht + + + Beschrijving + + + Bewerken + + + Exporteren + + + Gefilterde merken geëxporteerd + + + Id + + + Importeren + + + Beheer merken. + + + Naam + + + Geen toegestane acties + + + Herladen + + + Zoeken naar merken + + + Gestreept + + + Belasting + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.ru.resx new file mode 100644 index 0000000..1c34c46 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.ru.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Действия + + + Добавить бренд + + + Обрамлённый + + + Бренды + + + Бренды экспортированы + + + Создать + + + Удалить + + + Удалить контент + + + Компактный + + + Описание + + + Редактировать + + + Экспорт в Excel + + + Отфильтрованные бренды экспортированы + + + Id + + + Импорт + + + Управление брендами. + + + Наименование + + + Нет доступных действий + + + Перезагрузить + + + Поиск брендов... + + + Чередующийся + + + Сбор + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.sv.resx new file mode 100644 index 0000000..934d8d1 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Brands.sv.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Åtgärder + + + Lägg till varumärke + + + Varumärken + + + Brands exported + + + Skapa + + + Radera + + + Ta bort innehåll + + + Beskrivning + + + Redigera + + + Exportera + + + Filtered Brands exported + + + Id + + + Import + + + Hantera varumärken. + + + Namn + + + No Allowed Actions + + + Ladda om + + + Sök efter varumärken + + + Moms + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.ar.resx new file mode 100644 index 0000000..e84ef69 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.ar.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أجراءات + + + الشفره + + + يحدها + + + ماركة + + + إنشاء + + + حذف + + + حذف المحتوى + + + كثيف + + + وصف + + + تعديل + + + تصدير + + + تصدير المنتجات المفلترة + + + المعرّف + + + إدارة المنتجات. + + + اسم + + + لا توجد إجراءات مسموح بها + + + منتجات + + + تصدير المنتجات + + + تقييم + + + إعادة تحميل + + + بحث + + + مخطط + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.de.resx new file mode 100644 index 0000000..d3ab068 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.de.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Strichcode + + + Gerahmt + + + Marke + + + Hinzufügen + + + Löschen + + + Inhalt löschen + + + Schmal + + + Beschreibung + + + Bearbeiten + + + Exportieren + + + Gefilterte Produkte exportiert + + + Id + + + Produkte verwalten + + + Maximale Bewertung + + + Minimale Bewertung + + + Name + + + Keine Aktionen erlaubt + + + Produkte + + + Produkte exportiert + + + Bewertung + + + Neu laden + + + Suchen + + + Gebändert + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.en.resx new file mode 100644 index 0000000..1c633ca --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.en.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Barcode + + + Bordered + + + Brand + + + Create + + + Delete + + + Delete Content + + + Dense + + + Description + + + Edit + + + Export + + + Filtered Products exported + + + Id + + + Manage Products. + + + Maximum Rate + + + Minimum Rate + + + Name + + + No Allowed Actions + + + Products + + + Products exported + + + Rate + + + Reload + + + Search + + + Striped + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.es.resx new file mode 100644 index 0000000..3da508d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.es.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acciones + + + Código de barra + + + Bordeado + + + Marca + + + Crear + + + Borrar + + + ¿Desea eliminar el registro? + + + Denso + + + Descripción + + + Editar + + + Exportar + + + Productos filtrados exportados + + + Id + + + Gestionar Productos + + + Nombre + + + Acciones no Permitidas + + + Productos + + + Productos exportados + + + Precio + + + Recargar + + + Buscar + + + Rayado + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.fr.resx new file mode 100644 index 0000000..ebf66a8 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.fr.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Code barre + + + Avec bordures + + + Marque + + + Créer + + + Supprimer + + + Supprimer le produit + + + Dense + + + Description + + + Éditer + + + Exporter + + + Produits filtrés exportés + + + Identifiant + + + Gérer les produits. + + + Nom + + + Aucune action autorisée + + + Produits + + + Products exported + + + Note + + + Recharger + + + Chercher + + + Rayé + + diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.id.resx new file mode 100644 index 0000000..15d8d77 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.id.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tindakan + + + Barcode + + + Merek + + + Tambah + + + Hapus + + + Hapus Konten + + + Deskripsi + + + Sunting + + + Ekspor + + + Filtered Products exported + + + Id + + + Kelola Produk. + + + Nama + + + No Allowed Actions + + + Produk + + + Products exported + + + Nilai + + + Muat Ulang + + + Cari + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.it.resx new file mode 100644 index 0000000..a218fa3 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.it.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Azioni + + + Descrizione + + + Id + + + Nome + + + Prodotti + + + Ricarica + + + Marca + + + Cancella contenuto + + + Ricerca + + + Tasso + + + Gestione prodotti. + + + Modifica + + + Elimina + + + Crea + + + Barcode + + + Prodotti esportati + + + Prodotti filtrati esportati + + + Nessuna azione consentita + + + Tasso massimo + + + Tasso minimo + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.km.resx new file mode 100644 index 0000000..6cbf00d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.km.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + មុខងារ + + + បាកូដ + + + បង្កើត + + + លុប + + + ការពិពណ៌នា + + + កែប្រែ + + + ច្រោះផលិតផលបាននាំចេញ + + + លេខកូដសម្ងាល់ + + + គ្រប់គ្រងផលិតផល + + + ឈ្មោះ + + + គ្មានសិទ្ធិ + + + ផលិតផល + + + ផលិតផលនាំចេញ + + + អត្រា + + + ផ្ទុកឡើងវិញ + + + ស្វែងរក + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.nl.resx new file mode 100644 index 0000000..cc4ced9 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.nl.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acties + + + Barcode + + + Aanmaken + + + Verwijderen + + + Beschrijving + + + Bewerken + + + Gefilterde producten geëxporteerd + + + Id + + + Producten beheren. + + + Naam + + + Geen toegestane acties + + + Producten + + + Uitgevoerde producten + + + Verhouding + + + Herladen + + + Zoeken + + + Grenst aan + + + Merk + + + Inhoud verwijderen + + + Dicht + + + Exporteren + + + Gestreept + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.ru.resx new file mode 100644 index 0000000..b2ae187 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.ru.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Действия + + + Баркод + + + Обрамлённый + + + Бренд + + + Создать + + + Удалить + + + Удалить контент + + + Компактный + + + Описание + + + Редактировать + + + Экспорт в Excel + + + Отфильтрованные продукты экспортированы + + + Id + + + Управление продуктами. + + + Наименование + + + Нет доступных действий + + + Продукты + + + Продукты экспортированы + + + Рейтинг + + + Перезагрузить + + + Поиск продуктов... + + + Чередующийся + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.sv.resx new file mode 100644 index 0000000..43994b0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Catalog/Products.sv.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Åtgärder + + + Streckkod + + + Varumärke + + + Skapa + + + Radera + + + Ta bort innehåll + + + Beskrivning + + + Redigera + + + Exportera + + + Filtered Products exported + + + Id + + + Hantera Produkter. + + + Namn + + + No Allowed Actions + + + Produkter + + + Products exported + + + Betygsätta + + + Ladda om + + + Sök + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.ar.resx new file mode 100644 index 0000000..6637bd9 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.ar.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + دردشة + + + جهات الاتصال + + + دليل مفصل للمزيد. + + + أدخل رسالتك... + + + مسجّل الدخول. + + + تسجيل الخروج. + + + رسالة جديدة من {0} + + + يرسل + + + هل تريد أن تفهم كيف يتم تنفيذ الدردشة في BlazorHero؟ قم بإحالة هذا + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.de.resx new file mode 100644 index 0000000..0555b5b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.de.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Chat + + + Kontakte + + + Detaillierte Anleitung für mehr. + + + Gibt deine Nachricht ein... + + + Eingeloggt. + + + Ausgeloggt. + + + Neue Nachricht von {0} + + + Absenden + + + Du möchtest verstehen, wie der Chat in FullStackHero implementiert ist? Lies hier + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.en.resx new file mode 100644 index 0000000..7b318d4 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.en.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + chat + + + contacts + + + detailed guide for more. + + + Enter your message... + + + Logged In. + + + Logged Out. + + + New Message From {0} + + + Send + + + Want to understand how Chat is implemented in BlazorHero ? Refer this + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.es.resx new file mode 100644 index 0000000..702f3f7 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.es.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + chat + + + contactos + + + guía detallada para mas. + + + Ingrese su mensaje... + + + Contectado. + + + Desconectado. + + + Nuevo mensaje de {0} + + + Enviar + + + ¿Quiere entender como el Chat está implmentado en BlazorHero? Mirar esta referencia + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.fr.resx new file mode 100644 index 0000000..9b67e0b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.fr.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Conversations + + + Contacts + + + guide détaillé pour en savoir plus. + + + Entrez votre message. + + + Connecté. + + + Déconnecté. + + + Nouveau message de {0} + + + Envoyer + + + Vous voulez comprendre comment le chat est implémenté dans BlazorHero ? Jettez un œil à ce + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.id.resx new file mode 100644 index 0000000..a9e65c4 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.id.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + obrolan + + + kontak + + + panduan rinci lebih lanjut. + + + Tulis pesan anda... + + + Logged In. + + + Logged Out. + + + New Message From {0} + + + Kirim + + + Ingin tau bagaimana cara obrolan diimplementasi di BlazorHero ? Lihat + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.it.resx new file mode 100644 index 0000000..534c625 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.it.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + chat + + + contatti + + + guida dettagliata per saperne di più. + + + Inserisci il tuo messaggio ... + + + Logged In. + + + Logged Out. + + + New Message From {0} + + + Invia + + + Vuoi capire come viene implementata la chat in BlazorHero? Guarda qui + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.km.resx new file mode 100644 index 0000000..f492f0a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.km.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ជជែក + + + ឈ្មោះទំនាក់ទំនង + + + ការណែនាំលំអិត + + + វាយបញ្ចូលសាររបស់អ្នក + + + ឡុកចូល។ + + + ឡុកចេញ។ + + + សារថ្មីមកពី {0} + + + ផ្ញើ + + + ចង់ដឹងអំពីរបៀបសរសេរកូដមុខងារជជែកក្នុងប្លេហ្សឺហេរ៉ូ ចូលទៅកាន់តំណភ្ជាប់នេះ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.nl.resx new file mode 100644 index 0000000..7b2a08f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.nl.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Gesprek + + + Contactpersonen + + + gedetailleerde gids voor meer. + + + Voer uw bericht in... + + + Ingelogd. + + + Uitgelogd. + + + Nieuw bericht van {0} + + + Verzenden + + + Wilt u begrijpen hoe een Chat wordt geïmplementeerd in BlazorHero ? Ga dan naar deze + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.ru.resx new file mode 100644 index 0000000..e2e8a9e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.ru.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + чат + + + контакты + + + подробному руководству для получения дополнительной информации. + + + Введите ваше сообщение... + + + авторизовался. + + + вышел. + + + Новое сообщение от {0} + + + Отправить + + + Хотите понять, как реализован чат в BlazorHero ? Обратитесь к этому + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.sv.resx new file mode 100644 index 0000000..0fa02a8 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Communication/Chat.sv.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + chatt + + + kontakter + + + detaljerad guide för mer. + + + Ditt meddelande... + + + Logged In. + + + Logged Out. + + + New Message From {0} + + + Skicka + + + Vill du förstå hur Chatt implementeras i BlazorHero? Se detta + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.ar.resx new file mode 100644 index 0000000..06018d1 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.ar.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + بليزر للمبتدئين - بدء استخدام بليزر + + + Blazor Hero عبارة عن نموذج للحل الشامل للهندسة المعمارية النظيفة لتجميع الويب Blazor الذي تم إنشاؤه باستخدام + + + بناء تطبيق دردشة مع Blazor ، Identity ، و SignalR + + + الاحتفال بـ 1500 نجمة على جيثب! + + + مكتبة المكونات + + + المصادقة المخصصة في Blazor WebAssembly - بالتفصيل + + + قالب معماري نظيف لـ Blazor Web-Assembly + + + التوثيق - قريبا + + + استكشاف هيكل مشروع Blazor + + + ابدء + + + مستودع جيثب: لا تنسى ترك نجم ؛) + + + إليك بعض المقالات التي من المفترض أن تساعدك في البدء باستخدام Blazor. + + + كيفية تنفيذ Blazor CRUD باستخدام Entity Framework Core؟ + + + تنفيذ Blazor CRUD باستخدام مكتبة مكونات Mudblazor في .NET 5 + + + روابط مهمة + + + في حال كنت عالقًا في أي مكان أو كان لديك أي استفسارات بخصوص هذا التنفيذ ، فقد قمت بتجميع دليل البدء السريع للرجوع إليه + + + مصادر التعلم + + + أحب BlazorHero؟ نجمة لنا على جيثب! + + + هندسة البصل في ASP.NET Core مع CQRS - مفصل + + + صفحة المشروع + + + دليل البدء السريع + + + اقرأ الدليل + + + ادعمني! + + + بلازور هيرو + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.de.resx new file mode 100644 index 0000000..64fdfeb --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.de.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor für Anfänger - Erste Schritte in Blazor + + + Blazor Hero ist ein All-In-One Clean Architecture Lösungstemplate für Blazor Web-Assembly, erstellt mit + + + Baue eine Chat-Anwendung With Blazor, Identity, And SignalR + + + Wir feiern 1,500 Sterne auf Github! + + + Komponentenbibliothek + + + Benutzerdefinierte Authentifizierung in Blazor WebAssembly im Detail + + + Clean Architecture Vorlage für Blazor Web-Assembly + + + Dokumentation - demnächst + + + Erforsche die Blazor Projektstruktur + + + Erste Schritte + + + Github Repository : Vergiss nicht, einen Stern zu hinterlassen ;) + + + Hier sind ein paar Artikel, die dir beimn Einstieg in Blazor helfen sollten. + + + Wie implementierst du Blazor CRUD mit Entity Framework Core? + + + Implementiere Blazor CRUD mit der Mudblazor Komponentenbibliothek in .NET 5 + + + Wichtige Verknüpfungen + + + Falls du irgendwo steckenbleiben solltest, oder Fragen zu dieser Implementierung hast, habe ich eine Schnellstartanleitung für dich erstellt. + + + Lernmittel + + + Dir gefällt BlazorHero? Hinterlasse einen Stern auf Github! + + + Zwiebelarchitektur in ASP.NET Core mit CQRS im Detail + + + Projektseite + + + Schnellstartanleitung + + + Lies die Anleitung + + + Unterstütze mich! + + + Blazor Hero + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.en.resx new file mode 100644 index 0000000..1d1c273 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.en.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor For Beginners – Getting Started With Blazor + + + Blazor Hero is an All-In-One Clean Architecture Solution Template For Blazor Web-Assembly built with + + + Building A Chat Application With Blazor, Identity, And SignalR + + + Celebrating 1,500 Stars on Github! + + + Component Library + + + Custom Authentication In Blazor WebAssembly – Detailed + + + Clean Architecture Template For Blazor Web-Assembly + + + Documentation - Coming Soon + + + Exploring Blazor Project Structure + + + Getting Started + + + Github Repository : Do Not Forget to Leave a Star ;) + + + Here are few articles that should help you get started with Blazor. + + + How To Implement Blazor CRUD Using Entity Framework Core? + + + Implementing Blazor CRUD Using Mudblazor Component Library In .NET 5 + + + Important Links + + + In case you are stuck anywhere or have any queries regarding this implementation, I have compiled a Quick Start Guide for you reference. + + + Learning Resources + + + Liked BlazorHero? Star us on Github! + + + Onion Architecture In ASP.NET Core With CQRS – Detailed + + + Project Page + + + Quick Start Guide + + + Read The Guide + + + Support Me! + + + Blazor Hero + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.es.resx new file mode 100644 index 0000000..f5e12b4 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.es.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor para Principiantes – Iniciarse con Blazor + + + Blazor Hero es un template de Solución de Arquitectura todo-en-uno para Blazor Web-Assembly, hecho con la Librería de Componentes + + + Construir una Aplicación de Chat con Blazor, Identity y SignalR + + + Celebrando 1,500 Estrellas en Github! + + + + + + Autenticación Personalizada en Blazor WebAssembly – Detallado + + + Template de Arquitectura Limpia para Blazor Web-Assembly + + + Documentación - Pronto + + + Explorando la estructura de un Proyecto Blazor + + + Iniciarse + + + Repositorio en Github: No olvides dejar una estrella ;) + + + Aquí hay unos artículos que te ayudarán a iniciarte el Blazor. + + + ¿Cómo implementar un CRUD en Blazro usando Entity Framework Core? + + + Implementando un CRUD en Blazor usando la librería de componentes Mudblazor en .NET 5 + + + Links Importantes + + + En caso que tengas problemas para avanzar o tengas preguntas sobre la implementación, he compilado una Guía de Inicio Rápido para tu referencia. + + + Recursos para Aprendizaje + + + ¿Te gustó BlazorHero? Deja una estrella en Github! + + + Arquitectura Onion en ASP.NET Core con CQRS – Detalle + + + Página del proyecto + + + Guía de Inicio Rápido + + + Lee la guía + + + Apoyarme! + + + Blazor Hero + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.fr.resx new file mode 100644 index 0000000..0024b82 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.fr.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor For Beginners – Getting Started With Blazor + + + Blazor Hero est un modèle de solution propre et tout en un pour Blazor Web-Assembly, construit avec la bibliothèque de composants + + + Building A Chat Application With Blazor, Identity, And SignalR + + + Celebrating 1,500 Stars on Github! + + + + + + Custom Authentication In Blazor WebAssembly – Detailed + + + Modèle d'architecture propre pour Blasor Web-Assembly + + + Documentation - Coming Soon + + + Exploring Blazor Project Structure + + + Getting Started + + + Github Repository : Do Not Forget to Leave a Star ;) + + + Here are few articles that should help you get started with Blazor. + + + How To Implement Blazor CRUD Using Entity Framework Core? + + + Implementing Blazor CRUD Using Mudblazor Component Library In .NET 5 + + + Important Links + + + In case you are stuck anywhere or have any queries regarding this implementation, I have compiled a Quick Start Guide for you reference. + + + Learning Resources + + + Liked BlazorHero? Star us on Github! + + + Onion Architecture In ASP.NET Core With CQRS – Detailed + + + Project Page + + + Quick Start Guide + + + Read The Guide + + + Support Me! + + + Blazor Hero + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.id.resx new file mode 100644 index 0000000..32c38ef --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.id.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor For Beginners – Getting Started With Blazor + + + Blazor Hero adalah sebuah Template Solusi Clean Architecture All-In-One Untuk Blazor Web-Assembly + + + Blazor Hero is an All-In-One Clean Architecture Solution Template For Blazor Web-Assembly built with + + + Building A Chat Application With Blazor, Identity, And SignalR + + + Celebrating 1,500 Stars on Github! + + + Pustaka Komponen + + + Component Library + + + Custom Authentication In Blazor WebAssembly – Detailed + + + Template Clean Architecture Untuk Blazor Web-Assembly + + + Documentation - Coming Soon + + + Exploring Blazor Project Structure + + + Getting Started + + + Github Repository : Do Not Forget to Leave a Star ;) + + + Here are few articles that should help you get started with Blazor. + + + How To Implement Blazor CRUD Using Entity Framework Core? + + + Implementing Blazor CRUD Using Mudblazor Component Library In .NET 5 + + + Important Links + + + In case you are stuck anywhere or have any queries regarding this implementation, I have compiled a Quick Start Guide for you reference. + + + Learning Resources + + + Liked BlazorHero? Star us on Github! + + + Onion Architecture In ASP.NET Core With CQRS – Detailed + + + Halaman Proyek + + + Quick Start Guide + + + Read The Guide + + + Dukung Saya! + + + Blazor Hero + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.it.resx new file mode 100644 index 0000000..e004f55 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.it.resx @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Descrizione + + + Blazor Hero + + + Libreria di compoenti + + + Supportami! + + + Blazor Hero + + + Blazor For Beginners – Getting Started With Blazor + + + Blazor Hero is an All-In-One Clean Architecture Solution Template For Blazor Web-Assembly built with + + + Building A Chat Application With Blazor, Identity, And SignalR + + + Celebrating 1,500 Stars on Github! + + + Component Library + + + Custom Authentication In Blazor WebAssembly – Detailed + + + Exploring Blazor Project Structure + + + Getting Started + + + Github Repository : Do Not Forget to Leave a Star ;) + + + Here are few articles that should help you get started with Blazor. + + + How To Implement Blazor CRUD Using Entity Framework Core? + + + Implementing Blazor CRUD Using Mudblazor Component Library In .NET 5 + + + Important Links + + + In case you are stuck anywhere or have any queries regarding this implementation, I have compiled a Quick Start Guide for you reference. + + + Learning Resources + + + Liked BlazorHero? Star us on Github! + + + Onion Architecture In ASP.NET Core With CQRS – Detailed + + + Quick Start Guide + + + Read The Guide + + + Documentation - Coming Soon + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.km.resx new file mode 100644 index 0000000..7fccc0b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.km.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ប្លេហ្សឺសម្រាប់ការចាប់ផ្តើម - ចាំផ្តើមជាមួយប្លេហ្សឺ + + + Blazor Hero is an All-In-One Clean Architecture Solution Template For Blazor Web-Assembly built with + + + Building A Chat Application With Blazor, Identity, And SignalR + + + Celebrating 1,500 Stars on Github! + + + Component Library + + + Custom Authentication In Blazor WebAssembly – Detailed + + + គំរូកម្មវិធីដែលអភិវឌ្ឍតាមបច្ចេកវិទ្យា Blazor Web-Assembly + + + ឯកសារណែនាំលម្អិត មកដល់ឆាប់ៗនេះ + + + គ្រោងថតរបស់គម្រោង + + + ចាប់ផ្តើម + + + Github Repository : Do Not Forget to Leave a Star ;) + + + Here are few articles that should help you get started with Blazor. + + + How To Implement Blazor CRUD Using Entity Framework Core? + + + Implementing Blazor CRUD Using Mudblazor Component Library In .NET 5 + + + Important Links + + + In case you are stuck anywhere or have any queries regarding this implementation, I have compiled a Quick Start Guide for you reference. + + + ធនធានសិក្សា + + + Liked BlazorHero? Star us on Github! + + + Onion Architecture In ASP.NET Core With CQRS – Detailed + + + ទំព័រគម្រោង + + + ការណែនាំសង្ខេប + + + អានការណែនា + + + គាំទ្រយើងខ្ញុំ! + + + ប្លេហ្សឺ ហេរ៉ូ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.nl.resx new file mode 100644 index 0000000..6ec8ae5 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.nl.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor voor beginners – Aan de slag met Blazor + + + Blazor Hero is een alles-in-één schone architectuuroplossing sjabloon voor Blazor web-assembly gebouwd met + + + Een chattoepassing bouwen met Blazor, Identity en SignalR + + + Inmiddels 1500 sterren op Github! + + + Componentbibliotheek + + + Aangepaste verificatie in Blazor WebAssembly - Gedetailleerd + + + Schone architectuursjabloon voor Blazor Web-Assembly + + + Documentatie - Binnenkort beschikbaar + + + Blazor-projectstructuur verkennen + + + Opstarten + + + Github Repository : Vergeet niet om een ster achter te laten ;) + + + Hier zijn enkele artikelen die u moeten helpen aan de slag te gaan met Blazor. + + + Hoe Blazor CRUD implementeren met Entity Framework Core? + + + Blazor CRUD implementeren met mudblazor-componentbibliotheek in .NET 5 + + + Belangrijke links + + + Verhoog dat u ergens vastzit of heb vragen over deze implementatie, ik heb een Quick Start Guide voor u samengesteld. + + + Leermiddelen + + + Vind je BlazorHero leuk? Geef een ster op Github! + + + Onion Architecture In ASP.NET Core Met CQRS – Gedetailleerd + + + Projectpagina + + + Snelstartgids + + + Lees de gids + + + Steun mij! + + + Blazor Held + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.ru.resx new file mode 100644 index 0000000..c1d6b11 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.ru.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor For Beginners – Getting Started With Blazor + + + Blazor Hero - это All-In-One шаблон решения с применением "чистой" архитектуры для Blazor Web-Assembly, построенный с помощью + + + Building A Chat Application With Blazor, Identity, And SignalR + + + Достигнуто 1,500 Звёзд на Github! + + + библиотеки компонентов + + + Custom Authentication In Blazor WebAssembly – Detailed + + + Шаблон "чистой" архитектуры для Blazor Web-Assembly + + + Документация - скоро появится + + + Exploring Blazor Project Structure + + + Начало работы + + + Репозиторий Github : не забудьте поставить звезду ;) + + + Вот несколько статей, которые должны помочь вам начать работу с Blazor. + + + How To Implement Blazor CRUD Using Entity Framework Core? + + + Implementing Blazor CRUD Using Mudblazor Component Library In .NET 5 + + + Важные ссылки + + + Если вы где-то застряли или у вас есть какие-либо вопросы относительно этой реализации, я составил для вас краткое руководство по началу работы. + + + Учебные ресурсы + + + Нравится BlazorHero? Поставьте звезду на Github! + + + Onion Architecture In ASP.NET Core With CQRS – Detailed + + + Страница проекта + + + Краткое руководство по началу работы + + + Прочитать руководство + + + Поддержать меня! + + + Blazor Hero + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.sv.resx new file mode 100644 index 0000000..a9bcdcc --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Home.sv.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor för nybörjare - Komma igång med Blazor + + + Blazor Hero är en allt-i-ett-ren mall för arkitekturlösningar för Blazor Web-Assembly byggd med + + + Bygga en Chattapplikation med Blazor, Identity och SignalR + + + Celebrating 1,500 Stars on Github! + + + Komponentbibliotek + + + Anpassad autentisering i Blazor WebAssembly - Detaljerad + + + Ren arkitekturmall för Blazor Web-Assembly + + + Documentation - Coming Soon + + + Utforska Blazor-projektets struktur + + + Komma igång + + + Github Repository : Glöm inte att lämna en stjärna ;) + + + Här är några artiklar som kan hjälpa dig att komma igång med Blazor. + + + Hur implementerar jag Blazor CRUD med Entity Framework Core? + + + Implementering av Blazor CRUD med Mudblazor Komponent Library i .NET 5 + + + Viktiga länkar + + + Öka att du har fastnat någonstans eller har några frågor angående denna implementering, jag har sammanställt en snabbstartsguide som referens. + + + Lärande resurser + + + Liked BlazorHero? Star us on Github! + + + Onion Architecture In ASP.NET Core With CQRS – Detaljerad + + + Projektsida + + + Snabbstartsguide + + + Läs guiden + + + Stöd Mig! + + + Blazor Hero + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.ar.resx new file mode 100644 index 0000000..4f13a27 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.ar.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + الوصول إلى الموارد هنا. + + + رهيبة بليزر + + + مكان رائع للتعلم والعثور على معلومات ومشاريع / أمثلة حول Blazor. + + + موارد + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.de.resx new file mode 100644 index 0000000..9000594 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.de.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Auf Ressourcen zugreifen. + + + Awesome Blazor + + + Großartige Seite zum Lernen von Blazor. Es gibt eine Vielzahl an Informationen, Projekten und Beispielen. + + + Ressourcen + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.en.resx new file mode 100644 index 0000000..4254cab --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.en.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Access Resources here. + + + Awesome Blazor + + + Great place to learn, find information and projects/examples about Blazor. + + + Resources + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.es.resx new file mode 100644 index 0000000..0f6b656 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.es.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acceder a los recursos aquí + + + Awesome Blazor + + + Estupendo lugar para aprender, buscar información y proyectos/ejemplos sobre Blazor. + + + Recursos + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.fr.resx new file mode 100644 index 0000000..fdccea8 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.fr.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Accédez aux ressouces ici. + + + Awesome Blazor + + + Bon endroit pour apprendre, trouver des informations et des projets / exemples avec Blazor. + + + Ressources + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.id.resx new file mode 100644 index 0000000..5233f41 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.id.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Akses Resources di sini. + + + Awesome Blazor + + + Tempat yang bagus untuk belajar, mencari informasi dan proyek/contoh tentang Blazor. + + + Resources + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.it.resx new file mode 100644 index 0000000..2d8f2f6 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.it.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Risorse + + + Ottimo posto per imparare, trovare informazioni e progetti/esempi su Blazor. + + + Eccezionale Blazor + + + Accedi alle risorse qui. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.km.resx new file mode 100644 index 0000000..fe1c3c3 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.km.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ចូលប្រើធនធាននៅទីនេះ + + + ធនធានប្លេហ្សឺមហាសាល + + + កន្លែងដ៏ល្អដើម្បីរៀនស្វែងរកព័ត៌មាននិងគម្រោង / ឧទាហរណ៍គំរូរបស់ប្លេហ្សឺ + + + ធនធាន + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.nl.resx new file mode 100644 index 0000000..a6e54ef --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.nl.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Hier kunt u bronnen openen. + + + Geweldige Blazor + + + Geweldige plek om te leren, informatie en projecten / voorbeelden over Blazor te vinden. + + + Bronnen + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.ru.resx new file mode 100644 index 0000000..c69e400 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.ru.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Доступ к ресурсам здесь. + + + Awesome Blazor + + + Отличное место для обучения, где можно найти информацию и проекты/примеры о Blazor. + + + Ресурсы + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.sv.resx new file mode 100644 index 0000000..163625f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Content/Resources.sv.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Få tillgång till resurser här. + + + Fantastisk Blazor + + + Bra ställe att lära sig, hitta information och projekt / exempel om Blazor. + + + Resurser + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.ar.resx new file mode 100644 index 0000000..a1e51f2 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.ar.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + الحساب + + + إدارة حسابك + + + الملف الشخصي + + + حماية + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.de.resx new file mode 100644 index 0000000..a309580 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.de.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Konto + + + Konto verwalten + + + Profil + + + Sicherheit + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.en.resx new file mode 100644 index 0000000..8153dbd --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.en.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Manage your account + + + Profile + + + Security + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.es.resx new file mode 100644 index 0000000..d838676 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.es.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cuenta + + + Gestione su cuenta + + + Perfil + + + Seguridad + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.fr.resx new file mode 100644 index 0000000..3ff7ab8 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.fr.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Compte + + + Gérez votre compte + + + Profile + + + Sécurité + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.id.resx new file mode 100644 index 0000000..7ee6bd2 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.id.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Akun + + + Kelola akun anda + + + Profil + + + Keamanan + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.it.resx new file mode 100644 index 0000000..d4c0346 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.it.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Gestisci il tuo account + + + Profilo + + + Sicurezza + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.km.resx new file mode 100644 index 0000000..d3e124c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.km.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + គណនី + + + គ្រប់គ្រង​គណនី​របស់​អ្នក + + + ប្រវត្តិរូប + + + សន្តិសុខ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.nl.resx new file mode 100644 index 0000000..4e3d049 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.nl.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Uw account beheren + + + Profiel + + + Beveiliging + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.ru.resx new file mode 100644 index 0000000..5344d37 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.ru.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Аккаунт + + + Управление вашим аккаунтом + + + Профиль + + + Безопасность + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.sv.resx new file mode 100644 index 0000000..2bfbf5c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Account.sv.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Konto + + + Hantera ditt konto + + + Profil + + + Säkerhet + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.ar.resx new file mode 100644 index 0000000..549b9dc --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.ar.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + حذف صورة + + + حذف الصورة + + + هل تريد حذف صورة ملف تعريف {0} + + + بريد الالكتروني + + + الاسم الأول + + + الكنية + + + رقم الهاتف + + + الملف الشخصي + + + تفاصيل الملف الشخصي + + + تمت إضافة صورة الملف الشخصي. + + + تم حذف صورة الملف الشخصي. + + + حفظ التغييرات + + + تحميل الصور + + + تم تحديث ملفك الشخصي. الرجاء تسجيل الدخول للمتابعة. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.de.resx new file mode 100644 index 0000000..badb9b7 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.de.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Bild löschen + + + Bild löschen + + + Möchtest du das Profilbild von {0} löschen + + + E-Mail + + + Vorname + + + Nachname + + + Telefon + + + Profil + + + Profildetails + + + Profilbild hinzugefügt. + + + Profilbild gelöscht. + + + Änderungen speichern + + + Bild hochladen + + + Profil aktualisiert. Zum Fortfahren anmelden. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.en.resx new file mode 100644 index 0000000..708594b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.en.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Delete Image + + + Delete Picture + + + Do you want to delete the profile picture of {0} + + + Email + + + First Name + + + Last Name + + + Phone Number + + + Profile + + + Profile Details + + + Profile picture added. + + + Profile picture deleted. + + + Save Changes + + + Upload Image + + + Your Profile has been updated. Please Login to Continue. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.es.resx new file mode 100644 index 0000000..add91bb --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.es.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Borrar Imagen + + + Borrar Imagen + + + ¿Quiere borrar la imagen de perfil de {0} + + + Correo + + + Nombre + + + Apellido + + + Teléfono + + + Perfil + + + Detalle del perfil + + + Imagen de Perfil agregada. + + + Imagen de Perfil borrada. + + + Guardar cambios + + + Cargar Imagen + + + Tu perfil fue actualizado, por favor ingrese para continuar. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.fr.resx new file mode 100644 index 0000000..9dd3d5c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.fr.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Supprimer image + + + Supprimer photo + + + Voulez-vous supprimer la photo de profil de {0} + + + Courriel + + + Prénom + + + Nom + + + Numéro de téléphone + + + Profil + + + Détails du profil + + + Photo de profil ajouté. + + + Photo de profil supprimée. + + + Sauvagarder les changements + + + Téléverser une image + + + Votre profil a été mis à jour. Merci de vous reconnecter pour continuer. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.id.resx new file mode 100644 index 0000000..238596e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.id.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Hapus Gambar + + + Hapus Gambar + + + Do you want to delete the profile picture of {0} + + + Email + + + Nama Depan + + + Nama Belakang + + + Nomor Telepon + + + Profil + + + Detail Profil + + + Profile picture added. + + + Profile picture deleted. + + + Simpan Perubahan + + + Unggah Gambar + + + Profil Anda telah diperbarui. Login untuk Melanjutkan. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.it.resx new file mode 100644 index 0000000..3848468 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.it.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Elimina Immagine + + + Elimina Immagine + + + Do you want to delete the profile picture of {0} + + + Email + + + Nome + + + Cognome + + + Telefono + + + Profilo + + + Dettagli profilo + + + Profile picture added. + + + Profile picture deleted. + + + Salvare le modifiche + + + Carica immagine + + + Il tuo profilo è stato aggiornato. Accedere per continuare. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.km.resx new file mode 100644 index 0000000..56fd8a9 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.km.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + លុបរូបភាព + + + លុបរូបភាព + + + តើអ្នកចង់លុបរូបថតប្រូហ្វាល់នៃ {0} + + + អ៊ីមែល + + + នាមខ្លួន + + + នាមត្រកូល + + + លេខទូរស័ព្ទ + + + ប្រវត្តិរូប + + + ព័ត៌មានលម្អិតប្រវត្តិរូប + + + រូបថតប្រូហ្វាល់បានបន្ថែម + + + រូបថតប្រូហ្វាល់បានលុប + + + រក្សាទុកការផ្លាស់ប្តូរ + + + ផ្ទុកឡើងរូបភាព + + + ពត៌មានរបស់អ្នកត្រូវបានធ្វើបច្ចុប្បន្នភាព។ សូមចូលដើម្បីបន្ត។ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.nl.resx new file mode 100644 index 0000000..faba084 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.nl.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Afbeelding verwijderen + + + Wilt u de profielfoto van {0} verwijderen? + + + Email + + + Voornaam + + + Achternaam + + + Telefoonnummer + + + Profiel + + + Profielgegevens + + + Profielfoto toegevoegd. + + + Profielfoto verwijderd. + + + Wijzigingen opslaan + + + Uw profiel is bijgewerkt. Log in om door te gaan. + + + Afbeelding verwijderen + + + Afbeelding uploaden + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.ru.resx new file mode 100644 index 0000000..c08082a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.ru.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Удалить изображение + + + Вы действительно хотите удалить изображение профиля {0} + + + Email + + + Имя + + + Фамилия + + + Номер телефона + + + Профиль + + + Детали профиля + + + Изображение профиля добавлено. + + + Изображение профиля удалено. + + + Сохранить изменения + + + Загрузить изображение + + + Ваш профиль был обновлён. Пожалуйста, авторизуйтесь, чтобы продолжить. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.sv.resx new file mode 100644 index 0000000..48cf3c5 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Profile.sv.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Radera Bild + + + Radera Bild + + + Do you want to delete the profile picture of {0} + + + E-post + + + Förnamn + + + Efternamn + + + Telefonnummer + + + Profil + + + Profil Detaljer + + + Profile picture added. + + + Profile picture deleted. + + + Spara Ändringar + + + Ladda upp bild + + + Din profil har uppdaterats. Var vänlig logga in för att fortsätta. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.ar.resx new file mode 100644 index 0000000..8e0d14b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.ar.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + تغيير كلمة المرور + + + كلمة المرور الحالي + + + كلمة سر خاطئة. + + + كلمه السر + + + تم تغيير كلمة السر! + + + تأكيد كلمة المرور + + + مطلوب تأكيد كلمة المرور! + + + كلمة المرور مطلوبة! + + + يجب ألا يقل طول كلمة المرور عن 8 + + + يجب أن تحتوي كلمة المرور على حرف كبير واحد على الأقل + + + يجب أن تحتوي كلمة المرور على رقم واحد على الأقل + + + يجب أن تحتوي كلمة المرور على حرف صغير واحد على الأقل + + + كلمات المرور غير متطابقة + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.de.resx new file mode 100644 index 0000000..593ce75 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.de.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Passwort ändern + + + Aktuelles Passwort + + + Falsches Passwort. + + + Passwort + + + Passwort geändert! + + + Passwortwiederholung + + + Passwortwiederholung wird benötigt! + + + Passwort wird benötigt! + + + Passwort muss mindestens 8 Zeichen lang sein + + + Passwort muss mindestens einen Großbuchstaben enthalten + + + Passwort muss mindestens eine Zahl enthalten + + + Passwort muss mindestens einen Kleinbuchstaben enthalten + + + Passwörter stimmen nicht überein. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.en.resx new file mode 100644 index 0000000..9de3a3e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.en.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Change Password + + + Current Password + + + Incorrect Password. + + + Password + + + Password Changed! + + + Password Confirmation + + + Password Confirmation is required! + + + Password is required! + + + Password must be at least of length 8 + + + Password must contain at least one capital letter + + + Password must contain at least one digit + + + Password must contain at least one lowercase letter + + + Passwords don't match + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.es.resx new file mode 100644 index 0000000..998fab6 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.es.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cambiar contraseña + + + Contraseña actual + + + Contraseña + + + Confirmación de contraseña + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.fr.resx new file mode 100644 index 0000000..b98c7ae --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.fr.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Changer le mot de passe + + + Mot de passe actuel + + + Mot de passe incorrect. + + + Mot de passe + + + Mot de passe changé ! + + + Mot de passe confirmé ! + + + Confirmation du mot de passe requise ! + + + Mot de passe requis ! + + + Le mot de passe doit au moins contenir 8 caractères ! + + + Le mot de passe doit au moins contenir une lettre majuscule + + + Le mot de passe doit au moins contenir un chiffre + + + Le mot de passe doit au moins contenir une minuscule + + + Les mots de passes de correspondent pas + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.id.resx new file mode 100644 index 0000000..6f68328 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.id.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ubah sandi + + + Sandi saat Ini + + + Sandi salah. + + + Sandi + + + Sandi diperbarui! + + + Konfirmasi sandi + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.it.resx new file mode 100644 index 0000000..787c422 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.it.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cambia password + + + Password corrente + + + Password non corretta. + + + Password + + + Password cambiata! + + + Conferma password + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.km.resx new file mode 100644 index 0000000..9f41488 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.km.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ផ្លាស់ប្តូរពាក្យសម្ងាត់ + + + លេខសំងាត់​បច្ចុប្បន្ន + + + ពាក្យសម្ងាត់ + + + ការ​បញ្ជាក់​ពាក្យ​សម្ងាត់ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.nl.resx new file mode 100644 index 0000000..54116f3 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.nl.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Wachtwoord wijzigen + + + Huidig wachtwoord + + + Wachtwoord + + + Wachtwoordbevestiging + + + Onjuist wachtwoord. + + + Wachtwoord gewijzigd! + + + Lösenordsbekräftelse krävs! + + + Wachtwoord is vereist! + + + Wachtwoord moet uit minimaal 8 karakters bestaan! + + + Wachtwoord moet uit minimaal 1 hoofdletter bestaan! + + + Wachtwoord moet uit minimaal 1 nummer! + + + Wachtwoord moet uit minimaal 1 kleine letter! + + + Wachtwoorden komen niet overeen! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.ru.resx new file mode 100644 index 0000000..6240d95 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.ru.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Изменить пароль + + + Текущий пароль + + + Неверный пароль. + + + Пароль + + + Пароль изменён! + + + Подтверждение пароля + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.sv.resx new file mode 100644 index 0000000..1fa3c42 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Account/Security.sv.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ändra lösenord + + + Nuvarande lösenord + + + Fel lösenord. + + + Lösenord + + + Lösenord Ändrat! + + + Lösenordsbekräftelse + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.ar.resx new file mode 100644 index 0000000..aa9eed6 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.ar.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + المستخدم نشط؟ + + + هل تريد تأكيد البريد الإلكتروني تلقائيًا؟ + + + إلغاء + + + تأكيد كلمة المرور + + + بريد الالكتروني + + + الاسم الأول + + + الكنية + + + كلمه السر + + + رقم الهاتف + + + الملف الشخصي + + + تفاصيل الملف الشخصي + + + تسجيل + + + تسجيل المستخدم + + + حفظ التغييرات + + + اسم االمستخدم + + + مستخدم مسجل! + + + مستخدم مسجل. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.de.resx new file mode 100644 index 0000000..06149d5 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.de.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Benutzer aktivieren? + + + E-Mail automatisch bestätigen? + + + Abbrechen + + + Passwort wiederholen + + + E-Mail + + + Vorname + + + Nachname + + + Passwort + + + Telefon + + + Profil + + + Profildetails + + + Registrieren + + + Benutzer registrieren + + + Änderungen speichern + + + Benutzername + + + Benutzer registriert! + + + Benutzer registriert. Eine Bestätigungsemail wurde an die angegebene E-Mail-Adresse versendet. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.en.resx new file mode 100644 index 0000000..02e1e86 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.en.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Activate User? + + + Auto Confirm Email? + + + Cancel + + + Confirm Password + + + Email + + + First Name + + + Last Name + + + Password + + + Phone Number + + + Profile + + + Profile Details + + + Register + + + Register User + + + Save Changes + + + User Name + + + User Registered! + + + User Registered. Confirmation Mail has been delivered to the Mailbox. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.es.resx new file mode 100644 index 0000000..ff8e8ee --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.es.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ¿Activar usuario? + + + ¿Autoconfirmar correo? + + + Cancelar + + + Confirmar contraseña + + + Correo + + + Nombre + + + Apellido + + + Contraseña + + + Teléfono + + + Perfil + + + Detalle del perfil + + + Registrar + + + Usuario registrado + + + Guardar cambios + + + Usuario + + + Usuario Registrado! + + + Usuario Registrado. Un correo de confirmación fue enviado a su casilla de correo. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.fr.resx new file mode 100644 index 0000000..3c2d06a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.fr.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Utilisateur actif ? + + + Confirmer automatiquement le courriel ? + + + Annuler + + + Confirmer le mot de passe + + + Courriel + + + Prénom + + + Nom + + + Mot de passe + + + Numéro de téléphone + + + Profil + + + Détails du profil + + + Inscrire + + + Inscrire l'utilisateur + + + Sauvegarder les changements. + + + Nom d'utilisateur + + + Utilisateur enregistré. + + + Utilisateur enregistré. Un courriel de confirmation a lui été envoyé. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.id.resx new file mode 100644 index 0000000..b26268a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.id.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktifkan Pengguna? + + + Konfirmasi Email Otomatis? + + + Batal + + + Konfirmasi Sandi + + + Email + + + Nama Depan + + + Nama Belakang + + + Sandi + + + Nomor Telepon + + + Profil + + + Detail Profil + + + Daftar + + + Daftar Pengguna + + + Simpan Perubahan + + + User Name + + + Pengguna Terdaftar! + + + Pengguna Terdaftar. Email konfirmasi telah dikirim ke email Anda. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.it.resx new file mode 100644 index 0000000..2999209 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.it.resx @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Auto conferma E-Mail? + + + Annulla + + + Conferma password + + + Email + + + Nome + + + Cognome + + + Password + + + Telefono + + + Profilo + + + Dettagli profilo + + + Registrati + + + Registra utente + + + Salvare le modifiche + + + Nome utente + + + Utente registrato! + + + Utente registrato. Una mail di conferma è stata inviata alla vostra casella E-Mail. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.km.resx new file mode 100644 index 0000000..821eb89 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.km.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ធ្វើឱ្យអ្នកប្រើប្រាស់សកម្ម? + + + បញ្ជាក់អ៊ីមែលដោយស្វ័យប្រវត្តិ? + + + បោះបង់ + + + បញ្ជាក់ពាក្យសម្ងាត់ + + + អ៊ីមែល + + + នាមខ្លួន + + + នាមត្រកូល + + + ពាក្យសម្ងាត់ + + + លេខទូរស័ព្ទ + + + ប្រវត្តិរូប + + + ប្រវត្តិរូបលម្អិត + + + ចុះឈ្មោះ + + + ចុះឈ្មោះអ្នកប្រើប្រាស់ + + + រក្សាការកែប្រែ + + + ឈ្មោះអ្នកប្រើប្រាស់ + + + អ្នកប្រើប្រាស់ត្រូវបានចុះឈ្មោះរួចរាល់ + + + អ្នកប្រើប្រាស់ត្រូវបានចុះឈ្មោះរួចរាល់ សារអ៊ីម៉ែលបញ្ជាក់នឹងត្រូវផ្ញើទៅកាន់ប្រអប់សាររបស់អ្នក! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.nl.resx new file mode 100644 index 0000000..39a5449 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.nl.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Gebruiker activeren? + + + E-mail automatisch bevestigen? + + + Annuleren + + + Wachtwoord bevestigen + + + Email + + + Voornaam + + + Achternaam + + + Wachtwoord + + + Telefoonnummer + + + Profiel + + + Profielgegevens + + + Registreren + + + Gebruiker registreren + + + Wijzigingen opslaan + + + Gebruikersnaam + + + Gebruiker geregistreerd! + + + Geregistreerde gebruiker. Bevestigingsmail is afgeleverd bij de mailbox. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.ru.resx new file mode 100644 index 0000000..15c69df --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.ru.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Активировать пользователя? + + + Подтвердить email автоматически? + + + Отмена + + + Подтверждение пароля + + + Email + + + Имя + + + Фамилия + + + Пароль + + + Номер телефона + + + Профиль + + + Детали профиля + + + Зарегистрировать + + + Регистрация пользователя + + + Сохранить изменения + + + Username + + + Пользователь зарегистрирован + + + Пользователь зарегистрирован. Письмо для подтверждения будет отправлено по почте. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.sv.resx new file mode 100644 index 0000000..949f8d8 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RegisterUserModal.sv.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktivera användare? + + + Bekräfta e-post automatiskt? + + + Avbryt + + + Bekräfta lösenord + + + E-post + + + Förnamn + + + Efternamn + + + Lösenord + + + Telefonnummer + + + Profil + + + Profil Detaljer + + + Registrera + + + Registrera användare + + + Spara ändringar + + + Användarnamn + + + Användare Registrerad! + + + Användare registrerad. Bekräftelsemeddelande har skickats till brevlådan. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.ar.resx new file mode 100644 index 0000000..cfc5c47 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.ar.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + تأكيد كلمة المرور + + + بريد الالكتروني + + + أدخل البريد الإلكتروني لإعادة تعيين كلمة المرور + + + كلمه السر + + + إعادة تعيين كلمة المرور + + + لم يتم العثور على الرمز! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.de.resx new file mode 100644 index 0000000..00eb773 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.de.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Passwort bestätigen + + + E-Mail + + + E-Mail-Adresse eingeben um, das Passwort zurückzusetzen + + + Passwort + + + Passwort zurücksetzen + + + Token nicht gefunden! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.en.resx new file mode 100644 index 0000000..4e4a724 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.en.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Confirm Password + + + E-mail + + + Enter email for password reset + + + Password + + + Reset password + + + Token Not Found! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.es.resx new file mode 100644 index 0000000..cf79b0c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.es.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Confirmar Contraseña + + + Correo + + + Ingrese correo para blanquear contraseña + + + Contraseña + + + Blanquear Contraseña + + + Token no encontrado! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.fr.resx new file mode 100644 index 0000000..a38eed5 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.fr.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Confirmer le mot de passe + + + Courriel + + + Entrez le courriel pour la réinitialisation du mot de passe + + + Mot de passe + + + Réinitialiser le mot de passe + + + Jeton introuvable ! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.id.resx new file mode 100644 index 0000000..4e4a724 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.id.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Confirm Password + + + E-mail + + + Enter email for password reset + + + Password + + + Reset password + + + Token Not Found! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.it.resx new file mode 100644 index 0000000..4e4a724 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.it.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Confirm Password + + + E-mail + + + Enter email for password reset + + + Password + + + Reset password + + + Token Not Found! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.km.resx new file mode 100644 index 0000000..895f21c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.km.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + លេខកូដសម្ងាត់បញ្ជាក់ + + + អ៊ីំម៉ែល + + + បញ្ចូលអ៊ីម៉ែលដើម្បីកំណត់លេខកូដសម្ងាត់ឡើងវិញ + + + លេខកូដសម្ងាត់ + + + កំណត់លេខកូដសម្ងាត់ឡើងវិញ + + + ធូឃីនរកមិនឃើញ! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.nl.resx new file mode 100644 index 0000000..d1617f7 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.nl.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Wachtwoord bevestigen + + + E-mail + + + Voer uw E-mail in voor het opnieuw instellen van het wachtwoord! + + + Wachtwoord + + + Wachtwoord opnieuw instellen + + + Token niet gevonden! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.ru.resx new file mode 100644 index 0000000..47208bc --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.ru.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Подтверждение пароля + + + E-mail + + + Введите email для сброса ппароля + + + Пароль + + + Сбросить пароль + + + Токен не найден! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.sv.resx new file mode 100644 index 0000000..4e4a724 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Reset.sv.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Confirm Password + + + E-mail + + + Enter email for password reset + + + Password + + + Reset password + + + Token Not Found! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.ar.resx new file mode 100644 index 0000000..ea2c146 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.ar.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أضف دورًا + + + إلغاء + + + وصف + + + معرف الدور + + + اسم الدور + + + حفظ الدور + + + تحديث الدور + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.de.resx new file mode 100644 index 0000000..3ad22b6 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.de.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Rolle hinzufügen + + + Abbrechen + + + Beschreibung + + + Rollen ID + + + Rollenname + + + Rolle speichern + + + Rolle aktualisieren + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.en.resx new file mode 100644 index 0000000..a9dfc58 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.en.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Role + + + Cancel + + + Description + + + Role ID + + + Role Name + + + Save Role + + + Update Role + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.es.resx new file mode 100644 index 0000000..059eae4 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.es.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Agregar Rol + + + Cancelar + + + Descripción + + + ID de Rol + + + Nombre de Rol + + + Guardar + + + Actualizar + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.fr.resx new file mode 100644 index 0000000..88f6a63 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.fr.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ajouter un rôle + + + Annuler + + + Description + + + Identifiant du rôle + + + Nom du rôle + + + Sauvegarder le rôle + + + Mettre à jour le rôle + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.id.resx new file mode 100644 index 0000000..ba2c181 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.id.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tambah Wewenang + + + Batal + + + Description + + + Wewenang berhasil dibuat! + + + ID Wewenang + + + Nama Wewenang + + + Simpan Wewenang + + + Perbarui Wewenang + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.it.resx new file mode 100644 index 0000000..eba449c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.it.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Attivare l'utente? + + + Annulla + + + Description + + + Id ruolo + + + Nome ruolo + + + Salvare ruolo + + + Aggiorna ruolo + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.km.resx new file mode 100644 index 0000000..eaa3005 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.km.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បន្ថែមតួនាទី + + + បោះបង់ + + + ពិពណ៌នា + + + លេខសម្គាល់តួនាទី + + + ឈ្មោះតួនាទី + + + រក្សាទុកតួនាទី + + + ធ្វើបច្ចុប្បន្នភាពតួនាទី + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.nl.resx new file mode 100644 index 0000000..26ddbae --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.nl.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Rol toevoegen + + + Annuleren + + + Beschrijving + + + Rol-ID + + + Rolnaam + + + Rol opslaan + + + Rol bijwerken + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.ru.resx new file mode 100644 index 0000000..a66eebf --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.ru.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Добавить роль + + + Отмена + + + Описание + + + ID роли + + + Имя роли + + + Сохранить роль + + + Обновить роль + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.sv.resx new file mode 100644 index 0000000..d01cb2e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/RoleModal.sv.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Lägg till roll + + + Avbryt + + + Description + + + Roll ID + + + Roll Namn + + + Spara Roll + + + Uppdatera Roll + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.ar.resx new file mode 100644 index 0000000..d40cc37 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.ar.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + كل الأذونات + + + تطبيق + + + يحدها + + + كثيف + + + وصف + + + هنا يمكنك ترك تعليق لهذا الإذن للدور الحالي + + + إدارة الإذن + + + إدارة أذونات {0} {1} + + + اسم الإذن + + + ابحث عن أذونات + + + حالة + + + مخطط + + + نوع + + + تحديث أذونات الدور + + + سيتم حفظها فقط عند تحديد الإذن + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.de.resx new file mode 100644 index 0000000..bc9a1e6 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.de.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Alle Berechtigungen + + + Anwenden + + + Gerahmt + + + Schmal + + + Beschreibung + + + Hier kann ein Kommentar für diese Berechtigung der aktuellen Rolle hinterlassen werden + + + Berechtigungen verwalten + + + Verwalte {0} Berechtigungen von {1} + + + Berechtigungsname + + + Nach Berechtigungen suchen + + + Status + + + Gebändert + + + Typ + + + Rollenberechtigungen verwalten + + + Wird nur gespeichert wenn Berechtigung ausgewählt + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.en.resx new file mode 100644 index 0000000..83f81ed --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.en.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + All Permissions + + + Apply + + + Bordered + + + Dense + + + Description + + + Here you can leave a comment for this permission for the current role + + + Manage Permission + + + Manage {0} {1}'s Permissions + + + Permission Name + + + Search For Permissions + + + Status + + + Striped + + + Type + + + Update Role Permissions + + + Will be saved only when selected Permission + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.es.resx new file mode 100644 index 0000000..358154c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.es.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Todos los Permisos + + + Aplicar + + + Bordeado + + + Denso + + + Descripción + + + Aquí puede dejar un comentario para este permiso para el rol actual + + + Administrar Permisos + + + Administrar los permisos de {0} {1} + + + Nombre del Permiso + + + Buscar Permisos + + + Estado + + + Rayado + + + Tipo + + + Actualizar los Permisos del Rol + + + Será guardado únicamente cuando se seleccione Permisos + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.fr.resx new file mode 100644 index 0000000..8b5380b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.fr.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Toutes les permissions + + + Appliquer + + + Avec bordures + + + Dense + + + Description + + + Vous pouvez laisser ici un commentaire pour expliquer la permission de ce rôle. + + + Gérer la permission + + + Gérer les permissions du rôle {0} {1} + + + Nom de la permission + + + Rechercher une permission + + + Statut + + + Rayé + + + Type + + + Mettre à jour les permissions du rôle + + + Va être sauvegardé seulement si la permission est sélectionnée + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.id.resx new file mode 100644 index 0000000..6698c6a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.id.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + All Permissions + + + Apply + + + Description + + + Here you can leave a comment for this permission for the current role + + + Pengaturan Izin + + + Pengaturan {0} {1} Izin + + + Nama Wewenang + + + Status + + + Tipe + + + Perbarui Izin Wewenang + + + Will be saved only when selected Permission + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.it.resx new file mode 100644 index 0000000..56b3c0d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.it.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tutti le autorizzazioni + + + Applica + + + Descrizione + + + Qui puoi lasciare un commento per questa autorizzazione per il ruolo corrente + + + Gestisci autorizzazione + + + Gestisci {0} {1} Autorizzazioni + + + Nome autorizzazioni + + + Status + + + Questa è una visualizzazione solo amministratore + + + Salva autorizzazioni + + + Aggiorna le autorizzazioni del ruolo + + + Saranno salvati solo i permessi selezionati + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.km.resx new file mode 100644 index 0000000..10fa383 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.km.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + សិទ្ធិទាំងអស់ + + + អនុវត្ត + + + ពិពណ៌នា + + + ទីនេះអ្នកអាចដាក់កំណត់សម្គាល់សិទ្ធិសម្រាប់តួនាទីមួយនេះបាន + + + គ្រង់គ្រងសិទ្ធិ + + + គ្រប់គ្រង {0} {1} សិទ្ធិ + + + ឈ្មោះសិទ្ធិ + + + ស្ថានភាព + + + ប្រភេទ + + + បច្ចុប្បន្នភាពសិទ្ធិរបស់តួនាទី + + + ត្រូវបានរក្សាទុកចំពោះសិទ្ធិដែលបានជ្រើសរើសតែប៉ុណ្ណោះ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.nl.resx new file mode 100644 index 0000000..ac114dc --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.nl.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Alle machtigingen + + + Toepassen + + + Grenst aan + + + Dicht + + + Beschrijving + + + Hier kunt u een opmerking achterlaten voor deze machtiging voor de huidige rol + + + Machtiging beheren + + + Machtigingen van {0} {1} beheren + + + Naam machtiging + + + Zoeken naar machtigingen + + + Status + + + Gestreept + + + Type + + + Rolmachtigingen bijwerken + + + Wordt alleen opgeslagen wanneer deze optie Is geselecteerd + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.ru.resx new file mode 100644 index 0000000..752fc9c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.ru.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Все права + + + Применить + + + Обрамлённый + + + Компактный + + + Описание + + + Здесь вы можете оставить комментарий к этому разрешению для текущей роли + + + Управление правами + + + Управление правами {0} {1} + + + Имя права + + + Найти права + + + Статус + + + Чередующийся + + + Тип + + + Обновить права роли + + + Будет сохранено только при выбранном разрешении + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.sv.resx new file mode 100644 index 0000000..f45df6a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/RolePermissions.sv.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + All Permissions + + + Apply + + + Description + + + Here you can leave a comment for this permission for the current role + + + Hantera Behörighet + + + Hantera {0} {1} Behörigheter + + + Permission Name + + + Status + + + Typ + + + Uppdatera Rollbehörigheter + + + Will be saved only when selected Permission + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.ar.resx new file mode 100644 index 0000000..fd3def1 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.ar.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أجراءات + + + يحدها + + + إنشاء + + + حذف + + + هل تريد حذف الدور بالمعرف {0}؟ + + + كثيف + + + وصف + + + يحرر + + + المعرف + + + إدارة الإذن + + + إدارة الأدوار. + + + لا توجد إجراءات مسموح بها + + + إعادة تحميل + + + دور + + + الأدوار + + + البحث عن الأدوار ... + + + مخطط + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.de.resx new file mode 100644 index 0000000..dab2a04 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.de.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Gerahmt + + + Hinzufügen + + + Löschen + + + Möchtest du die Rolle mit der Id {0} löschen? + + + Schmal + + + Beschreibung + + + Bearbeiten + + + Id + + + Berechtigungen verwalten + + + Rollen verwalten. + + + Keine Aktionen erlaubt + + + Neu laden + + + Rolle + + + Rollen + + + Nach Rollen suchen... + + + Gebändert + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.en.resx new file mode 100644 index 0000000..0fa1138 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.en.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Bordered + + + Create + + + Delete + + + Do you want to delete the role with Id {0}? + + + Dense + + + Description + + + Edit + + + Id + + + Manage Permission + + + Manage Roles. + + + No Allowed Actions + + + Reload + + + Role + + + Roles + + + Search for Roles... + + + Striped + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.es.resx new file mode 100644 index 0000000..1d2ab77 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.es.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acciones + + + Bordeado + + + Crear + + + Borrar + + + ¿Deseas borrar el rol con el Id {0}? + + + Denso + + + Descripción + + + Editar + + + Id + + + Administrar Permisos + + + Gestionar Roles + + + Acciones no Permitidas + + + Recargar + + + Rol + + + Roles + + + Buscar Roles + + + Rayado + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.fr.resx new file mode 100644 index 0000000..24b39cc --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.fr.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Avec bordures + + + Créer + + + Supprimer + + + Voulez-vous supprimer le rôle d'identifiant {0}? + + + Dense + + + Description + + + Éditer + + + Identifiant + + + Gérer la permission + + + Gérer les rôles + + + Aucune action autorisée + + + Recharger + + + Rôle + + + Rôles + + + Rechercher des rôles + + + Rayé + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.id.resx new file mode 100644 index 0000000..7c09d81 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.id.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tindakan + + + Tambah + + + Hapus + + + Hapus wewenang dengan Id {0}? + + + Description + + + Sunting + + + Id + + + Atur Perizinan + + + Atur Wewenang. + + + No Allowed Actions + + + Muat Ulang + + + Wewenang + + + Wewenang + + + Cari Wewenang... + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.it.resx new file mode 100644 index 0000000..fbd73a3 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.it.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Azioni + + + Crea + + + Elimina + + + Vuoi eliminare il ruolo con Id {0}? + + + Description + + + Modifica + + + Id + + + Gestisci autorizzazione + + + Gestisci ruoli. + + + No Allowed Actions + + + Ricarica + + + Ruolo + + + Ruoli + + + Ricerca ruoli... + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.km.resx new file mode 100644 index 0000000..eca7c51 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.km.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + មុខងារ + + + បង្កើត + + + លុប + + + តើអ្នកចង់លុបតួនាទីជាមួយលេខសម្គាល់ {0} ទេ? + + + ពិពណ៌នា + + + កែប្រែ + + + លេខកូដ + + + គ្រប់គ្រងតួនាទី + + + សកម្មភាពមិនត្រូវបានអនុញ្ញាត្ត + + + ផ្ទុកឡើងវិញ + + + តួនាទី + + + ស្វែងរកតួនាទី ... + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.nl.resx new file mode 100644 index 0000000..e64ccda --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.nl.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acties + + + Aanmaken + + + Verwijderen + + + Wilt u de rol verwijderen met Id {0}? + + + Beschrijving + + + Bewerken + + + Id + + + Rollen beheren. + + + Geen toegestane acties + + + Herladen + + + Rollen + + + Rollen zoeken... + + + Grenst aan + + + Dicht + + + Machtiging beheren + + + Rol + + + Gestreept + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.ru.resx new file mode 100644 index 0000000..283844d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.ru.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Действия + + + Обрамлённый + + + Создать + + + Удалить + + + Вы действительно хотите удалить роль с Id {0}? + + + Компактный + + + Описание + + + Редактировать + + + Id + + + Управление правами + + + Управление ролями. + + + Нет доступных действий + + + Перезагрузить + + + Роль + + + Роли + + + Поиск ролей... + + + Чередующийся + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.sv.resx new file mode 100644 index 0000000..0b9f79f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Roles/Roles.sv.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Åtgärder + + + Skapa + + + Radera + + + Vill du ta bort rollen med Id {0}? + + + Description + + + Redigera + + + Id + + + Hantera Behörighet + + + Hantera Roller. + + + No Allowed Actions + + + Ladda Om + + + Roll + + + Roller + + + Sök efter Roll... + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.ar.resx new file mode 100644 index 0000000..9a71a7f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.ar.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + نشيط؟ + + + إعدادات المسؤول. + + + البريد الإلكتروني + + + الاسم الأول + + + الكنية + + + رقم الهاتف + + + الملف الشخصي + + + حساب عام + + + حفظ التغييرات + + + هذا هو العرض المسؤول فقط. + + + تم تحديث حالة المستخدم. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.de.resx new file mode 100644 index 0000000..7ae4716 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.de.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktiv? + + + Administrator Einstellungen + + + E-Mail + + + Vorname + + + Nachname + + + Telefon + + + Profil + + + Öffentliches Profil + + + Änderungen speichern + + + Diese Ansicht ist nur für den Administrator. + + + Benutzerstatus aktualisiert. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.en.resx new file mode 100644 index 0000000..f98093b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.en.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Active? + + + Administrator Settings. + + + E-Mail + + + First Name + + + Last Name + + + Phone Number + + + Profile + + + Public Profile + + + Save Changes + + + This is an Administrator Only View. + + + Updated User Status. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.es.resx new file mode 100644 index 0000000..6acdc56 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.es.resx @@ -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 + + + ¿Activo? + + + Configuraciones de Administrador + + + Correo + + + Nombre + + + Apellido + + + Teléfono + + + Perfil + + + Perfil Público + + + Guardar cambios + + + Esta es una vista solo de Administrador + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.fr.resx new file mode 100644 index 0000000..4ce1ad8 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.fr.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actif ? + + + Paramètres pour les administateurs. + + + Courriel + + + Prénom + + + Nom + + + Numéro de téléphone + + + Profil + + + Profil public + + + Sauvegarder les changements + + + Ceci est visible uniquement par les administrateurs. + + + Statut de l'utilisateur mis à jour. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.id.resx new file mode 100644 index 0000000..56bde38 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.id.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktif? + + + Pengaturan Administrator. + + + E-Mail + + + Nama Depan + + + Nama Belakang + + + Nomor Telepon + + + Profil + + + Profil Publik + + + Simpan Perubahan + + + Ini adalah tampilan khusus Administrator. + + + Perbarui Status Pengguna. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.it.resx new file mode 100644 index 0000000..3bea79d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.it.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Attivato ? + + + Impostazioni amministratore. + + + E-Mail + + + Nome + + + Cognome + + + Telefono + + + Profilo + + + Profilo pubblico + + + Salvare le modifiche + + + Questa è una visualizzazione solo amministratore. + + + Aggiorna status utente. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.km.resx new file mode 100644 index 0000000..fb3e505 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.km.resx @@ -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 + + + សកម្ម? + + + ការកំណត់អ្នកគ្រប់គ្រង + + + អ៊ីមែល + + + នាមខ្លួន + + + នាមត្រកូល + + + លេខទូរស័ព្ទ + + + ប្រវត្តិរូប + + + ប្រវត្តិរូបសាធារណៈ + + + រក្សាទុកការផ្លាស់ប្តូរ + + + ផ្ទាំងសម្រាប់តែអ្នកប្រើប្រាស់មានសិទ្ធិជារដ្ឋបាលប្រព័ន្ធទេ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.nl.resx new file mode 100644 index 0000000..17c4cd3 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.nl.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actief? + + + Beheerdersinstellingen + + + E-mail + + + Voornaam + + + Achternaam + + + Telefoonnummer + + + Profiel + + + Openbaar profiel + + + Wijzigingen opslaan + + + Dit is alleen een weergave voor beheerders. + + + Bijgewerkte gebruikersstatus. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.ru.resx new file mode 100644 index 0000000..ca0349c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.ru.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Активный? + + + Настройки администратора. + + + E-Mail + + + Имя + + + Фамилия + + + Номер телефона + + + Профиль + + + Публичные данные профиля + + + Сохранить изменения + + + Эта стрица доступна только администраторам. + + + Статус пользователя обновлён. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.sv.resx new file mode 100644 index 0000000..ad47191 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserProfile.sv.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktiv? + + + Administratörsinställningar. + + + E-post + + + Förnamn + + + Efternamn + + + Telefonnummer + + + Profil + + + Offentlig profil + + + Spara ändringar + + + Detta är enbart en administratörsvy. + + + Uppdaterad användarstatus. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.ar.resx new file mode 100644 index 0000000..74663cc --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.ar.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Bordered + + + Dense + + + Manage {0} {1}'s Roles + + + Role Name + + + Roles Updated! + + + Search For User Roles + + + Status + + + Striped + + + Update User Roles + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.de.resx new file mode 100644 index 0000000..cd38ab3 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.de.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Gerahmt + + + Schmal + + + Rollen von {0} {1}'s verwalten + + + Rollenname + + + Rollen aktualisiert! + + + Nach Benutzerrollen suchen + + + Status + + + Gebändert + + + Nutzerrolle aktualisieren + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.en.resx new file mode 100644 index 0000000..74663cc --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.en.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Bordered + + + Dense + + + Manage {0} {1}'s Roles + + + Role Name + + + Roles Updated! + + + Search For User Roles + + + Status + + + Striped + + + Update User Roles + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.es.resx new file mode 100644 index 0000000..f4b8b24 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.es.resx @@ -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 + + + Bordeado + + + Denso + + + Descripción + + + Administrar Roles de {0} {1} + + + Nombre del Rol + + + Roles actualizados! + + + Buscar por Rol de Usuario + + + Estado + + + Rayado + + + Actualizar Roles de Usuario + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.fr.resx new file mode 100644 index 0000000..e56749a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.fr.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Avec bordures + + + Dense + + + Gérer les rôles de {0} {1} + + + Nom du rôle + + + Rôles mis à jour + + + Rechercher parmis les rôles de l'utilisateur + + + Statut + + + Rayé + + + Mettre à jour les rôles de l'utilisateur + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.id.resx new file mode 100644 index 0000000..5015c9e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.id.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Pengaturan {0} {1} Wewenang + + + Nama Wewenang + + + Wewenang Diperbarui! + + + Status + + + Perbarui Wewenang Pengguna + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.it.resx new file mode 100644 index 0000000..ac5b7c0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.it.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Manage {0} {1}'s Roles + + + Nome ruolo + + + Ruoli aggiornati! + + + Stato + + + Aggiorna ruoli utente + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.km.resx new file mode 100644 index 0000000..706e0a6 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.km.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Manage {0} {1}'s Roles + + + ឈ្មោះតួនាទី + + + តួនាទីត្រូវបានធ្វើបច្ចុប្បន្នភាព! + + + ស្ថានភាព + + + បច្ចុប្បន្នភាពតួនាទីរបស់អ្នកប្រើប្រាស់ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.nl.resx new file mode 100644 index 0000000..e515e39 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.nl.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Rollen van {0} {1} beheren + + + Rolnaam + + + Rollen bijgewerkt! + + + Status + + + Gebruikersrollen bijwerken + + + Grenst aan + + + Dicht + + + Zoeken naar gebruikersrollen + + + Gestreept + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.ru.resx new file mode 100644 index 0000000..a934c03 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.ru.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Обрамлённый + + + Компактный + + + Управление Ролями {0} {1} + + + Имя роли + + + Роли обновлены! + + + Поиск ролей пользователя + + + Статус + + + Чередующийся + + + Обновить роли пользователя + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.sv.resx new file mode 100644 index 0000000..4963a5f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/UserRoles.sv.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Hantera {0} {1} Roller + + + Rollnamn + + + Roller uppdaterade! + + + Status + + + Uppdatera användarroller + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.ar.resx new file mode 100644 index 0000000..09b0624 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.ar.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أجراءات + + + نشيط + + + يحدها + + + إنشاء + + + كثيف + + + بريد الالكتروني + + + تأكيد البريد الإلكتروني + + + تصدير + + + تم تصدير المستخدمين الذين تمت تصفيتهم + + + الاسم الأول + + + الكنية + + + إدارة الأدوار + + + ادارة المستخدمين + + + لا توجد إجراءات مسموح بها + + + غير مسموح. + + + رقم الهاتف + + + تسجيل مستخدم جديد + + + إعادة تحميل + + + البحث عن المستخدمين + + + مخطط + + + اسم االمستخدم + + + المستخدمون + + + تصدير المستخدمين + + + عرض الصفحة الشخصية + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.de.resx new file mode 100644 index 0000000..48abf2c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.de.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Aktiv + + + Gerahmt + + + Passwort bestätigen + + + Hinzufügen + + + Schmal + + + E-Mail + + + E-Mail bestätigt + + + Export + + + Gefilterte Benutzer exportiert + + + Vorname + + + Nachname + + + Rollen verwalten + + + Nutzer verwalten + + + Keine Aktionen erlaubt + + + Nicht erlaubt. + + + Passwort + + + Telefonnummer + + + Neuen Nutzer anlegen + + + Neu laden + + + Nach Benutzern suchen + + + Gebändert + + + Benutzername + + + Nutzer + + + Benutzer exportiert + + + Profil anzeigen + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.en.resx new file mode 100644 index 0000000..2251438 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.en.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Active + + + Bordered + + + Confirm Password + + + Create + + + Dense + + + Email + + + Email Confirmation + + + Export + + + Filtered Users exported + + + First Name + + + Last Name + + + Manage Roles + + + Manage Users + + + No Allowed Actions + + + Not Allowed. + + + Password + + + Phone Number + + + Register New User + + + Reload + + + Search For Users + + + Striped + + + User Name + + + Users + + + Users exported + + + View Profile + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.es.resx new file mode 100644 index 0000000..9a9793a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.es.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acciones + + + Activo + + + Bordeado + + + Crear + + + Denso + + + Correo + + + Confirmación de correo + + + Exportar + + + Usuarios Filtrados exportados + + + Nombre + + + Apellido + + + Gestionar Roles + + + Gestionar Usuarios + + + Acciones no Permitidas + + + No Permitido + + + Teléfono + + + Nuevo usuario + + + Recargar + + + Buscar usuarios + + + Rayado + + + Nombre de Usuario + + + Usuarios + + + Usuarios exportados + + + Ver perfil + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.fr.resx new file mode 100644 index 0000000..771937f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.fr.resx @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Actif + + + Créer + + + Courriel + + + Confirmation du courriel + + + Exporter + + + Utilisateurs filtrés exportés + + + Prénom + + + Nom + + + Gérer les rôles + + + Gérer les utilisateurs + + + Aucune action autorisée + + + Enregistrer un nouvel utilisateur + + + Recharger + + + Rechercher des utilisateurs + + + Utilisateurs + + + Utilisateurs exportés + + + Voir le profil + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.id.resx new file mode 100644 index 0000000..4b1f5dd --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.id.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tindakan + + + Aktif + + + Tambah Pengguna + + + Email + + + Konfirmasi Email + + + Export + + + Filtered Users exported + + + Nama Depan + + + Nama Belakang + + + Atur Wewenang + + + Atur Pengguna + + + No Allowed Actions + + + Tidak Diizinkan. + + + Daftar Pengguna Baru + + + Muat Ulang + + + Cari Pengguna + + + Pengguna + + + Users exported + + + Lihat Profil + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.it.resx new file mode 100644 index 0000000..7d50b0c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.it.resx @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Azioni + + + Attiva + + + Conferma Password + + + Crea + + + Email + + + Conferma E-Mail + + + Export + + + Filtered Users exported + + + Nome + + + Cognome + + + Gestisci ruoli + + + Gestisci utenti + + + No Allowed Actions + + + Non autorizzato. + + + Password + + + Numero di telefono + + + Numero di telefono + + + Registra nuovo utente + + + Ricarica + + + Ricerca utenti + + + Nome utente + + + Nome utente + + + Utenti + + + Users exported + + + Vedi profilo + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.km.resx new file mode 100644 index 0000000..7e26532 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.km.resx @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + មុខងារ + + + សកម្ម + + + បង្កើត + + + អ៊ីម៉ែល + + + អ៊ីម៉ែលបញ្ជាក់ + + + នាំចេញ + + + ច្រោះអ្នកប្រើប្រាស់បាននាំចេញ + + + នាមខ្លួន + + + នាមត្រកូល + + + កំណត់សិទ្ធិអ្នកប្រើប្រាស់ + + + កំណត់អ្នកប្រើប្រាស់ + + + សកម្មភាពមិនអនុញ្ញាត្ត + + + ចុះឈ្មោះអ្នកប្រើប្រាស់ថ្មី + + + ផ្ទុកឡើងវិញ + + + ស្វែងរកអ្នកប្រើប្រាស់ + + + អ្នកប្រើប្រាស់ + + + អ្នកប្រើប្រាស់បាននាំចេញ + + + បង្ហាញព័ត៌មានផ្ទាល់ខ្លួន + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.nl.resx new file mode 100644 index 0000000..80ee914 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.nl.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acties + + + Actief + + + Aanmaken + + + Email + + + Bevestiging per e-mail + + + Exporteren + + + Gefilterde gebruikers geëxporteerd + + + Voornaam + + + Achternaam + + + Rollen beheren + + + Gebruikers beheren + + + Geen toegestane acties + + + Nieuwe gebruiker registreren + + + Herladen + + + Gebruikers zoeken + + + Gebruikers + + + Gebruikers geëxporteerd + + + Profiel weergeven + + + Grenst aan + + + Dicht + + + Niet toegestaan. + + + Telefoonnummer + + + Gestreept + + + Gebruikersnaam + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.ru.resx new file mode 100644 index 0000000..9b83555 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.ru.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Действия + + + Активный + + + Обрамлённый + + + Создать + + + Компактный + + + Email + + + Email подтверждён + + + Экспорт в Excel + + + Отфильтрованные пользователи экспортированы + + + Имя + + + Фамилия + + + Управление ролями + + + Управление пользователями + + + Нет доступных действий + + + Не разрешено. + + + Номер телефона + + + Зарегистрировать нового пользователя + + + Перезагрузить + + + Поиск пользователя... + + + Чередующийся + + + UserName + + + Пользователи + + + Пользователи экспортированы + + + Посмотреть профиль + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.sv.resx new file mode 100644 index 0000000..bdc6cd6 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Identity/Users/Users.sv.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Åtgärder + + + Aktiv + + + Skapa + + + E-post + + + E-post Bekräftelse + + + Export + + + Filtered Users exported + + + Förnamn + + + Efternamn + + + Hantera Roller + + + Hantera Användare + + + No Allowed Actions + + + Inte Tillåtet. + + + Registrera ny användare + + + Ladda om + + + Sök efter användare + + + Användare + + + Users exported + + + Visa Profil + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Index.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Index.de.resx new file mode 100644 index 0000000..e998e26 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Index.de.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor WASM Vorlage + + + Erstellt mit dem Besten von + + + Kompatibel mit + + + Komponentenbibliothek + + + Falls du irgendwo steckenbleiben solltest, oder Fragen zu dieser Implementierung hast, habe ich eine Schnellstartanleitung für dich erstellt. + + + Anleitung lesen + + + Version 1.0 + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Index.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Index.en.resx new file mode 100644 index 0000000..14ddac7 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Index.en.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor WASM Boilerplate + + + Built with the goodness of + + + Compatible with + + + Component Library + + + In case you are stuck anywhere or have any queries regarding this implementation, I have compiled a Quick Start Guide for you reference. + + + Read The Guide + + + Version 1.0 + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Index.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Index.it.resx new file mode 100644 index 0000000..cb76ac0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Index.it.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor WASM Boilerplate + + + Sviluppato con l'ultilizzo di componenti della libreria + + + Compatibile con + + + Component Library + + + Nel caso in cui tu sia bloccato ovunque o hai domande riguardanti questa implementazione, ho compilato una guida rapida per il tuo riferimento. + + + GUIDA + + + Versione 1.0 + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.ar.resx new file mode 100644 index 0000000..c32c8b3 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.ar.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أضف مستند + + + الغاء + + + وصف + + + نوع المستند + + + تنزيل + + + رقم المعرف + + + عام؟ + + + حفظ + + + عنوان + + + تحديث + + + تحديث المستند + + + رفع + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.de.resx new file mode 100644 index 0000000..5c863a4 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.de.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dokument hinzufügen + + + Abbrechen + + + Beschreibung + + + Dokumenttyp + + + Herunterladen + + + Id + + + Öffentlich? + + + Speichern + + + Titel + + + Aktualisieren + + + Dokument aktualisieren + + + Hochladen + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.en.resx new file mode 100644 index 0000000..87f6df1 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.en.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Document + + + Cancel + + + Description + + + Document Type + + + Download + + + Id + + + Is Public? + + + Save + + + Title + + + Update + + + Update Document + + + Upload + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.es.resx new file mode 100644 index 0000000..dc71795 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.es.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Agregar Documento + + + Cancelar + + + Descripción + + + Tipo de Documento + + + Descargar + + + Id + + + ¿Es Público? + + + Guardar + + + Título + + + Actualizar + + + Actualizar Documento + + + Subir + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.fr.resx new file mode 100644 index 0000000..2e1cc02 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.fr.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ajouter un document + + + Annuler + + + Description + + + Type du document + + + Télécharger + + + Identifiant + + + Est public ? + + + Sauvegarder + + + Titre + + + Mettre à jour + + + Mettre à jour le document + + + Téléverser + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.id.resx new file mode 100644 index 0000000..afa6f30 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.id.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tambah Dokumen + + + Batal + + + Deskripsi + + + Document Type + + + Unduh + + + Id + + + Dokumen Publik? + + + Simpan + + + Judul + + + Perbarui + + + Perbarui Dokumen + + + Unggah + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.it.resx new file mode 100644 index 0000000..6c14e3b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.it.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aggiungi documento + + + Annulla + + + Descrizione + + + Document Type + + + Download + + + Id + + + È pubblico? + + + Salva + + + Titolo + + + Aggiorna + + + Aggiorna Documento + + + Carica + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.km.resx new file mode 100644 index 0000000..0797109 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.km.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បន្ថែមឯកសារ + + + បោះបង់ + + + ការពិពណ៌នា + + + ប្រភេទឯកសារ + + + ទាញយក + + + លេខកូដសម្គាល់ + + + ជាសាធារណះ? + + + រក្សាទុក + + + ចំណងជើង + + + បច្ចុប្បន្នភាព + + + បច្ចុប្បន្នភាពឯកសារ + + + ផ្ទុកឡើង + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.nl.resx new file mode 100644 index 0000000..3da7669 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.nl.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Document toevoegen + + + Annuleren + + + Beschrijving + + + Documenttype + + + Downloaden + + + Id + + + Is het openbaar? + + + Opslaan + + + Titel + + + Update + + + Document bijwerken + + + Uploaden + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.ru.resx new file mode 100644 index 0000000..4da98f0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.ru.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Добавить документ + + + Отмена + + + Описание + + + Тип документа + + + Скачать + + + Id + + + Публичный? + + + Сохранить + + + Заголовок + + + Обновить + + + Обновить документ + + + Загрузить + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.sv.resx new file mode 100644 index 0000000..e23d6b5 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentModal.sv.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Lägg till dokument + + + Avbryt + + + Beskrivning + + + Document Type + + + Ladda ner + + + Id + + + Är Offentlig? + + + Spara + + + Rubrik + + + Uppdatera + + + Uppdatera Dokument + + + Ladda Upp + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ar.resx new file mode 100644 index 0000000..909c248 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ar.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Document Type + + + الغاء + + + وصف + + + رقم المعرف + + + اسم + + + حثظ + + + تحديث + + + تحديث موع المستند + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.de.resx new file mode 100644 index 0000000..4b9bf26 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.de.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dokumenttyp hinzufügen + + + Abbrechen + + + Beschreibung + + + Id + + + Name + + + Speichern + + + Aktualisieren + + + Dokumenttyp aktualisieren + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.en.resx new file mode 100644 index 0000000..8b60e1c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.en.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Document Type + + + Cancel + + + Description + + + Id + + + Name + + + Save + + + Update + + + Update Document Type + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.es.resx new file mode 100644 index 0000000..647a528 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.es.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Agregar Tipo de Documento + + + Cancelar + + + Descripción + + + Id + + + Nombre + + + Guardar + + + Actualizar + + + Actualizar Tipo de Documento + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.fr.resx new file mode 100644 index 0000000..a0b980d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.fr.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ajouter un type de document + + + Annuler + + + Description + + + Identifiant + + + Nom + + + Sauvegarder + + + Mettre à jour + + + Mettre à jour le type de document + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.km.resx new file mode 100644 index 0000000..bd07f65 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.km.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បន្ថែមប្រភេទឯកសារ + + + បោះបង់ + + + ពិពណ៌នា + + + លេខកូដ + + + ឈ្មោះ + + + រក្សាទុក + + + បច្ចុប្បន្នភាព + + + បច្ចុប្បន្នភាពប្រភេទឯកសារ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.nl.resx new file mode 100644 index 0000000..cb353bf --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.nl.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Documenttype toevoegen + + + Annuleren + + + Beschrijving + + + Id + + + Naam + + + Opslaan + + + Update + + + Documenttype bijwerken + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ru.resx new file mode 100644 index 0000000..0f7290e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ru.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Добавить тип документа + + + Отмена + + + Описание + + + Id + + + Наименование + + + Сохранить + + + Обновить + + + Обновить тип документа + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.ar.resx new file mode 100644 index 0000000..ae36281 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.ar.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أجراءات + + + يحدها + + + تصفح المستندات المتاحة. + + + إنشاء + + + تاريخ الإنشاء + + + حذف + + + حذف المحتوى + + + كثيف + + + وصف + + + متجر المستندات + + + نوع الوثيقة + + + تحميل + + + يحرر + + + المعرف + + + عام + + + إدارة السمات الموسعة + + + لا توجد إجراءات مسموح بها + + + صاحب + + + إعادة تحميل + + + بحث + + + مخطط + + + عنوان + + + أنت + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.de.resx new file mode 100644 index 0000000..d7f094f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.de.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Gerahmt + + + Verfügbare Dokumente durchsuchen. + + + Erstellen + + + Erstellungsdatum + + + Löschen + + + Inhalt löschen + + + Schmal + + + Beschreibung + + + Dokumentenspeicher + + + Dokumenttyp + + + Herunterladen + + + Bearbeiten + + + Id + + + Öffentlich + + + Erweiterte Attribute verwalten + + + Keine Aktionen erlaubt + + + Eigentümer + + + Neu laden + + + Suche + + + Gebändert + + + Titel + + + Du + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.en.resx new file mode 100644 index 0000000..68cb0bb --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.en.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Bordered + + + Browse Available Documents. + + + Create + + + Date Created + + + Delete + + + Delete Content + + + Dense + + + Description + + + Document Store + + + Document Type + + + Download + + + Edit + + + Id + + + Is Public + + + Manage Extended Attributes + + + No Allowed Actions + + + Owner + + + Reload + + + Search + + + Striped + + + Title + + + you + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.es.resx new file mode 100644 index 0000000..74654a0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.es.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acciones + + + Bordeado + + + Navegar Documentos Disponibles. + + + Crear + + + Fecha de Creación + + + Borrar + + + ¿Desea eliminar el registro? + + + Denso + + + Descripción + + + Almacén de Documentos + + + Tipo de Documento + + + Descarga + + + Editar + + + Id + + + Es Público + + + Administrar Atributos Extendidos + + + Acciones no Permitidas + + + Propietario + + + Recargar + + + Buscar + + + Rayado + + + Título + + + Ud. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.fr.resx new file mode 100644 index 0000000..5247805 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.fr.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Avec bordures + + + Parcourir les documents disponibles. + + + Créer + + + Date de création + + + Supprimer + + + Supprimer l'élément + + + Dense + + + Description + + + Stockage de documents + + + Type de document + + + Télécharger + + + Éditer + + + Identifiant + + + Est public + + + Gérer les attributs étendus + + + Aucune action autorisée + + + Propriétaire + + + Recharger + + + Rechercher + + + Rayé + + + Titre + + + vous + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.id.resx new file mode 100644 index 0000000..4586f7d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.id.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tindakan + + + Telusuri Dokumen yang Tersedia. + + + Tambah Dokumen + + + Tanggal Dibuat + + + Hapus + + + Delete Content + + + Deskripsi + + + Penyimpanan Dokumen + + + Document Type + + + Unduh + + + Sunting + + + Id + + + Dokumen Publik + + + Manage Extended Attributes + + + No Allowed Actions + + + Pemilik + + + Muat Ulang + + + Cari + + + Judul + + + you + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.it.resx new file mode 100644 index 0000000..51932c2 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.it.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Azioni + + + Sfoglia i documenti disponibili. + + + Crea + + + Data di Creazione + + + Elimina + + + Delete Content + + + Descrizione + + + Archivio documenti + + + Document Type + + + Download + + + Modifica + + + Id + + + E' Pubblico + + + Manage Extended Attributes + + + No Allowed Actions + + + Proprietario + + + Ricarica + + + Cerca + + + Titolo + + + you + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.km.resx new file mode 100644 index 0000000..d1d4b53 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.km.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + សកម្មភាព + + + រកមើលឯកសារមានទាំងអស់ + + + បង្កើត + + + កាលបរិឆ្ឆេទបង្កើត + + + លុប + + + អត្ថបទត្រូវបានលុប + + + ការពិពណ៌នា + + + តំបន់រក្សាទុកឯកសារ + + + ប្រភេទឯកសារ + + + ទាញយក + + + កែប្រែ + + + លេខកូដសម្ងាត់ + + + ធ្វើអោយជាសាធារណះ + + + គ្រប់គ្រង ជួរឈរបន្ថែម + + + សកម្មភាពមិនបានអនុញ្ញាត្ត + + + ម្ខាស់ + + + ផ្ទុកឡើងវិញ + + + ស្វែងរក + + + ចំណងជើង + + + អ្នក + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.nl.resx new file mode 100644 index 0000000..5f962f4 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.nl.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acties + + + Grenst aan + + + Blader door beschikbare documenten. + + + Aanmaken + + + Datum gemaakt + + + Verwijderen + + + Inhoud verwijderen + + + Dicht + + + Beschrijving + + + Documentopslag + + + Documenttype + + + Downloaden + + + Bewerken + + + Id + + + Is openbaar + + + Uitgebreide kenmerken beheren + + + Geen toegestane acties + + + Eigenaar + + + Herladen + + + Zoeken + + + Gestreept + + + Titel + + + jij + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.ru.resx new file mode 100644 index 0000000..6f251e4 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.ru.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Действия + + + Обрамлённый + + + Обзор доступных документов. + + + Создать + + + Дата создания + + + Удалить + + + Удалить контент + + + Компактный + + + Описание + + + Хранилище документов + + + Тип документа + + + Скачать + + + Редактировать + + + Id + + + Публичный + + + Управление атрибутами + + + Нет доступных действий + + + Владелец + + + Перезагрузить + + + Поиск документов + + + Чередующийся + + + Заголовок + + + Вы + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.sv.resx new file mode 100644 index 0000000..869cdea --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentStore.sv.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Åtgärder + + + Bläddra i tillgängliga dokument. + + + Skapa + + + Skapat datum + + + Radera + + + Delete Content + + + Beskrivning + + + Dokument Förvaring + + + Document Type + + + Ladda Ner + + + Ändra + + + Id + + + Är Offentlig + + + Manage Extended Attributes + + + No Allowed Actions + + + Ägare + + + Ladda Om + + + Sök + + + Rubrik + + + you + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.ar.resx new file mode 100644 index 0000000..d317b38 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.ar.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أجراءات + + + يحدها + + + إنشاء + + + حذف + + + حذف المحتوى + + + كثيف + + + وصف + + + أنواع المستندات + + + أنواع المستندات التي تم تصديرها + + + يحرر + + + يصدر + + + تم تصدير أنواع المستندات التي تمت تصفيتها + + + المعرف + + + إدارة أنواع المستندات. + + + اسم + + + لا توجد إجراءات مسموح بها + + + إعادة تحميل + + + ابحث عن أنواع المستندات + + + مخطط + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.de.resx new file mode 100644 index 0000000..930df1f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.de.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Gerahmt + + + Erstellen + + + Löschen + + + Inhalt löschen + + + Schmal + + + Beschreibung + + + Dokumenttypen + + + Dokumenttypen exportiert + + + Bearbeiten + + + Export + + + Gefilterte Dokumenttypen exportiert + + + Id + + + Dokumenttypen verwalten. + + + Name + + + Keine Aktionen erlaubt + + + Neu laden + + + Nach Dokumenttypen suchen + + + Gebändert + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.en.resx new file mode 100644 index 0000000..ba73b34 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.en.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Bordered + + + Create + + + Delete + + + Delete Content + + + Dense + + + Description + + + Document Types + + + Document Types exported + + + Edit + + + Export + + + Filtered Document Types exported + + + Id + + + Manage Document Types. + + + Name + + + No Allowed Actions + + + Reload + + + Search for Document Types + + + Striped + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.es.resx new file mode 100644 index 0000000..527d617 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.es.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acciones + + + Bordeado + + + Crear + + + Borrar + + + ¿Desea borrar el registro? + + + Denso + + + Descripción + + + Tipos de Documentos + + + Tipos de Documentos exportados + + + Editar + + + Exportar + + + Tipos de Documentos Filtrados exportados + + + Id + + + Administar Tipos de Documentos. + + + Nombre + + + Acciones no Permitidas + + + Recargar + + + Buscar Tipos de Documentos + + + Rayado + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.fr.resx new file mode 100644 index 0000000..19ca0fb --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.fr.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Avec bordures + + + Création + + + Suppression + + + Supprimer l'élément + + + Dense + + + Description + + + Types de documents + + + Types de documents exportés + + + Éditer + + + Exporter + + + Types de documents filtrés exportés + + + Identifiants + + + Gérer les types de documents + + + Nom + + + Aucune action autorisée + + + Recharger + + + Rechercher parmis les types de documents + + + Rayé + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.km.resx new file mode 100644 index 0000000..2ab117c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.km.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + សកម្មភាព + + + ព្រុំប្រទល់ + + + បង្កើត + + + លុប + + + លុបខ្លឹមសារ + + + ពង្រួម + + + ពិពណ៌នា + + + ប្រភេទឯកសារ + + + ប្រភេទឯកសារនាំចេញ + + + កែប្រែ + + + នាំចេញ + + + ច្រោះប្រភេទឯកសារនាំចេញ + + + លេខកូដ + + + គ្រប់គ្រងប្រភេទឯកសារ + + + ឈ្មោះ + + + សកម្មភាពមិនអនុញ្ញាត្ត + + + ផ្ទុកឡើងវិញ + + + ស្វែងរកប្រភេទឯកសារ + + + ឆ្លាស់ពណ៌ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.nl.resx new file mode 100644 index 0000000..65e8af1 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.nl.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acties + + + Grenst aan + + + Aanmaken + + + Verwijderen + + + Inhoud verwijderen + + + Dicht + + + Beschrijving + + + Documenttypen + + + Geëxporteerde documenttypen + + + Bewerken + + + Exporteren + + + Gefilterde documenttypen geëxporteerd + + + Id + + + Documenttypen beheren. + + + Naam + + + Geen toegestane acties + + + Herladen + + + Zoeken naar documenttypen + + + Gestreept + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.ru.resx new file mode 100644 index 0000000..1d369bb --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Misc/DocumentTypes.ru.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Действия + + + Обрамлённый + + + Создать + + + Удалить + + + Удалить контент + + + Компактный + + + Описание + + + Типы документов + + + Типы документов экспортированы + + + Редактировать + + + Экспорт в Excel + + + Отфильтрованные типы документов экспортированы + + + Id + + + Управление типами документов. + + + Наименование + + + Нет доступных действий + + + Перезагрузить + + + Поиск типов документов... + + + Чередующийся + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/Tenants.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/Tenants.de.resx new file mode 100644 index 0000000..f0beede --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/Tenants.de.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktiv + + + E-Mail-Adresse des Administrators + + + Name + + + Gültig bis + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/Tenants.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/Tenants.en.resx new file mode 100644 index 0000000..383c6a7 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/Tenants.en.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Active + + + Admin Email + + + Name + + + Valid Upto + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/Tenants.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/Tenants.it.resx new file mode 100644 index 0000000..356ba8f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/Tenants.it.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Attivo + + + Email (Adm) + + + Nome + + + Valito fino a + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.de.resx new file mode 100644 index 0000000..75eeef9 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.de.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Abbrechen + + + Aktuelles Ablaufdatum + + + Neues Ablaufdatum + + + Aktualisieren + + + Abonnement aktualisieren + + + Abonnement aktualisiert. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.en.resx new file mode 100644 index 0000000..c788ea0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.en.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Current Expiry Date + + + New Expiry Date + + + Upgrade + + + Upgrade Subscription + + + Upgraded Subscription. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.it.resx new file mode 100644 index 0000000..87d54c5 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.it.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annulla + + + Data di scadenza + + + Nuova data di scadenza + + + Aggiornamento + + + Aggiorna Subscription + + + Subscription Aggiornata. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.ar.resx new file mode 100644 index 0000000..2bacb36 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.ar.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + مسارات المراجعة + + + تم تصدير مسارات التدقيق + + + يحدها + + + الغاء + + + مسح + + + تتأثر الأعمدة + + + تاريخ + + + النطاق الزمني للبحث + + + كثيف + + + تفاصيل معرف الممر + + + تصدير إلى Excel + + + تم تصدير مسارات التدقيق المصفاة + + + إخفاء + + + المعرف + + + محلي + + + قيم جديدة + + + موافق + + + المفتاح الأساسي + + + ابحث عن مسارات + + + ابحث في القيم الجديدة + + + ابحث في القيم القديمة + + + ابحث في القيم القديمة + + + عرض + + + مخطط + + + اسم الجدول + + + تفاضيل + + + نوع + + + التوقيت العالمي + + + أنشطتك الأخيرة. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.de.resx new file mode 100644 index 0000000..f16282e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.de.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Prüfpfade + + + Prüfpfade aktualisiert + + + Gerahmt + + + Abbrechen + + + Leeren + + + Betroffene Spalten + + + Datum + + + Zeitraum für Suche + + + Schmal + + + Details zur Prüfpfad-Id + + + Zu Excel exportieren + + + Gefilterte Prüfpfade exported + + + Verstecken + + + Id + + + Lokal + + + Neue Werte + + + Ok + + + Alte Werte + + + Primärschlüssekl + + + Nach Prüfpfaden suchen + + + In neuen Werten suchen + + + In alten Werten suchen + + + Anzeigen + + + Gebändert + + + Tabellenname + + + Prüfpfad-Details + + + Typ + + + UTC + + + Deine letzten Aktivitäten. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.en.resx new file mode 100644 index 0000000..c6b6a01 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.en.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Audit Trails + + + Audit Trails exported + + + Bordered + + + Cancel + + + Clear + + + Columns Affected + + + Date + + + Date Range For Searching + + + Dense + + + Details for Trail ID + + + Export To Excel + + + Filtered Audit Trails exported + + + Hide + + + Id + + + Local + + + New Values + + + Ok + + + Old Values + + + Primary Key + + + Search for Trails + + + Search in New Values + + + Search in Old Values + + + Show + + + Striped + + + Table Name + + + Trail Details + + + Type + + + UTC + + + Your Recent Activities. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.es.resx new file mode 100644 index 0000000..a363e1c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.es.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Registro de Auditoría + + + Registro de Auditoría exportado + + + Bordeado + + + Cancelar + + + Limpiar + + + Columnas Afectadas + + + Fecha + + + Rango de Fechas para Búsqueda + + + Denso + + + Detalles para Registro ID + + + Exportar a Excel + + + Registros de Auditoría Filtrados exportados + + + Ocultar + + + Id + + + Local + + + Nuevos Valores + + + Ok + + + Valores Anteriores + + + Clave Primaria + + + Buscar Registros + + + Buscar en Valores Nuevos + + + Buscar en Valores Anteriores + + + Mostrar + + + Rayado + + + Nombre de Tabla + + + Detalle de Registro + + + Tipo + + + UTC + + + Su actividad reciente. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.fr.resx new file mode 100644 index 0000000..f2029e1 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.fr.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Pistes d'audit + + + Pistes d'audit exportées + + + Avec bordures + + + Annulées + + + Effacer + + + Colonnes affectées + + + Date + + + Plage de dates pour la recherche + + + Dense + + + Détail de la piste d'identifiant + + + Exporter vers Excel + + + Pistes d'audit filtrés exportées + + + Cacher + + + Identifiant + + + Local + + + Nouvelles valeurs + + + OK + + + Anciennes valeurs + + + Clé primaire + + + Rechercher des pistes + + + Rechercher parmis les nouvelles valeurs + + + Rechercher parmis les anciennes valeurs + + + Afficher + + + Rayé + + + Nom de la table + + + Détails de la piste + + + Type + + + UTC + + + Activité récente + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.it.resx new file mode 100644 index 0000000..c3eab91 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.it.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Registro Attività + + + Audit Trails exported + + + Colonne Interessate + + + Data + + + Dettagli per ID Attività + + + Esporta in Excel + + + Filtered Audit Trails exported + + + Nascondi + + + Id + + + Locale + + + Nuovi valori + + + Vecchi valori + + + Chiave Primaria + + + Cerca Attività + + + Mostra + + + Nome Tabella + + + Dettagli Attività + + + Tipo + + + UTC + + + Le tue Attività Recenti. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.km.resx new file mode 100644 index 0000000..d3a1341 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.km.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + កំណត់ត្រាប្រព័ន្ធ + + + កំណត់ត្រាប្រព័ន្ធ នាំចេញ + + + ជួរឈរដែលបានកែប្រែ + + + កាលបរិច្ឆេទ + + + កំណត់ត្រាលម្អិតសម្រាប់កំណត់ត្រាដែលមានលេខសម្ងាល់ + + + បម្លែងជា​ Excel + + + ច្រោះកំណត់ត្រាប្រព័ន្ធនាំចេញ + + + បិទ + + + លេខកូដសម្ងាល់ + + + ខាងក្នុង + + + តម្លៃថ្មី + + + តម្លៃចាស់ + + + លេខសម្គាល់គោល + + + ស្វែងរកកំណត់ត្រាប្រព័ន្ធ + + + បង្ហាញ + + + ឈ្មោះតារាង + + + កំណត់ត្រាលម្អិត + + + ប្រភេទ + + + ម៉ោងសកល + + + សកម្មភាពរបស់អ្នកចុងក្រោយ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.nl.resx new file mode 100644 index 0000000..b84bf72 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.nl.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Audit Trails + + + Audit Trails geëxporteerd + + + Grenst aan + + + Annuleren + + + Duidelijk + + + Betrokken kolommen + + + Datum + + + Datumbereik voor zoeken + + + Dicht + + + Details voor Trail ID + + + Exporteren naar Excel + + + Gefilterde controletrails geëxporteerd + + + Verbergen + + + Id + + + Lokaal + + + Nieuwe Waarden + + + OK + + + Oude Waarden + + + Primary Key + + + Zoeken naar paden + + + Zoeken in nieuwe waarden + + + Zoeken in oude waarden + + + Tonen + + + Gestreept + + + Table Naam + + + Trail Details + + + Type + + + UTC + + + Uw recente activiteiten. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.ru.resx new file mode 100644 index 0000000..583705f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.ru.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Журналы аудита + + + Журналы аудита экспортированы + + + Обрамлённый + + + Отмена + + + Очистить + + + Затронутые стобцы + + + Дата + + + Диапазон дат для поиска + + + Компактный + + + Детали для записи с ID + + + Экспорт в Excel + + + Отфильтрованные журналы аудита экспортированы + + + Скрыть + + + Id + + + Локальное + + + Новые значения + + + Ok + + + Старые значения + + + Первичный ключ + + + Поиск в журналах + + + Искать в новых значениях + + + Искать в старых значениях + + + Показать + + + Чередующийся + + + Имя таблицы + + + Детали записи в журнале + + + Тип + + + UTC + + + Ваша текущая активность. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.sv.resx new file mode 100644 index 0000000..3b95b8b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/AuditLogs.sv.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Granskningsspår + + + Audit Trails exported + + + Berörda kolumner + + + Datum + + + Detaljer för Spår ID + + + Exportera till Excel + + + Filtered Audit Trails exported + + + Göm + + + Id + + + Lokalt + + + Nya Värden + + + Gamla Värden + + + Primärnyckel + + + Sök efter spår + + + Visa + + + Tabellnamn + + + Spår Detaljer + + + Typ + + + UTC + + + Dina senaste aktiviteter. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.ar.resx new file mode 100644 index 0000000..a803152 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.ar.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أبريل + + + أغسطس + + + العلامات التجارية + + + الرسوم البيانية قادمة قريبا + + + لوحة القيادة + + + ديسمبر + + + سمات المستند الممتدة + + + أنواع المستندات + + + وثائق + + + فبراير + + + يناير + + + يوليو + + + يونيو + + + مارس + + + مايو + + + نوفمبر + + + أكتوبر + + + منتجات + + + رؤى سريعة. + + + تحديثات الوقت الحقيقي & رؤى مع SignalR. + + + الأدوار المسجلة + + + المستخدمون المسجلون + + + سبتمبر + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.de.resx new file mode 100644 index 0000000..a20fd84 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.de.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Apr + + + Aug + + + Marken + + + Diagramme kommen bald... + + + Dashboard + + + Dez + + + Erweiterte Dokumentattribute + + + Dokumenttypen + + + Dokumente + + + Feb + + + Jan + + + Jul + + + Jun + + + Mär + + + Mai + + + Nov + + + Okt + + + Produkte + + + Schnelle Einblicke. + + + Echtzeitaktualisierungen & Einblicke mit SignalR. + + + Registrierte Rollen + + + Registrierte Benutzer + + + Sep + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.en.resx new file mode 100644 index 0000000..0ec5a3f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.en.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Apr + + + Aug + + + Brands + + + Charts comming soon ish... + + + Dashboard + + + Dec + + + Document Extended Attributes + + + Document Types + + + Documents + + + Feb + + + Jan + + + Jul + + + Jun + + + Mar + + + May + + + Nov + + + Oct + + + Products + + + Quick Insights. + + + Realtime Updates & Insights with SignalR. + + + Registered Roles + + + Registered Users + + + Sep + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.es.resx new file mode 100644 index 0000000..e278606 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.es.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Abr + + + Ago + + + Marcas + + + Próximamente gráficos... + + + Panel de Control + + + Dic + + + Atributos Extendidos de Documentos + + + Tipos de Documentos + + + Documentos + + + Feb + + + Ene + + + Jul + + + Jun + + + Mar + + + May + + + Nov + + + Oct + + + Productos + + + Perspectivas Rápidas. + + + Actualizaciones en Tiempo Real & Perspectivas con SignalR. + + + Roles Registrados + + + Usuarios Registrados + + + Sep + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.fr.resx new file mode 100644 index 0000000..819beeb --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.fr.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Avr. + + + Août + + + Marques + + + Tableau de bord + + + Déc. + + + Attributs étendus des documents + + + Types de documents + + + Documents + + + Févr. + + + Janv. + + + Juill. + + + Juin + + + Mars + + + Mai + + + Nov. + + + Oct. + + + Produits + + + Aperçus rapides. + + + Mises à jour en temps réel & aperçus avec SignalR. + + + Roles enregistrés + + + Utilisateurs enregistrés + + + Sept. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.id.resx new file mode 100644 index 0000000..c7a7fed --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.id.resx @@ -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 + + + Merek + + + Grafik akan segera hadir... + + + Dasbor + + + Document Extended Attributes + + + Document Types + + + Documents + + + Produk + + + Wawasan Singkat. + + + Wewenang Terdaftar + + + Pengguna Terdaftar + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.it.resx new file mode 100644 index 0000000..316467e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.it.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Prodotti + + + Utenti registrati + + + Marche + + + Grafici... coming soon... + + + Dashboard + + + Approfondimenti rapidi. + + + Ruoli registrati + + + Documenti + + + Tipi di documenti + + + Document Extended Attributes + + + Aggiornamenti in tempo reale e approfondimenti con SignalR + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.km.resx new file mode 100644 index 0000000..809c44a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.km.resx @@ -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 + + + ម៉ាក + + + ផ្ទាំងឆាតនឹងមកដល់ឆាប់ៗនេះ + + + ផ្ទាំងទិន្នន័យ + + + ជួរឈរឯកសារ + + + ប្រភេទឯកសារ + + + ឯកសារ + + + ផលិតផល + + + ផ្ទាំងទិន្នន័យសង្ខេប + + + ចំនួនតួនាទីសរុប + + + ចំនួនអ្នកប្រើប្រាស់សរុប + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.nl.resx new file mode 100644 index 0000000..d5e9851 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.nl.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Apr + + + Aug + + + Merken + + + Grafieken binnenkort ish... + + + Dashboard + + + Dec + + + Uitgebreide kenmerken van document + + + Documenttypen + + + Documenten + + + Februari + + + Jan + + + Jul + + + Jun + + + Mar + + + Mei + + + Nov + + + Oct + + + Producten + + + Snelle inzichten. + + + Realtime updates en inzichten met SignalR. + + + Geregistreerde rollen + + + Geregistreerde gebruikers + + + Sep + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.ru.resx new file mode 100644 index 0000000..fab4703 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.ru.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Апр + + + Авг + + + Брендов + + + Графики скоро появятся ... + + + Dashboard + + + Дек + + + Расширенных атрибутов документов + + + Типов документов + + + Документов + + + Фев + + + Янв + + + Июл + + + Июн + + + Мрт + + + Май + + + Ноя + + + Окт + + + Продуктов + + + Быстрая информация. + + + Обновления и аналитика в реальном времени с помощью SignalR. + + + Ролей + + + Пользователей + + + Сен + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.sv.resx new file mode 100644 index 0000000..25c864d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Pages/Personal/Dashboard.sv.resx @@ -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 + + + Varumärken + + + Diagram kommer ganska snart... + + + Instrumentpanel + + + Document Extended Attributes + + + Document Types + + + Documents + + + Produkter + + + Snabba insikter. + + + Registrerade Roller + + + Registrerade Användare + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ar.resx new file mode 100644 index 0000000..5642e31 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ar.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + إضافة الخصائص الإضافية + + + إلغاء + + + مسح + + + تاريخ + + + عشري + + + وصف + + + رقم المعرف + + + المعرف الخارجي + + + مجموعة + + + المعرف + + + مفعل؟ + + + Json + + + مفتاح + + + موافق + + + حفظ + + + نص + + + وقت + + + نوع + + + تحديث + + + تحديث الخصائص الإضافية + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.de.resx new file mode 100644 index 0000000..7c7cd54 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.de.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Erweiterte Attribute hinzufügen + + + Abbrechen + + + Leeren + + + Datum + + + Dezimal + + + Beschreibung + + + Objekt-Id + + + Externe Id + + + Gruppe + + + Id + + + Ist Aktiv + + + Json + + + Schlüssel + + + Ok + + + Speichern + + + Text + + + Zeit + + + Typ + + + Aktualisieren + + + Erweiterte Attribute aktualieren + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.en.resx new file mode 100644 index 0000000..9e1f7c0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.en.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Extended Attribute + + + Cancel + + + Clear + + + Date + + + Decimal + + + Description + + + Entity Id + + + External Id + + + Group + + + Id + + + Is Active + + + Json + + + Key + + + Ok + + + Save + + + Text + + + Time + + + Type + + + Update + + + Update Extended Attribute + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.es.resx new file mode 100644 index 0000000..e061dff --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.es.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Agregar Atributo Extendido + + + Cancelar + + + Limpiar + + + Fecha + + + Decimal + + + Descripción + + + Id de Entidad + + + Id Externo + + + Grupo + + + Id + + + ¿Está Activo? + + + Json + + + Clave + + + Ok + + + Guardar + + + Texto + + + Hora + + + Tipo + + + Actualizar + + + Actualizar Atributos Extendidos + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.fr.resx new file mode 100644 index 0000000..0cbb20b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.fr.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ajouter un attribut étendu + + + Annuler + + + Effacer + + + Date + + + Décimal + + + Description + + + Identifiant de l'entité + + + Identifiant externe + + + Groupe + + + Identifiant + + + Est actif + + + Json + + + Clé + + + OK + + + Sauvegarder + + + Texte + + + Heure + + + Type + + + Mettre à jour + + + Mettre à jour l'attribut étendu + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.id.resx new file mode 100644 index 0000000..9e1f7c0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.id.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Extended Attribute + + + Cancel + + + Clear + + + Date + + + Decimal + + + Description + + + Entity Id + + + External Id + + + Group + + + Id + + + Is Active + + + Json + + + Key + + + Ok + + + Save + + + Text + + + Time + + + Type + + + Update + + + Update Extended Attribute + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.it.resx new file mode 100644 index 0000000..ff5ace2 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.it.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Extended Attribute + + + Annulla + + + Pulisci + + + Date + + + Decimal + + + Description + + + Entity Id + + + External Id + + + Group + + + Id + + + IsActive + + + Json + + + Key + + + Ok + + + Salva + + + Text + + + Time + + + Type + + + Aggiorna + + + Update Extended Attribute + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.km.resx new file mode 100644 index 0000000..184bb9f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.km.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បន្ធែមជួរឈរ + + + បោះបង់ + + + សម្អាត + + + Date + + + Decimal + + + ពិពណ៌នា + + + Entity Id + + + External Id + + + ក្រុម + + + Id + + + គឺសកម្ម + + + Json + + + Key + + + អូខេ + + + រក្សាទុក + + + Text + + + Time + + + ប្រភេទ + + + បច្ចុប្បន្នភាព + + + បច្ចុប្បន្នភាពជួរឈរបន្ថែម + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.nl.resx new file mode 100644 index 0000000..1a8594e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.nl.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Uitgebreid kenmerk toevoegen + + + Annuleren + + + Duidelijk + + + Datum + + + Decimaal + + + Beschrijving + + + Entiteits-id + + + Externe id + + + Groep + + + Id + + + Is actief + + + Json + + + Sleutel + + + OK + + + Opslaan + + + Sms + + + Tijd + + + Type + + + Update + + + Uitgebreid kenmerk bijwerken + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ru.resx new file mode 100644 index 0000000..934224d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ru.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Добавить расширенный атрибут + + + Отмена + + + Очистить + + + Дата + + + Числовое значение + + + Описание + + + Id сущности + + + Внешний Id + + + Группа + + + Id + + + Активный? + + + Json значение + + + Ключ + + + Ок + + + Сохранить + + + Текстовое значение + + + Время + + + Тип + + + Обновить + + + Обновить расширенный атрибут + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.sv.resx new file mode 100644 index 0000000..9e1f7c0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.sv.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Extended Attribute + + + Cancel + + + Clear + + + Date + + + Decimal + + + Description + + + Entity Id + + + External Id + + + Group + + + Id + + + Is Active + + + Json + + + Key + + + Ok + + + Save + + + Text + + + Time + + + Type + + + Update + + + Update Extended Attribute + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ar.resx new file mode 100644 index 0000000..ca79862 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ar.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أجراءات + + + كل المجموعات + + + Bordered + + + إنشاء + + + حذف + + + هل تريد حذف السمة الموسعة؟ + + + كثيف + + + وصف + + + تعديل + + + معرف الكينونة + + + تصدير + + + الخصائص الإضافية التي تم تصديرها + + + معرف خارجي + + + تم تصدير السمات الموسعة التي تمت تصفيتها + + + مجموعة + + + رقم المعرف + + + تضمين حقول الكينونة (تصدير) + + + نشط؟ + + + مفتاح + + + إدارة الخصائص الإضافية {0} + + + إدارة سمات {0} {1} الموسعة + + + لا توجد إجراءات مسموح بها + + + غير مسموح. + + + مجموعة مختارة فقط (تصدير) + + + مالك + + + إعادة تحميل + + + ابحث عن {0} السمات الموسعة + + + مخطط + + + نوع + + + قيمة + + + أنت + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.de.resx new file mode 100644 index 0000000..f7b7111 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.de.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Alle Gruppen + + + Gebändert + + + Erstellen + + + Löschen + + + Erweiterte Attribute löschen? + + + Schmal + + + Beschreibung + + + Bearbeiten + + + Objekt-Id + + + Export + + + Erweiterte Attribute exportiert + + + Externe Id + + + Gefilterte erweiterte Attribute exportiert + + + Gruppe + + + Id + + + Objektfelder einschließen (Export) + + + Ist Aktiv + + + Schlüssel + + + Verwalte {0} erweiterte Attribute + + + Verwalte erweiterte {0} Attribute von {1} + + + No Allowed Actions + + + Not Allowed. + + + Only Selected Group (Export) + + + Owner + + + Reload + + + Search For {0} Extended Attributes + + + Striped + + + Type + + + Value + + + you + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.en.resx new file mode 100644 index 0000000..4270e95 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.en.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + All Groups + + + Bordered + + + Create + + + Delete + + + Delete Extended Attribute? + + + Dense + + + Description + + + Edit + + + Entity Id + + + Export + + + Extended Attributes exported + + + External Id + + + Filtered Extended Attributes exported + + + Group + + + Id + + + Include Entity fields (Export) + + + Is Active + + + Key + + + Manage {0} Extended Attributes + + + Manage {0} {1}'s Extended Attributes + + + No Allowed Actions + + + Not Allowed. + + + Only Selected Group (Export) + + + Owner + + + Reload + + + Search For {0} Extended Attributes + + + Striped + + + Type + + + Value + + + you + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.es.resx new file mode 100644 index 0000000..1cfea1f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.es.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acciones + + + Todos los Grupos + + + Bordeado + + + Crear + + + Borrar + + + ¿Eliminar Atributo Extendido? + + + Denso + + + Descripción + + + Editar + + + Id de Entidad + + + Exportar + + + Atributos Extendidos exportados + + + Id Externo + + + Atributos Extendidos Filtrados exportados + + + Grupo + + + Id + + + Incluir campos de Entidad (Exportar) + + + ¿Está Activo? + + + Clave + + + Administrar Atributos Extendidos ({0}) + + + Administrar los Atributos Extendidos de: {0}-{1} + + + Acciones no Permitidas + + + No Permitido. + + + Solo el Grupo Seleccionado (Exportar) + + + Propietario + + + Recargar + + + Buscar Atributos Extendidos ({0}) + + + Rayado + + + Tipo + + + Valor + + + Ud. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.fr.resx new file mode 100644 index 0000000..706054b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.fr.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Tous les groupes + + + Avec bordure + + + Créer + + + Supprimer + + + Supprimer l'attribut étendu ? + + + Dense + + + Description + + + Éditer + + + Identifiant de l'entité + + + Exporter + + + Attributs étendus exportés + + + Identifiant externe + + + Attributs étendus filtrés exportés + + + Groupe + + + Identifiant + + + Inclure tous les champs (export) + + + Est actif + + + Clé + + + Gérer les attributs étendus de {0} + + + Gérer les attributs étendus de {0} {1} + + + Aucune action autorisée + + + Non autorisé. + + + Seulement les groupes sélectionné (export) + + + Propriétaire + + + Recharger + + + Rechercher les attributs étendus de {0} + + + Rayé + + + Type + + + Valeur + + + vous + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.id.resx new file mode 100644 index 0000000..4270e95 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.id.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + All Groups + + + Bordered + + + Create + + + Delete + + + Delete Extended Attribute? + + + Dense + + + Description + + + Edit + + + Entity Id + + + Export + + + Extended Attributes exported + + + External Id + + + Filtered Extended Attributes exported + + + Group + + + Id + + + Include Entity fields (Export) + + + Is Active + + + Key + + + Manage {0} Extended Attributes + + + Manage {0} {1}'s Extended Attributes + + + No Allowed Actions + + + Not Allowed. + + + Only Selected Group (Export) + + + Owner + + + Reload + + + Search For {0} Extended Attributes + + + Striped + + + Type + + + Value + + + you + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.it.resx new file mode 100644 index 0000000..4fb941f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.it.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Azioni + + + All Groups + + + Bordered + + + Crea + + + Cancella + + + Delete Extended Attribute? + + + Dense + + + Descrizione + + + Modifica + + + Entity Id + + + Esporta + + + Extended Attributes exported + + + External Id + + + Filtered Extended Attributes exported + + + Gruppo + + + Id + + + Include Entity fields (Export) + + + Attivo + + + Key + + + Manage {0} Extended Attributes + + + Manage {0} {1}'s Extended Attributes + + + Nessuna azione è consentita + + + Non consentito + + + Solo il gruppo selezionato (Export) + + + Owner + + + Ricarica + + + Search For {0} Extended Attributes + + + Striped + + + Tipo + + + Valore + + + you + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.km.resx new file mode 100644 index 0000000..a88e072 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.km.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + សកម្មភាព + + + ក្រុមទាំងអស់ + + + ព្រុំព្រទល់ + + + បង្កើត + + + លុប + + + លុបជួរឈរបន្ថែម? + + + បង្រួម + + + ពិពណ៌នា + + + កែប្រែ + + + Entity Id + + + នាំចេញ + + + ជួរឈរបន្ថែមនាំចេញ + + + External Id + + + ច្រោះជួរឈរបន្ថែមនាំចេញ + + + ក្រុម + + + Id + + + Include Entity fields (Export) + + + គឺសកម្ម + + + Key + + + Manage {0} Extended Attributes + + + Manage {0} {1}'s Extended Attributes + + + មិនត្រូវបានអនុញ្ញាត + + + មិនអនុញ្ញាត្ត + + + Only Selected Group (Export) + + + ម្ចាស់ + + + ផ្ទុកឡើងវិញ + + + Search For {0} Extended Attributes + + + Striped + + + ប្រភេទ + + + តម្លៃ + + + you + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.nl.resx new file mode 100644 index 0000000..b54e93e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.nl.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acties + + + Alle groepen + + + Grenst aan + + + Aanmaken + + + Verwijderen + + + Uitgebreid kenmerk verwijderen? + + + Dicht + + + Beschrijving + + + Bewerken + + + Entiteits-id + + + Exporteren + + + Geëxporteerde uitgebreide kenmerken + + + Externe id + + + Gefilterde uitgebreide kenmerken geëxporteerd + + + Groep + + + Id + + + Entiteitsvelden opnemen (exporteren) + + + Is actief + + + Sleutel + + + Uitgebreide kenmerken beheren {0} + + + Uitgebreide kenmerken van {0} {1} beheren + + + Geen toegestane acties + + + Niet toegestaan. + + + Alleen geselecteerde groep (exporteren) + + + Eigenaar + + + Herladen + + + Zoeken naar {0} uitgebreide kenmerken + + + Gestreept + + + Type + + + Waarde + + + jij + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ru.resx new file mode 100644 index 0000000..7ec3a74 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ru.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Действия + + + Все группы + + + Обрамлённый + + + Создать + + + Удалить + + + Удалить расширенный атрибут? + + + Компактный + + + Описание + + + Редактировать + + + Id сущности + + + Экспорт в Excel + + + Расширенные атрибуты экспортированы + + + Внешний Id + + + Отфильтрованные расширенные атрибуты экспортированы + + + Группа + + + Id + + + Включить поля сущности (Экспорт) + + + Активный? + + + Ключ + + + Управление расширенными атрибутами {0} + + + Управление расширенными атрибутами {1} с Id = {0} + + + Нет доступных действий + + + Нет доступа. + + + Только выбранную группу (Экспорт) + + + Владелец + + + Перезагрузить + + + Поиск расширенных атрибутов {0} + + + Чередующийся + + + Тип + + + Значение + + + Вы + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.sv.resx new file mode 100644 index 0000000..4270e95 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.sv.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + All Groups + + + Bordered + + + Create + + + Delete + + + Delete Extended Attribute? + + + Dense + + + Description + + + Edit + + + Entity Id + + + Export + + + Extended Attributes exported + + + External Id + + + Filtered Extended Attributes exported + + + Group + + + Id + + + Include Entity fields (Export) + + + Is Active + + + Key + + + Manage {0} Extended Attributes + + + Manage {0} {1}'s Extended Attributes + + + No Allowed Actions + + + Not Allowed. + + + Only Selected Group (Export) + + + Owner + + + Reload + + + Search For {0} Extended Attributes + + + Striped + + + Type + + + Value + + + you + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.ar.resx new file mode 100644 index 0000000..23dee1b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.ar.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + إلغاء + + + استيراد + + + الرجاء رفع ملف اكسل! + + + رفع + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.de.resx new file mode 100644 index 0000000..fd884a0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.de.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Abbrechen + + + Importieren + + + Bitte lade eine Excel-Datei hoch! + + + Hochladen + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.en.resx new file mode 100644 index 0000000..7d6c332 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.en.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Import + + + Please upload excel file! + + + Upload + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.es.resx new file mode 100644 index 0000000..cb3b505 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.es.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancelar + + + Importar + + + Por favor subar el archivo Excel! + + + Subir + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.fr.resx new file mode 100644 index 0000000..eece67a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.fr.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annuler + + + Importer + + + Merci de téléverser un fichier excel ! + + + Téléverser + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.id.resx new file mode 100644 index 0000000..7d6c332 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.id.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Import + + + Please upload excel file! + + + Upload + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.it.resx new file mode 100644 index 0000000..7d6c332 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.it.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Import + + + Please upload excel file! + + + Upload + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.km.resx new file mode 100644 index 0000000..7d6c332 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.km.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Import + + + Please upload excel file! + + + Upload + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.nl.resx new file mode 100644 index 0000000..719c7eb --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.nl.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annuleren + + + Importeren + + + Upload excel-bestand! + + + Uploaden + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.ru.resx new file mode 100644 index 0000000..6cbf650 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.ru.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Отмена + + + Импорт + + + Пожалуйста, загрузите excel файл! + + + Загрузить + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.sv.resx new file mode 100644 index 0000000..7d6c332 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/ImportExcelModal.sv.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Import + + + Please upload excel file! + + + Upload + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.ar.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.ar.resx new file mode 100644 index 0000000..5ab4357 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.ar.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dutch - Netherlands + + + English + + + French + + + German + + + Indonesia + + + Italian + + + Khmer + + + Russian + + + Spanish + + + Swedish + + + عربي + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.de.resx new file mode 100644 index 0000000..0b8081b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.de.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Niederländisch - Nederland + + + Englisch - English + + + Französisch - Français + + + Deutsch + + + Indonesisch - bahasa Indonesia + + + Italienisch - Italiano + + + Khmer - ខ្មែរ + + + Russisch - русский + + + Spanisch - Español + + + Schwedisch - Svenska + + + Arabisch - عربي + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.en.resx new file mode 100644 index 0000000..5ab4357 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.en.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dutch - Netherlands + + + English + + + French + + + German + + + Indonesia + + + Italian + + + Khmer + + + Russian + + + Spanish + + + Swedish + + + عربي + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.es.resx new file mode 100644 index 0000000..3c1f165 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.es.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Holandés - Holanda + + + Inglés + + + Francés + + + Alemán + + + Indonesia + + + Italiano + + + Jemer + + + Ruso + + + Español + + + Sueco + + + عربي + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.fr.resx new file mode 100644 index 0000000..09a7e86 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.fr.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dutch - Netherlands + + + Anglais + + + Français + + + Allemand + + + Indonésie + + + Italien + + + Jemer + + + Russe + + + Espanol + + + Suédois + + + عربي + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.id.resx new file mode 100644 index 0000000..e728993 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.id.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dutch - Netherlands + + + Inggris + + + Perancis + + + Jerman + + + Indonesiano + + + Italia + + + Khmer + + + Rusia + + + Orang Spanyol + + + Orang Swedia + + + عربي + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.it.resx new file mode 100644 index 0000000..001bf81 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.it.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dutch - Netherlands + + + Inglese + + + Francese + + + Tedesco + + + Indonesiano + + + Italiano + + + Khmer + + + Russo + + + Spagnolo + + + Svedese + + + عربي + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.nl.resx new file mode 100644 index 0000000..5ab4357 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.nl.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dutch - Netherlands + + + English + + + French + + + German + + + Indonesia + + + Italian + + + Khmer + + + Russian + + + Spanish + + + Swedish + + + عربي + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.ru.resx new file mode 100644 index 0000000..9290d77 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Components/LanguageSelector.ru.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Голландский - Нидерланды + + + Английский + + + Французский + + + Немецкий + + + Индонезия + + + Итальянский + + + Кхмерский + + + Русский + + + Испанский + + + Шведский + + + عربي + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.en.resx new file mode 100644 index 0000000..ad5c1a2 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.en.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Confirm + + + Delete Confirmation + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.es.resx new file mode 100644 index 0000000..83a4d45 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.es.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancelar + + + Confirmar + + + Confirmación de borrado + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.fr.resx new file mode 100644 index 0000000..8aa2a1a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.fr.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annuler + + + Confirmer + + + Confirmation de suppression + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.id.resx new file mode 100644 index 0000000..33fd900 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.id.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Batal + + + Konfirmasi + + + Konfirmasi Hapus + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.it.resx new file mode 100644 index 0000000..a529978 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.it.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annulla + + + Conferma + + + Conferma eliminazione + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.km.resx new file mode 100644 index 0000000..819d5ff --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.km.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បោះបង់ + + + បញ្ជាក់ + + + បញ្ជាក់លុប + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.nl.resx new file mode 100644 index 0000000..d9fdfce --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.nl.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annuleren + + + Bevestig + + + Verwijder Bevestiging + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.ru.resx new file mode 100644 index 0000000..7b147f7 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.ru.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Отмена + + + Подтвердить + + + Подтвержедние удаления + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.sv.resx new file mode 100644 index 0000000..5a9a09f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.sv.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Avbryt + + + Bekräfta + + + Radera bekräftelse + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.en.resx new file mode 100644 index 0000000..2bb3110 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.en.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Logout Confirmation + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.es.resx new file mode 100644 index 0000000..fa3257a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.es.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancelar + + + Confirmación de Salida + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.fr.resx new file mode 100644 index 0000000..8cc6a39 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.fr.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annuler + + + Confirmation de déconnexion + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.id.resx new file mode 100644 index 0000000..077f91a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.id.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Batal + + + Konfirmasi Keluar + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.it.resx new file mode 100644 index 0000000..d2222c8 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.it.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annulla + + + Conferma Logout + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.km.resx new file mode 100644 index 0000000..8438a5c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.km.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បោះបង់ + + + បញ្ជាក់ពីការចាកចេញពីប្រព័ន្ធ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.nl.resx new file mode 100644 index 0000000..01f52ed --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.nl.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annuleren + + + Afmeldbevestiging + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.ru.resx new file mode 100644 index 0000000..68a6131 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.ru.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Отмена + + + Подтверждение выхода + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.sv.resx new file mode 100644 index 0000000..7ad76d8 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/Logout.sv.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Avbryt + + + Bekräftelse För Utloggning + + \ No newline at end of file diff --git "a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217DeleteConfirmation.ar.resx" "b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217DeleteConfirmation.ar.resx" new file mode 100644 index 0000000..7172f86 --- /dev/null +++ "b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217DeleteConfirmation.ar.resx" @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + الغاء + + + تأكيد + + + تأكيد الحذف + + \ No newline at end of file diff --git "a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217Logout.ar.resx" "b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217Logout.ar.resx" new file mode 100644 index 0000000..c23d9df --- /dev/null +++ "b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217Logout.ar.resx" @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + الغاء + + + تأكيد الخروج + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.de.resx new file mode 100644 index 0000000..819ef5a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.de.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Konto + + + Kauf mir einen Kaffee! + + + Chat? + + + Community + + + Facebook-Gruppe + + + Facebook-Seite + + + Repository forken + + + Ausloggen + + + Möchtest du dich wirklich ausloggen? + + + MudBlazor-Dokumentation + + + Schnellstartanleitung + + + Token aktualisiert. + + + Ressourcen + + + Support + + + Umschalten zum dunklen Modus + + + Rechts nach Links / Links nach Rechts umschalten + + + Willkommen {0} + + + Du wurdest ausgeloggt, weil die Berechtigungen einer deine Rollen aktualisiert wurden. + + + Du wurdest ausgeloggt, weil der Benutzer mit deinem Token gelöscht wurde. + + + Bis bist ausgeloggt. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.en.resx new file mode 100644 index 0000000..ef2c7d0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.en.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Buy Me A Coffee! + + + Chat? + + + Community + + + Facebook Group + + + Facebook Page + + + Fork Repository + + + Logout + + + Do you really want to Logout? + + + MudBlazor Documentation + + + Quick-Start Guide + + + Refreshed Token. + + + Resources + + + Support + + + Toggle Dark Mode + + + Toggle right-to-left/left-to-right + + + Welcome {0} + + + You are logged out because the Permissions of one of your Roles have been updated. + + + You are logged out because the user with your Token has been deleted. + + + You are Logged Out. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.es.resx new file mode 100644 index 0000000..79c64e9 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.es.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cuenta + + + Buy Me A Coffee! + + + Chat? + + + Comunidad + + + Grupo de Facebook + + + Página de Facebook + + + Salir + + + ¿Realmente quiere salir del sistema? + + + Documentación de MudBlazor + + + Guía de Inicio Rápido + + + Token refrescado. + + + Recursos + + + Soporte + + + Alternar modo oscuro + + + Alternar right-to-left/left-to-right + + + Bienvenido {0} + + + Ha cerrado sesión porque los permisos de su Rol han sido actualizados. + + + Ha cerrado sesión porque el usuario asociado a su Token ha sido borrado. + + + Ha cerrado sesión. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.fr.resx new file mode 100644 index 0000000..e3538b8 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.fr.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Compte + + + Buy Me A Coffee! + + + Chatter ? + + + Communauté + + + Grouppe Facebook + + + Page Facebook + + + Forker le dépôt + + + Déconnexion + + + Voulez-vous vraiment vous déconnecter ? + + + Documentation MudBlazor + + + Guide de démarrage rapide + + + Jeton raffraîchi + + + Ressources + + + Support + + + Basculer le mode sombre / mode clair + + + Basculer affichage gauche-droite / droite-gauche + + + Bienvenu {0} + + + Vous avez été déconnecté car les permissions de l'un de vos rôles ont été mise à jour. + + + Vous avez été déconnecté car l'utilisateur lié au jeton a été supprimé. + + + Vous êtes déconnecté. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.id.resx new file mode 100644 index 0000000..33714f0 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.id.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Akun + + + Buy Me A Coffee! + + + Chat? + + + Komunitas + + + Grup Facebook + + + Halaman Facebook + + + Fork Repository + + + Keluar + + + Apakah anda yakin ingin Keluar? + + + Dokumentasi MudBlazor + + + Panduan Awal Singkat + + + Refreshed Token. + + + Resources + + + Dukung + + + Toggle Mode Gelap + + + Toggle right-to-left/left-to-right + + + Selamat Datang {0} + + + You are logged out because the Permissions of one of your Roles have been updated. + + + You are logged out because the user with your Token has been deleted. + + + You are Logged Out. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.it.resx new file mode 100644 index 0000000..5140d04 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.it.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Buy Me A Coffee! + + + Chat? + + + Community + + + Gruppo Facebook + + + Pagina Facebook + + + Fork Repository + + + Logout + + + Vuoi effettuare il Logout? + + + Documentazione MudBlazor + + + Guida rapida + + + Refreshed Token. + + + Risorse + + + Supporto + + + Attiva la modalità scura + + + Toggle right-to-left/left-to-right + + + Benvenuto {0} + + + You are logged out because the Permissions of one of your Roles have been updated. + + + You are logged out because the user with your Token has been deleted. + + + You are Logged Out. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.km.resx new file mode 100644 index 0000000..227e366 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.km.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + គណនី + + + ទិញកាហ្វេមួយមក! + + + ឆាត? + + + សហគមន៍ + + + ក្រុមហ្វេសប៊ុក + + + ទំព័រហ្វេសប៊ុក + + + ចាកចេញ + + + តើអ្នកពិតជាចង់ចាកចេញមែនទេ? + + + ឯកសារ MudBlazor + + + ម​គ្គុ​ទេស​ក៍​ចាប់​ផ្តើ​ម​រហ័ស + + + Refreshed Token. + + + ធនធាន + + + គាំទ្រ + + + បិទ / បើកស្បែកងងឹត + + + Toggle right-to-left/left-to-right + + + ស្វាគមន៏ {0} + + + អ្នកត្រូវបានចាកចេញពីប្រព័ន្ធព្រោះសិទ្ធិនៃមុខងារបស់អ្នកត្រូវបានធ្វើបច្ចុប្បន្នភាព + + + អ្នកត្រូវបានចាកចេញពីប្រព័ន្ធព្រោះកូដធូឃីនអ្នកត្រូវបានលុប + + + អ្នកត្រូវបានចាកចេញ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.nl.resx new file mode 100644 index 0000000..9cbbf9e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.nl.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Koop me een koffie! + + + Chatten? + + + Community + + + Facebook Groep + + + Facebook Pagina + + + Fork Repository + + + Uitloggen + + + Wil je echt uitloggen? + + + MudBlazor Documentation + + + Snelstartgids + + + Vernieuwd Token. + + + Bronnen + + + Ondersteuning + + + Donkere Modus Schakelen + + + Wissel van rechts naar links/links naar rechts + + + Welkom {0} + + + U bent uitgelogd omdat de machtigingen van een van uw rollen zijn bijgewerkt. + + + U bent uitgelogd omdat de gebruiker met uw Token is verwijderd. + + + U bent uitgelogd. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.ru.resx new file mode 100644 index 0000000..1fee9c5 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.ru.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Аккаунт + + + Купить мне кофе! + + + К чату? + + + Сообщество + + + Группа Facebook + + + Страница Facebook + + + Репозиторий + + + Выйти + + + Подтверждение выхода + + + Документация MudBlazor + + + Краткое руководство пользователя + + + Токен обновлён. + + + Ресурсы + + + Поддержка + + + Переключить Тёмный режим + + + Переключить справа-на-лево/слева-на-право + + + Добро пожаловать {0} + + + Вы вышли из системы, потому что были обновлены разрешения одной из ваших ролей. + + + Вы вышли из системы, потому что пользователь с вашим токеном был удален. + + + Вы вышли из системы. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.sv.resx new file mode 100644 index 0000000..d66bc71 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/MainLayout.sv.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Konto + + + Buy Me A Coffee! + + + Chat? + + + Community + + + Facebook Grupp + + + Facebook Sida + + + Fork Repository + + + Logga ut + + + Vill du verkligen logga ut? + + + MudBlazor Dokumentation + + + Snabbstart Guide + + + Refreshed Token. + + + Resurser + + + Support + + + Växla Mörktläge + + + Toggle right-to-left/left-to-right + + + Välkommen {0} + + + You are logged out because the Permissions of one of your Roles have been updated. + + + You are logged out because the user with your Token has been deleted. + + + You are Logged Out. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.de.resx new file mode 100644 index 0000000..8bd8b09 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.de.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Konto + + + Administrator + + + Marken + + + Katalog + + + Chat + + + Kommunikation + + + Dashboard + + + Dokumentenverwaltung + + + Dokumentenspeicher + + + Documenttypen + + + FAQs + + + Merkmale + + + Start + + + Protokolle + + + E-Mail + + + Persönlich + + + Produkte + + + Schnellstartanleitung + + + Ressourcen + + + Rollen + + + Swagger + + + Benutzer + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.en.resx new file mode 100644 index 0000000..61adb32 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.en.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Administrator + + + Brands + + + Catalog + + + Chat + + + Communication + + + Dashboard + + + Document Management + + + Document Store + + + Document Types + + + FAQs + + + Features + + + Home + + + Logs + + + Mail + + + Personal + + + Products + + + Quick Start Guide + + + Resources + + + Roles + + + Swagger + + + Users + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.es.resx new file mode 100644 index 0000000..6bfbf6e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.es.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cuenta + + + Administrador + + + Auditoría + + + Marcas + + + Gestión de catálogo + + + Chat + + + Comunicaciones + + + Panel de Control + + + Administración de Documentos + + + Almacén de Documentos + + + Tipos de Documentos + + + FAQs + + + Características + + + Inicio + + + Mail + + + Personal + + + Productos + + + Guía de Inicio Rápido + + + Recursos + + + Roles + + + Swagger + + + Usuarios + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.fr.resx new file mode 100644 index 0000000..b888549 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.fr.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Compte + + + Administrateur + + + Pistes d'audit + + + Marques + + + Gestion du catalogue + + + Conversations + + + Communication + + + Tableau de bord + + + Gestion des documents + + + Stockage des documents + + + Types de documents + + + FAQ + + + Fonctionnalités + + + Accueil + + + Courriel + + + Renseignements personnels + + + Produits + + + Guide de démarrage rapide + + + Ressources + + + Rôles + + + Swagger + + + Utilisateurs + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.id.resx new file mode 100644 index 0000000..5240880 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.id.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Akun + + + Administrator + + + Audit Trails + + + Merek + + + Manajemen Katalog + + + Obrolan + + + Komunikasi + + + Dasbor + + + Document Management + + + Document Store + + + Document Types + + + FAQs + + + Fitur + + + Beranda + + + Mail + + + Personal + + + Produk + + + Panduan Awal Singkat + + + Resources + + + Wewenang + + + Swagger + + + Pengguna + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.it.resx new file mode 100644 index 0000000..371cd91 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.it.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Amministratore + + + Marche + + + Gestione catalogo + + + Chat + + + Comunicazione + + + Dashboard + + + Document Management + + + Archivio documenti + + + Document Types + + + FAQs + + + Caratteristiche + + + Home + + + Registro Attività + + + Mail + + + Personale + + + Prodotti + + + Guida rapida + + + Risorse + + + Ruoli + + + Swagger + + + Utenti + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.km.resx new file mode 100644 index 0000000..01df5e7 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.km.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + គណនី + + + រដ្ឋបាល + + + ផលិតផល + + + គ្រប់គ្រងកាតាឡុក + + + ទំនាក់ទំនង + + + ការគ្រប់គ្រងឯកសារ + + + ប្រភេទឯកសារ + + + កម្រងសំណួរចម្លើយ + + + មុខងារ + + + ទំព័រដើម + + + ឯកជន + + + ផលិតផល + + + ធនធាន + + + សិទ្ធិប្រើប្រាស់ + + + អ្នកប្រើប្រាស់ + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.nl.resx new file mode 100644 index 0000000..30d1ce8 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.nl.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Administrator + + + Audit Trails + + + Merken + + + Catalogusbeheer + + + Chat + + + Communicatie + + + Dashboard + + + Documentbeheer + + + Documentopslag + + + Documenttypen + + + FAQs + + + Functies + + + Hoofdscherm + + + Mail + + + Persoonlijk + + + Producten + + + Snelstartgids + + + Bronnen + + + Rollen + + + Swagger + + + Gebruikers + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.ru.resx new file mode 100644 index 0000000..253d25a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.ru.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Аккаунт + + + Администрирование + + + Журналы аудита + + + Бренды + + + Управление каталогом + + + Чат + + + Коммуникации + + + Dashboard + + + Управление документами + + + Хранилище документов + + + Типы документов + + + FAQ + + + Функции + + + Домашняя + + + Почта + + + Персональные данные + + + Продукты + + + Краткое руководство пользователя + + + Ресурсы + + + Роли + + + Swagger + + + Пользователи + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.sv.resx new file mode 100644 index 0000000..d85fdd1 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NavMenu.sv.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Konto + + + Administratör + + + Audit Trails + + + Märken + + + Kataloghantering + + + Chatt + + + Kommunikation + + + Översikt + + + Document Management + + + Dokumentlagring + + + Document Types + + + FAQs + + + Funktioner + + + Hem + + + Mail + + + Personal + + + Produkter + + + Snabbstart Guide + + + Resurser + + + Roler + + + Swagger + + + Användare + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.de.resx new file mode 100644 index 0000000..15b332f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.de.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Zur Startseite gehen! + + + Die gesuchte Seite existiert nicht! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.en.resx new file mode 100644 index 0000000..3b95741 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.en.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Go Home! + + + The page you were looking for doesn't exist. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.es.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.es.resx new file mode 100644 index 0000000..8cda145 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.es.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ir a Inicio! + + + La página que busca no existe + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.fr.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.fr.resx new file mode 100644 index 0000000..c0d6d60 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.fr.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Revenir à l'accueil + + + La page que vous recherchez n'existe pas. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.id.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.id.resx new file mode 100644 index 0000000..1b922b7 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.id.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Kembali ke Beranda! + + + Halaman yang anda tuju tidak tersedia. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.it.resx new file mode 100644 index 0000000..5f231c6 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.it.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Vai alla Home! + + + La pagina che stavi cercando non esiste. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.km.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.km.resx new file mode 100644 index 0000000..b6c6f4b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.km.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ទៅទំព័រដើម! + + + ទំព័រដែលអ្នកមកកាន់នេះគឺពុំមានទេ! + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.nl.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.nl.resx new file mode 100644 index 0000000..39ea8d9 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.nl.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ga naar hoofdpagina + + + De pagina die u zocht bestaat niet + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.ru.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.ru.resx new file mode 100644 index 0000000..506a4d9 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.ru.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + На домашнюю страницу! + + + Страница, которую вы искали, не существует. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.sv.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.sv.resx new file mode 100644 index 0000000..e49cb97 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/NotFoundLayout.sv.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Till Start! + + + Sidan du letar efter finns inte. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/SharedResource.de.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/SharedResource.de.resx new file mode 100644 index 0000000..c6de4f5 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/SharedResource.de.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Fortgeschrittene Suche + + + Marke + + + Abbrechen + + + Erstellen + + + Bearbeiten + + + Produkt + + + Produkte + + + Neu laden + + + Suche nach + + + Aktualisieren + + + Benutzer + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/SharedResource.en.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/SharedResource.en.resx new file mode 100644 index 0000000..4ced943 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/SharedResource.en.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Advanced Search + + + Brand + + + Cancel + + + Create + + + Edit + + + Product + + + Products + + + Reload + + + Search for + + + Update + + + User + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/SharedResource.it.resx b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/SharedResource.it.resx new file mode 100644 index 0000000..310e16e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/SharedResource.it.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Azioni + + + Ricerca avanzata + + + Marchio + + + Annulla + + + Crea + + + Modifica + + + Prodotto + + + Prodotti + + + Ricarica + + + Ricerca per + + + Aggiorna + + + Utente + + \ No newline at end of file diff --git "a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/\342\200\217\342\200\217MainLayout.ar.resx" "b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/\342\200\217\342\200\217MainLayout.ar.resx" new file mode 100644 index 0000000..55bb1c9 --- /dev/null +++ "b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/\342\200\217\342\200\217MainLayout.ar.resx" @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + الحساب + + + اشتري لي قهوة! + + + دردشة؟ + + + تواصل اجتماعي + + + مجموعة الفيسبوك + + + صفحة الفيسبوك + + + نسخ الشوكة + + + تسجيل خروج + + + هل تريد حقًا تسجيل الخروج؟ + + + توثيق MudBlazor + + + دليل البدء السريع + + + Rرمز محدث. + + + الموارد + + + الدعم + + + تبديل الوضع الداكن + + + التبديل من اليمين إلى اليسار / من اليسار إلى اليمين + + + مرحبًا {0} + + + لقد تم تسجيل خروجك لأنه تم تحديث أذونات أحد الأدوار الخاصة بك. + + + لقد تم تسجيل خروجك لأنه تم حذف المستخدم الذي يحمل الرمز المميز الخاص بك. + + + لقد قمت بتسجيل الخروج. + + \ No newline at end of file diff --git "a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/\342\200\217\342\200\217NavMenu.ar.resx" "b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/\342\200\217\342\200\217NavMenu.ar.resx" new file mode 100644 index 0000000..50ba92e --- /dev/null +++ "b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/\342\200\217\342\200\217NavMenu.ar.resx" @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + الحساب + + + الإدارة + + + مسارات المراجعة + + + العلامات التجارية + + + إدارة الكتالوج + + + الدردشة + + + التواصل + + + لوحة الإدارة + + + إدارة المستندات + + + مخزن المستندات + + + أنواع المستندات + + + أسئلة وأجوبة + + + سمات + + + الصفحة الرئيسية + + + بريد + + + شخصي + + + المنتجات + + + دليل البدء السريع + + + الموارد + + + الأدوار + + + Swagger + + + المستخدمون + + \ No newline at end of file diff --git "a/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/\342\200\217\342\200\217NotFoundLayout.ar.resx" "b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/\342\200\217\342\200\217NotFoundLayout.ar.resx" new file mode 100644 index 0000000..fa752e5 --- /dev/null +++ "b/blazor-wasm-boilerplate-main/src/Client/Resources/Shared/\342\200\217\342\200\217NotFoundLayout.ar.resx" @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + الذهاب للرئيسية! + + + الصفحة التي تبحث عنها غير موجودة. + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Shared/ApiHelper.cs b/blazor-wasm-boilerplate-main/src/Client/Shared/ApiHelper.cs new file mode 100644 index 0000000..1d4285e --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Shared/ApiHelper.cs @@ -0,0 +1,86 @@ +using FSH.BlazorWebAssembly.Client.Components.Common; +using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Shared; + +public static class ApiHelper +{ + public static async Task ExecuteCallGuardedAsync( + Func> call, + ISnackbar snackbar, + CustomValidation? customValidation = null, + string? successMessage = null) + { + customValidation?.ClearErrors(); + try + { + var result = await call(); + + if (!string.IsNullOrWhiteSpace(successMessage)) + { + snackbar.Add(successMessage, Severity.Info); + } + + return result; + } + catch (ApiException ex) + { + if (ex.Result.Errors is not null) + { + customValidation?.DisplayErrors(ex.Result.Errors); + } + else + { + snackbar.Add("Something went wrong!", Severity.Error); + } + } + catch (ApiException ex) + { + snackbar.Add(ex.Result.Exception, Severity.Error); + } + catch (Exception ex) + { + snackbar.Add(ex.Message, Severity.Error); + } + + return default; + } + + public static async Task ExecuteCallGuardedAsync( + Func call, + ISnackbar snackbar, + CustomValidation? customValidation = null, + string? successMessage = null) + { + customValidation?.ClearErrors(); + try + { + await call(); + + if (!string.IsNullOrWhiteSpace(successMessage)) + { + snackbar.Add(successMessage, Severity.Success); + } + + return true; + } + catch (ApiException ex) + { + if (ex.Result.Errors is not null) + { + customValidation?.DisplayErrors(ex.Result.Errors); + } + else + { + snackbar.Add("Something went wrong!", Severity.Error); + } + } + catch (ApiException ex) + { + snackbar.Add(ex.Result.Exception, Severity.Error); + } + + return false; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Shared/BaseLayout.razor b/blazor-wasm-boilerplate-main/src/Client/Shared/BaseLayout.razor new file mode 100644 index 0000000..9eaabaa --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Shared/BaseLayout.razor @@ -0,0 +1,33 @@ +@inherits LayoutComponentBase + + + + + + + + + + + + + + @Body + + + + + + + + + + @Body + + + + + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Shared/BaseLayout.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Shared/BaseLayout.razor.cs new file mode 100644 index 0000000..6778e2b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Shared/BaseLayout.razor.cs @@ -0,0 +1,49 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.Preferences; +using FSH.BlazorWebAssembly.Client.Infrastructure.Theme; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Shared; + +public partial class BaseLayout +{ + private ClientPreference? _themePreference; + private MudTheme _currentTheme = new LightTheme(); + private bool _themeDrawerOpen; + private bool _rightToLeft; + + protected override async Task OnInitializedAsync() + { + _themePreference = await ClientPreferences.GetPreference() as ClientPreference; + if (_themePreference == null) _themePreference = new ClientPreference(); + SetCurrentTheme(_themePreference); + + Snackbar.Add("Like this boilerplate? ", Severity.Normal, config => + { + config.BackgroundBlurred = true; + config.Icon = Icons.Custom.Brands.GitHub; + config.Action = "Star us on Github!"; + config.ActionColor = Color.Primary; + config.Onclick = snackbar => + { + Navigation.NavigateTo("https://github.com/fullstackhero/blazor-wasm-boilerplate"); + return Task.CompletedTask; + }; + }); + } + + private async Task ThemePreferenceChanged(ClientPreference themePreference) + { + SetCurrentTheme(themePreference); + await ClientPreferences.SetPreference(themePreference); + } + + private void SetCurrentTheme(ClientPreference themePreference) + { + _currentTheme = themePreference.IsDarkMode ? new DarkTheme() : new LightTheme(); + _currentTheme.Palette.Primary = themePreference.PrimaryColor; + _currentTheme.Palette.Secondary = themePreference.SecondaryColor; + _currentTheme.LayoutProperties.DefaultBorderRadius = $"{themePreference.BorderRadius}px"; + _currentTheme.LayoutProperties.DefaultBorderRadius = $"{themePreference.BorderRadius}px"; + _rightToLeft = themePreference.IsRTL; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Shared/DialogServiceExtensions.cs b/blazor-wasm-boilerplate-main/src/Client/Shared/DialogServiceExtensions.cs new file mode 100644 index 0000000..597ed31 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Shared/DialogServiceExtensions.cs @@ -0,0 +1,19 @@ +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Shared; + +public static class DialogServiceExtensions +{ + public static Task ShowModalAsync(this IDialogService dialogService, DialogParameters parameters) + where TDialog : ComponentBase => + dialogService.ShowModal(parameters).Result; + + public static IDialogReference ShowModal(this IDialogService dialogService, DialogParameters parameters) + where TDialog : ComponentBase + { + var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Medium, FullWidth = true, DisableBackdropClick = true }; + + return dialogService.Show(string.Empty, parameters, options); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Shared/MainLayout.razor b/blazor-wasm-boilerplate-main/src/Client/Shared/MainLayout.razor new file mode 100644 index 0000000..7eec5df --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Shared/MainLayout.razor @@ -0,0 +1,107 @@ +@inject IStringLocalizer L + + + + + + + @L["fullstackhero"] + + + + @L["Sponsor"] + + + + @L["Community"] + @L["Discord"] + @L["Facebook"] + + LinkedIn + Buy Me a Coffee! + + Open Collective + + @L["Resources"] + @L["Documentation"] + + + + + + + + + + + + + + +
+ + +
+ @L["Community"] + @L["Discord"] + @L["Facebook"] + + LinkedIn + @L["Resources"] + + @L["MudBlazor Documentation"] + + @L["Quick-Start Guide"] +
+ +
+ + + + + +
+ + +
+ + @L["Account"] +
+
+ +
+ + @L["Dashboard"] +
+
+
+ + Logout + +
+
+
+
+
+ + + + + + + + @ChildContent + + + + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Shared/MainLayout.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Shared/MainLayout.razor.cs new file mode 100644 index 0000000..51aba54 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Shared/MainLayout.razor.cs @@ -0,0 +1,63 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.Preferences; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace FSH.BlazorWebAssembly.Client.Shared; + +public partial class MainLayout +{ + [Parameter] + public RenderFragment ChildContent { get; set; } = default!; + [Parameter] + public EventCallback OnDarkModeToggle { get; set; } + [Parameter] + public EventCallback OnRightToLeftToggle { get; set; } + + private bool _drawerOpen; + private bool _rightToLeft; + + protected override async Task OnInitializedAsync() + { + if (await ClientPreferences.GetPreference() is ClientPreference preference) + { + _rightToLeft = preference.IsRTL; + _drawerOpen = preference.IsDrawerOpen; + } + } + + private async Task RightToLeftToggle() + { + bool isRtl = await ClientPreferences.ToggleLayoutDirectionAsync(); + _rightToLeft = isRtl; + + await OnRightToLeftToggle.InvokeAsync(isRtl); + } + + public async Task ToggleDarkMode() + { + await OnDarkModeToggle.InvokeAsync(); + } + + private async Task DrawerToggle() + { + _drawerOpen = await ClientPreferences.ToggleDrawerAsync(); + } + + private void Logout() + { + var parameters = new DialogParameters + { + { nameof(Dialogs.Logout.ContentText), $"{L["Logout Confirmation"]}"}, + { nameof(Dialogs.Logout.ButtonText), $"{L["Logout"]}"}, + { nameof(Dialogs.Logout.Color), Color.Error} + }; + + var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true }; + DialogService.Show(L["Logout"], parameters, options); + } + + private void Profile() + { + Navigation.NavigateTo("/account"); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Shared/NavMenu.razor b/blazor-wasm-boilerplate-main/src/Client/Shared/NavMenu.razor new file mode 100644 index 0000000..9ccb1ba --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Shared/NavMenu.razor @@ -0,0 +1,55 @@ +@inject IStringLocalizer L + + + + @L["Start"] + @L["Home"] + @L["Getting Started"] + @if (_canViewHangfire) + { + @L["Hangfire"] + } + @L["Personal"] + @if (_canViewDashboard) + { + @L["Dashboard"] + } + @L["Account"] + @L["Logs"] + @if (_canViewProducts || _canViewBrands) + { + @L["Management"] + + @if (_canViewProducts) + { + + @L["Products"] + + } + @if (_canViewBrands) + { + + @L["Brands"] + + } + + } + @if (CanViewAdministrationGroup) + { + @L["Administration"] + @if (_canViewUsers) + { + @L["Users"] + } + @if (_canViewRoles) + { + @L["Roles"] + } + @if(_canViewTenants) + { + @L["Tenants"] + } + } + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Shared/NavMenu.razor.cs b/blazor-wasm-boilerplate-main/src/Client/Shared/NavMenu.razor.cs new file mode 100644 index 0000000..7532712 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Shared/NavMenu.razor.cs @@ -0,0 +1,39 @@ +using FSH.BlazorWebAssembly.Client.Infrastructure.Auth; +using FSH.BlazorWebAssembly.Client.Infrastructure.Common; +using FSH.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; + +namespace FSH.BlazorWebAssembly.Client.Shared; + +public partial class NavMenu +{ + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + + private string? _hangfireUrl; + private bool _canViewHangfire; + private bool _canViewDashboard; + private bool _canViewRoles; + private bool _canViewUsers; + private bool _canViewProducts; + private bool _canViewBrands; + private bool _canViewTenants; + private bool CanViewAdministrationGroup => _canViewUsers || _canViewRoles || _canViewTenants; + + protected override async Task OnParametersSetAsync() + { + _hangfireUrl = Config[ConfigNames.ApiBaseUrl] + "jobs"; + var user = (await AuthState).User; + _canViewHangfire = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.Hangfire); + _canViewDashboard = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.Dashboard); + _canViewRoles = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.Roles); + _canViewUsers = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.Users); + _canViewProducts = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.Products); + _canViewBrands = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.Brands); + _canViewTenants = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.Tenants); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Shared/NotFound.razor b/blazor-wasm-boilerplate-main/src/Client/Shared/NotFound.razor new file mode 100644 index 0000000..98c36fd --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Shared/NotFound.razor @@ -0,0 +1,56 @@ +@using Infrastructure.Theme +@inherits LayoutComponentBase + + + + +
+ + + + + + + + + + + + + + + + + Not Found + +
+ Go Home +
+
+
+
+ +@code { + private MudTheme _currentTheme = new LightTheme(); + + protected override async Task OnInitializedAsync() + { + _currentTheme = new LightTheme(); + _currentTheme = await ClientPreferences.GetCurrentThemeAsync(); + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/Shared/SharedResource.cs b/blazor-wasm-boilerplate-main/src/Client/Shared/SharedResource.cs new file mode 100644 index 0000000..7e35167 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/Shared/SharedResource.cs @@ -0,0 +1,5 @@ +namespace FSH.BlazorWebAssembly.Client.Shared; + +public class SharedResource +{ +} diff --git a/blazor-wasm-boilerplate-main/src/Client/_Imports.razor b/blazor-wasm-boilerplate-main/src/Client/_Imports.razor new file mode 100644 index 0000000..a5697e7 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/_Imports.razor @@ -0,0 +1,42 @@ +@using System.Security.Claims +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components +@using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.AspNetCore.Components.WebAssembly.Authentication +@using Microsoft.AspNetCore.Components.WebAssembly.Http +@using Microsoft.AspNetCore.WebUtilities +@using Microsoft.Extensions.Configuration +@using Microsoft.Extensions.DependencyInjection +@using Microsoft.Extensions.Localization +@using Microsoft.JSInterop +@using FSH.BlazorWebAssembly.Client +@using FSH.BlazorWebAssembly.Client.Shared +@using FSH.BlazorWebAssembly.Client.Pages.Authentication +@using FSH.BlazorWebAssembly.Client.Pages.Multitenancy +@using FSH.BlazorWebAssembly.Client.Components.Common +@using FSH.BlazorWebAssembly.Client.Components.EntityTable +@using FSH.BlazorWebAssembly.Client.Components.Localization +@using FSH.BlazorWebAssembly.Client.Components.Notifications +@using FSH.BlazorWebAssembly.Client.Components.ThemeManager +@using FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient +@using FSH.BlazorWebAssembly.Client.Infrastructure.Auth +@using FSH.BlazorWebAssembly.Client.Infrastructure.Common +@using FSH.BlazorWebAssembly.Client.Infrastructure.Notifications +@using FSH.BlazorWebAssembly.Client.Infrastructure.Preferences +@using FSH.WebApi.Shared.Authorization +@using Blazored.LocalStorage +@using Mapster +@using MediatR.Courier +@using MudBlazor + +@attribute [Authorize] + +@inject NavigationManager Navigation +@inject ISnackbar Snackbar +@inject IDialogService DialogService +@inject IConfiguration Config +@inject IClientPreferenceManager ClientPreferences \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/wwwroot/appsettings.Development.json b/blazor-wasm-boilerplate-main/src/Client/wwwroot/appsettings.Development.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/wwwroot/appsettings.Development.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/wwwroot/appsettings.json b/blazor-wasm-boilerplate-main/src/Client/wwwroot/appsettings.json new file mode 100644 index 0000000..704cf56 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/wwwroot/appsettings.json @@ -0,0 +1,10 @@ +{ + "ApiBaseUrl": "https://localhost:5001/", + "AuthProvider": "Jwt", + "AzureAd": { + "Authority": "https://login.microsoftonline.com/organizations", + "ClientId": "", + "ValidateAuthority": true, + "ApiScope": "api:///access_as_user" + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/wwwroot/css/fsh.css b/blazor-wasm-boilerplate-main/src/Client/wwwroot/css/fsh.css new file mode 100644 index 0000000..a44b634 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/wwwroot/css/fsh.css @@ -0,0 +1,72 @@ +.fsh-center-text { + text-align: center !important; +} + +.mud-button-filled { + box-shadow: 0 3px 1px -2px rgb(0 0 0 / 30%), 0 2px 2px 0 rgb(0 0 0 / 0), 0 1px 5px 0 rgb(0 0 0 / 10%) !important; +} + +.mud-dialog { + box-shadow: 0 3px 1px -2px rgb(0 0 0 / 10%), 0 2px 2px 0 rgb(0 0 0 / 0), 0 10px 10px 0 rgb(0 0 0 / 5%) !important; +} + +.mud-nav-link { + white-space: normal !important; + padding: 12px 16px 12px 38px; +} + + .mud-nav-link.active:not(.mud-nav-link-disabled) { + border-right: 3px solid var(--mud-palette-primary); + background-color: rgba(var(--mud-palette-primary-rgb), 0.1); + } + +.mud-table { + padding: 20px !important; + margin-bottom: 20px !important; +} + +.mud-card { + margin-bottom: 20px !important; +} + +#blazor-error-ui { + color: var(--mud-palette-drawer-text); + background: var(--mud-palette-drawer-background); +} + +.mud-overlay-dark { + backdrop-filter: blur(2px); +} + +.mud-card-header .mud-card-header-avatar { + margin-inline-end: 10px !important; +} + +.mud-nav-link { + padding: 12px 16px 12px 15px !important; +} + +.mud-dialog-content { + max-height: 75vh !important; + overflow: auto !important; + overflow-x: hidden !important; +} + +.mud-grid-spacing-xs-3 { + margin: 0px !important; + margin-left: -12px !important; +} + +.mud-table-toolbar +{ + flex-wrap:wrap; + margin-bottom:20px!important; +} + +::-webkit-scrollbar { + width: 2px!important; + height: 6px!important; +} +.fsh-nav-child { + padding-left: 10px !important; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/wwwroot/favicon.ico b/blazor-wasm-boilerplate-main/src/Client/wwwroot/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fd58c54d08dcde4e4c40e4c8187a3d8bb79829d6 GIT binary patch literal 18409 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 literal 0 HcmV?d00001 diff --git a/blazor-wasm-boilerplate-main/src/Client/wwwroot/full-stack-hero-logo.png b/blazor-wasm-boilerplate-main/src/Client/wwwroot/full-stack-hero-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..05bdf45be151f25724da91e566fc9e7c9ab3f2c7 GIT binary patch literal 160036 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ℑ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

)!RQS&Mik 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 + + + + + + Blazor WebAssembly Boilerplate + + + + + + + + + + + + +

+ + +
+
+
+
+
+ +
+
+
+ +
+ + + + + + + + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/wwwroot/manifest.json b/blazor-wasm-boilerplate-main/src/Client/wwwroot/manifest.json new file mode 100644 index 0000000..c95abce --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/wwwroot/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "Blazor WebAssembly Boilerplate", + "short_name": "Blazor WebAssembly Boilerplate", + "start_url": "./", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#3eaf7c", + "prefer_related_applications": false, + "icons": [ + { + "src": "full-stack-hero-logo.png", + "type": "image/png", + "sizes": "512x512" + }, + { + "src": "full-stack-hero-logo.png", + "type": "image/png", + "sizes": "192x192" + } + ] +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/wwwroot/service-worker.js b/blazor-wasm-boilerplate-main/src/Client/wwwroot/service-worker.js new file mode 100644 index 0000000..0c4fa6b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/wwwroot/service-worker.js @@ -0,0 +1,4 @@ +// In development, always fetch from the network and do not enable offline support. +// This is because caching would make development more difficult (changes would not +// be reflected on the first load after each change). +self.addEventListener('fetch', () => { }); \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Client/wwwroot/service-worker.published.js b/blazor-wasm-boilerplate-main/src/Client/wwwroot/service-worker.published.js new file mode 100644 index 0000000..a88a6e9 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Client/wwwroot/service-worker.published.js @@ -0,0 +1,48 @@ +// Caution! Be sure you understand the caveats before publishing an application with +// offline support. See https://aka.ms/blazor-offline-considerations + +self.importScripts('./service-worker-assets.js'); +self.addEventListener('install', event => event.waitUntil(onInstall(event))); +self.addEventListener('activate', event => event.waitUntil(onActivate(event))); +self.addEventListener('fetch', event => event.respondWith(onFetch(event))); + +const cacheNamePrefix = 'offline-cache-'; +const cacheName = `${cacheNamePrefix}${self.assetsManifest.version}`; +const offlineAssetsInclude = [/\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/, /\.blat$/, /\.dat$/]; +const offlineAssetsExclude = [/^service-worker\.js$/]; + +async function onInstall(event) { + console.info('Service worker: Install'); + + // Fetch and cache all matching items from the assets manifest + const assetsRequests = self.assetsManifest.assets + .filter(asset => offlineAssetsInclude.some(pattern => pattern.test(asset.url))) + .filter(asset => !offlineAssetsExclude.some(pattern => pattern.test(asset.url))) + .map(asset => new Request(asset.url, { integrity: asset.hash, cache: 'no-cache' })); + await caches.open(cacheName).then(cache => cache.addAll(assetsRequests)); +} + +async function onActivate(event) { + console.info('Service worker: Activate'); + + // Delete unused caches + const cacheKeys = await caches.keys(); + await Promise.all(cacheKeys + .filter(key => key.startsWith(cacheNamePrefix) && key !== cacheName) + .map(key => caches.delete(key))); +} + +async function onFetch(event) { + let cachedResponse = null; + if (event.request.method === 'GET') { + // For all navigation requests, try to serve index.html from cache + // If you need some URLs to be server-rendered, edit the following check to exclude those URLs + const shouldServeIndexHtml = event.request.mode === 'navigate'; + + const request = shouldServeIndexHtml ? 'index.html' : event.request; + const cache = await caches.open(cacheName); + cachedResponse = await cache.match(request); + } + + return cachedResponse || fetch(event.request); +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Host/Host.csproj b/blazor-wasm-boilerplate-main/src/Host/Host.csproj new file mode 100644 index 0000000..50cd34d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Host/Host.csproj @@ -0,0 +1,24 @@ + + + + net6.0 + FSH.BlazorWebAssembly.Host + FSH.BlazorWebAssembly.Host + + + + + + + + + + + + + + Always + + + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Host/Pages/Error.cshtml b/blazor-wasm-boilerplate-main/src/Host/Pages/Error.cshtml new file mode 100644 index 0000000..a0863a8 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Host/Pages/Error.cshtml @@ -0,0 +1,44 @@ +@page +@model FSH.BlazorWebAssembly.Server.Pages.ErrorModel + + + + + + + + Error + + + + + +
+
+

Error.

+

An error occurred while processing your request.

+ + @if (Model.ShowRequestId) + { +

+ Request ID: @Model.RequestId +

+ } + +

Development Mode

+

+ Swapping to the Development environment displays detailed information about the error + that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the + ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

+
+
+ + + diff --git a/blazor-wasm-boilerplate-main/src/Host/Pages/Error.cshtml.cs b/blazor-wasm-boilerplate-main/src/Host/Pages/Error.cshtml.cs new file mode 100644 index 0000000..863883a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Host/Pages/Error.cshtml.cs @@ -0,0 +1,19 @@ +using System.Diagnostics; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace FSH.BlazorWebAssembly.Server.Pages; + +[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] +[IgnoreAntiforgeryToken] +public class ErrorModel : PageModel +{ + public string? RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + public void OnGet() + { + RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Host/Program.cs b/blazor-wasm-boilerplate-main/src/Host/Program.cs new file mode 100644 index 0000000..098865c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Host/Program.cs @@ -0,0 +1,26 @@ +var builder = WebApplication.CreateBuilder(args); +builder.Services.AddControllersWithViews(); +builder.Services.AddRazorPages(); + +var app = builder.Build(); + +if (app.Environment.IsDevelopment()) +{ + app.UseWebAssemblyDebugging(); +} +else +{ + app.UseExceptionHandler("/Error"); + app.UseHsts(); +} + +app.UseHttpsRedirection(); +app.UseBlazorFrameworkFiles(); +app.UseStaticFiles(); +app.UseRouting(); + +app.MapRazorPages(); +app.MapControllers(); +app.MapFallbackToFile("index.html"); + +app.Run(); \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Host/Properties/launchSettings.json b/blazor-wasm-boilerplate-main/src/Host/Properties/launchSettings.json new file mode 100644 index 0000000..a24d289 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Host/Properties/launchSettings.json @@ -0,0 +1,30 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:21716", + "sslPort": 44331 + } + }, + "profiles": { + "FSH.BlazorWebAssembly.Server": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:5002;http://localhost:5003", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Host/appsettings.Development.json b/blazor-wasm-boilerplate-main/src/Host/appsettings.Development.json new file mode 100644 index 0000000..1b2d3ba --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Host/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Host/appsettings.json b/blazor-wasm-boilerplate-main/src/Host/appsettings.json new file mode 100644 index 0000000..ec04bc1 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Host/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Shared/Authorization/ClaimsPrincipalExtensions.cs b/blazor-wasm-boilerplate-main/src/Shared/Authorization/ClaimsPrincipalExtensions.cs new file mode 100644 index 0000000..a0559f6 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Shared/Authorization/ClaimsPrincipalExtensions.cs @@ -0,0 +1,39 @@ +using FSH.WebApi.Shared.Authorization; + +namespace System.Security.Claims; + +public static class ClaimsPrincipalExtensions +{ + public static string? GetEmail(this ClaimsPrincipal principal) + => principal.FindFirstValue(ClaimTypes.Email); + + public static string? GetTenant(this ClaimsPrincipal principal) + => principal.FindFirstValue(FSHClaims.Tenant); + + public static string? GetFullName(this ClaimsPrincipal principal) + => principal?.FindFirst(FSHClaims.Fullname)?.Value; + + public static string? GetFirstName(this ClaimsPrincipal principal) + => principal?.FindFirst(ClaimTypes.Name)?.Value; + + public static string? GetSurname(this ClaimsPrincipal principal) + => principal?.FindFirst(ClaimTypes.Surname)?.Value; + + public static string? GetPhoneNumber(this ClaimsPrincipal principal) + => principal.FindFirstValue(ClaimTypes.MobilePhone); + + public static string? GetUserId(this ClaimsPrincipal principal) + => principal.FindFirstValue(ClaimTypes.NameIdentifier); + + public static string? GetImageUrl(this ClaimsPrincipal principal) + => principal.FindFirstValue(FSHClaims.ImageUrl); + + public static DateTimeOffset GetExpiration(this ClaimsPrincipal principal) => + DateTimeOffset.FromUnixTimeSeconds(Convert.ToInt64( + principal.FindFirstValue(FSHClaims.Expiration))); + + private static string? FindFirstValue(this ClaimsPrincipal principal, string claimType) => + principal is null + ? throw new ArgumentNullException(nameof(principal)) + : principal.FindFirst(claimType)?.Value; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Shared/Authorization/FSHClaims.cs b/blazor-wasm-boilerplate-main/src/Shared/Authorization/FSHClaims.cs new file mode 100644 index 0000000..a94b26b --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Shared/Authorization/FSHClaims.cs @@ -0,0 +1,11 @@ +namespace FSH.WebApi.Shared.Authorization; + +public static class FSHClaims +{ + public const string Tenant = "tenant"; + public const string Fullname = "fullName"; + public const string Permission = "permission"; + public const string ImageUrl = "image_url"; + public const string IpAddress = "ipAddress"; + public const string Expiration = "exp"; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Shared/Authorization/FSHPermissions.cs b/blazor-wasm-boilerplate-main/src/Shared/Authorization/FSHPermissions.cs new file mode 100644 index 0000000..229654d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Shared/Authorization/FSHPermissions.cs @@ -0,0 +1,80 @@ +using System.Collections.ObjectModel; + +namespace FSH.WebApi.Shared.Authorization; + +public static class FSHAction +{ + public const string View = nameof(View); + public const string Search = nameof(Search); + public const string Create = nameof(Create); + public const string Update = nameof(Update); + public const string Delete = nameof(Delete); + public const string Export = nameof(Export); + public const string Generate = nameof(Generate); + public const string Clean = nameof(Clean); + public const string UpgradeSubscription = nameof(UpgradeSubscription); +} + +public static class FSHResource +{ + public const string Tenants = nameof(Tenants); + public const string Dashboard = nameof(Dashboard); + public const string Hangfire = nameof(Hangfire); + public const string Users = nameof(Users); + public const string UserRoles = nameof(UserRoles); + public const string Roles = nameof(Roles); + public const string RoleClaims = nameof(RoleClaims); + public const string Products = nameof(Products); + public const string Brands = nameof(Brands); +} + +public static class FSHPermissions +{ + private static readonly FSHPermission[] _all = new FSHPermission[] + { + new("View Dashboard", FSHAction.View, FSHResource.Dashboard), + new("View Hangfire", FSHAction.View, FSHResource.Hangfire), + new("View Users", FSHAction.View, FSHResource.Users), + new("Search Users", FSHAction.Search, FSHResource.Users), + new("Create Users", FSHAction.Create, FSHResource.Users), + new("Update Users", FSHAction.Update, FSHResource.Users), + new("Delete Users", FSHAction.Delete, FSHResource.Users), + new("Export Users", FSHAction.Export, FSHResource.Users), + new("View UserRoles", FSHAction.View, FSHResource.UserRoles), + new("Update UserRoles", FSHAction.Update, FSHResource.UserRoles), + new("View Roles", FSHAction.View, FSHResource.Roles), + new("Create Roles", FSHAction.Create, FSHResource.Roles), + new("Update Roles", FSHAction.Update, FSHResource.Roles), + new("Delete Roles", FSHAction.Delete, FSHResource.Roles), + new("View RoleClaims", FSHAction.View, FSHResource.RoleClaims), + new("Update RoleClaims", FSHAction.Update, FSHResource.RoleClaims), + new("View Products", FSHAction.View, FSHResource.Products, IsBasic: true), + new("Search Products", FSHAction.Search, FSHResource.Products, IsBasic: true), + new("Create Products", FSHAction.Create, FSHResource.Products), + new("Update Products", FSHAction.Update, FSHResource.Products), + new("Delete Products", FSHAction.Delete, FSHResource.Products), + new("Export Products", FSHAction.Export, FSHResource.Products), + new("View Brands", FSHAction.View, FSHResource.Brands, IsBasic: true), + new("Search Brands", FSHAction.Search, FSHResource.Brands, IsBasic: true), + new("Create Brands", FSHAction.Create, FSHResource.Brands), + new("Update Brands", FSHAction.Update, FSHResource.Brands), + new("Delete Brands", FSHAction.Delete, FSHResource.Brands), + new("Generate Brands", FSHAction.Generate, FSHResource.Brands), + new("Clean Brands", FSHAction.Clean, FSHResource.Brands), + new("View Tenants", FSHAction.View, FSHResource.Tenants, IsRoot: true), + new("Create Tenants", FSHAction.Create, FSHResource.Tenants, IsRoot: true), + new("Update Tenants", FSHAction.Update, FSHResource.Tenants, IsRoot: true), + new("Upgrade Tenant Subscription", FSHAction.UpgradeSubscription, FSHResource.Tenants, IsRoot: true) + }; + + public static IReadOnlyList All { get; } = new ReadOnlyCollection(_all); + public static IReadOnlyList Root { get; } = new ReadOnlyCollection(_all.Where(p => p.IsRoot).ToArray()); + public static IReadOnlyList Admin { get; } = new ReadOnlyCollection(_all.Where(p => !p.IsRoot).ToArray()); + public static IReadOnlyList Basic { get; } = new ReadOnlyCollection(_all.Where(p => p.IsBasic).ToArray()); +} + +public record FSHPermission(string Description, string Action, string Resource, bool IsBasic = false, bool IsRoot = false) +{ + public string Name => NameFor(Action, Resource); + public static string NameFor(string action, string resource) => $"Permissions.{resource}.{action}"; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Shared/Authorization/FSHRoles.cs b/blazor-wasm-boilerplate-main/src/Shared/Authorization/FSHRoles.cs new file mode 100644 index 0000000..974b07a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Shared/Authorization/FSHRoles.cs @@ -0,0 +1,17 @@ +using System.Collections.ObjectModel; + +namespace FSH.WebApi.Shared.Authorization; + +public static class FSHRoles +{ + public static string Admin = nameof(Admin); + public static string Basic = nameof(Basic); + + public static IReadOnlyList DefaultRoles { get; } = new ReadOnlyCollection(new[] + { + Admin, + Basic + }); + + public static bool IsDefault(string roleName) => DefaultRoles.Any(r => r == roleName); +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Shared/Events/IEvent.cs b/blazor-wasm-boilerplate-main/src/Shared/Events/IEvent.cs new file mode 100644 index 0000000..8dfdf10 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Shared/Events/IEvent.cs @@ -0,0 +1,5 @@ +namespace FSH.WebApi.Shared.Events; + +public interface IEvent +{ +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Shared/MultiTenancy/MultitenancyConstants.cs b/blazor-wasm-boilerplate-main/src/Shared/MultiTenancy/MultitenancyConstants.cs new file mode 100644 index 0000000..8ffd325 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Shared/MultiTenancy/MultitenancyConstants.cs @@ -0,0 +1,15 @@ +namespace FSH.WebApi.Shared.Multitenancy; + +public class MultitenancyConstants +{ + public static class Root + { + public const string Id = "root"; + public const string Name = "Root"; + public const string EmailAddress = "admin@root.com"; + } + + public const string DefaultPassword = "123Pa$$word!"; + + public const string TenantIdName = "tenant"; +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Shared/Notifications/BasicNotification.cs b/blazor-wasm-boilerplate-main/src/Shared/Notifications/BasicNotification.cs new file mode 100644 index 0000000..c90ec4a --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Shared/Notifications/BasicNotification.cs @@ -0,0 +1,15 @@ +namespace FSH.WebApi.Shared.Notifications; + +public class BasicNotification : INotificationMessage +{ + public enum LabelType + { + Information, + Success, + Warning, + Error + } + + public string? Message { get; set; } + public LabelType Label { get; set; } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Shared/Notifications/INotificationMessage.cs b/blazor-wasm-boilerplate-main/src/Shared/Notifications/INotificationMessage.cs new file mode 100644 index 0000000..8374916 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Shared/Notifications/INotificationMessage.cs @@ -0,0 +1,5 @@ +namespace FSH.WebApi.Shared.Notifications; + +public interface INotificationMessage +{ +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Shared/Notifications/JobNotification.cs b/blazor-wasm-boilerplate-main/src/Shared/Notifications/JobNotification.cs new file mode 100644 index 0000000..cbe8658 --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Shared/Notifications/JobNotification.cs @@ -0,0 +1,8 @@ +namespace FSH.WebApi.Shared.Notifications; + +public class JobNotification : INotificationMessage +{ + public string? Message { get; set; } + public string? JobId { get; set; } + public decimal Progress { get; set; } +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Shared/Notifications/NotificationConstants.cs b/blazor-wasm-boilerplate-main/src/Shared/Notifications/NotificationConstants.cs new file mode 100644 index 0000000..f4fc15d --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Shared/Notifications/NotificationConstants.cs @@ -0,0 +1,6 @@ +namespace FSH.WebApi.Shared.Notifications; + +public static class NotificationConstants +{ + public const string NotificationFromServer = nameof(NotificationFromServer); +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Shared/Notifications/StatsChangedNotification.cs b/blazor-wasm-boilerplate-main/src/Shared/Notifications/StatsChangedNotification.cs new file mode 100644 index 0000000..e9ebe9c --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Shared/Notifications/StatsChangedNotification.cs @@ -0,0 +1,5 @@ +namespace FSH.WebApi.Shared.Notifications; + +public class StatsChangedNotification : INotificationMessage +{ +} \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/src/Shared/Shared.csproj b/blazor-wasm-boilerplate-main/src/Shared/Shared.csproj new file mode 100644 index 0000000..72eb13f --- /dev/null +++ b/blazor-wasm-boilerplate-main/src/Shared/Shared.csproj @@ -0,0 +1,7 @@ + + + net6.0 + FSH.WebApi.Shared + FSH.WebApi.Shared + + \ No newline at end of file diff --git a/blazor-wasm-boilerplate-main/stylecop.json b/blazor-wasm-boilerplate-main/stylecop.json new file mode 100644 index 0000000..95ceebe --- /dev/null +++ b/blazor-wasm-boilerplate-main/stylecop.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", + "settings": { + "orderingRules": { + "systemUsingDirectivesFirst": true, + "usingDirectivesPlacement": "outsideNamespace" + }, + "layoutRules": { + "newlineAtEndOfFile": "omit" + } + } +} \ No newline at end of file diff --git a/dotnet.ruleset b/dotnet.ruleset new file mode 100644 index 0000000..3010e47 --- /dev/null +++ b/dotnet.ruleset @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/global.json b/global.json new file mode 100644 index 0000000..f443bd4 --- /dev/null +++ b/global.json @@ -0,0 +1,7 @@ +{ + "sdk": { + "version": "6.0", + "rollForward": "latestMajor", + "allowPrerelease": true + } +} \ No newline at end of file diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9fa41873a242c485b6b8570e273e8246be3259 GIT binary patch literal 153939 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%0A&u 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[YRGava~CQ`0J#idFCTB7Mm6Cy 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 b46BggvoE43D^m*Khv?fQGX5 literal 0 HcmV?d00001 diff --git a/scripts/nswag-regen.ps1 b/scripts/nswag-regen.ps1 new file mode 100644 index 0000000..98ccbc4 --- /dev/null +++ b/scripts/nswag-regen.ps1 @@ -0,0 +1,20 @@ +# This script is cross-platform, supporting all OSes that PowerShell Core/7 runs on. + +$currentDirectory = Get-Location +$rootDirectory = git rev-parse --show-toplevel +$hostDirectory = Join-Path -Path $rootDirectory -ChildPath 'src/Host' +$infrastructurePrj = Join-Path -Path $rootDirectory -ChildPath 'src/Client.Infrastructure/Client.Infrastructure.csproj' + +Write-Host "Make sure you have run the RewardsPlus.WebApi project. `n" +Write-Host "Press any key to continue... `n" +$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); + +Set-Location -Path $hostDirectory +Write-Host "Host Directory is $hostDirectory `n" + +<# Run command #> +dotnet build -t:NSwag $infrastructurePrj + +Set-Location -Path $currentDirectory +Write-Host -NoNewLine 'NSwag Regenerated. Press any key to continue...'; +$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); diff --git a/scripts/pull-shared-from-webapi.ps1 b/scripts/pull-shared-from-webapi.ps1 new file mode 100644 index 0000000..35dd0ab --- /dev/null +++ b/scripts/pull-shared-from-webapi.ps1 @@ -0,0 +1,40 @@ +# This script is cross-platform, supporting all OSes that PowerShell Core/7 runs on. + +$rootDirectory = git rev-parse --show-toplevel +$sourcePath = Join-Path -Path $rootDirectory -ChildPath '..\dotnet-webapi-boilerplate\src\Core\Shared' +$destinationPath = Join-Path -Path $rootDirectory -ChildPath 'src\Shared' + +$excludes = @('bin', 'obj') + +Write-Host "Pull changes from the Fullstackhero WebApi Shared Project" +write-Host "---------------------------------------------------------" +Write-Host + +If ($null -eq $sourcePath) { + Write-Error "Error! The expected path of WebApi Shared Project does not exist: $sourcePath" + Exit 1 +} + +if ($null -eq (Resolve-Path $destinationPath)) { + # Ensure the destination exists + try + { + New-Item -Path $destinationPath -ItemType Directory -ErrorAction Stop | Out-Null + } + catch + { + Write-Error "Error! Unable to create output path \"$destinationPath\"" + Exit 1 + } +} + +Write-Host "WARNING! This will delete everything in the shared project ($($destinationPath | Resolve-Path))" +Write-Host "and then copy over the whole project from the webapi repository ($($sourcePath | Resolve-Path))" +Write-Host +Read-Host -Prompt "Press ENTER to continue" + +Remove-Item -Path "$destinationPath" -Recurse -Force +Copy-Item -Path (Get-Item -Path "$sourcePath" -Exclude $excludes).FullName -Destination "$destinationPath" -Recurse -Force + +Write-Host "Changes have been pulled." +Write-Host \ No newline at end of file diff --git a/src/Client.Infrastructure/ApiClient/FSHApi.cs b/src/Client.Infrastructure/ApiClient/FSHApi.cs new file mode 100644 index 0000000..0e905a4 --- /dev/null +++ b/src/Client.Infrastructure/ApiClient/FSHApi.cs @@ -0,0 +1,6849 @@ +//---------------------- +// +// Generated using the NSwag toolchain v13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org) +// +//---------------------- + +#nullable enable + +#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended." +#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword." +#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?' +#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ... +#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..." +#pragma warning disable 8073 // Disable "CS8073 The result of the expression is always 'false' since a value of type 'T' is never equal to 'null' of type 'T?'" +#pragma warning disable 3016 // Disable "CS3016 Arrays as attribute arguments is not CLS-compliant" +#pragma warning disable 8603 // Disable "CS8603 Possible null reference return" + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient +{ + using System = global::System; + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface ITenantsClient : IApiService + { + /// + /// Get a list of all tenants. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetListAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a list of all tenants. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetListAsync(System.Threading.CancellationToken cancellationToken); + + /// + /// Create a new tenant. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateTenantRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create a new tenant. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateTenantRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Get tenant details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get tenant details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Activate a tenant. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ActivateAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Activate a tenant. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ActivateAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Deactivate a tenant. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeactivateAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Deactivate a tenant. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeactivateAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Upgrade a tenant's subscription. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpgradeSubscriptionAsync(string? id, UpgradeSubscriptionRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Upgrade a tenant's subscription. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpgradeSubscriptionAsync(string? id, UpgradeSubscriptionRequest request, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class TenantsClient : ITenantsClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public TenantsClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Get a list of all tenants. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetListAsync() + { + return GetListAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a list of all tenants. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetListAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tenants"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Create a new tenant. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task CreateAsync(CreateTenantRequest request) + { + return CreateAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create a new tenant. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task CreateAsync(CreateTenantRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tenants"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get tenant details. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetAsync(string? id) + { + return GetAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get tenant details. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tenants/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Activate a tenant. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ActivateAsync(string? id) + { + return ActivateAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Activate a tenant. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ActivateAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tenants/{id}/activate"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Deactivate a tenant. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeactivateAsync(string? id) + { + return DeactivateAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Deactivate a tenant. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeactivateAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tenants/{id}/deactivate"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Upgrade a tenant's subscription. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpgradeSubscriptionAsync(string? id, UpgradeSubscriptionRequest request) + { + return UpgradeSubscriptionAsync(id, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Upgrade a tenant's subscription. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpgradeSubscriptionAsync(string? id, UpgradeSubscriptionRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tenants/{id}/upgrade"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface IRolesClient : IApiService + { + /// + /// Get a list of all roles. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetListAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a list of all roles. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetListAsync(System.Threading.CancellationToken cancellationToken); + + /// + /// Create or update a role. + /// + /// A server side error occurred. + System.Threading.Tasks.Task RegisterRoleAsync(CreateOrUpdateRoleRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create or update a role. + /// + /// A server side error occurred. + System.Threading.Tasks.Task RegisterRoleAsync(CreateOrUpdateRoleRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Get role details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetByIdAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get role details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetByIdAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Delete a role. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete a role. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Get role details with its permissions. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetByIdWithPermissionsAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get role details with its permissions. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetByIdWithPermissionsAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Update a role's permissions. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdatePermissionsAsync(string? id, UpdateRolePermissionsRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a role's permissions. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdatePermissionsAsync(string? id, UpdateRolePermissionsRequest request, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class RolesClient : IRolesClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public RolesClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Get a list of all roles. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetListAsync() + { + return GetListAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a list of all roles. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetListAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/roles"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Create or update a role. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task RegisterRoleAsync(CreateOrUpdateRoleRequest request) + { + return RegisterRoleAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create or update a role. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task RegisterRoleAsync(CreateOrUpdateRoleRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/roles"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get role details. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetByIdAsync(string? id) + { + return GetByIdAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get role details. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetByIdAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/roles/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Delete a role. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteAsync(string? id) + { + return DeleteAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete a role. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/roles/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get role details with its permissions. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetByIdWithPermissionsAsync(string? id) + { + return GetByIdWithPermissionsAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get role details with its permissions. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetByIdWithPermissionsAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/roles/{id}/permissions"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Update a role's permissions. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpdatePermissionsAsync(string? id, UpdateRolePermissionsRequest request) + { + return UpdatePermissionsAsync(id, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a role's permissions. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpdatePermissionsAsync(string? id, UpdateRolePermissionsRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/roles/{id}/permissions"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface ITokensClient : IApiService + { + /// + /// Request an access token using credentials. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task GetTokenAsync(string tenant, TokenRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Request an access token using credentials. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task GetTokenAsync(string tenant, TokenRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Request an access token using a refresh token. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task RefreshAsync(string tenant, RefreshTokenRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Request an access token using a refresh token. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task RefreshAsync(string tenant, RefreshTokenRequest request, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class TokensClient : ITokensClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public TokensClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Request an access token using credentials. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetTokenAsync(string tenant, TokenRequest request) + { + return GetTokenAsync(tenant, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Request an access token using credentials. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetTokenAsync(string tenant, TokenRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tokens"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + + if (tenant == null) + throw new System.ArgumentNullException("tenant"); + request_.Headers.TryAddWithoutValidation("tenant", ConvertToString(tenant, System.Globalization.CultureInfo.InvariantCulture)); + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Request an access token using a refresh token. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual System.Threading.Tasks.Task RefreshAsync(string tenant, RefreshTokenRequest request) + { + return RefreshAsync(tenant, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Request an access token using a refresh token. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task RefreshAsync(string tenant, RefreshTokenRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/tokens/refresh"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + + if (tenant == null) + throw new System.ArgumentNullException("tenant"); + request_.Headers.TryAddWithoutValidation("tenant", ConvertToString(tenant, System.Globalization.CultureInfo.InvariantCulture)); + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface IUsersClient : IApiService + { + /// + /// Get list of all users. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetListAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get list of all users. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetListAsync(System.Threading.CancellationToken cancellationToken); + + /// + /// Creates a new user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateUserRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Creates a new user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateUserRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Get a user's details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetByIdAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a user's details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetByIdAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Get a user's roles. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetRolesAsync(string? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a user's roles. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetRolesAsync(string? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Update a user's assigned roles. + /// + /// A server side error occurred. + System.Threading.Tasks.Task AssignRolesAsync(string? id, UserRolesRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a user's assigned roles. + /// + /// A server side error occurred. + System.Threading.Tasks.Task AssignRolesAsync(string? id, UserRolesRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Anonymous user creates a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task SelfRegisterAsync(string tenant, CreateUserRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Anonymous user creates a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task SelfRegisterAsync(string tenant, CreateUserRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Toggle a user's active status. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ToggleStatusAsync(string? id, ToggleUserStatusRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Toggle a user's active status. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ToggleStatusAsync(string? id, ToggleUserStatusRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Confirm email address for a user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ConfirmEmailAsync(string? tenant, string? userId, string? code); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Confirm email address for a user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ConfirmEmailAsync(string? tenant, string? userId, string? code, System.Threading.CancellationToken cancellationToken); + + /// + /// Confirm phone number for a user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ConfirmPhoneNumberAsync(string? userId, string? code); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Confirm phone number for a user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ConfirmPhoneNumberAsync(string? userId, string? code, System.Threading.CancellationToken cancellationToken); + + /// + /// Request a pasword reset email for a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task ForgotPasswordAsync(string tenant, ForgotPasswordRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Request a pasword reset email for a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + System.Threading.Tasks.Task ForgotPasswordAsync(string tenant, ForgotPasswordRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Reset a user's password. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ResetPasswordAsync(ResetPasswordRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Reset a user's password. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ResetPasswordAsync(ResetPasswordRequest request, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UsersClient : IUsersClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public UsersClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Get list of all users. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetListAsync() + { + return GetListAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get list of all users. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetListAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Creates a new user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task CreateAsync(CreateUserRequest request) + { + return CreateAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Creates a new user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task CreateAsync(CreateUserRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get a user's details. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetByIdAsync(string? id) + { + return GetByIdAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a user's details. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetByIdAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get a user's roles. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetRolesAsync(string? id) + { + return GetRolesAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get a user's roles. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetRolesAsync(string? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/{id}/roles"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Update a user's assigned roles. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task AssignRolesAsync(string? id, UserRolesRequest request) + { + return AssignRolesAsync(id, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a user's assigned roles. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task AssignRolesAsync(string? id, UserRolesRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/{id}/roles"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Anonymous user creates a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual System.Threading.Tasks.Task SelfRegisterAsync(string tenant, CreateUserRequest request) + { + return SelfRegisterAsync(tenant, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Anonymous user creates a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task SelfRegisterAsync(string tenant, CreateUserRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/self-register"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + + if (tenant == null) + throw new System.ArgumentNullException("tenant"); + request_.Headers.TryAddWithoutValidation("tenant", ConvertToString(tenant, System.Globalization.CultureInfo.InvariantCulture)); + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Toggle a user's active status. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ToggleStatusAsync(string? id, ToggleUserStatusRequest request) + { + return ToggleStatusAsync(id, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Toggle a user's active status. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ToggleStatusAsync(string? id, ToggleUserStatusRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/{id}/toggle-status"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Confirm email address for a user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ConfirmEmailAsync(string? tenant, string? userId, string? code) + { + return ConfirmEmailAsync(tenant, userId, code, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Confirm email address for a user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ConfirmEmailAsync(string? tenant, string? userId, string? code, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/confirm-email?"); + if (tenant != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("tenant") + "=").Append(System.Uri.EscapeDataString(ConvertToString(tenant, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (userId != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("userId") + "=").Append(System.Uri.EscapeDataString(ConvertToString(userId, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (code != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("code") + "=").Append(System.Uri.EscapeDataString(ConvertToString(code, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Confirm phone number for a user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ConfirmPhoneNumberAsync(string? userId, string? code) + { + return ConfirmPhoneNumberAsync(userId, code, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Confirm phone number for a user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ConfirmPhoneNumberAsync(string? userId, string? code, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/confirm-phone-number?"); + if (userId != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("userId") + "=").Append(System.Uri.EscapeDataString(ConvertToString(userId, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (code != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("code") + "=").Append(System.Uri.EscapeDataString(ConvertToString(code, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Request a pasword reset email for a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ForgotPasswordAsync(string tenant, ForgotPasswordRequest request) + { + return ForgotPasswordAsync(tenant, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Request a pasword reset email for a user. + /// + /// Input your tenant Id to access this API + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ForgotPasswordAsync(string tenant, ForgotPasswordRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/forgot-password"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + + if (tenant == null) + throw new System.ArgumentNullException("tenant"); + request_.Headers.TryAddWithoutValidation("tenant", ConvertToString(tenant, System.Globalization.CultureInfo.InvariantCulture)); + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Reset a user's password. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ResetPasswordAsync(ResetPasswordRequest request) + { + return ResetPasswordAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Reset a user's password. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ResetPasswordAsync(ResetPasswordRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/users/reset-password"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface IPersonalClient : IApiService + { + /// + /// Get profile details of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetProfileAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get profile details of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetProfileAsync(System.Threading.CancellationToken cancellationToken); + + /// + /// Update profile details of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdateProfileAsync(UpdateUserRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update profile details of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdateProfileAsync(UpdateUserRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Change password of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ChangePasswordAsync(ChangePasswordRequest model); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Change password of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ChangePasswordAsync(ChangePasswordRequest model, System.Threading.CancellationToken cancellationToken); + + /// + /// Get permissions of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetPermissionsAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get permissions of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetPermissionsAsync(System.Threading.CancellationToken cancellationToken); + + /// + /// Get audit logs of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetLogsAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get audit logs of currently logged in user. + /// + /// A server side error occurred. + System.Threading.Tasks.Task> GetLogsAsync(System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class PersonalClient : IPersonalClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public PersonalClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Get profile details of currently logged in user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetProfileAsync() + { + return GetProfileAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get profile details of currently logged in user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetProfileAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/personal/profile"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Update profile details of currently logged in user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpdateProfileAsync(UpdateUserRequest request) + { + return UpdateProfileAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update profile details of currently logged in user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpdateProfileAsync(UpdateUserRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/personal/profile"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Change password of currently logged in user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ChangePasswordAsync(ChangePasswordRequest model) + { + return ChangePasswordAsync(model, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Change password of currently logged in user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ChangePasswordAsync(ChangePasswordRequest model, System.Threading.CancellationToken cancellationToken) + { + if (model == null) + throw new System.ArgumentNullException("model"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/personal/change-password"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(model, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + return; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get permissions of currently logged in user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetPermissionsAsync() + { + return GetPermissionsAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get permissions of currently logged in user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetPermissionsAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/personal/permissions"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get audit logs of currently logged in user. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task> GetLogsAsync() + { + return GetLogsAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get audit logs of currently logged in user. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task> GetLogsAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/personal/logs"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface IDashboardClient : IApiService + { + /// + /// Get statistics for the dashboard. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get statistics for the dashboard. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class DashboardClient : IDashboardClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public DashboardClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Get statistics for the dashboard. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetAsync() + { + return GetAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get statistics for the dashboard. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/dashboard"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface IBrandsClient : IApiService + { + /// + /// Search brands using available filters. + /// + /// A server side error occurred. + System.Threading.Tasks.Task SearchAsync(SearchBrandsRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Search brands using available filters. + /// + /// A server side error occurred. + System.Threading.Tasks.Task SearchAsync(SearchBrandsRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Get brand details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(System.Guid id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get brand details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(System.Guid id, System.Threading.CancellationToken cancellationToken); + + /// + /// Update a brand. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateBrandRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a brand. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateBrandRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Delete a brand. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteAsync(System.Guid id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete a brand. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteAsync(System.Guid id, System.Threading.CancellationToken cancellationToken); + + /// + /// Create a new brand. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateBrandRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create a new brand. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateBrandRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Generate a number of random brands. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GenerateRandomAsync(GenerateRandomBrandRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Generate a number of random brands. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GenerateRandomAsync(GenerateRandomBrandRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Delete the brands generated with the generate-random call. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteRandomAsync(); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete the brands generated with the generate-random call. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteRandomAsync(System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class BrandsClient : IBrandsClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public BrandsClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Search brands using available filters. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task SearchAsync(SearchBrandsRequest request) + { + return SearchAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Search brands using available filters. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task SearchAsync(SearchBrandsRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/brands/search"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get brand details. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetAsync(System.Guid id) + { + return GetAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get brand details. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetAsync(System.Guid id, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/brands/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Update a brand. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateBrandRequest request) + { + return UpdateAsync(id, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a brand. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateBrandRequest request, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/brands/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Delete a brand. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteAsync(System.Guid id) + { + return DeleteAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete a brand. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteAsync(System.Guid id, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/brands/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Create a new brand. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task CreateAsync(CreateBrandRequest request) + { + return CreateAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create a new brand. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task CreateAsync(CreateBrandRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/brands"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Generate a number of random brands. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GenerateRandomAsync(GenerateRandomBrandRequest request) + { + return GenerateRandomAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Generate a number of random brands. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GenerateRandomAsync(GenerateRandomBrandRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/brands/generate-random"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Delete the brands generated with the generate-random call. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteRandomAsync() + { + return DeleteRandomAsync(System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete the brands generated with the generate-random call. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteRandomAsync(System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/brands/delete-random"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial interface IProductsClient : IApiService + { + /// + /// Search products using available filters. + /// + /// A server side error occurred. + System.Threading.Tasks.Task SearchAsync(SearchProductsRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Search products using available filters. + /// + /// A server side error occurred. + System.Threading.Tasks.Task SearchAsync(SearchProductsRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Get product details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(System.Guid id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get product details. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetAsync(System.Guid id, System.Threading.CancellationToken cancellationToken); + + /// + /// Update a product. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateProductRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a product. + /// + /// A server side error occurred. + System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateProductRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Delete a product. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteAsync(System.Guid id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete a product. + /// + /// A server side error occurred. + System.Threading.Tasks.Task DeleteAsync(System.Guid id, System.Threading.CancellationToken cancellationToken); + + /// + /// Get product details via dapper. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetDapperAsync(System.Guid? id); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get product details via dapper. + /// + /// A server side error occurred. + System.Threading.Tasks.Task GetDapperAsync(System.Guid? id, System.Threading.CancellationToken cancellationToken); + + /// + /// Create a new product. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateProductRequest request); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create a new product. + /// + /// A server side error occurred. + System.Threading.Tasks.Task CreateAsync(CreateProductRequest request, System.Threading.CancellationToken cancellationToken); + + /// + /// Export a products. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ExportAsync(ExportProductsRequest filter); + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Export a products. + /// + /// A server side error occurred. + System.Threading.Tasks.Task ExportAsync(ExportProductsRequest filter, System.Threading.CancellationToken cancellationToken); + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ProductsClient : IProductsClient + { + private System.Net.Http.HttpClient _httpClient; + private System.Lazy _settings; + + public ProductsClient(System.Net.Http.HttpClient httpClient) + { + _httpClient = httpClient; + _settings = new System.Lazy(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// + /// Search products using available filters. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task SearchAsync(SearchProductsRequest request) + { + return SearchAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Search products using available filters. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task SearchAsync(SearchProductsRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/products/search"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get product details. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetAsync(System.Guid id) + { + return GetAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get product details. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetAsync(System.Guid id, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/products/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Update a product. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateProductRequest request) + { + return UpdateAsync(id, request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Update a product. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task UpdateAsync(System.Guid id, UpdateProductRequest request, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/products/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Delete a product. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task DeleteAsync(System.Guid id) + { + return DeleteAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Delete a product. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task DeleteAsync(System.Guid id, System.Threading.CancellationToken cancellationToken) + { + if (id == null) + throw new System.ArgumentNullException("id"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/products/{id}"); + urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("DELETE"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Get product details via dapper. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task GetDapperAsync(System.Guid? id) + { + return GetDapperAsync(id, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Get product details via dapper. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task GetDapperAsync(System.Guid? id, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/products/dapper?"); + if (id != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("id") + "=").Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Create a new product. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task CreateAsync(CreateProductRequest request) + { + return CreateAsync(request, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Create a new product. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task CreateAsync(CreateProductRequest request, System.Threading.CancellationToken cancellationToken) + { + if (request == null) + throw new System.ArgumentNullException("request"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/products"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + return objectResponse_.Object; + } + else + if (status_ == 400) + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + else + { + var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); + if (objectResponse_.Object == null) + { + throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); + } + throw new ApiException("A server side error occurred.", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + /// + /// Export a products. + /// + /// A server side error occurred. + public virtual System.Threading.Tasks.Task ExportAsync(ExportProductsRequest filter) + { + return ExportAsync(filter, System.Threading.CancellationToken.None); + } + + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// Export a products. + /// + /// A server side error occurred. + public virtual async System.Threading.Tasks.Task ExportAsync(ExportProductsRequest filter, System.Threading.CancellationToken cancellationToken) + { + if (filter == null) + throw new System.ArgumentNullException("filter"); + + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append("api/v1/products/export"); + + var client_ = _httpClient; + var disposeClient_ = false; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(filter, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/octet-stream")); + + PrepareRequest(client_, request_, urlBuilder_); + + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var disposeResponse_ = true; + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = (int)response_.StatusCode; + if (status_ == 200 || status_ == 206) + { + var responseStream_ = response_.Content == null ? System.IO.Stream.Null : await response_.Content.ReadAsStreamAsync().ConfigureAwait(false); + var fileResponse_ = new FileResponse(status_, headers_, responseStream_, null, response_); + disposeClient_ = false; disposeResponse_ = false; // response and client are disposed by FileResponse + return fileResponse_; + } + else + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); + } + } + finally + { + if (disposeResponse_) + response_.Dispose(); + } + } + } + finally + { + if (disposeClient_) + client_.Dispose(); + } + } + + protected struct ObjectResponseResult + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult(default(T)!, string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings); + return new ObjectResponseResult(typedBody!, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize(jsonTextReader); + return new ObjectResponseResult(typedBody!, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) + { + if (value == null) + { + return ""; + } + + if (value is System.Enum) + { + var name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); + return converted == null ? string.Empty : converted; + } + } + else if (value is bool) + { + return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + var result = System.Convert.ToString(value, cultureInfo); + return result == null ? "" : result; + } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class TenantDto + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("connectionString", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? ConnectionString { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("adminEmail", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string AdminEmail { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("isActive", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool IsActive { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("validUpto", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTime ValidUpto { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Issuer { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class HttpValidationProblemDetails : ProblemDetails + { + [Newtonsoft.Json.JsonProperty("errors", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.IDictionary> Errors { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ProblemDetails + { + [Newtonsoft.Json.JsonProperty("type", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Type { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("title", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Title { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int? Status { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("detail", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Detail { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("instance", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Instance { get; set; } = default!; + + private System.Collections.Generic.IDictionary _additionalProperties = new System.Collections.Generic.Dictionary(); + + [Newtonsoft.Json.JsonExtensionData] + public System.Collections.Generic.IDictionary AdditionalProperties + { + get { return _additionalProperties; } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ErrorResult + { + [Newtonsoft.Json.JsonProperty("messages", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection? Messages { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("source", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Source { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("exception", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Exception { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("errorId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? ErrorId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("supportMessage", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? SupportMessage { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("statusCode", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int StatusCode { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateTenantRequest + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("connectionString", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? ConnectionString { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("adminEmail", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.RegularExpression(@"^[^@]+@[^@]+$")] + public string AdminEmail { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Issuer { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpgradeSubscriptionRequest + { + [Newtonsoft.Json.JsonProperty("tenantId", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string TenantId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("extendedExpiryDate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTime ExtendedExpiryDate { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class RoleDto + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("permissions", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection? Permissions { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpdateRolePermissionsRequest + { + [Newtonsoft.Json.JsonProperty("roleId", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string RoleId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("permissions", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public System.Collections.Generic.ICollection Permissions { get; set; } = new System.Collections.ObjectModel.Collection(); + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateOrUpdateRoleRequest + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class TokenResponse + { + [Newtonsoft.Json.JsonProperty("token", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Token { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("refreshToken", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string RefreshToken { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("refreshTokenExpiryTime", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTime RefreshTokenExpiryTime { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class TokenRequest + { + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.RegularExpression(@"^[^@]+@[^@]+$")] + public string Email { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("password", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Password { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class RefreshTokenRequest + { + [Newtonsoft.Json.JsonProperty("token", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Token { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("refreshToken", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string RefreshToken { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UserDetailsDto + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("userName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? UserName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("firstName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? FirstName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("lastName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? LastName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Email { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("isActive", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool IsActive { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("emailConfirmed", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool EmailConfirmed { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("phoneNumber", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? PhoneNumber { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("imageUrl", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? ImageUrl { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UserRoleDto + { + [Newtonsoft.Json.JsonProperty("roleId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? RoleId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("roleName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? RoleName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("enabled", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool Enabled { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UserRolesRequest + { + [Newtonsoft.Json.JsonProperty("userRoles", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection UserRoles { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateUserRequest + { + [Newtonsoft.Json.JsonProperty("firstName", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string FirstName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("lastName", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string LastName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.RegularExpression(@"^[^@]+@[^@]+$")] + public string Email { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("userName", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string UserName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("password", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Password { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("confirmPassword", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string ConfirmPassword { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("phoneNumber", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? PhoneNumber { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ToggleUserStatusRequest + { + [Newtonsoft.Json.JsonProperty("activateUser", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool ActivateUser { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("userId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? UserId { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ForgotPasswordRequest + { + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.RegularExpression(@"^[^@]+@[^@]+$")] + public string Email { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ResetPasswordRequest + { + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Email { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("password", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Password { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("token", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Token { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpdateUserRequest + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("firstName", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(75, MinimumLength = 1)] + public string FirstName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("lastName", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(75, MinimumLength = 1)] + public string LastName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("phoneNumber", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? PhoneNumber { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.RegularExpression(@"^[^@]+@[^@]+$")] + public string Email { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("image", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public FileUploadRequest? Image { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("deleteCurrentImage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool DeleteCurrentImage { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class FileUploadRequest + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(150, MinimumLength = 1)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("extension", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(5, MinimumLength = 1)] + public string Extension { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("data", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Data { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ChangePasswordRequest + { + [Newtonsoft.Json.JsonProperty("password", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string Password { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("newPassword", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public string NewPassword { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("confirmNewPassword", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ConfirmNewPassword { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class AuditDto + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("userId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid UserId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("type", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Type { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("tableName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? TableName { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("dateTime", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTime DateTime { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("oldValues", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? OldValues { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("newValues", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? NewValues { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("affectedColumns", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? AffectedColumns { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("primaryKey", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? PrimaryKey { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class StatsDto + { + [Newtonsoft.Json.JsonProperty("productCount", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int ProductCount { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("brandCount", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int BrandCount { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("userCount", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int UserCount { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("roleCount", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int RoleCount { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("dataEnterBarChart", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection DataEnterBarChart { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("productByBrandTypePieChart", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.IDictionary? ProductByBrandTypePieChart { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ChartSeries + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("data", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection? Data { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class PaginationResponseOfBrandDto + { + [Newtonsoft.Json.JsonProperty("data", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Data { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("currentPage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int CurrentPage { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("totalPages", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int TotalPages { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("totalCount", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int TotalCount { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("pageSize", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int PageSize { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("hasPreviousPage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool HasPreviousPage { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("hasNextPage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool HasNextPage { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class BrandDto + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class SearchBrandsRequest : PaginationFilter + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class PaginationFilter : BaseFilter + { + [Newtonsoft.Json.JsonProperty("pageNumber", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int PageNumber { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("pageSize", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int PageSize { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("orderBy", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection? OrderBy { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class BaseFilter + { + /// + /// Column Wise Search is Supported. + /// + [Newtonsoft.Json.JsonProperty("advancedSearch", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Search? AdvancedSearch { get; set; } = default!; + + /// + /// Keyword to Search in All the available columns of the Resource. + /// + [Newtonsoft.Json.JsonProperty("keyword", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Keyword { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Search + { + [Newtonsoft.Json.JsonProperty("fields", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Fields { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("keyword", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Keyword { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateBrandRequest + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(75, MinimumLength = 1)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpdateBrandRequest + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(75, MinimumLength = 1)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class GenerateRandomBrandRequest + { + [Newtonsoft.Json.JsonProperty("nSeed", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int NSeed { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class PaginationResponseOfProductDto + { + [Newtonsoft.Json.JsonProperty("data", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection Data { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("currentPage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int CurrentPage { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("totalPages", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int TotalPages { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("totalCount", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int TotalCount { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("pageSize", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int PageSize { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("hasPreviousPage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool HasPreviousPage { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("hasNextPage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool HasNextPage { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ProductDto + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("rate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public decimal Rate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("imagePath", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? ImagePath { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("brandId", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid BrandId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("brandName", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string BrandName { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class SearchProductsRequest : PaginationFilter + { + [Newtonsoft.Json.JsonProperty("brandId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid? BrandId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("minimumRate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public decimal? MinimumRate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("maximumRate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public decimal? MaximumRate { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ProductDetailsDto + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("rate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public decimal Rate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("imagePath", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? ImagePath { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("brand", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public BrandDto Brand { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class CreateProductRequest + { + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(75, MinimumLength = 1)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("rate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [System.ComponentModel.DataAnnotations.Range(1.0D, double.MaxValue)] + public decimal Rate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("brandId", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public System.Guid BrandId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("image", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public FileUploadRequest? Image { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UpdateProductRequest + { + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid Id { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + [System.ComponentModel.DataAnnotations.StringLength(75, MinimumLength = 1)] + public string Name { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string? Description { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("rate", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + [System.ComponentModel.DataAnnotations.Range(1.0D, double.MaxValue)] + public decimal Rate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("brandId", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public System.Guid BrandId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("deleteCurrentImage", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool DeleteCurrentImage { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("image", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public FileUploadRequest? Image { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ExportProductsRequest : BaseFilter + { + [Newtonsoft.Json.JsonProperty("brandId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Guid? BrandId { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("minimumRate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public decimal? MinimumRate { get; set; } = default!; + + [Newtonsoft.Json.JsonProperty("maximumRate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public decimal? MaximumRate { get; set; } = default!; + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class FileResponse : System.IDisposable + { + private System.IDisposable? _client; + private System.IDisposable? _response; + + public int StatusCode { get; private set; } + + public System.Collections.Generic.IReadOnlyDictionary> Headers { get; private set; } + + public System.IO.Stream Stream { get; private set; } + + public bool IsPartial + { + get { return StatusCode == 206; } + } + + public FileResponse(int statusCode, System.Collections.Generic.IReadOnlyDictionary> headers, System.IO.Stream stream, System.IDisposable? client, System.IDisposable? response) + { + StatusCode = statusCode; + Headers = headers; + Stream = stream; + _client = client; + _response = response; + } + + public void Dispose() + { + Stream.Dispose(); + if (_response != null) + _response.Dispose(); + if (_client != null) + _client.Dispose(); + } + } + + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ApiException : System.Exception + { + public int StatusCode { get; private set; } + + public string? Response { get; private set; } + + public System.Collections.Generic.IReadOnlyDictionary> Headers { get; private set; } + + public ApiException(string message, int statusCode, string? response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Exception? innerException) + : base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + ((response == null) ? "(null)" : response.Substring(0, response.Length >= 512 ? 512 : response.Length)), innerException) + { + StatusCode = statusCode; + Response = response; + Headers = headers; + } + + public override string ToString() + { + return string.Format("HTTP Response: \n\n{0}\n\n{1}", Response, base.ToString()); + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class ApiException : ApiException + { + public TResult Result { get; private set; } + + public ApiException(string message, int statusCode, string? response, System.Collections.Generic.IReadOnlyDictionary> headers, TResult result, System.Exception? innerException) + : base(message, statusCode, response, headers, innerException) + { + Result = result; + } + } + +} + +#pragma warning restore 1591 +#pragma warning restore 1573 +#pragma warning restore 472 +#pragma warning restore 114 +#pragma warning restore 108 +#pragma warning restore 3016 +#pragma warning restore 8603 \ No newline at end of file diff --git a/src/Client.Infrastructure/ApiClient/IApiService.cs b/src/Client.Infrastructure/ApiClient/IApiService.cs new file mode 100644 index 0000000..4bbe1b4 --- /dev/null +++ b/src/Client.Infrastructure/ApiClient/IApiService.cs @@ -0,0 +1,5 @@ +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; + +public interface IApiService +{ +} \ No newline at end of file diff --git a/src/Client.Infrastructure/ApiClient/nswag.json b/src/Client.Infrastructure/ApiClient/nswag.json new file mode 100644 index 0000000..47351c6 --- /dev/null +++ b/src/Client.Infrastructure/ApiClient/nswag.json @@ -0,0 +1,100 @@ +{ + "runtime": "Net60", + "defaultVariables": null, + "documentGenerator": { + "fromDocument": { + "json": "", + "url": "https://localhost:5001/swagger/v1/swagger.json", + "output": null, + "newLineBehavior": "Auto" + } + }, + "codeGenerators": { + "openApiToCSharpClient": { + "clientBaseClass": null, + "configurationClass": null, + "generateClientClasses": true, + "generateClientInterfaces": true, + "clientBaseInterface": "IApiService", + "injectHttpClient": true, + "disposeHttpClient": false, + "protectedMethods": [], + "generateExceptionClasses": true, + "exceptionClass": "ApiException", + "wrapDtoExceptions": true, + "useHttpClientCreationMethod": false, + "httpClientType": "System.Net.Http.HttpClient", + "useHttpRequestMessageCreationMethod": false, + "useBaseUrl": false, + "generateBaseUrlProperty": true, + "generateSyncMethods": false, + "generatePrepareRequestAndProcessResponseAsAsyncMethods": false, + "exposeJsonSerializerSettings": false, + "clientClassAccessModifier": "public", + "typeAccessModifier": "public", + "generateContractsOutput": false, + "contractsNamespace": null, + "contractsOutputFilePath": null, + "parameterDateTimeFormat": "s", + "parameterDateFormat": "yyyy-MM-dd", + "generateUpdateJsonSerializerSettingsMethod": true, + "useRequestAndResponseSerializationSettings": false, + "serializeTypeInformation": false, + "queryNullValue": "", + "className": "{controller}Client", + "operationGenerationMode": "MultipleClientsFromOperationId", + "additionalNamespaceUsages": [], + "additionalContractNamespaceUsages": [], + "generateOptionalParameters": false, + "generateJsonMethods": false, + "enforceFlagEnums": false, + "parameterArrayType": "System.Collections.Generic.IEnumerable", + "parameterDictionaryType": "System.Collections.Generic.IDictionary", + "responseArrayType": "System.Collections.Generic.ICollection", + "responseDictionaryType": "System.Collections.Generic.IDictionary", + "wrapResponses": false, + "wrapResponseMethods": [], + "generateResponseClasses": true, + "responseClass": "SwaggerResponse", + "namespace": "FSH.BlazorWebAssembly.Client.Infrastructure.ApiClient", + "requiredPropertiesMustBeDefined": true, + "dateType": "System.DateTimeOffset", + "jsonConverters": null, + "anyType": "object", + "dateTimeType": "System.DateTime", + "timeType": "System.TimeSpan", + "timeSpanType": "System.TimeSpan", + "arrayType": "System.Collections.Generic.ICollection", + "arrayInstanceType": "System.Collections.ObjectModel.Collection", + "dictionaryType": "System.Collections.Generic.IDictionary", + "dictionaryInstanceType": "System.Collections.Generic.Dictionary", + "arrayBaseType": "System.Collections.ObjectModel.Collection", + "dictionaryBaseType": "System.Collections.Generic.Dictionary", + "classStyle": "Poco", + "jsonLibrary": "NewtonsoftJson", + "generateDefaultValues": true, + "generateDataAnnotations": true, + "excludedTypeNames": [], + "excludedParameterNames": [], + "handleReferences": false, + "generateImmutableArrayProperties": false, + "generateImmutableDictionaryProperties": false, + "jsonSerializerSettingsTransformationMethod": null, + "inlineNamedArrays": false, + "inlineNamedDictionaries": false, + "inlineNamedTuples": true, + "inlineNamedAny": false, + "generateDtoTypes": true, + "generateOptionalPropertiesAsNullable": false, + "generateNullableReferenceTypes": true, + "templateDirectory": null, + "typeNameGeneratorType": null, + "propertyNameGeneratorType": null, + "enumNameGeneratorType": null, + "serviceHost": null, + "serviceSchemes": null, + "output": "FSHApi.cs", + "newLineBehavior": "Auto" + } + } +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Auth/AuthProvider.cs b/src/Client.Infrastructure/Auth/AuthProvider.cs new file mode 100644 index 0000000..fb956cf --- /dev/null +++ b/src/Client.Infrastructure/Auth/AuthProvider.cs @@ -0,0 +1,7 @@ +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; + +public enum AuthProvider +{ + Jwt, + AzureAd +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Auth/AuthorizationServiceExtensions.cs b/src/Client.Infrastructure/Auth/AuthorizationServiceExtensions.cs new file mode 100644 index 0000000..8b2e42d --- /dev/null +++ b/src/Client.Infrastructure/Auth/AuthorizationServiceExtensions.cs @@ -0,0 +1,10 @@ +using RewardsPlus.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; + +public static class AuthorizationServiceExtensions +{ + public static async Task HasPermissionAsync(this IAuthorizationService service, ClaimsPrincipal user, string action, string resource) => + (await service.AuthorizeAsync(user, null, FSHPermission.NameFor(action, resource))).Succeeded; +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthenticationService.cs b/src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthenticationService.cs new file mode 100644 index 0000000..821b041 --- /dev/null +++ b/src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthenticationService.cs @@ -0,0 +1,34 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth.AzureAd; + +internal class AzureAdAuthenticationService : IAuthenticationService +{ + private readonly SignOutSessionStateManager _signOut; + private readonly NavigationManager _navigation; + + public AzureAdAuthenticationService(SignOutSessionStateManager signOut, NavigationManager navigation) => + (_signOut, _navigation) = (signOut, navigation); + + public AuthProvider ProviderType => AuthProvider.AzureAd; + + public void NavigateToExternalLogin(string returnUrl) => + _navigation.NavigateTo($"authentication/login?returnUrl={Uri.EscapeDataString(returnUrl)}"); + + public Task LoginAsync(string tenantId, TokenRequest request) => + throw new NotImplementedException(); + + public async Task LogoutAsync() + { + await _signOut.SetSignOutState(); + _navigation.NavigateTo("authentication/logout"); + } + + public Task ReLoginAsync(string returnUrl) + { + NavigateToExternalLogin(returnUrl); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthorizationMessageHandler.cs b/src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthorizationMessageHandler.cs new file mode 100644 index 0000000..53d607e --- /dev/null +++ b/src/Client.Infrastructure/Auth/AzureAd/AzureAdAuthorizationMessageHandler.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth.AzureAd; + +public class AzureAdAuthorizationMessageHandler : AuthorizationMessageHandler +{ + public AzureAdAuthorizationMessageHandler(IAccessTokenProvider provider, NavigationManager navigation, IConfiguration config) + : base(provider, navigation) => ConfigureHandler( + new[] { config[ConfigNames.ApiBaseUrl] }, + new[] { config[$"{nameof(AuthProvider.AzureAd)}:{ConfigNames.ApiScope}"] }); +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Auth/AzureAd/AzureAdClaimsPrincipalFactory.cs b/src/Client.Infrastructure/Auth/AzureAd/AzureAdClaimsPrincipalFactory.cs new file mode 100644 index 0000000..f678ab3 --- /dev/null +++ b/src/Client.Infrastructure/Auth/AzureAd/AzureAdClaimsPrincipalFactory.cs @@ -0,0 +1,73 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal; +using Microsoft.Extensions.DependencyInjection; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth.AzureAd; + +internal class AzureAdClaimsPrincipalFactory : AccountClaimsPrincipalFactory +{ + // Can't work with actual services in the constructor here, have to + // use IServiceProvider, otherwise the app hangs at startup. + // The culprit is probably HttpClient, as this class is instantiated + // at startup while the HttpClient is being (or not even) created. + private readonly IServiceProvider _services; + + public AzureAdClaimsPrincipalFactory(IAccessTokenProviderAccessor accessor, IServiceProvider services) + : base(accessor) => + _services = services; + + public override async ValueTask CreateUserAsync(RemoteUserAccount account, RemoteAuthenticationUserOptions options) + { + var principal = await base.CreateUserAsync(account, options); + + if (principal.Identity?.IsAuthenticated is true) + { + var userDetails = await _services.GetRequiredService().GetProfileAsync(); + + var userIdentity = (ClaimsIdentity)principal.Identity; + + if (!string.IsNullOrWhiteSpace(userDetails.Email) && !userIdentity.HasClaim(c => c.Type == ClaimTypes.Email)) + { + userIdentity.AddClaim(new Claim(ClaimTypes.Email, userDetails.Email)); + } + + if (!string.IsNullOrWhiteSpace(userDetails.PhoneNumber) && !userIdentity.HasClaim(c => c.Type == ClaimTypes.MobilePhone)) + { + userIdentity.AddClaim(new Claim(ClaimTypes.MobilePhone, userDetails.PhoneNumber)); + } + + if (!string.IsNullOrWhiteSpace(userDetails.FirstName) && !userIdentity.HasClaim(c => c.Type == ClaimTypes.Name)) + { + userIdentity.AddClaim(new Claim(ClaimTypes.Name, userDetails.FirstName)); + } + + if (!string.IsNullOrWhiteSpace(userDetails.LastName) && !userIdentity.HasClaim(c => c.Type == ClaimTypes.Surname)) + { + userIdentity.AddClaim(new Claim(ClaimTypes.Surname, userDetails.LastName)); + } + + if (!userIdentity.HasClaim(c => c.Type == FSHClaims.Fullname)) + { + userIdentity.AddClaim(new Claim(FSHClaims.Fullname, $"{userDetails.FirstName} {userDetails.LastName}")); + } + + if (!userIdentity.HasClaim(c => c.Type == ClaimTypes.NameIdentifier)) + { + userIdentity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userDetails.Id.ToString())); + } + + if (!string.IsNullOrWhiteSpace(userDetails.ImageUrl) && !userIdentity.HasClaim(c => c.Type == FSHClaims.ImageUrl) && userDetails.ImageUrl is not null) + { + userIdentity.AddClaim(new Claim(FSHClaims.ImageUrl, userDetails.ImageUrl)); + } + + var permissions = await _services.GetRequiredService().GetPermissionsAsync(); + + userIdentity.AddClaims(permissions.Select(permission => new Claim(FSHClaims.Permission, permission))); + } + + return principal; + } +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Auth/IAuthenticationService.cs b/src/Client.Infrastructure/Auth/IAuthenticationService.cs new file mode 100644 index 0000000..685d53a --- /dev/null +++ b/src/Client.Infrastructure/Auth/IAuthenticationService.cs @@ -0,0 +1,16 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; + +public interface IAuthenticationService +{ + AuthProvider ProviderType { get; } + + void NavigateToExternalLogin(string returnUrl); + + Task LoginAsync(string tenantId, TokenRequest request); + + Task LogoutAsync(); + + Task ReLoginAsync(string returnUrl); +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Auth/Jwt/AccessTokenProviderAccessor.cs b/src/Client.Infrastructure/Auth/Jwt/AccessTokenProviderAccessor.cs new file mode 100644 index 0000000..a9b1ecd --- /dev/null +++ b/src/Client.Infrastructure/Auth/Jwt/AccessTokenProviderAccessor.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal; +using Microsoft.Extensions.DependencyInjection; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth.Jwt; + +internal class AccessTokenProviderAccessor : IAccessTokenProviderAccessor +{ + private readonly IServiceProvider _provider; + private IAccessTokenProvider? _tokenProvider; + + public AccessTokenProviderAccessor(IServiceProvider provider) => + _provider = provider; + + public IAccessTokenProvider TokenProvider => + _tokenProvider ??= _provider.GetRequiredService(); +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationHeaderHandler.cs b/src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationHeaderHandler.cs new file mode 100644 index 0000000..59b6ff3 --- /dev/null +++ b/src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationHeaderHandler.cs @@ -0,0 +1,34 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth.Jwt; + +public class JwtAuthenticationHeaderHandler : DelegatingHandler +{ + private readonly IAccessTokenProviderAccessor _tokenProviderAccessor; + private readonly NavigationManager _navigation; + + public JwtAuthenticationHeaderHandler(IAccessTokenProviderAccessor tokenProviderAccessor, NavigationManager navigation) + { + _tokenProviderAccessor = tokenProviderAccessor; + _navigation = navigation; + } + + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + // skip token endpoints + if (request.RequestUri?.AbsolutePath.Contains("/tokens") is not true) + { + if (await _tokenProviderAccessor.TokenProvider.GetAccessTokenAsync() is string token) + { + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); + } + else + { + _navigation.NavigateTo("/login"); + } + } + + return await base.SendAsync(request, cancellationToken); + } +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationService.cs b/src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationService.cs new file mode 100644 index 0000000..061019d --- /dev/null +++ b/src/Client.Infrastructure/Auth/Jwt/JwtAuthenticationService.cs @@ -0,0 +1,222 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth.Jwt; + +public class JwtAuthenticationService : AuthenticationStateProvider, IAuthenticationService, IAccessTokenProvider +{ + private readonly SemaphoreSlim _semaphore = new(1, 1); + + private readonly ILocalStorageService _localStorage; + private readonly ITokensClient _tokensClient; + private readonly IPersonalClient _personalClient; + private readonly NavigationManager _navigation; + + public AuthProvider ProviderType => AuthProvider.Jwt; + + public JwtAuthenticationService(ILocalStorageService localStorage, IPersonalClient personalClient, ITokensClient tokensClient, NavigationManager navigation) + { + _localStorage = localStorage; + _personalClient = personalClient; + _tokensClient = tokensClient; + _navigation = navigation; + } + + public override async Task GetAuthenticationStateAsync() + { + string cachedToken = await GetCachedAuthTokenAsync(); + if (string.IsNullOrWhiteSpace(cachedToken)) + { + return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity())); + } + + // Generate claimsIdentity from cached token + var claimsIdentity = new ClaimsIdentity(GetClaimsFromJwt(cachedToken), "jwt"); + + // Add cached permissions as claims + if (await GetCachedPermissionsAsync() is List cachedPermissions) + { + claimsIdentity.AddClaims(cachedPermissions.Select(p => new Claim(FSHClaims.Permission, p))); + } + + return new AuthenticationState(new ClaimsPrincipal(claimsIdentity)); + } + + public void NavigateToExternalLogin(string returnUrl) => + throw new NotImplementedException(); + + public async Task LoginAsync(string tenantId, TokenRequest request) + { + var tokenResponse = await _tokensClient.GetTokenAsync(tenantId, request); + + string? token = tokenResponse.Token; + string? refreshToken = tokenResponse.RefreshToken; + + if (string.IsNullOrWhiteSpace(token) || string.IsNullOrWhiteSpace(refreshToken)) + { + return false; + } + + await CacheAuthTokens(token, refreshToken); + + // Get permissions for the current user and add them to the cache + var permissions = await _personalClient.GetPermissionsAsync(); + await CachePermissions(permissions); + + NotifyAuthenticationStateChanged(GetAuthenticationStateAsync()); + + return true; + } + + public async Task LogoutAsync() + { + await ClearCacheAsync(); + + NotifyAuthenticationStateChanged(GetAuthenticationStateAsync()); + + _navigation.NavigateTo("/login"); + } + + public async Task ReLoginAsync(string returnUrl) + { + await LogoutAsync(); + _navigation.NavigateTo(returnUrl); + } + + public async ValueTask RequestAccessToken() + { + var authState = await GetAuthenticationStateAsync(); + if (authState.User.Identity?.IsAuthenticated is not true) + { + return new AccessTokenResult(AccessTokenResultStatus.RequiresRedirect, null, "/login"); + } + + // We make sure the access token is only refreshed by one thread at a time. The other ones have to wait. + await _semaphore.WaitAsync(); + try + { + string? token = await GetCachedAuthTokenAsync(); + + // Check if token needs to be refreshed (when its expiration time is less than 1 minute away) + var expTime = authState.User.GetExpiration(); + var diff = expTime - DateTime.UtcNow; + if (diff.TotalMinutes <= 1) + { + string? refreshToken = await GetCachedRefreshTokenAsync(); + (bool succeeded, var response) = await TryRefreshTokenAsync(new RefreshTokenRequest { Token = token, RefreshToken = refreshToken }); + if (!succeeded) + { + return new AccessTokenResult(AccessTokenResultStatus.RequiresRedirect, null, "/login"); + } + + token = response?.Token; + } + + return new AccessTokenResult(AccessTokenResultStatus.Success, new AccessToken() { Value = token }, string.Empty); + } + finally + { + _semaphore.Release(); + } + } + + public ValueTask RequestAccessToken(AccessTokenRequestOptions options) => + RequestAccessToken(); + + private async Task<(bool Succeeded, TokenResponse? Token)> TryRefreshTokenAsync(RefreshTokenRequest request) + { + var authState = await GetAuthenticationStateAsync(); + string? tenantKey = authState.User.GetTenant(); + if (string.IsNullOrWhiteSpace(tenantKey)) + { + throw new InvalidOperationException("Can't refresh token when user is not logged in!"); + } + + try + { + var tokenResponse = await _tokensClient.RefreshAsync(tenantKey, request); + + await CacheAuthTokens(tokenResponse.Token, tokenResponse.RefreshToken); + + return (true, tokenResponse); + } + catch (ApiException) + { + return (false, null); + } + } + + private async ValueTask CacheAuthTokens(string? token, string? refreshToken) + { + await _localStorage.SetItemAsync(StorageConstants.Local.AuthToken, token); + await _localStorage.SetItemAsync(StorageConstants.Local.RefreshToken, refreshToken); + } + + private ValueTask CachePermissions(ICollection permissions) => + _localStorage.SetItemAsync(StorageConstants.Local.Permissions, permissions); + + private async Task ClearCacheAsync() + { + await _localStorage.RemoveItemAsync(StorageConstants.Local.AuthToken); + await _localStorage.RemoveItemAsync(StorageConstants.Local.RefreshToken); + await _localStorage.RemoveItemAsync(StorageConstants.Local.Permissions); + } + + private ValueTask GetCachedAuthTokenAsync() => + _localStorage.GetItemAsync(StorageConstants.Local.AuthToken); + + private ValueTask GetCachedRefreshTokenAsync() => + _localStorage.GetItemAsync(StorageConstants.Local.RefreshToken); + + private ValueTask> GetCachedPermissionsAsync() => + _localStorage.GetItemAsync>(StorageConstants.Local.Permissions); + + private IEnumerable GetClaimsFromJwt(string jwt) + { + var claims = new List(); + string payload = jwt.Split('.')[1]; + byte[] jsonBytes = ParseBase64WithoutPadding(payload); + var keyValuePairs = JsonSerializer.Deserialize>(jsonBytes); + + if (keyValuePairs is not null) + { + keyValuePairs.TryGetValue(ClaimTypes.Role, out object? roles); + + if (roles is not null) + { + string? rolesString = roles.ToString(); + if (!string.IsNullOrEmpty(rolesString)) + { + if (rolesString.Trim().StartsWith("[")) + { + string[]? parsedRoles = JsonSerializer.Deserialize(rolesString); + + if (parsedRoles is not null) + { + claims.AddRange(parsedRoles.Select(role => new Claim(ClaimTypes.Role, role))); + } + } + else + { + claims.Add(new Claim(ClaimTypes.Role, rolesString)); + } + } + + keyValuePairs.Remove(ClaimTypes.Role); + } + + claims.AddRange(keyValuePairs.Select(kvp => new Claim(kvp.Key, kvp.Value.ToString() ?? string.Empty))); + } + + return claims; + } + + private byte[] ParseBase64WithoutPadding(string payload) + { + payload = payload.Trim().Replace('-', '+').Replace('_', '/'); + string base64 = payload.PadRight(payload.Length + ((4 - (payload.Length % 4)) % 4), '='); + return Convert.FromBase64String(base64); + } +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Auth/MustHavePermissionAttribute.cs b/src/Client.Infrastructure/Auth/MustHavePermissionAttribute.cs new file mode 100644 index 0000000..3618e7e --- /dev/null +++ b/src/Client.Infrastructure/Auth/MustHavePermissionAttribute.cs @@ -0,0 +1,10 @@ +using RewardsPlus.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; + +public class MustHavePermissionAttribute : AuthorizeAttribute +{ + public MustHavePermissionAttribute(string action, string resource) => + Policy = FSHPermission.NameFor(action, resource); +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Auth/Startup.cs b/src/Client.Infrastructure/Auth/Startup.cs new file mode 100644 index 0000000..f692474 --- /dev/null +++ b/src/Client.Infrastructure/Auth/Startup.cs @@ -0,0 +1,47 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth.AzureAd; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth.Jwt; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal; +using Microsoft.Extensions.DependencyInjection; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; + +internal static class Startup +{ + public static IServiceCollection AddAuthentication(this IServiceCollection services, IConfiguration config) => + config[nameof(AuthProvider)] switch + { + // AzureAd + nameof(AuthProvider.AzureAd) => services + .AddScoped() + .AddScoped() + .AddMsalAuthentication(options => + { + config.Bind(nameof(AuthProvider.AzureAd), options.ProviderOptions.Authentication); + options.ProviderOptions.DefaultAccessTokenScopes.Add( + config[$"{nameof(AuthProvider.AzureAd)}:{ConfigNames.ApiScope}"]); + options.ProviderOptions.LoginMode = "redirect"; + }) + .AddAccountClaimsPrincipalFactory() + .Services, + + // Jwt + _ => services + .AddScoped() + .AddScoped(sp => (IAuthenticationService)sp.GetRequiredService()) + .AddScoped(sp => (IAccessTokenProvider)sp.GetRequiredService()) + .AddScoped() + .AddScoped() + }; + + public static IHttpClientBuilder AddAuthenticationHandler(this IHttpClientBuilder builder, IConfiguration config) => + config[nameof(AuthProvider)] switch + { + // AzureAd + nameof(AuthProvider.AzureAd) => + builder.AddHttpMessageHandler(), + + // Jwt + _ => builder.AddHttpMessageHandler() + }; +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Client.Infrastructure.csproj b/src/Client.Infrastructure/Client.Infrastructure.csproj new file mode 100644 index 0000000..e1301f9 --- /dev/null +++ b/src/Client.Infrastructure/Client.Infrastructure.csproj @@ -0,0 +1,39 @@ + + + + net6.0 + FSH.BlazorWebAssembly.Client.Infrastructure + FSH.BlazorWebAssembly.Client.Infrastructure + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Client.Infrastructure/Common/AccessTokenProviderExtensions.cs b/src/Client.Infrastructure/Common/AccessTokenProviderExtensions.cs new file mode 100644 index 0000000..3b12abc --- /dev/null +++ b/src/Client.Infrastructure/Common/AccessTokenProviderExtensions.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Common; + +public static class AccessTokenProviderExtensions +{ + public static async Task GetAccessTokenAsync(this IAccessTokenProvider tokenProvider) => + (await tokenProvider.RequestAccessToken()) + .TryGetToken(out var token) + ? token.Value + : null; +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Common/ApplicationConstants.cs b/src/Client.Infrastructure/Common/ApplicationConstants.cs new file mode 100644 index 0000000..02c94e9 --- /dev/null +++ b/src/Client.Infrastructure/Common/ApplicationConstants.cs @@ -0,0 +1,15 @@ +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Common; + +public static class ApplicationConstants +{ + public static readonly List SupportedImageFormats = new() + { + ".jpeg", + ".jpg", + ".png" + }; + public static readonly string StandardImageFormat = "image/jpeg"; + public static readonly int MaxImageWidth = 1500; + public static readonly int MaxImageHeight = 1500; + public static readonly long MaxAllowedSize = 1000000; // Allows Max File Size of 1 Mb. +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Common/ConfigNames.cs b/src/Client.Infrastructure/Common/ConfigNames.cs new file mode 100644 index 0000000..b2a0133 --- /dev/null +++ b/src/Client.Infrastructure/Common/ConfigNames.cs @@ -0,0 +1,7 @@ +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Common; + +public static class ConfigNames +{ + public const string ApiBaseUrl = "ApiBaseUrl"; + public const string ApiScope = "ApiScope"; +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Common/IAppService.cs b/src/Client.Infrastructure/Common/IAppService.cs new file mode 100644 index 0000000..c23b0b1 --- /dev/null +++ b/src/Client.Infrastructure/Common/IAppService.cs @@ -0,0 +1,5 @@ +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Common; + +public interface IAppService +{ +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Common/LocalizationConstants.cs b/src/Client.Infrastructure/Common/LocalizationConstants.cs new file mode 100644 index 0000000..4d7e7cf --- /dev/null +++ b/src/Client.Infrastructure/Common/LocalizationConstants.cs @@ -0,0 +1,21 @@ +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Common; + +public record LanguageCode(string Code, string DisplayName, bool IsRTL = false); + +public static class LocalizationConstants +{ + public static readonly LanguageCode[] SupportedLanguages = + { + new("en-US", "English"), + new("fr-FR", "French"), + new("km_KH", "Khmer"), + new("de-DE", "German"), + new("nl-NL", "Dutch - Netherlands"), + new("es-ES", "Spanish"), + new("ru-RU", "Russian"), + new("sv-SE", "Swedish"), + new("id-ID", "Indonesia"), + new("it-IT", "Italian"), + new("ar", "عربي", true) + }; +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Common/StorageConstants.cs b/src/Client.Infrastructure/Common/StorageConstants.cs new file mode 100644 index 0000000..f044cac --- /dev/null +++ b/src/Client.Infrastructure/Common/StorageConstants.cs @@ -0,0 +1,14 @@ +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Common; + +public static class StorageConstants +{ + public static class Local + { + public static string Preference = "clientPreference"; + + public static string AuthToken = "authToken"; + public static string RefreshToken = "refreshToken"; + public static string ImageUri = "userImageURL"; + public static string Permissions = "permissions"; + } +} \ No newline at end of file diff --git a/src/Client.Infrastructure/GlobalUsings.cs b/src/Client.Infrastructure/GlobalUsings.cs new file mode 100644 index 0000000..563b3e0 --- /dev/null +++ b/src/Client.Infrastructure/GlobalUsings.cs @@ -0,0 +1,7 @@ +global using System.Net.Http.Headers; +global using System.Security.Claims; +global using System.Text.Json; +global using Blazored.LocalStorage; +global using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Common; +global using Microsoft.AspNetCore.Components.Authorization; +global using Microsoft.Extensions.Configuration; diff --git a/src/Client.Infrastructure/Notifications/ConnectionState.cs b/src/Client.Infrastructure/Notifications/ConnectionState.cs new file mode 100644 index 0000000..6dbfc01 --- /dev/null +++ b/src/Client.Infrastructure/Notifications/ConnectionState.cs @@ -0,0 +1,8 @@ +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Notifications; + +public enum ConnectionState +{ + Connected, + Connecting, + Disconnected +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Notifications/ConnectionStateChanged.cs b/src/Client.Infrastructure/Notifications/ConnectionStateChanged.cs new file mode 100644 index 0000000..2987586 --- /dev/null +++ b/src/Client.Infrastructure/Notifications/ConnectionStateChanged.cs @@ -0,0 +1,5 @@ +using RewardsPlus.WebApi.Shared.Notifications; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Notifications; + +public record ConnectionStateChanged(ConnectionState State, string? Message) : INotificationMessage; \ No newline at end of file diff --git a/src/Client.Infrastructure/Notifications/INotificationPublisher.cs b/src/Client.Infrastructure/Notifications/INotificationPublisher.cs new file mode 100644 index 0000000..1a7b0df --- /dev/null +++ b/src/Client.Infrastructure/Notifications/INotificationPublisher.cs @@ -0,0 +1,8 @@ +using RewardsPlus.WebApi.Shared.Notifications; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Notifications; + +public interface INotificationPublisher +{ + Task PublishAsync(INotificationMessage notification); +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Notifications/NotificationPublisher.cs b/src/Client.Infrastructure/Notifications/NotificationPublisher.cs new file mode 100644 index 0000000..0ae62d2 --- /dev/null +++ b/src/Client.Infrastructure/Notifications/NotificationPublisher.cs @@ -0,0 +1,24 @@ +using RewardsPlus.WebApi.Shared.Notifications; +using MediatR; +using Microsoft.Extensions.Logging; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Notifications; + +public class NotificationPublisher : INotificationPublisher +{ + private readonly ILogger _logger; + private readonly IPublisher _mediator; + + public NotificationPublisher(ILogger logger, IPublisher mediator) => + (_logger, _mediator) = (logger, mediator); + + public Task PublishAsync(INotificationMessage notification) + { + _logger.LogInformation("Publishing Notification : {notification}", notification.GetType().Name); + return _mediator.Publish(CreateNotificationWrapper(notification)); + } + + private INotification CreateNotificationWrapper(INotificationMessage notification) => + (INotification)Activator.CreateInstance( + typeof(NotificationWrapper<>).MakeGenericType(notification.GetType()), notification)!; +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Notifications/NotificationWrapper.cs b/src/Client.Infrastructure/Notifications/NotificationWrapper.cs new file mode 100644 index 0000000..40c0f11 --- /dev/null +++ b/src/Client.Infrastructure/Notifications/NotificationWrapper.cs @@ -0,0 +1,12 @@ +using RewardsPlus.WebApi.Shared.Notifications; +using MediatR; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Notifications; + +public class NotificationWrapper : INotification + where TNotificationMessage : INotificationMessage +{ + public NotificationWrapper(TNotificationMessage notification) => Notification = notification; + + public TNotificationMessage Notification { get; } +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Notifications/Startup.cs b/src/Client.Infrastructure/Notifications/Startup.cs new file mode 100644 index 0000000..df712d2 --- /dev/null +++ b/src/Client.Infrastructure/Notifications/Startup.cs @@ -0,0 +1,34 @@ +using RewardsPlus.WebApi.Shared.Notifications; +using MediatR; +using MediatR.Courier; +using MediatR.Courier.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Notifications; + +internal static class Startup +{ + public static IServiceCollection AddNotifications(this IServiceCollection services) + { + // Add mediator processing of notifications + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + + services + .AddMediatR(assemblies) + .AddCourier(assemblies) + .AddTransient(); + + // Register handlers for all INotificationMessages + foreach (var eventType in assemblies + .SelectMany(a => a.GetTypes()) + .Where(t => t.GetInterfaces().Any(i => i == typeof(INotificationMessage)))) + { + services.AddSingleton( + typeof(INotificationHandler<>).MakeGenericType( + typeof(NotificationWrapper<>).MakeGenericType(eventType)), + serviceProvider => serviceProvider.GetRequiredService(typeof(MediatRCourier))); + } + + return services; + } +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Preferences/ClientPreference.cs b/src/Client.Infrastructure/Preferences/ClientPreference.cs new file mode 100644 index 0000000..f5df767 --- /dev/null +++ b/src/Client.Infrastructure/Preferences/ClientPreference.cs @@ -0,0 +1,15 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Theme; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences; + +public class ClientPreference : IPreference +{ + public bool IsDarkMode { get; set; } + public bool IsRTL { get; set; } + public bool IsDrawerOpen { get; set; } + public string PrimaryColor { get; set; } = CustomColors.Light.Primary; + public string SecondaryColor { get; set; } = CustomColors.Light.Secondary; + public double BorderRadius { get; set; } = 5; + public string LanguageCode { get; set; } = LocalizationConstants.SupportedLanguages.FirstOrDefault()?.Code ?? "en-US"; + public FshTablePreference TablePreference { get; set; } = new FshTablePreference(); +} diff --git a/src/Client.Infrastructure/Preferences/ClientPreferenceManager.cs b/src/Client.Infrastructure/Preferences/ClientPreferenceManager.cs new file mode 100644 index 0000000..d1842b4 --- /dev/null +++ b/src/Client.Infrastructure/Preferences/ClientPreferenceManager.cs @@ -0,0 +1,137 @@ +using System.Text.RegularExpressions; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Theme; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences; + +public class ClientPreferenceManager : IClientPreferenceManager +{ + private readonly ILocalStorageService _localStorageService; + + public ClientPreferenceManager( + ILocalStorageService localStorageService) + { + _localStorageService = localStorageService; + } + + public async Task ToggleDarkModeAsync() + { + if (await GetPreference() is ClientPreference preference) + { + preference.IsDarkMode = !preference.IsDarkMode; + await SetPreference(preference); + return !preference.IsDarkMode; + } + + return false; + } + + public async Task ToggleDrawerAsync() + { + if (await GetPreference() is ClientPreference preference) + { + preference.IsDrawerOpen = !preference.IsDrawerOpen; + await SetPreference(preference); + return preference.IsDrawerOpen; + } + + return false; + } + + public async Task ToggleLayoutDirectionAsync() + { + if (await GetPreference() is ClientPreference preference) + { + preference.IsRTL = !preference.IsRTL; + await SetPreference(preference); + return preference.IsRTL; + } + + return false; + } + + public async Task ChangeLanguageAsync(string languageCode) + { + if (await GetPreference() is ClientPreference preference) + { + var language = Array.Find(LocalizationConstants.SupportedLanguages, a => a.Code == languageCode); + if (language?.Code is not null) + { + preference.LanguageCode = language.Code; + preference.IsRTL = language.IsRTL; + } + else + { + preference.LanguageCode = "en-EN"; + preference.IsRTL = false; + } + + await SetPreference(preference); + return true; + } + + return false; + } + + public async Task GetCurrentThemeAsync() + { + if (await GetPreference() is ClientPreference preference) + { + if (preference.IsDarkMode) return new DarkTheme(); + } + + return new LightTheme(); + } + + public async Task GetPrimaryColorAsync() + { + if (await GetPreference() is ClientPreference preference) + { + string colorCode = preference.PrimaryColor; + if (Regex.Match(colorCode, "^#(?:[0-9a-fA-F]{3,4}){1,2}$").Success) + { + return colorCode; + } + else + { + preference.PrimaryColor = CustomColors.Light.Primary; + await SetPreference(preference); + return preference.PrimaryColor; + } + } + + return CustomColors.Light.Primary; + } + + public async Task IsRTL() + { + if (await GetPreference() is ClientPreference preference) + { + return preference.IsRTL; + } + + return false; + } + + public async Task IsDrawerOpen() + { + if (await GetPreference() is ClientPreference preference) + { + return preference.IsDrawerOpen; + } + + return false; + } + + public static string Preference = "clientPreference"; + + public async Task GetPreference() + { + return await _localStorageService.GetItemAsync(Preference) ?? new ClientPreference(); + } + + public async Task SetPreference(IPreference preference) + { + await _localStorageService.SetItemAsync(Preference, preference as ClientPreference); + } +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Preferences/FshTablePreference.cs b/src/Client.Infrastructure/Preferences/FshTablePreference.cs new file mode 100644 index 0000000..33e5a49 --- /dev/null +++ b/src/Client.Infrastructure/Preferences/FshTablePreference.cs @@ -0,0 +1,11 @@ +using RewardsPlus.WebApi.Shared.Notifications; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences; + +public class FshTablePreference : INotificationMessage +{ + public bool IsDense { get; set; } + public bool IsStriped { get; set; } + public bool HasBorder { get; set; } + public bool IsHoverable { get; set; } +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Preferences/IClientPreferenceManager.cs b/src/Client.Infrastructure/Preferences/IClientPreferenceManager.cs new file mode 100644 index 0000000..cbaf767 --- /dev/null +++ b/src/Client.Infrastructure/Preferences/IClientPreferenceManager.cs @@ -0,0 +1,14 @@ +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences; + +public interface IClientPreferenceManager : IPreferenceManager +{ + Task GetCurrentThemeAsync(); + + Task ToggleDarkModeAsync(); + + Task ToggleDrawerAsync(); + + Task ToggleLayoutDirectionAsync(); +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Preferences/IPreference.cs b/src/Client.Infrastructure/Preferences/IPreference.cs new file mode 100644 index 0000000..3092e42 --- /dev/null +++ b/src/Client.Infrastructure/Preferences/IPreference.cs @@ -0,0 +1,6 @@ +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences; + +public interface IPreference +{ + // public string LanguageCode { get; set; } +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Preferences/IPreferenceManager.cs b/src/Client.Infrastructure/Preferences/IPreferenceManager.cs new file mode 100644 index 0000000..c0644b4 --- /dev/null +++ b/src/Client.Infrastructure/Preferences/IPreferenceManager.cs @@ -0,0 +1,10 @@ +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences; + +public interface IPreferenceManager : IAppService +{ + Task SetPreference(IPreference preference); + + Task GetPreference(); + + Task ChangeLanguageAsync(string languageCode); +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Startup.cs b/src/Client.Infrastructure/Startup.cs new file mode 100644 index 0000000..298139a --- /dev/null +++ b/src/Client.Infrastructure/Startup.cs @@ -0,0 +1,81 @@ +using System.Globalization; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Notifications; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences; +using RewardsPlus.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.DependencyInjection; +using MudBlazor; +using MudBlazor.Services; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure; + +public static class Startup +{ + private const string ClientName = "FullStackHero.API"; + + public static IServiceCollection AddClientServices(this IServiceCollection services, IConfiguration config) => + services + .AddLocalization(options => options.ResourcesPath = "Resources") + .AddBlazoredLocalStorage() + .AddMudServices(configuration => + { + configuration.SnackbarConfiguration.PositionClass = Defaults.Classes.Position.BottomRight; + configuration.SnackbarConfiguration.HideTransitionDuration = 100; + configuration.SnackbarConfiguration.ShowTransitionDuration = 100; + configuration.SnackbarConfiguration.VisibleStateDuration = 3000; + configuration.SnackbarConfiguration.ShowCloseIcon = false; + }) + .AddScoped() + .AutoRegisterInterfaces() + .AutoRegisterInterfaces() + .AddNotifications() + .AddAuthentication(config) + .AddAuthorizationCore(RegisterPermissionClaims) + + // Add Api Http Client. + .AddHttpClient(ClientName, client => + { + client.DefaultRequestHeaders.AcceptLanguage.Clear(); + client.DefaultRequestHeaders.AcceptLanguage.ParseAdd(CultureInfo.DefaultThreadCurrentCulture?.TwoLetterISOLanguageName); + client.BaseAddress = new Uri(config[ConfigNames.ApiBaseUrl]); + }) + .AddAuthenticationHandler(config) + .Services + .AddScoped(sp => sp.GetRequiredService().CreateClient(ClientName)); + + private static void RegisterPermissionClaims(AuthorizationOptions options) + { + foreach (var permission in FSHPermissions.All) + { + options.AddPolicy(permission.Name, policy => policy.RequireClaim(FSHClaims.Permission, permission.Name)); + } + } + + public static IServiceCollection AutoRegisterInterfaces(this IServiceCollection services) + { + var @interface = typeof(T); + + var types = @interface + .Assembly + .GetExportedTypes() + .Where(t => t.IsClass && !t.IsAbstract) + .Select(t => new + { + Service = t.GetInterface($"I{t.Name}"), + Implementation = t + }) + .Where(t => t.Service != null); + + foreach (var type in types) + { + if (@interface.IsAssignableFrom(type.Service)) + { + services.AddTransient(type.Service, type.Implementation); + } + } + + return services; + } +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Theme/CustomColors.cs b/src/Client.Infrastructure/Theme/CustomColors.cs new file mode 100644 index 0000000..847b602 --- /dev/null +++ b/src/Client.Infrastructure/Theme/CustomColors.cs @@ -0,0 +1,42 @@ +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Theme; + +public static class CustomColors +{ + public static readonly List ThemeColors = new() + { + Light.Primary, + Colors.Blue.Default, + Colors.BlueGrey.Default, + Colors.Purple.Default, + Colors.Orange.Default, + Colors.Red.Default, + Colors.Amber.Default, + Colors.DeepPurple.Default, + Colors.Pink.Default, + Colors.Indigo.Default, + Colors.LightBlue.Default, + Colors.Cyan.Default, + }; + + public static class Light + { + public const string Primary = "#3eaf7c"; + public const string Secondary = "#2196f3"; + public const string Background = "#FFF"; + public const string AppbarBackground = "#FFF"; + public const string AppbarText = "#6e6e6e"; + } + + public static class Dark + { + public const string Primary = "#3eaf7c"; + public const string Secondary = "#2196f3"; + public const string Background = "#1b1f22"; + public const string AppbarBackground = "#1b1f22"; + public const string DrawerBackground = "#121212"; + public const string Surface = "#202528"; + public const string Disabled = "#545454"; + } +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Theme/CustomTypography.cs b/src/Client.Infrastructure/Theme/CustomTypography.cs new file mode 100644 index 0000000..9f8e6af --- /dev/null +++ b/src/Client.Infrastructure/Theme/CustomTypography.cs @@ -0,0 +1,114 @@ +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Theme; + +public static class CustomTypography +{ + public static Typography FSHTypography => new Typography() + { + Default = new Default() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = ".875rem", + FontWeight = 200, + LineHeight = 1.43, + LetterSpacing = ".01071em" + }, + H1 = new H1() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "6rem", + FontWeight = 300, + LineHeight = 1.167, + LetterSpacing = "-.01562em" + }, + H2 = new H2() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "3.75rem", + FontWeight = 300, + LineHeight = 1.2, + LetterSpacing = "-.00833em" + }, + H3 = new H3() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "3rem", + FontWeight = 400, + LineHeight = 1.167, + LetterSpacing = "0" + }, + H4 = new H4() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "2.125rem", + FontWeight = 400, + LineHeight = 1.235, + LetterSpacing = ".00735em" + }, + H5 = new H5() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "1.5rem", + FontWeight = 400, + LineHeight = 1.334, + LetterSpacing = "0" + }, + H6 = new H6() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "1.25rem", + FontWeight = 400, + LineHeight = 1.6, + LetterSpacing = ".0075em" + }, + Button = new Button() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = ".875rem", + FontWeight = 400, + LineHeight = 1.75, + LetterSpacing = ".02857em" + }, + Body1 = new Body1() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "1rem", + FontWeight = 400, + LineHeight = 1.5, + LetterSpacing = ".00938em" + }, + Body2 = new Body2() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = ".875rem", + FontWeight = 400, + LineHeight = 1.43, + LetterSpacing = ".01071em" + }, + Caption = new Caption() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = ".75rem", + FontWeight = 200, + LineHeight = 1.66, + LetterSpacing = ".03333em" + }, + Subtitle1 = new Subtitle1() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = "1rem", + FontWeight = 400, + LineHeight = 1.57, + LetterSpacing = ".00714em" + }, + Subtitle2 = new Subtitle2() + { + FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontSize = ".875rem", + FontWeight = 400, + LineHeight = 1.57, + LetterSpacing = ".00714em" + } + }; +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Theme/DarkTheme.cs b/src/Client.Infrastructure/Theme/DarkTheme.cs new file mode 100644 index 0000000..3d36aec --- /dev/null +++ b/src/Client.Infrastructure/Theme/DarkTheme.cs @@ -0,0 +1,44 @@ +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Theme; + +public class DarkTheme : MudTheme +{ + public DarkTheme() + { + Palette = new Palette() + { + Primary = CustomColors.Dark.Primary, + Secondary = CustomColors.Dark.Secondary, + Success = CustomColors.Dark.Primary, + Black = "#27272f", + Background = CustomColors.Dark.Background, + BackgroundGrey = "#27272f", + Surface = CustomColors.Dark.Surface, + DrawerBackground = CustomColors.Dark.DrawerBackground, + DrawerText = "rgba(255,255,255, 0.50)", + AppbarBackground = CustomColors.Dark.AppbarBackground, + AppbarText = "rgba(255,255,255, 0.70)", + TextPrimary = "rgba(255,255,255, 0.70)", + TextSecondary = "rgba(255,255,255, 0.50)", + ActionDefault = "#adadb1", + ActionDisabled = "rgba(255,255,255, 0.26)", + ActionDisabledBackground = "rgba(255,255,255, 0.12)", + DrawerIcon = "rgba(255,255,255, 0.50)", + TableLines = "#e0e0e036", + Dark = CustomColors.Dark.DrawerBackground, + Divider = "#e0e0e036", + OverlayDark = "hsl(0deg 0% 0% / 75%)", + TextDisabled = CustomColors.Dark.Disabled + }; + + LayoutProperties = new LayoutProperties() + { + DefaultBorderRadius = "5px", + }; + + Typography = CustomTypography.FSHTypography; + Shadows = new Shadow(); + ZIndex = new ZIndex() { Drawer = 1300 }; + } +} \ No newline at end of file diff --git a/src/Client.Infrastructure/Theme/LightTheme.cs b/src/Client.Infrastructure/Theme/LightTheme.cs new file mode 100644 index 0000000..1771083 --- /dev/null +++ b/src/Client.Infrastructure/Theme/LightTheme.cs @@ -0,0 +1,31 @@ +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Theme; + +public class LightTheme : MudTheme +{ + public LightTheme() + { + Palette = new Palette() + { + Primary = CustomColors.Light.Primary, + Secondary = CustomColors.Light.Secondary, + Background = CustomColors.Light.Background, + AppbarBackground = CustomColors.Light.AppbarBackground, + AppbarText = CustomColors.Light.AppbarText, + DrawerBackground = CustomColors.Light.Background, + DrawerText = "rgba(0,0,0, 0.7)", + Success = CustomColors.Light.Primary, + TableLines = "#e0e0e029", + OverlayDark = "hsl(0deg 0% 0% / 75%)" + }; + LayoutProperties = new LayoutProperties() + { + DefaultBorderRadius = "5px" + }; + + Typography = CustomTypography.FSHTypography; + Shadows = new Shadow(); + ZIndex = new ZIndex() { Drawer = 1300 }; + } +} \ No newline at end of file diff --git a/src/Client/App.razor b/src/Client/App.razor new file mode 100644 index 0000000..8fd8903 --- /dev/null +++ b/src/Client/App.razor @@ -0,0 +1,23 @@ + + + + + + @if (@context.User.Identity?.IsAuthenticated is true) + { +

You are not authorized to be here.

+ } + else + { + + } +
+
+
+ + +

Sorry, there's nothing at this address.

+
+
+
+
\ No newline at end of file diff --git a/src/Client/Client.csproj b/src/Client/Client.csproj new file mode 100644 index 0000000..08fec69 --- /dev/null +++ b/src/Client/Client.csproj @@ -0,0 +1,35 @@ + + + + net6.0 + FSH.BlazorWebAssembly.Client + FSH.BlazorWebAssembly.Client + service-worker-assets.js + true + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Client/Components/Common/CustomValidation.cs b/src/Client/Components/Common/CustomValidation.cs new file mode 100644 index 0000000..c0d47e8 --- /dev/null +++ b/src/Client/Components/Common/CustomValidation.cs @@ -0,0 +1,51 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.Common; + +// See https://docs.microsoft.com/en-us/aspnet/core/blazor/forms-validation?view=aspnetcore-6.0#server-validation-with-a-validator-component +public class CustomValidation : ComponentBase +{ + private ValidationMessageStore? _messageStore; + + [CascadingParameter] + private EditContext? CurrentEditContext { get; set; } + + protected override void OnInitialized() + { + if (CurrentEditContext is null) + { + throw new InvalidOperationException( + $"{nameof(CustomValidation)} requires a cascading " + + $"parameter of type {nameof(EditContext)}. " + + $"For example, you can use {nameof(CustomValidation)} " + + $"inside an {nameof(EditForm)}."); + } + + _messageStore = new(CurrentEditContext); + + CurrentEditContext.OnValidationRequested += (s, e) => + _messageStore?.Clear(); + CurrentEditContext.OnFieldChanged += (s, e) => + _messageStore?.Clear(e.FieldIdentifier); + } + + public void DisplayErrors(IDictionary> errors) + { + if (CurrentEditContext is not null && errors is not null) + { + foreach (var err in errors) + { + _messageStore?.Add(CurrentEditContext.Field(err.Key), err.Value); + } + + CurrentEditContext.NotifyValidationStateChanged(); + } + } + + public void ClearErrors() + { + _messageStore?.Clear(); + CurrentEditContext?.NotifyValidationStateChanged(); + } +} \ No newline at end of file diff --git a/src/Client/Components/Common/ErrorHandler.razor b/src/Client/Components/Common/ErrorHandler.razor new file mode 100644 index 0000000..9467791 --- /dev/null +++ b/src/Client/Components/Common/ErrorHandler.razor @@ -0,0 +1,2 @@ +@inherits ErrorBoundary +@ChildContent \ No newline at end of file diff --git a/src/Client/Components/Common/ErrorHandler.razor.cs b/src/Client/Components/Common/ErrorHandler.razor.cs new file mode 100644 index 0000000..4c8ad99 --- /dev/null +++ b/src/Client/Components/Common/ErrorHandler.razor.cs @@ -0,0 +1,31 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.Common; + +public partial class ErrorHandler +{ + [Inject] + public IAuthenticationService AuthService { get; set; } = default!; + + public List _receivedExceptions = new(); + + protected override async Task OnErrorAsync(Exception exception) + { + _receivedExceptions.Add(exception); + switch (exception) + { + case UnauthorizedAccessException: + await AuthService.LogoutAsync(); + Snackbar.Add("Authentication Failed", Severity.Error); + break; + } + } + + public new void Recover() + { + _receivedExceptions.Clear(); + base.Recover(); + } +} \ No newline at end of file diff --git a/src/Client/Components/Common/FshCustomError.razor b/src/Client/Components/Common/FshCustomError.razor new file mode 100644 index 0000000..827318b --- /dev/null +++ b/src/Client/Components/Common/FshCustomError.razor @@ -0,0 +1 @@ +Oopsie !! 😔 \ No newline at end of file diff --git a/src/Client/Components/Common/FshTable.cs b/src/Client/Components/Common/FshTable.cs new file mode 100644 index 0000000..29f7983 --- /dev/null +++ b/src/Client/Components/Common/FshTable.cs @@ -0,0 +1,39 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Notifications; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences; +using MediatR.Courier; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.Common; + +public class FshTable : MudTable +{ + [Inject] + private IClientPreferenceManager ClientPreferences { get; set; } = default!; + [Inject] + protected ICourier Courier { get; set; } = default!; + + protected override async Task OnInitializedAsync() + { + if (await ClientPreferences.GetPreference() is ClientPreference clientPreference) + { + SetTablePreference(clientPreference.TablePreference); + } + + Courier.SubscribeWeak>(wrapper => + { + SetTablePreference(wrapper.Notification); + StateHasChanged(); + }); + + await base.OnInitializedAsync(); + } + + private void SetTablePreference(FshTablePreference tablePreference) + { + Dense = tablePreference.IsDense; + Striped = tablePreference.IsStriped; + Bordered = tablePreference.HasBorder; + Hover = tablePreference.IsHoverable; + } +} \ No newline at end of file diff --git a/src/Client/Components/Common/FshTitle.razor b/src/Client/Components/Common/FshTitle.razor new file mode 100644 index 0000000..e696be9 --- /dev/null +++ b/src/Client/Components/Common/FshTitle.razor @@ -0,0 +1,8 @@ +@Title +@Description + +@code +{ + [Parameter] public string? Title { get; set; } + [Parameter] public string? Description { get; set; } +} \ No newline at end of file diff --git a/src/Client/Components/Common/PersonCard.razor b/src/Client/Components/Common/PersonCard.razor new file mode 100644 index 0000000..d17630e --- /dev/null +++ b/src/Client/Components/Common/PersonCard.razor @@ -0,0 +1,19 @@ + + + + @if (string.IsNullOrEmpty(this.ImageUri)) + { + @FullName?.ToUpper().FirstOrDefault() + + } + else + { + + } + + + @FullName + @Email + + + diff --git a/src/Client/Components/Common/PersonCard.razor.cs b/src/Client/Components/Common/PersonCard.razor.cs new file mode 100644 index 0000000..c0db50e --- /dev/null +++ b/src/Client/Components/Common/PersonCard.razor.cs @@ -0,0 +1,46 @@ +using System.Security.Claims; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Common; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.Common; + +public partial class PersonCard +{ + [Parameter] + public string? Class { get; set; } + [Parameter] + public string? Style { get; set; } + + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + + private string? UserId { get; set; } + private string? Email { get; set; } + private string? FullName { get; set; } + private string? ImageUri { get; set; } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + await LoadUserData(); + } + } + + private async Task LoadUserData() + { + var user = (await AuthState).User; + if (user.Identity?.IsAuthenticated == true) + { + if (string.IsNullOrEmpty(UserId)) + { + FullName = user.GetFullName(); + UserId = user.GetUserId(); + Email = user.GetEmail(); + ImageUri = string.IsNullOrEmpty(user?.GetImageUrl()) ? string.Empty : (Config[ConfigNames.ApiBaseUrl] + user?.GetImageUrl()); + StateHasChanged(); + } + } + } +} \ No newline at end of file diff --git a/src/Client/Components/Common/TablePager.razor b/src/Client/Components/Common/TablePager.razor new file mode 100644 index 0000000..c5fdc78 --- /dev/null +++ b/src/Client/Components/Common/TablePager.razor @@ -0,0 +1,3 @@ +@inject IStringLocalizer L + + \ No newline at end of file diff --git a/src/Client/Components/Dialogs/DeleteConfirmation.razor b/src/Client/Components/Dialogs/DeleteConfirmation.razor new file mode 100644 index 0000000..f08d440 --- /dev/null +++ b/src/Client/Components/Dialogs/DeleteConfirmation.razor @@ -0,0 +1,31 @@ +@inject IStringLocalizer L + + + + + + @L["Delete Confirmation"] + + + + @ContentText + + + @L["Cancel"] + @L["Confirm"] + + + +@code { + [CascadingParameter] + MudDialogInstance MudDialog { get; set; } = default!; + + [Parameter] + public string? ContentText { get; set; } + + void Submit() + { + MudDialog.Close(DialogResult.Ok(true)); + } + void Cancel() => MudDialog.Cancel(); +} \ No newline at end of file diff --git a/src/Client/Components/Dialogs/Logout.razor b/src/Client/Components/Dialogs/Logout.razor new file mode 100644 index 0000000..490049c --- /dev/null +++ b/src/Client/Components/Dialogs/Logout.razor @@ -0,0 +1,40 @@ +@namespace RewardsPlus.BlazorWebAssembly.Client.Shared.Dialogs + +@inject IStringLocalizer L +@inject IAuthenticationService AuthService + + + + + + @L["Logout Confirmation"] + + + + @ContentText + + + @L["Cancel"] + @ButtonText + + + +@code { + [Parameter] public string? ContentText { get; set; } + + [Parameter] public string? ButtonText { get; set; } + + [Parameter] public Color Color { get; set; } + + [CascadingParameter] MudDialogInstance MudDialog { get; set; } = default!; + + async Task Submit() + { + await AuthService.LogoutAsync(); + Snackbar.Add(@L["Logged out"], Severity.Info); + MudDialog.Close(DialogResult.Ok(true)); + } + + void Cancel() => + MudDialog.Cancel(); +} \ No newline at end of file diff --git a/src/Client/Components/EntityTable/AddEditModal.razor b/src/Client/Components/EntityTable/AddEditModal.razor new file mode 100644 index 0000000..ea086f5 --- /dev/null +++ b/src/Client/Components/EntityTable/AddEditModal.razor @@ -0,0 +1,51 @@ +@typeparam TRequest + +@inject IStringLocalizer L + + + + + + + @if (IsCreate) + { + + } + else + { + + } + @Title + + + + + + + + + @ChildContent(RequestModel) + + + + + + + @L["Cancel"] + + @if (IsCreate) + { + + @L["Save"] + + } + else + { + + @L["Update"] + + } + + + + \ No newline at end of file diff --git a/src/Client/Components/EntityTable/AddEditModal.razor.cs b/src/Client/Components/EntityTable/AddEditModal.razor.cs new file mode 100644 index 0000000..22514dc --- /dev/null +++ b/src/Client/Components/EntityTable/AddEditModal.razor.cs @@ -0,0 +1,49 @@ +using RewardsPlus.BlazorWebAssembly.Client.Components.Common; +using RewardsPlus.BlazorWebAssembly.Client.Shared; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.EntityTable; + +public partial class AddEditModal : IAddEditModal +{ + [Parameter] + [EditorRequired] + public RenderFragment ChildContent { get; set; } = default!; + [Parameter] + [EditorRequired] + public TRequest RequestModel { get; set; } = default!; + [Parameter] + [EditorRequired] + public Func SaveFunc { get; set; } = default!; + [Parameter] + public Func? OnInitializedFunc { get; set; } + [Parameter] + [EditorRequired] + public string Title { get; set; } = default!; + [Parameter] + public bool IsCreate { get; set; } + [Parameter] + public string? SuccessMessage { get; set; } + + [CascadingParameter] + private MudDialogInstance MudDialog { get; set; } = default!; + + private CustomValidation? _customValidation; + + public void ForceRender() => StateHasChanged(); + + protected override Task OnInitializedAsync() => + OnInitializedFunc is not null + ? OnInitializedFunc() + : Task.CompletedTask; + + private async Task SaveAsync() + { + if (await ApiHelper.ExecuteCallGuardedAsync( + () => SaveFunc(RequestModel), Snackbar, _customValidation, SuccessMessage)) + { + MudDialog.Close(); + } + } +} \ No newline at end of file diff --git a/src/Client/Components/EntityTable/EntityClientTableContext.cs b/src/Client/Components/EntityTable/EntityClientTableContext.cs new file mode 100644 index 0000000..d15d735 --- /dev/null +++ b/src/Client/Components/EntityTable/EntityClientTableContext.cs @@ -0,0 +1,67 @@ +namespace RewardsPlus.BlazorWebAssembly.Client.Components.EntityTable; + +/// +/// Initialization Context for the EntityTable Component. +/// Use this one if you want to use Client Paging, Sorting and Filtering. +/// +public class EntityClientTableContext + : EntityTableContext +{ + /// + /// A function that loads all the data for the table from the api and returns a ListResult of TEntity. + /// + public Func?>> LoadDataFunc { get; } + + /// + /// A function that returns a boolean which indicates whether the supplied entity meets the search criteria + /// (the supplied string is the search string entered). + /// + public Func SearchFunc { get; } + + public EntityClientTableContext( + List> fields, + Func?>> loadDataFunc, + Func searchFunc, + Func? idFunc = null, + Func>? getDefaultsFunc = null, + Func? createFunc = null, + Func>? getDetailsFunc = null, + Func? updateFunc = null, + Func? deleteFunc = null, + string? entityName = null, + string? entityNamePlural = null, + string? entityResource = null, + string? searchAction = null, + string? createAction = null, + string? updateAction = null, + string? deleteAction = null, + string? exportAction = null, + Func? editFormInitializedFunc = null, + Func? hasExtraActionsFunc = null, + Func? canUpdateEntityFunc = null, + Func? canDeleteEntityFunc = null) + : base( + fields, + idFunc, + getDefaultsFunc, + createFunc, + getDetailsFunc, + updateFunc, + deleteFunc, + entityName, + entityNamePlural, + entityResource, + searchAction, + createAction, + updateAction, + deleteAction, + exportAction, + editFormInitializedFunc, + hasExtraActionsFunc, + canUpdateEntityFunc, + canDeleteEntityFunc) + { + LoadDataFunc = loadDataFunc; + SearchFunc = searchFunc; + } +} \ No newline at end of file diff --git a/src/Client/Components/EntityTable/EntityField.cs b/src/Client/Components/EntityTable/EntityField.cs new file mode 100644 index 0000000..13797c3 --- /dev/null +++ b/src/Client/Components/EntityTable/EntityField.cs @@ -0,0 +1,35 @@ +using Microsoft.AspNetCore.Components; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.EntityTable; + +public record EntityField(Func ValueFunc, string DisplayName, string SortLabel = "", Type? Type = null, RenderFragment? Template = null) +{ + /// + /// A function that returns the actual value of this field from the supplied entity. + /// + public Func ValueFunc { get; init; } = ValueFunc; + + /// + /// The string that's shown on the UI for this field. + /// + public string DisplayName { get; init; } = DisplayName; + + /// + /// The string that's sent to the api as property to sort on for this field. + /// This is only relevant when using server side sorting. + /// + public string SortLabel { get; init; } = SortLabel; + + /// + /// The type of the field. Default is string, but when boolean, it shows as a checkbox. + /// + public Type? Type { get; init; } = Type; + + /// + /// When supplied this template will be used for this field in stead of the default template. + /// For an example on how to do this, see . + /// + public RenderFragment? Template { get; init; } = Template; + + public bool CheckedForSearch { get; set; } = true; +} \ No newline at end of file diff --git a/src/Client/Components/EntityTable/EntityServerTableContext.cs b/src/Client/Components/EntityTable/EntityServerTableContext.cs new file mode 100644 index 0000000..8ce3fbe --- /dev/null +++ b/src/Client/Components/EntityTable/EntityServerTableContext.cs @@ -0,0 +1,73 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.EntityTable; + +/// +/// Initialization Context for the EntityTable Component. +/// Use this one if you want to use Server Paging, Sorting and Filtering. +/// +public class EntityServerTableContext + : EntityTableContext +{ + /// + /// A function that loads the specified page from the api with the specified search criteria + /// and returns a PaginatedResult of TEntity. + /// + public Func>> SearchFunc { get; } + + /// + /// A function that exports the specified data from the API. + /// + public Func>? ExportFunc { get; } + + public bool EnableAdvancedSearch { get; } + + public EntityServerTableContext( + List> fields, + Func>> searchFunc, + Func>? exportFunc = null, + bool enableAdvancedSearch = false, + Func? idFunc = null, + Func>? getDefaultsFunc = null, + Func? createFunc = null, + Func>? getDetailsFunc = null, + Func? updateFunc = null, + Func? deleteFunc = null, + string? entityName = null, + string? entityNamePlural = null, + string? entityResource = null, + string? searchAction = null, + string? createAction = null, + string? updateAction = null, + string? deleteAction = null, + string? exportAction = null, + Func? editFormInitializedFunc = null, + Func? hasExtraActionsFunc = null, + Func? canUpdateEntityFunc = null, + Func? canDeleteEntityFunc = null) + : base( + fields, + idFunc, + getDefaultsFunc, + createFunc, + getDetailsFunc, + updateFunc, + deleteFunc, + entityName, + entityNamePlural, + entityResource, + searchAction, + createAction, + updateAction, + deleteAction, + exportAction, + editFormInitializedFunc, + hasExtraActionsFunc, + canUpdateEntityFunc, + canDeleteEntityFunc) + { + SearchFunc = searchFunc; + ExportFunc = exportFunc; + EnableAdvancedSearch = enableAdvancedSearch; + } +} \ No newline at end of file diff --git a/src/Client/Components/EntityTable/EntityTable.razor b/src/Client/Components/EntityTable/EntityTable.razor new file mode 100644 index 0000000..68221bd --- /dev/null +++ b/src/Client/Components/EntityTable/EntityTable.razor @@ -0,0 +1,158 @@ +@typeparam TEntity +@typeparam TId +@typeparam TRequest + +@inject IJSRuntime JS +@inject IStringLocalizer L + + + + + + + @if (_canSearch && (Context.AdvancedSearchEnabled || AdvancedSearchContent is not null)) + { + + + + @if (Context.AdvancedSearchEnabled) + { +
+ + @foreach (var field in Context.Fields) + { + + } +
+ } + @AdvancedSearchContent + +
+ } + + + + +
+ @if (_canCreate) + { + @L["Create"] + } + @if (_canExport) + { + @L["Export"] + } + @L["Reload"] +
+ + @if (_canSearch && !_advancedSearchExpanded) + { + + + } +
+ + + @if (Context.Fields is not null) + { + foreach (var field in Context.Fields) + { + + @if (Context.IsClientContext) + { + @field.DisplayName + } + else + { + @field.DisplayName + } + + } + } + @L["Actions"] + + + + @foreach (var field in Context.Fields) + { + + @if (field.Template is not null) + { + @field.Template(context) + } + else if (field.Type == typeof(bool)) + { + + } + else + { + + } + + } + + @if (ActionsContent is not null) + { + @ActionsContent(context) + } + else if (HasActions) + { + + @if (CanUpdateEntity(context)) + { + @L["Edit"] + } + @if (CanDeleteEntity(context)) + { + @L["Delete"] + } + @if (ExtraActions is not null) + { + @ExtraActions(context) + } + + } + else + { + + @L["No Allowed Actions"] + + } + + + + + + + +
+ +
+ + + +
\ No newline at end of file diff --git a/src/Client/Components/EntityTable/EntityTable.razor.cs b/src/Client/Components/EntityTable/EntityTable.razor.cs new file mode 100644 index 0000000..3e87773 --- /dev/null +++ b/src/Client/Components/EntityTable/EntityTable.razor.cs @@ -0,0 +1,321 @@ +using RewardsPlus.BlazorWebAssembly.Client.Components.Dialogs; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; +using RewardsPlus.BlazorWebAssembly.Client.Shared; +using Mapster; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.JSInterop; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.EntityTable; + +public partial class EntityTable + where TRequest : new() +{ + [Parameter] + [EditorRequired] + public EntityTableContext Context { get; set; } = default!; + + [Parameter] + public bool Loading { get; set; } + + [Parameter] + public string? SearchString { get; set; } + [Parameter] + public EventCallback SearchStringChanged { get; set; } + + [Parameter] + public RenderFragment? AdvancedSearchContent { get; set; } + + [Parameter] + public RenderFragment? ActionsContent { get; set; } + [Parameter] + public RenderFragment? ExtraActions { get; set; } + [Parameter] + public RenderFragment? ChildRowContent { get; set; } + + [Parameter] + public RenderFragment? EditFormContent { get; set; } + + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + + private bool _canSearch; + private bool _canCreate; + private bool _canUpdate; + private bool _canDelete; + private bool _canExport; + + private bool _advancedSearchExpanded; + + private MudTable _table = default!; + private IEnumerable? _entityList; + private int _totalItems; + + protected override async Task OnInitializedAsync() + { + var state = await AuthState; + _canSearch = await CanDoActionAsync(Context.SearchAction, state); + _canCreate = await CanDoActionAsync(Context.CreateAction, state); + _canUpdate = await CanDoActionAsync(Context.UpdateAction, state); + _canDelete = await CanDoActionAsync(Context.DeleteAction, state); + _canExport = await CanDoActionAsync(Context.ExportAction, state); + + await LocalLoadDataAsync(); + } + + public Task ReloadDataAsync() => + Context.IsClientContext + ? LocalLoadDataAsync() + : ServerLoadDataAsync(); + + private async Task CanDoActionAsync(string? action, AuthenticationState state) => + !string.IsNullOrWhiteSpace(action) && + ((bool.TryParse(action, out bool isTrue) && isTrue) || // check if action equals "True", then it's allowed + (Context.EntityResource is { } resource && await AuthService.HasPermissionAsync(state.User, action, resource))); + + private bool HasActions => _canUpdate || _canDelete || (Context.HasExtraActionsFunc is not null && Context.HasExtraActionsFunc()); + private bool CanUpdateEntity(TEntity entity) => _canUpdate && (Context.CanUpdateEntityFunc is null || Context.CanUpdateEntityFunc(entity)); + private bool CanDeleteEntity(TEntity entity) => _canDelete && (Context.CanDeleteEntityFunc is null || Context.CanDeleteEntityFunc(entity)); + + // Client side paging/filtering + private bool LocalSearch(TEntity entity) => + Context.ClientContext?.SearchFunc is { } searchFunc + ? searchFunc(SearchString, entity) + : string.IsNullOrWhiteSpace(SearchString); + + private async Task LocalLoadDataAsync() + { + if (Loading || Context.ClientContext is null) + { + return; + } + + Loading = true; + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => Context.ClientContext.LoadDataFunc(), Snackbar) + is List result) + { + _entityList = result; + } + + Loading = false; + } + + // Server Side paging/filtering + + private async Task OnSearchStringChanged(string? text = null) + { + await SearchStringChanged.InvokeAsync(SearchString); + + await ServerLoadDataAsync(); + } + + private async Task ServerLoadDataAsync() + { + if (Context.IsServerContext) + { + await _table.ReloadServerData(); + } + } + + private Func>>? ServerReloadFunc => + Context.IsServerContext ? ServerReload : null; + + private async Task> ServerReload(TableState state) + { + if (!Loading && Context.ServerContext is not null) + { + Loading = true; + + var filter = GetPaginationFilter(state); + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => Context.ServerContext.SearchFunc(filter), Snackbar) + is { } result) + { + _totalItems = result.TotalCount; + _entityList = result.Data; + } + + Loading = false; + } + + return new TableData { TotalItems = _totalItems, Items = _entityList }; + } + + private async Task ExportAsync() + { + if (!Loading && Context.ServerContext is not null) + { + if (Context.ServerContext.ExportFunc is not null) + { + Loading = true; + + var filter = GetBaseFilter(); + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => Context.ServerContext.ExportFunc(filter), Snackbar) + is { } result) + { + using var streamRef = new DotNetStreamReference(result.Stream); + await JS.InvokeVoidAsync("downloadFileFromStream", $"{Context.EntityNamePlural}.xlsx", streamRef); + } + + Loading = false; + } + } + } + + private PaginationFilter GetPaginationFilter(TableState state) + { + string[]? orderings = null; + if (!string.IsNullOrEmpty(state.SortLabel)) + { + orderings = state.SortDirection == SortDirection.None + ? new[] { $"{state.SortLabel}" } + : new[] { $"{state.SortLabel} {state.SortDirection}" }; + } + + var filter = new PaginationFilter + { + PageSize = state.PageSize, + PageNumber = state.Page + 1, + Keyword = SearchString, + OrderBy = orderings ?? Array.Empty() + }; + + if (!Context.AllColumnsChecked) + { + filter.AdvancedSearch = new() + { + Fields = Context.SearchFields, + Keyword = filter.Keyword + }; + filter.Keyword = null; + } + + return filter; + } + + private BaseFilter GetBaseFilter() + { + var filter = new BaseFilter + { + Keyword = SearchString, + }; + + if (!Context.AllColumnsChecked) + { + filter.AdvancedSearch = new() + { + Fields = Context.SearchFields, + Keyword = filter.Keyword + }; + filter.Keyword = null; + } + + return filter; + } + + private async Task InvokeModal(TEntity? entity = default) + { + bool isCreate = entity is null; + + var parameters = new DialogParameters() + { + { nameof(AddEditModal.ChildContent), EditFormContent }, + { nameof(AddEditModal.OnInitializedFunc), Context.EditFormInitializedFunc }, + { nameof(AddEditModal.IsCreate), isCreate } + }; + + Func saveFunc; + TRequest requestModel; + string title, successMessage; + + if (isCreate) + { + _ = Context.CreateFunc ?? throw new InvalidOperationException("CreateFunc can't be null!"); + + saveFunc = Context.CreateFunc; + + requestModel = + Context.GetDefaultsFunc is not null + && await ApiHelper.ExecuteCallGuardedAsync( + () => Context.GetDefaultsFunc(), Snackbar) + is { } defaultsResult + ? defaultsResult + : new TRequest(); + + title = $"{L["Create"]} {Context.EntityName}"; + successMessage = $"{Context.EntityName} {L["Created"]}"; + } + else + { + _ = Context.IdFunc ?? throw new InvalidOperationException("IdFunc can't be null!"); + _ = Context.UpdateFunc ?? throw new InvalidOperationException("UpdateFunc can't be null!"); + + var id = Context.IdFunc(entity!); + + saveFunc = request => Context.UpdateFunc(id, request); + + requestModel = + Context.GetDetailsFunc is not null + && await ApiHelper.ExecuteCallGuardedAsync( + () => Context.GetDetailsFunc(id!), + Snackbar) + is { } detailsResult + ? detailsResult + : entity!.Adapt(); + + title = $"{L["Edit"]} {Context.EntityName}"; + successMessage = $"{Context.EntityName} {L["Updated"]}"; + } + + parameters.Add(nameof(AddEditModal.SaveFunc), saveFunc); + parameters.Add(nameof(AddEditModal.RequestModel), requestModel); + parameters.Add(nameof(AddEditModal.Title), title); + parameters.Add(nameof(AddEditModal.SuccessMessage), successMessage); + + var dialog = DialogService.ShowModal>(parameters); + + Context.SetAddEditModalRef(dialog); + + var result = await dialog.Result; + + if (!result.Cancelled) + { + await ReloadDataAsync(); + } + } + + private async Task Delete(TEntity entity) + { + _ = Context.IdFunc ?? throw new InvalidOperationException("IdFunc can't be null!"); + TId id = Context.IdFunc(entity); + + string deleteContent = L["You're sure you want to delete {0} with id '{1}'?"]; + var parameters = new DialogParameters + { + { nameof(DeleteConfirmation.ContentText), string.Format(deleteContent, Context.EntityName, id) } + }; + var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true, DisableBackdropClick = true }; + var dialog = DialogService.Show(L["Delete"], parameters, options); + var result = await dialog.Result; + if (!result.Cancelled) + { + _ = Context.DeleteFunc ?? throw new InvalidOperationException("DeleteFunc can't be null!"); + + await ApiHelper.ExecuteCallGuardedAsync( + () => Context.DeleteFunc(id), + Snackbar); + + await ReloadDataAsync(); + } + } +} \ No newline at end of file diff --git a/src/Client/Components/EntityTable/EntityTableContext.cs b/src/Client/Components/EntityTable/EntityTableContext.cs new file mode 100644 index 0000000..6ff1033 --- /dev/null +++ b/src/Client/Components/EntityTable/EntityTableContext.cs @@ -0,0 +1,197 @@ +using RewardsPlus.WebApi.Shared.Authorization; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.EntityTable; + +/// +/// Abstract base class for the initialization Context of the EntityTable Component. +/// +/// The type of the entity. +/// The type of the id of the entity. +/// The type of the Request which is used on the AddEditModal and which is sent with the CreateFunc and UpdateFunc. +public abstract class EntityTableContext +{ + /// + /// The columns you want to display on the table. + /// + public List> Fields { get; } + + /// + /// A function that returns the Id of the entity. This is only needed when using the CRUD functionality. + /// + public Func? IdFunc { get; } + + /// + /// A function that executes the GetDefaults method on the api (or supplies defaults locally) and returns + /// a Task of Result of TRequest. When not supplied, a TRequest is simply newed up. + /// No need to check for error messages or api exceptions. These are automatically handled by the component. + /// + public Func>? GetDefaultsFunc { get; } + + /// + /// A function that executes the Create method on the api with the supplied entity and returns a Task of Result. + /// No need to check for error messages or api exceptions. These are automatically handled by the component. + /// + public Func? CreateFunc { get; } + + /// + /// A function that executes the GetDetails method on the api with the supplied Id and returns a Task of Result of TRequest. + /// No need to check for error messages or api exceptions. These are automatically handled by the component. + /// When not supplied, the TEntity out of the _entityList is supplied using the IdFunc and converted using mapster. + /// + public Func>? GetDetailsFunc { get; } + + /// + /// A function that executes the Update method on the api with the supplied entity and returns a Task of Result. + /// When not supplied, the TEntity from the list is mapped to TCreateRequest using mapster. + /// No need to check for error messages or api exceptions. These are automatically handled by the component. + /// + public Func? UpdateFunc { get; } + + /// + /// A function that executes the Delete method on the api with the supplied entity id and returns a Task of Result. + /// No need to check for error messages or api exceptions. These are automatically handled by the component. + /// + public Func? DeleteFunc { get; } + + /// + /// The name of the entity. This is used in the title of the add/edit modal and delete confirmation. + /// + public string? EntityName { get; } + + /// + /// The plural name of the entity. This is used in the "Search for ..." placeholder. + /// + public string? EntityNamePlural { get; } + + /// + /// The FSHResource that is representing this entity. This is used in combination with the xxActions to check for permissions. + /// + public string? EntityResource { get; } + + /// + /// The FSHAction name of the search permission. This is FSHAction.Search by default. + /// When empty, no search functionality will be available. + /// When the string is "true", search funtionality will be enabled, + /// otherwise it will only be enabled if the user has permission for this action on the EntityResource. + /// + public string SearchAction { get; } + + /// + /// The permission name of the create permission. This is FSHAction.Create by default. + /// When empty, no create functionality will be available. + /// When the string "true", create funtionality will be enabled, + /// otherwise it will only be enabled if the user has permission for this action on the EntityResource. + /// + public string CreateAction { get; } + + /// + /// The permission name of the update permission. This is FSHAction.Update by default. + /// When empty, no update functionality will be available. + /// When the string is "true", update funtionality will be enabled, + /// otherwise it will only be enabled if the user has permission for this action on the EntityResource. + /// + public string UpdateAction { get; } + + /// + /// The permission name of the delete permission. This is FSHAction.Delete by default. + /// When empty, no delete functionality will be available. + /// When the string is "true", delete funtionality will be enabled, + /// otherwise it will only be enabled if the user has permission for this action on the EntityResource. + /// + public string DeleteAction { get; } + + /// + /// The permission name of the export permission. This is FSHAction.Export by default. + /// + public string ExportAction { get; } + + /// + /// Use this if you want to run initialization during OnInitialized of the AddEdit form. + /// + public Func? EditFormInitializedFunc { get; } + + /// + /// Use this if you want to check for permissions of content in the ExtraActions RenderFragment. + /// The extra actions won't be available when this returns false. + /// + public Func? HasExtraActionsFunc { get; set; } + + /// + /// Use this if you want to disable the update functionality for specific entities in the table. + /// + public Func? CanUpdateEntityFunc { get; set; } + + /// + /// Use this if you want to disable the delete functionality for specific entities in the table. + /// + public Func? CanDeleteEntityFunc { get; set; } + + public EntityTableContext( + List> fields, + Func? idFunc, + Func>? getDefaultsFunc, + Func? createFunc, + Func>? getDetailsFunc, + Func? updateFunc, + Func? deleteFunc, + string? entityName, + string? entityNamePlural, + string? entityResource, + string? searchAction, + string? createAction, + string? updateAction, + string? deleteAction, + string? exportAction, + Func? editFormInitializedFunc, + Func? hasExtraActionsFunc, + Func? canUpdateEntityFunc, + Func? canDeleteEntityFunc) + { + EntityResource = entityResource; + Fields = fields; + EntityName = entityName; + EntityNamePlural = entityNamePlural; + IdFunc = idFunc; + GetDefaultsFunc = getDefaultsFunc; + CreateFunc = createFunc; + GetDetailsFunc = getDetailsFunc; + UpdateFunc = updateFunc; + DeleteFunc = deleteFunc; + SearchAction = searchAction ?? FSHAction.Search; + CreateAction = createAction ?? FSHAction.Create; + UpdateAction = updateAction ?? FSHAction.Update; + DeleteAction = deleteAction ?? FSHAction.Delete; + ExportAction = exportAction ?? FSHAction.Export; + EditFormInitializedFunc = editFormInitializedFunc; + HasExtraActionsFunc = hasExtraActionsFunc; + CanUpdateEntityFunc = canUpdateEntityFunc; + CanDeleteEntityFunc = canDeleteEntityFunc; + } + + // AddEdit modal + private IDialogReference? _addEditModalRef; + + internal void SetAddEditModalRef(IDialogReference dialog) => + _addEditModalRef = dialog; + + public IAddEditModal AddEditModal => + _addEditModalRef?.Dialog as IAddEditModal + ?? throw new InvalidOperationException("AddEditModal is only available when the modal is shown."); + + // Shortcuts + public EntityClientTableContext? ClientContext => this as EntityClientTableContext; + public EntityServerTableContext? ServerContext => this as EntityServerTableContext; + public bool IsClientContext => ClientContext is not null; + public bool IsServerContext => ServerContext is not null; + + // Advanced Search + public bool AllColumnsChecked => + Fields.All(f => f.CheckedForSearch); + public void AllColumnsCheckChanged(bool checkAll) => + Fields.ForEach(f => f.CheckedForSearch = checkAll); + public bool AdvancedSearchEnabled => + ServerContext?.EnableAdvancedSearch is true; + public List SearchFields => + Fields.Where(f => f.CheckedForSearch).Select(f => f.SortLabel).ToList(); +} \ No newline at end of file diff --git a/src/Client/Components/EntityTable/IAddEditModal.cs b/src/Client/Components/EntityTable/IAddEditModal.cs new file mode 100644 index 0000000..eb7d43f --- /dev/null +++ b/src/Client/Components/EntityTable/IAddEditModal.cs @@ -0,0 +1,8 @@ +namespace RewardsPlus.BlazorWebAssembly.Client.Components.EntityTable; + +public interface IAddEditModal +{ + TRequest RequestModel { get; } + bool IsCreate { get; } + void ForceRender(); +} \ No newline at end of file diff --git a/src/Client/Components/EntityTable/PaginationResponse.cs b/src/Client/Components/EntityTable/PaginationResponse.cs new file mode 100644 index 0000000..b78f37b --- /dev/null +++ b/src/Client/Components/EntityTable/PaginationResponse.cs @@ -0,0 +1,9 @@ +namespace RewardsPlus.BlazorWebAssembly.Client.Components.EntityTable; + +public class PaginationResponse +{ + public List Data { get; set; } = default!; + public int TotalCount { get; set; } + public int CurrentPage { get; set; } = 1; + public int PageSize { get; set; } = 10; +} diff --git a/src/Client/Components/Localization/LanguageSelector.razor b/src/Client/Components/Localization/LanguageSelector.razor new file mode 100644 index 0000000..0305761 --- /dev/null +++ b/src/Client/Components/Localization/LanguageSelector.razor @@ -0,0 +1,41 @@ +@inject IStringLocalizer L + + + + @foreach (var language in LocalizationConstants.SupportedLanguages) + { + if (language.Code == CurrentLanguage) + { + @L[language.DisplayName] + } + else + { + @L[language.DisplayName] + } + } + + + +@code { + public string? CurrentLanguage { get; set; } = "en-US"; + + protected override async Task OnInitializedAsync() + { + var currentPreference = await ClientPreferences.GetPreference() as ClientPreference; + if (currentPreference != null) + { + CurrentLanguage = currentPreference.LanguageCode; + } + else + { + CurrentLanguage = "en-US"; + } + + } + private async Task ChangeLanguageAsync(string languageCode) + { + var result = await ClientPreferences.ChangeLanguageAsync(languageCode); + Navigation.NavigateTo(Navigation.Uri, forceLoad: true); + } +} \ No newline at end of file diff --git a/src/Client/Components/Notifications/NotificationConnection.razor b/src/Client/Components/Notifications/NotificationConnection.razor new file mode 100644 index 0000000..6d04cdf --- /dev/null +++ b/src/Client/Components/Notifications/NotificationConnection.razor @@ -0,0 +1,3 @@ + + @ChildContent + \ No newline at end of file diff --git a/src/Client/Components/Notifications/NotificationConnection.razor.cs b/src/Client/Components/Notifications/NotificationConnection.razor.cs new file mode 100644 index 0000000..b7e79d4 --- /dev/null +++ b/src/Client/Components/Notifications/NotificationConnection.razor.cs @@ -0,0 +1,153 @@ +using System.Net; +using System.Reflection; +using System.Text.Json; +using System.Text.Json.Nodes; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Common; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Notifications; +using RewardsPlus.WebApi.Shared.Notifications; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; +using Microsoft.AspNetCore.SignalR.Client; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.Notifications; + +public partial class NotificationConnection : IDisposable, IAsyncDisposable +{ + [Parameter] + public RenderFragment ChildContent { get; set; } = default!; + [Inject] + private IAccessTokenProvider TokenProvider { get; set; } = default!; + [Inject] + private INotificationPublisher Publisher { get; set; } = default!; + [Inject] + private IAuthenticationService AuthService { get; set; } = default!; + [Inject] + private ILogger Logger { get; set; } = default!; + + private readonly CancellationTokenSource _cts = new(); + private IDisposable? _subscription; + private HubConnection? _hubConnection; + + public ConnectionState ConnectionState => + _hubConnection?.State switch + { + HubConnectionState.Connected => ConnectionState.Connected, + HubConnectionState.Disconnected => ConnectionState.Disconnected, + _ => ConnectionState.Connecting + }; + + public string? ConnectionId => _hubConnection?.ConnectionId; + + protected override Task OnInitializedAsync() + { + _hubConnection = new HubConnectionBuilder() + .WithUrl($"{Config[ConfigNames.ApiBaseUrl]}notifications", options => + options.AccessTokenProvider = + () => TokenProvider.GetAccessTokenAsync()) + .WithAutomaticReconnect(new IndefiniteRetryPolicy()) + .Build(); + + _hubConnection.Reconnecting += ex => + OnConnectionStateChangedAsync(ConnectionState.Connecting, ex?.Message); + + _hubConnection.Reconnected += id => + OnConnectionStateChangedAsync(ConnectionState.Connected, id); + + _hubConnection.Closed += async ex => + { + await OnConnectionStateChangedAsync(ConnectionState.Disconnected, ex?.Message); + + // This shouldn't happen with the IndefiniteRetryPolicy configured above, + // but just in case it does, we wait a bit and restart the connection again. + await Task.Delay(5000, _cts.Token); + await ConnectWithRetryAsync(_cts.Token); + }; + + _subscription = _hubConnection.On(NotificationConstants.NotificationFromServer, (notificationTypeName, notificationJson) => + { + if (Assembly.GetAssembly(typeof(INotificationMessage))!.GetType(notificationTypeName) + is { } notificationType + && notificationJson.Deserialize( + notificationType, + new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }) + is INotificationMessage notification) + { + return Publisher.PublishAsync(notification); + } + + Logger.LogError("Invalid Notification Received ({name}).", notificationTypeName); + + return Task.CompletedTask; + }); + + // launch the signalR connection in the background. + // see https://www.dotnetcurry.com/aspnet-core/realtime-app-using-blazor-webassembly-signalr-csharp9 + _ = ConnectWithRetryAsync(_cts.Token); + + return base.OnInitializedAsync(); + } + + protected virtual Task OnConnectionStateChangedAsync(ConnectionState state, string? message) + { + return Publisher.PublishAsync(new ConnectionStateChanged(state, message)); + } + + private async Task ConnectWithRetryAsync(CancellationToken cancellationToken) + { + _ = _hubConnection ?? throw new InvalidOperationException("HubConnection can't be null."); + + // Keep trying to until we can start or the token is canceled. + while (true) + { + try + { + await _hubConnection.StartAsync(cancellationToken); + await OnConnectionStateChangedAsync(ConnectionState.Connected, _hubConnection.ConnectionId); + return; + } + catch when (cancellationToken.IsCancellationRequested) + { + return; + } + catch (HttpRequestException requestException) when (requestException.StatusCode == HttpStatusCode.Unauthorized) + { + // This shouldn't happen, but just in case, redirect to logout. + await AuthService.LogoutAsync(); + return; + } + catch + { + // Try again in a few seconds. This could be an incremental interval + await Task.Delay(5000, cancellationToken); + } + } + } + + public void Dispose() + { + _cts.Cancel(); + _cts.Dispose(); + _subscription?.Dispose(); + } + + public async ValueTask DisposeAsync() + { + if (_hubConnection is not null) + { + await _hubConnection.DisposeAsync(); + } + } +} + +internal class IndefiniteRetryPolicy : IRetryPolicy +{ + public TimeSpan? NextRetryDelay(RetryContext retryContext) => + retryContext.PreviousRetryCount switch + { + 0 => TimeSpan.Zero, + 1 => TimeSpan.FromSeconds(2), + 2 => TimeSpan.FromSeconds(5), + _ => TimeSpan.FromSeconds(10) + }; +} \ No newline at end of file diff --git a/src/Client/Components/Notifications/NotificationConnectionStatus.razor b/src/Client/Components/Notifications/NotificationConnectionStatus.razor new file mode 100644 index 0000000..78bea4a --- /dev/null +++ b/src/Client/Components/Notifications/NotificationConnectionStatus.razor @@ -0,0 +1,49 @@ +@inject ICourier Courier + + + + + +@code { + public string TooltipText { get; set; } = "No Connection"; + public string Icon { get; set; } = Icons.Filled.SignalWifi0Bar; + public Color IconColor { get; set; } = Color.Error; + + [CascadingParameter] private NotificationConnection _notifications { get; set; } = default!; + + protected override void OnInitialized() + { + SetConnectionState(_notifications.ConnectionState, _notifications.ConnectionId); + + Courier.SubscribeWeak>(wrapper => + { + SetConnectionState(wrapper.Notification.State, wrapper.Notification.Message); + StateHasChanged(); + }); + } + + private void SetConnectionState(ConnectionState state, string? message) + { + switch (state) + { + case ConnectionState.Connected: + TooltipText = $"Connected to Server with ConnectionId {message}"; + Icon = @Icons.Filled.SignalWifiStatusbar4Bar; + IconColor = Color.Success; + break; + + case ConnectionState.Connecting: + TooltipText = $"(Re)connecting... ({message})."; + Icon = @Icons.Filled.SignalWifiStatusbarConnectedNoInternet4; + IconColor = Color.Warning; + break; + + case ConnectionState.Disconnected: + TooltipText = $"Connection Closed ({message})."; + Icon = @Icons.Filled.SignalWifiOff; + IconColor = Color.Error; + break; + } + StateHasChanged(); + } +} \ No newline at end of file diff --git a/src/Client/Components/ThemeManager/ColorPanel.razor b/src/Client/Components/ThemeManager/ColorPanel.razor new file mode 100644 index 0000000..2b90017 --- /dev/null +++ b/src/Client/Components/ThemeManager/ColorPanel.razor @@ -0,0 +1,27 @@ + + +
+ @ColorType + + +
+
+ + + + + @foreach (var color in Colors) + { + + +
+
+
+
+ } +
+
+
+
+
\ No newline at end of file diff --git a/src/Client/Components/ThemeManager/ColorPanel.razor.cs b/src/Client/Components/ThemeManager/ColorPanel.razor.cs new file mode 100644 index 0000000..3c899cc --- /dev/null +++ b/src/Client/Components/ThemeManager/ColorPanel.razor.cs @@ -0,0 +1,24 @@ +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.ThemeManager; + +public partial class ColorPanel +{ + [Parameter] + public List Colors { get; set; } = new(); + + [Parameter] + public string ColorType { get; set; } = string.Empty; + + [Parameter] + public Color CurrentColor { get; set; } + + [Parameter] + public EventCallback OnColorClicked { get; set; } + + protected async Task ColorClicked(string color) + { + await OnColorClicked.InvokeAsync(color); + } +} \ No newline at end of file diff --git a/src/Client/Components/ThemeManager/DarkModePanel.razor b/src/Client/Components/ThemeManager/DarkModePanel.razor new file mode 100644 index 0000000..1f983fc --- /dev/null +++ b/src/Client/Components/ThemeManager/DarkModePanel.razor @@ -0,0 +1,17 @@ + + +
+ @if (_isDarkMode) + { + Light Mode + } + else + { + Dark Mode + } + +
+
+
\ No newline at end of file diff --git a/src/Client/Components/ThemeManager/DarkModePanel.razor.cs b/src/Client/Components/ThemeManager/DarkModePanel.razor.cs new file mode 100644 index 0000000..70ae348 --- /dev/null +++ b/src/Client/Components/ThemeManager/DarkModePanel.razor.cs @@ -0,0 +1,24 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences; +using Microsoft.AspNetCore.Components; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.ThemeManager; + +public partial class DarkModePanel +{ + private bool _isDarkMode; + + protected override async Task OnInitializedAsync() + { + if (await ClientPreferences.GetPreference() is not ClientPreference themePreference) themePreference = new ClientPreference(); + _isDarkMode = themePreference.IsDarkMode; + } + + [Parameter] + public EventCallback OnIconClicked { get; set; } + + private async Task ToggleDarkMode() + { + _isDarkMode = !_isDarkMode; + await OnIconClicked.InvokeAsync(_isDarkMode); + } +} \ No newline at end of file diff --git a/src/Client/Components/ThemeManager/RadiusPanel.razor b/src/Client/Components/ThemeManager/RadiusPanel.razor new file mode 100644 index 0000000..56e42f2 --- /dev/null +++ b/src/Client/Components/ThemeManager/RadiusPanel.razor @@ -0,0 +1,15 @@ + + +
+ Border Radius + @Radius.ToString() + +
+
+ + + @Radius.ToString() + +
\ No newline at end of file diff --git a/src/Client/Components/ThemeManager/RadiusPanel.razor.cs b/src/Client/Components/ThemeManager/RadiusPanel.razor.cs new file mode 100644 index 0000000..5ad40bd --- /dev/null +++ b/src/Client/Components/ThemeManager/RadiusPanel.razor.cs @@ -0,0 +1,28 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences; +using Microsoft.AspNetCore.Components; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.ThemeManager; + +public partial class RadiusPanel +{ + [Parameter] + public double Radius { get; set; } + + [Parameter] + public double MaxValue { get; set; } = 30; + + [Parameter] + public EventCallback OnSliderChanged { get; set; } + + protected override async Task OnInitializedAsync() + { + if (await ClientPreferences.GetPreference() is not ClientPreference themePreference) themePreference = new ClientPreference(); + Radius = themePreference.BorderRadius; + } + + private async Task ChangedSelection(ChangeEventArgs args) + { + Radius = int.Parse(args?.Value?.ToString() ?? "0"); + await OnSliderChanged.InvokeAsync(Radius); + } +} \ No newline at end of file diff --git a/src/Client/Components/ThemeManager/TableCustomizationPanel.razor b/src/Client/Components/ThemeManager/TableCustomizationPanel.razor new file mode 100644 index 0000000..e10ea10 --- /dev/null +++ b/src/Client/Components/ThemeManager/TableCustomizationPanel.razor @@ -0,0 +1,19 @@ + + +
+ Table Customization + T + +
+
+ + + + + + +
\ No newline at end of file diff --git a/src/Client/Components/ThemeManager/TableCustomizationPanel.razor.cs b/src/Client/Components/ThemeManager/TableCustomizationPanel.razor.cs new file mode 100644 index 0000000..6f00648 --- /dev/null +++ b/src/Client/Components/ThemeManager/TableCustomizationPanel.razor.cs @@ -0,0 +1,74 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Notifications; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences; +using Microsoft.AspNetCore.Components; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.ThemeManager; + +public partial class TableCustomizationPanel +{ + [Parameter] + public bool IsDense { get; set; } + [Parameter] + public bool IsStriped { get; set; } + [Parameter] + public bool HasBorder { get; set; } + [Parameter] + public bool IsHoverable { get; set; } + [Inject] + protected INotificationPublisher Notifications { get; set; } = default!; + + private FshTablePreference _tablePreference = new(); + + protected override async Task OnInitializedAsync() + { + if (await ClientPreferences.GetPreference() is ClientPreference clientPreference) + { + _tablePreference = clientPreference.TablePreference; + } + + IsDense = _tablePreference.IsDense; + IsStriped = _tablePreference.IsStriped; + HasBorder = _tablePreference.HasBorder; + IsHoverable = _tablePreference.IsHoverable; + } + + [Parameter] + public EventCallback OnDenseSwitchToggled { get; set; } + + [Parameter] + public EventCallback OnStripedSwitchToggled { get; set; } + + [Parameter] + public EventCallback OnBorderdedSwitchToggled { get; set; } + + [Parameter] + public EventCallback OnHoverableSwitchToggled { get; set; } + + private async Task ToggleDenseSwitch() + { + _tablePreference.IsDense = !_tablePreference.IsDense; + await OnDenseSwitchToggled.InvokeAsync(_tablePreference.IsDense); + await Notifications.PublishAsync(_tablePreference); + } + + private async Task ToggleStripedSwitch() + { + _tablePreference.IsStriped = !_tablePreference.IsStriped; + await OnStripedSwitchToggled.InvokeAsync(_tablePreference.IsStriped); + await Notifications.PublishAsync(_tablePreference); + } + + private async Task ToggleBorderedSwitch() + { + _tablePreference.HasBorder = !_tablePreference.HasBorder; + await OnBorderdedSwitchToggled.InvokeAsync(_tablePreference.HasBorder); + await Notifications.PublishAsync(_tablePreference); + } + + private async Task ToggleHoverableSwitch() + { + _tablePreference.IsHoverable = !_tablePreference.IsHoverable; + await OnHoverableSwitchToggled.InvokeAsync(_tablePreference.IsHoverable); + await Notifications.PublishAsync(_tablePreference); + } +} \ No newline at end of file diff --git a/src/Client/Components/ThemeManager/ThemeButton.razor b/src/Client/Components/ThemeManager/ThemeButton.razor new file mode 100644 index 0000000..364ecc5 --- /dev/null +++ b/src/Client/Components/ThemeManager/ThemeButton.razor @@ -0,0 +1,16 @@ +
+ + + +
+ + \ No newline at end of file diff --git a/src/Client/Components/ThemeManager/ThemeButton.razor.cs b/src/Client/Components/ThemeManager/ThemeButton.razor.cs new file mode 100644 index 0000000..a88d4f2 --- /dev/null +++ b/src/Client/Components/ThemeManager/ThemeButton.razor.cs @@ -0,0 +1,10 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.ThemeManager; + +public partial class ThemeButton +{ + [Parameter] + public EventCallback OnClick { get; set; } +} \ No newline at end of file diff --git a/src/Client/Components/ThemeManager/ThemeDrawer.razor b/src/Client/Components/ThemeManager/ThemeDrawer.razor new file mode 100644 index 0000000..1ee685d --- /dev/null +++ b/src/Client/Components/ThemeManager/ThemeDrawer.razor @@ -0,0 +1,28 @@ + + + + Theme Manager + + + + + +
+ + + + + + + +
+
+ \ No newline at end of file diff --git a/src/Client/Components/ThemeManager/ThemeDrawer.razor.cs b/src/Client/Components/ThemeManager/ThemeDrawer.razor.cs new file mode 100644 index 0000000..afef574 --- /dev/null +++ b/src/Client/Components/ThemeManager/ThemeDrawer.razor.cs @@ -0,0 +1,96 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Theme; +using Microsoft.AspNetCore.Components; + +namespace RewardsPlus.BlazorWebAssembly.Client.Components.ThemeManager; + +public partial class ThemeDrawer +{ + [Parameter] + public bool ThemeDrawerOpen { get; set; } + + [Parameter] + public EventCallback ThemeDrawerOpenChanged { get; set; } + + [EditorRequired] + [Parameter] + public ClientPreference ThemePreference { get; set; } = default!; + + [EditorRequired] + [Parameter] + public EventCallback ThemePreferenceChanged { get; set; } + + private readonly List _colors = CustomColors.ThemeColors; + + private async Task UpdateThemePrimaryColor(string color) + { + if (ThemePreference is not null) + { + ThemePreference.PrimaryColor = color; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } + + private async Task UpdateThemeSecondaryColor(string color) + { + if (ThemePreference is not null) + { + ThemePreference.SecondaryColor = color; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } + + private async Task UpdateBorderRadius(double radius) + { + if (ThemePreference is not null) + { + ThemePreference.BorderRadius = radius; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } + + private async Task ToggleDarkLightMode(bool isDarkMode) + { + if (ThemePreference is not null) + { + ThemePreference.IsDarkMode = isDarkMode; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } + + private async Task ToggleEntityTableDense(bool isDense) + { + if (ThemePreference is not null) + { + ThemePreference.TablePreference.IsDense = isDense; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } + + private async Task ToggleEntityTableStriped(bool isStriped) + { + if (ThemePreference is not null) + { + ThemePreference.TablePreference.IsStriped = isStriped; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } + + private async Task ToggleEntityTableBorder(bool hasBorder) + { + if (ThemePreference is not null) + { + ThemePreference.TablePreference.HasBorder = hasBorder; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } + + private async Task ToggleEntityTableHoverable(bool isHoverable) + { + if (ThemePreference is not null) + { + ThemePreference.TablePreference.IsHoverable = isHoverable; + await ThemePreferenceChanged.InvokeAsync(ThemePreference); + } + } +} \ No newline at end of file diff --git a/src/Client/Pages/Authentication/Authentication.razor b/src/Client/Pages/Authentication/Authentication.razor new file mode 100644 index 0000000..08b90bc --- /dev/null +++ b/src/Client/Pages/Authentication/Authentication.razor @@ -0,0 +1,74 @@ +@page "/authentication/{action}" +@attribute [AllowAnonymous] + +@inject IStringLocalizer L + + + @* Override the different child items to adapt them to our own style + I've done this for LogOutSucceeded now, already added the rest but with the defaults (and localization). *@ + + + + @L["You were successfully logged out."] + + + + + @L["Click here to log back in"]. + + + + + @L["Logging you in..."] + + + @L["Checking permissions..."] + + + + + @L["Sorry, your login failed. Please try again or contact support."] + + + @if (GetMessage() is string message && !string.IsNullOrWhiteSpace(message)) + { + + @message + + } + + + @L["Logging you out..."] + + + @L["Logging you out..."] + + + @L["Sorry, log out operation failed. Please try again or contact support."] + + + @L["Retrieving profile..."] + + + @L["Registering account..."] + + + +@code { + [Parameter] public string? Action { get; set; } + + private void GoHome() => Navigation.NavigateTo("/"); + + private string? GetMessage() + { + var query = Navigation.ToAbsoluteUri(Navigation.Uri).Query; + + if (!string.IsNullOrWhiteSpace(query) + && QueryHelpers.ParseQuery(query).TryGetValue("message", out var message)) + { + return message.ToString(); + } + + return null; + } +} \ No newline at end of file diff --git a/src/Client/Pages/Authentication/ForgotPassword.razor b/src/Client/Pages/Authentication/ForgotPassword.razor new file mode 100644 index 0000000..73d9b51 --- /dev/null +++ b/src/Client/Pages/Authentication/ForgotPassword.razor @@ -0,0 +1,45 @@ +@page "/account/forgot-password" +@attribute [AllowAnonymous] +@inject IStringLocalizer L +@inject IStringLocalizer LS + + + + + + + + +
+ +
+
+ @L["Forgot Password?"] + + @L["We can help you by resetting your password."] +
+
+
+
+ + + + + + + + + + + + + + + @L["Forgot Password"] + +
+
\ No newline at end of file diff --git a/src/Client/Pages/Authentication/ForgotPassword.razor.cs b/src/Client/Pages/Authentication/ForgotPassword.razor.cs new file mode 100644 index 0000000..a3eaaae --- /dev/null +++ b/src/Client/Pages/Authentication/ForgotPassword.razor.cs @@ -0,0 +1,31 @@ +using RewardsPlus.BlazorWebAssembly.Client.Components.Common; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Shared; +using RewardsPlus.WebApi.Shared.Multitenancy; +using Microsoft.AspNetCore.Components; + +namespace RewardsPlus.BlazorWebAssembly.Client.Pages.Authentication; + +public partial class ForgotPassword +{ + private readonly ForgotPasswordRequest _forgotPasswordRequest = new(); + private CustomValidation? _customValidation; + private bool BusySubmitting { get; set; } + + [Inject] + private IUsersClient UsersClient { get; set; } = default!; + + private string Tenant { get; set; } = MultitenancyConstants.Root.Id; + + private async Task SubmitAsync() + { + BusySubmitting = true; + + await ApiHelper.ExecuteCallGuardedAsync( + () => UsersClient.ForgotPasswordAsync(Tenant, _forgotPasswordRequest), + Snackbar, + _customValidation); + + BusySubmitting = false; + } +} \ No newline at end of file diff --git a/src/Client/Pages/Authentication/Login.razor b/src/Client/Pages/Authentication/Login.razor new file mode 100644 index 0000000..2ca6929 --- /dev/null +++ b/src/Client/Pages/Authentication/Login.razor @@ -0,0 +1,47 @@ +@page "/login" +@attribute [AllowAnonymous] +@inject IStringLocalizer L +@inject IStringLocalizer LS + +
+ +
+
+ Sign In + @L["Enter your credentials to get started."] + +
+
+ + + + + + + + + + + + + + + + @L["Register?"] + + + @L["Forgot password?"] + + + @L["Sign In"] + + + @L["Fill Administrator Credentials"] + + + \ No newline at end of file diff --git a/src/Client/Pages/Authentication/Login.razor.cs b/src/Client/Pages/Authentication/Login.razor.cs new file mode 100644 index 0000000..2019629 --- /dev/null +++ b/src/Client/Pages/Authentication/Login.razor.cs @@ -0,0 +1,81 @@ +using RewardsPlus.BlazorWebAssembly.Client.Components.Common; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; +using RewardsPlus.BlazorWebAssembly.Client.Shared; +using RewardsPlus.WebApi.Shared.Multitenancy; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Pages.Authentication; + +public partial class Login +{ + [CascadingParameter] + public Task AuthState { get; set; } = default!; + [Inject] + public IAuthenticationService AuthService { get; set; } = default!; + + private CustomValidation? _customValidation; + + public bool BusySubmitting { get; set; } + + private readonly TokenRequest _tokenRequest = new(); + private string TenantId { get; set; } = string.Empty; + private bool _passwordVisibility; + private InputType _passwordInput = InputType.Password; + private string _passwordInputIcon = Icons.Material.Filled.VisibilityOff; + + protected override async Task OnInitializedAsync() + { + if (AuthService.ProviderType == AuthProvider.AzureAd) + { + AuthService.NavigateToExternalLogin(Navigation.Uri); + return; + } + + var authState = await AuthState; + if (authState.User.Identity?.IsAuthenticated is true) + { + Navigation.NavigateTo("/"); + } + } + + private void TogglePasswordVisibility() + { + if (_passwordVisibility) + { + _passwordVisibility = false; + _passwordInputIcon = Icons.Material.Filled.VisibilityOff; + _passwordInput = InputType.Password; + } + else + { + _passwordVisibility = true; + _passwordInputIcon = Icons.Material.Filled.Visibility; + _passwordInput = InputType.Text; + } + } + + private void FillAdministratorCredentials() + { + _tokenRequest.Email = MultitenancyConstants.Root.EmailAddress; + _tokenRequest.Password = MultitenancyConstants.DefaultPassword; + TenantId = MultitenancyConstants.Root.Id; + } + + private async Task SubmitAsync() + { + BusySubmitting = true; + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => AuthService.LoginAsync(TenantId, _tokenRequest), + Snackbar, + _customValidation)) + { + Snackbar.Add($"Logged in as {_tokenRequest.Email}", Severity.Info); + } + + BusySubmitting = false; + } +} \ No newline at end of file diff --git a/src/Client/Pages/Authentication/SelfRegister.razor b/src/Client/Pages/Authentication/SelfRegister.razor new file mode 100644 index 0000000..975e15e --- /dev/null +++ b/src/Client/Pages/Authentication/SelfRegister.razor @@ -0,0 +1,74 @@ +@page "/users/self-register" +@attribute [AllowAnonymous] +@inject IStringLocalizer L +@inject IStringLocalizer LS + + + + + + + + +
+ +
+
+ + @L["New User Registration"] + + @L["Enter your details below to set up your new account"] +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @L["Register"] + + +
+
\ No newline at end of file diff --git a/src/Client/Pages/Authentication/SelfRegister.razor.cs b/src/Client/Pages/Authentication/SelfRegister.razor.cs new file mode 100644 index 0000000..965951c --- /dev/null +++ b/src/Client/Pages/Authentication/SelfRegister.razor.cs @@ -0,0 +1,58 @@ +using RewardsPlus.BlazorWebAssembly.Client.Components.Common; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Shared; +using RewardsPlus.WebApi.Shared.Multitenancy; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Pages.Authentication; + +public partial class SelfRegister +{ + private readonly CreateUserRequest _createUserRequest = new(); + private CustomValidation? _customValidation; + private bool BusySubmitting { get; set; } + + [Inject] + private IUsersClient UsersClient { get; set; } = default!; + + private string Tenant { get; set; } = MultitenancyConstants.Root.Id; + + private bool _passwordVisibility; + private InputType _passwordInput = InputType.Password; + private string _passwordInputIcon = Icons.Material.Filled.VisibilityOff; + + private async Task SubmitAsync() + { + BusySubmitting = true; + + string? sucessMessage = await ApiHelper.ExecuteCallGuardedAsync( + () => UsersClient.SelfRegisterAsync(Tenant, _createUserRequest), + Snackbar, + _customValidation); + + if (sucessMessage != null) + { + Snackbar.Add(sucessMessage, Severity.Info); + Navigation.NavigateTo("/login"); + } + + BusySubmitting = false; + } + + private void TogglePasswordVisibility() + { + if (_passwordVisibility) + { + _passwordVisibility = false; + _passwordInputIcon = Icons.Material.Filled.VisibilityOff; + _passwordInput = InputType.Password; + } + else + { + _passwordVisibility = true; + _passwordInputIcon = Icons.Material.Filled.Visibility; + _passwordInput = InputType.Text; + } + } +} \ No newline at end of file diff --git a/src/Client/Pages/Catalog/BrandAutocomplete.cs b/src/Client/Pages/Catalog/BrandAutocomplete.cs new file mode 100644 index 0000000..e2e3ec0 --- /dev/null +++ b/src/Client/Pages/Catalog/BrandAutocomplete.cs @@ -0,0 +1,68 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Shared; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Localization; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Pages.Catalog; + +public class BrandAutocomplete : MudAutocomplete +{ + [Inject] + private IStringLocalizer L { get; set; } = default!; + [Inject] + private IBrandsClient BrandsClient { get; set; } = default!; + [Inject] + private ISnackbar Snackbar { get; set; } = default!; + + private List _brands = new(); + + // supply default parameters, but leave the possibility to override them + public override Task SetParametersAsync(ParameterView parameters) + { + Label = L["Brand"]; + Variant = Variant.Filled; + Dense = true; + Margin = Margin.Dense; + ResetValueOnEmptyText = true; + SearchFunc = SearchBrands; + ToStringFunc = GetBrandName; + Clearable = true; + return base.SetParametersAsync(parameters); + } + + // when the value parameter is set, we have to load that one brand to be able to show the name + // we can't do that in OnInitialized because of a strange bug (https://github.com/MudBlazor/MudBlazor/issues/3818) + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender && + _value != default && + await ApiHelper.ExecuteCallGuardedAsync( + () => BrandsClient.GetAsync(_value), Snackbar) is { } brand) + { + _brands.Add(brand); + ForceRender(true); + } + } + + private async Task> SearchBrands(string value) + { + var filter = new SearchBrandsRequest + { + PageSize = 10, + AdvancedSearch = new() { Fields = new[] { "name" }, Keyword = value } + }; + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => BrandsClient.SearchAsync(filter), Snackbar) + is PaginationResponseOfBrandDto response) + { + _brands = response.Data.ToList(); + } + + return _brands.Select(x => x.Id); + } + + private string GetBrandName(Guid id) => + _brands.Find(b => b.Id == id)?.Name ?? string.Empty; +} \ No newline at end of file diff --git a/src/Client/Pages/Catalog/Brands.razor b/src/Client/Pages/Catalog/Brands.razor new file mode 100644 index 0000000..fe23833 --- /dev/null +++ b/src/Client/Pages/Catalog/Brands.razor @@ -0,0 +1,52 @@ +@page "/catalog/brands" +@attribute [MustHavePermission(FSHAction.View, FSHResource.Brands)] + +@inject IStringLocalizer L +@inject IBrandsClient BrandsClient + + + + + + + @if (!Context.AddEditModal.IsCreate) + { + + + + } + + + + + + + + + + +@code +{ + protected EntityServerTableContext Context { get; set; } = default!; + + protected override void OnInitialized() => + Context = new( + entityName: L["Brand"], + entityNamePlural: L["Brands"], + entityResource: FSHResource.Brands, + fields: new() + { + new(brand => brand.Id, L["Id"], "Id"), + new(brand => brand.Name, L["Name"], "Name"), + new(brand => brand.Description, L["Description"], "Description"), + }, + idFunc: brand => brand.Id, + searchFunc: async filter => (await BrandsClient + .SearchAsync(filter.Adapt())) + .Adapt>(), + createFunc: async brand => await BrandsClient.CreateAsync(brand.Adapt()), + updateFunc: async (id, brand) => await BrandsClient.UpdateAsync(id, brand), + deleteFunc: async id => await BrandsClient.DeleteAsync(id), + exportAction: string.Empty); +} \ No newline at end of file diff --git a/src/Client/Pages/Catalog/Products.razor b/src/Client/Pages/Catalog/Products.razor new file mode 100644 index 0000000..89b083e --- /dev/null +++ b/src/Client/Pages/Catalog/Products.razor @@ -0,0 +1,78 @@ +@page "/catalog/products" +@attribute [MustHavePermission(FSHAction.View, FSHResource.Products)] + +@inject IStringLocalizer L + + + + + + + + @L["Minimum Rate"]: @_searchMinimumRate.ToString() + @L["Maximum Rate"]: @_searchMaximumRate.ToString() + + + + @if (!Context.AddEditModal.IsCreate) + { + + + + } + + + + + + + + + + + + + + + @if(!string.IsNullOrEmpty(context.ImageInBytes)) + { + + } + else + { + + } + + +
+ + @L["Upload"] + + @if(!Context.AddEditModal.IsCreate && !string.IsNullOrEmpty(context.ImagePath) && string.IsNullOrEmpty(context.ImageInBytes)) + { + + @L["View"] + + + + @L["Delete"] + + } + @if(!string.IsNullOrEmpty(context.ImageInBytes)) + { + + @L["Clear"] + + } +
+
+
+
+ +
\ No newline at end of file diff --git a/src/Client/Pages/Catalog/Products.razor.cs b/src/Client/Pages/Catalog/Products.razor.cs new file mode 100644 index 0000000..2995de4 --- /dev/null +++ b/src/Client/Pages/Catalog/Products.razor.cs @@ -0,0 +1,159 @@ +using RewardsPlus.BlazorWebAssembly.Client.Components.EntityTable; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Common; +using RewardsPlus.WebApi.Shared.Authorization; +using Mapster; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Pages.Catalog; + +public partial class Products +{ + [Inject] + protected IProductsClient ProductsClient { get; set; } = default!; + [Inject] + protected IBrandsClient BrandsClient { get; set; } = default!; + + protected EntityServerTableContext Context { get; set; } = default!; + + private EntityTable _table = default!; + + protected override void OnInitialized() => + Context = new( + entityName: L["Product"], + entityNamePlural: L["Products"], + entityResource: FSHResource.Products, + fields: new() + { + new(prod => prod.Id, L["Id"], "Id"), + new(prod => prod.Name, L["Name"], "Name"), + new(prod => prod.BrandName, L["Brand"], "Brand.Name"), + new(prod => prod.Description, L["Description"], "Description"), + new(prod => prod.Rate, L["Rate"], "Rate") + }, + enableAdvancedSearch: true, + idFunc: prod => prod.Id, + searchFunc: async filter => + { + var productFilter = filter.Adapt(); + + productFilter.BrandId = SearchBrandId == default ? null : SearchBrandId; + productFilter.MinimumRate = SearchMinimumRate; + productFilter.MaximumRate = SearchMaximumRate; + + var result = await ProductsClient.SearchAsync(productFilter); + return result.Adapt>(); + }, + createFunc: async prod => + { + if (!string.IsNullOrEmpty(prod.ImageInBytes)) + { + prod.Image = new FileUploadRequest() { Data = prod.ImageInBytes, Extension = prod.ImageExtension ?? string.Empty, Name = $"{prod.Name}_{Guid.NewGuid():N}" }; + } + + await ProductsClient.CreateAsync(prod.Adapt()); + prod.ImageInBytes = string.Empty; + }, + updateFunc: async (id, prod) => + { + if (!string.IsNullOrEmpty(prod.ImageInBytes)) + { + prod.DeleteCurrentImage = true; + prod.Image = new FileUploadRequest() { Data = prod.ImageInBytes, Extension = prod.ImageExtension ?? string.Empty, Name = $"{prod.Name}_{Guid.NewGuid():N}" }; + } + + await ProductsClient.UpdateAsync(id, prod.Adapt()); + prod.ImageInBytes = string.Empty; + }, + exportFunc: async filter => + { + var exportFilter = filter.Adapt(); + + exportFilter.BrandId = SearchBrandId == default ? null : SearchBrandId; + exportFilter.MinimumRate = SearchMinimumRate; + exportFilter.MaximumRate = SearchMaximumRate; + + return await ProductsClient.ExportAsync(exportFilter); + }, + deleteFunc: async id => await ProductsClient.DeleteAsync(id)); + + // Advanced Search + + private Guid _searchBrandId; + private Guid SearchBrandId + { + get => _searchBrandId; + set + { + _searchBrandId = value; + _ = _table.ReloadDataAsync(); + } + } + + private decimal _searchMinimumRate; + private decimal SearchMinimumRate + { + get => _searchMinimumRate; + set + { + _searchMinimumRate = value; + _ = _table.ReloadDataAsync(); + } + } + + private decimal _searchMaximumRate = 9999; + private decimal SearchMaximumRate + { + get => _searchMaximumRate; + set + { + _searchMaximumRate = value; + _ = _table.ReloadDataAsync(); + } + } + + // TODO : Make this as a shared service or something? Since it's used by Profile Component also for now, and literally any other component that will have image upload. + // The new service should ideally return $"data:{ApplicationConstants.StandardImageFormat};base64,{Convert.ToBase64String(buffer)}" + private async Task UploadFiles(InputFileChangeEventArgs e) + { + if (e.File != null) + { + string? extension = Path.GetExtension(e.File.Name); + if (!ApplicationConstants.SupportedImageFormats.Contains(extension.ToLower())) + { + Snackbar.Add("Image Format Not Supported.", Severity.Error); + return; + } + + Context.AddEditModal.RequestModel.ImageExtension = extension; + var imageFile = await e.File.RequestImageFileAsync(ApplicationConstants.StandardImageFormat, ApplicationConstants.MaxImageWidth, ApplicationConstants.MaxImageHeight); + byte[]? buffer = new byte[imageFile.Size]; + await imageFile.OpenReadStream(ApplicationConstants.MaxAllowedSize).ReadAsync(buffer); + Context.AddEditModal.RequestModel.ImageInBytes = $"data:{ApplicationConstants.StandardImageFormat};base64,{Convert.ToBase64String(buffer)}"; + Context.AddEditModal.ForceRender(); + } + } + + public void ClearImageInBytes() + { + Context.AddEditModal.RequestModel.ImageInBytes = string.Empty; + Context.AddEditModal.ForceRender(); + } + + public void SetDeleteCurrentImageFlag() + { + Context.AddEditModal.RequestModel.ImageInBytes = string.Empty; + Context.AddEditModal.RequestModel.ImagePath = string.Empty; + Context.AddEditModal.RequestModel.DeleteCurrentImage = true; + Context.AddEditModal.ForceRender(); + } +} + +public class ProductViewModel : UpdateProductRequest +{ + public string? ImagePath { get; set; } + public string? ImageInBytes { get; set; } + public string? ImageExtension { get; set; } +} \ No newline at end of file diff --git a/src/Client/Pages/Identity/Account/Account.razor b/src/Client/Pages/Identity/Account/Account.razor new file mode 100644 index 0000000..4d89ede --- /dev/null +++ b/src/Client/Pages/Identity/Account/Account.razor @@ -0,0 +1,33 @@ +@page "/account" + +@inject IStringLocalizer L + + + + + + + + @if (!SecurityTabHidden) + { + + + + } + + +@code +{ + [Inject] + public IAuthenticationService AuthService { get; set; } = default!; + + public bool SecurityTabHidden { get; set; } = false; + + protected override void OnInitialized() + { + if (AuthService.ProviderType == AuthProvider.AzureAd) + { + SecurityTabHidden = true; + } + } +} \ No newline at end of file diff --git a/src/Client/Pages/Identity/Account/Profile.razor b/src/Client/Pages/Identity/Account/Profile.razor new file mode 100644 index 0000000..006b27b --- /dev/null +++ b/src/Client/Pages/Identity/Account/Profile.razor @@ -0,0 +1,84 @@ +@inject IStringLocalizer L + + + + + +
+ @if (!string.IsNullOrEmpty(_imageUrl)) + { + + } + else + { + @_firstLetterOfName + } +
+ @_profileModel.FirstName @_profileModel.LastName + @_profileModel.Email +
+ + +
+
+ + + + + + @L["Profile Details"] + + + + + + + + + + + + + + + + + + + + + + @L["Save Changes"] + + + + +
\ No newline at end of file diff --git a/src/Client/Pages/Identity/Account/Profile.razor.cs b/src/Client/Pages/Identity/Account/Profile.razor.cs new file mode 100644 index 0000000..2130489 --- /dev/null +++ b/src/Client/Pages/Identity/Account/Profile.razor.cs @@ -0,0 +1,101 @@ +using System.Security.Claims; +using RewardsPlus.BlazorWebAssembly.Client.Components.Common; +using RewardsPlus.BlazorWebAssembly.Client.Components.Dialogs; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Common; +using RewardsPlus.BlazorWebAssembly.Client.Shared; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.AspNetCore.Components.Forms; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Pages.Identity.Account; + +public partial class Profile +{ + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthenticationService AuthService { get; set; } = default!; + [Inject] + protected IPersonalClient PersonalClient { get; set; } = default!; + + private readonly UpdateUserRequest _profileModel = new(); + + private string? _imageUrl; + private string? _userId; + private char _firstLetterOfName; + + private CustomValidation? _customValidation; + + protected override async Task OnInitializedAsync() + { + if ((await AuthState).User is { } user) + { + _userId = user.GetUserId(); + _profileModel.Email = user.GetEmail() ?? string.Empty; + _profileModel.FirstName = user.GetFirstName() ?? string.Empty; + _profileModel.LastName = user.GetSurname() ?? string.Empty; + _profileModel.PhoneNumber = user.GetPhoneNumber(); + _imageUrl = string.IsNullOrEmpty(user?.GetImageUrl()) ? string.Empty : (Config[ConfigNames.ApiBaseUrl] + user?.GetImageUrl()); + if (_userId is not null) _profileModel.Id = _userId; + } + + if (_profileModel.FirstName?.Length > 0) + { + _firstLetterOfName = _profileModel.FirstName.ToUpper().FirstOrDefault(); + } + } + + private async Task UpdateProfileAsync() + { + if (await ApiHelper.ExecuteCallGuardedAsync( + () => PersonalClient.UpdateProfileAsync(_profileModel), Snackbar, _customValidation)) + { + Snackbar.Add(L["Your Profile has been updated. Please Login again to Continue."], Severity.Success); + await AuthService.ReLoginAsync(Navigation.Uri); + } + } + + private async Task UploadFiles(InputFileChangeEventArgs e) + { + var file = e.File; + if (file is not null) + { + string? extension = Path.GetExtension(file.Name); + if (!ApplicationConstants.SupportedImageFormats.Contains(extension.ToLower())) + { + Snackbar.Add("Image Format Not Supported.", Severity.Error); + return; + } + + string? fileName = $"{_userId}-{Guid.NewGuid():N}"; + fileName = fileName[..Math.Min(fileName.Length, 90)]; + var imageFile = await file.RequestImageFileAsync(ApplicationConstants.StandardImageFormat, ApplicationConstants.MaxImageWidth, ApplicationConstants.MaxImageHeight); + byte[]? buffer = new byte[imageFile.Size]; + await imageFile.OpenReadStream(ApplicationConstants.MaxAllowedSize).ReadAsync(buffer); + string? base64String = $"data:{ApplicationConstants.StandardImageFormat};base64,{Convert.ToBase64String(buffer)}"; + _profileModel.Image = new FileUploadRequest() { Name = fileName, Data = base64String, Extension = extension }; + + await UpdateProfileAsync(); + } + } + + public async Task RemoveImageAsync() + { + string deleteContent = L["You're sure you want to delete your Profile Image?"]; + var parameters = new DialogParameters + { + { nameof(DeleteConfirmation.ContentText), deleteContent } + }; + var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true, DisableBackdropClick = true }; + var dialog = DialogService.Show(L["Delete"], parameters, options); + var result = await dialog.Result; + if (!result.Cancelled) + { + _profileModel.DeleteCurrentImage = true; + await UpdateProfileAsync(); + } + } +} \ No newline at end of file diff --git a/src/Client/Pages/Identity/Account/Security.razor b/src/Client/Pages/Identity/Account/Security.razor new file mode 100644 index 0000000..c63d189 --- /dev/null +++ b/src/Client/Pages/Identity/Account/Security.razor @@ -0,0 +1,41 @@ +@inject IStringLocalizer L + + + + + + @L["Change Password"] + + + + + + + + + + + + + + + + + + + + @L["Change Password"] + + + \ No newline at end of file diff --git a/src/Client/Pages/Identity/Account/Security.razor.cs b/src/Client/Pages/Identity/Account/Security.razor.cs new file mode 100644 index 0000000..5b32337 --- /dev/null +++ b/src/Client/Pages/Identity/Account/Security.razor.cs @@ -0,0 +1,72 @@ +using RewardsPlus.BlazorWebAssembly.Client.Components.Common; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Shared; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Pages.Identity.Account; + +public partial class Security +{ + [Inject] + public IPersonalClient PersonalClient { get; set; } = default!; + + private readonly ChangePasswordRequest _passwordModel = new(); + + private CustomValidation? _customValidation; + + private async Task ChangePasswordAsync() + { + if (await ApiHelper.ExecuteCallGuardedAsync( + () => PersonalClient.ChangePasswordAsync(_passwordModel), + Snackbar, + _customValidation, + L["Password Changed!"])) + { + _passwordModel.Password = string.Empty; + _passwordModel.NewPassword = string.Empty; + _passwordModel.ConfirmNewPassword = string.Empty; + } + } + + private bool _currentPasswordVisibility; + private InputType _currentPasswordInput = InputType.Password; + private string _currentPasswordInputIcon = Icons.Material.Filled.VisibilityOff; + private bool _newPasswordVisibility; + private InputType _newPasswordInput = InputType.Password; + private string _newPasswordInputIcon = Icons.Material.Filled.VisibilityOff; + + private void TogglePasswordVisibility(bool newPassword) + { + if (newPassword) + { + if (_newPasswordVisibility) + { + _newPasswordVisibility = false; + _newPasswordInputIcon = Icons.Material.Filled.VisibilityOff; + _newPasswordInput = InputType.Password; + } + else + { + _newPasswordVisibility = true; + _newPasswordInputIcon = Icons.Material.Filled.Visibility; + _newPasswordInput = InputType.Text; + } + } + else + { + if (_currentPasswordVisibility) + { + _currentPasswordVisibility = false; + _currentPasswordInputIcon = Icons.Material.Filled.VisibilityOff; + _currentPasswordInput = InputType.Password; + } + else + { + _currentPasswordVisibility = true; + _currentPasswordInputIcon = Icons.Material.Filled.Visibility; + _currentPasswordInput = InputType.Text; + } + } + } +} \ No newline at end of file diff --git a/src/Client/Pages/Identity/Roles/RolePermissions.razor b/src/Client/Pages/Identity/Roles/RolePermissions.razor new file mode 100644 index 0000000..c51c397 --- /dev/null +++ b/src/Client/Pages/Identity/Roles/RolePermissions.razor @@ -0,0 +1,75 @@ +@page "/roles/{Id}/permissions" +@attribute [MustHavePermission(FSHAction.View, FSHResource.RoleClaims)] + +@inject IStringLocalizer L + + + +@if (!_loaded) +{ + +} +else +{ + + @foreach (var group in _groupedRoleClaims.Keys) + { + var selectedRoleClaimsInGroup = _groupedRoleClaims[group].Where(c => c.Enabled).ToList(); + var allRoleClaimsInGroup = _groupedRoleClaims[group].ToList(); + + + +
+ @L["Back"] + + @if (_canEditRoleClaims) + { + @L["Update Permissions"] + + } +
+ + @if (_canSearchRoleClaims) + { + + + } +
+ + + + @L["Permission Name"] + + + + @L["Description"] + + + @L["Status"] + + + + + + + + + + + + + + + + + + +
+
+ } +
+} \ No newline at end of file diff --git a/src/Client/Pages/Identity/Roles/RolePermissions.razor.cs b/src/Client/Pages/Identity/Roles/RolePermissions.razor.cs new file mode 100644 index 0000000..859124a --- /dev/null +++ b/src/Client/Pages/Identity/Roles/RolePermissions.razor.cs @@ -0,0 +1,114 @@ +using System.Security.Claims; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; +using RewardsPlus.BlazorWebAssembly.Client.Shared; +using RewardsPlus.WebApi.Shared.Authorization; +using RewardsPlus.WebApi.Shared.Multitenancy; +using Mapster; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Pages.Identity.Roles; + +public partial class RolePermissions +{ + [Parameter] + public string Id { get; set; } = default!; // from route + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + [Inject] + protected IRolesClient RolesClient { get; set; } = default!; + + private Dictionary> _groupedRoleClaims = default!; + + public string _title = string.Empty; + public string _description = string.Empty; + + private string _searchString = string.Empty; + + private bool _canEditRoleClaims; + private bool _canSearchRoleClaims; + private bool _loaded; + + static RolePermissions() => TypeAdapterConfig.NewConfig().MapToConstructor(true); + + protected override async Task OnInitializedAsync() + { + var state = await AuthState; + _canEditRoleClaims = await AuthService.HasPermissionAsync(state.User, FSHAction.Update, FSHResource.RoleClaims); + _canSearchRoleClaims = await AuthService.HasPermissionAsync(state.User, FSHAction.View, FSHResource.RoleClaims); + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => RolesClient.GetByIdWithPermissionsAsync(Id), Snackbar) + is RoleDto role && role.Permissions is not null) + { + _title = string.Format(L["{0} Permissions"], role.Name); + _description = string.Format(L["Manage {0} Role Permissions"], role.Name); + + var permissions = state.User.GetTenant() == MultitenancyConstants.Root.Id + ? FSHPermissions.All + : FSHPermissions.Admin; + + _groupedRoleClaims = permissions + .GroupBy(p => p.Resource) + .ToDictionary(g => g.Key, g => g.Select(p => + { + var permission = p.Adapt(); + permission.Enabled = role.Permissions.Contains(permission.Name); + return permission; + }).ToList()); + } + + _loaded = true; + } + + private Color GetGroupBadgeColor(int selected, int all) + { + if (selected == 0) + return Color.Error; + + if (selected == all) + return Color.Success; + + return Color.Info; + } + + private async Task SaveAsync() + { + var allPermissions = _groupedRoleClaims.Values.SelectMany(a => a); + var selectedPermissions = allPermissions.Where(a => a.Enabled); + var request = new UpdateRolePermissionsRequest() + { + RoleId = Id, + Permissions = selectedPermissions.Where(x => x.Enabled).Select(x => x.Name).ToList(), + }; + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => RolesClient.UpdatePermissionsAsync(request.RoleId, request), + Snackbar, + successMessage: L["Updated Permissions."]) + is not null) + { + Navigation.NavigateTo("/roles"); + } + } + + private bool Search(PermissionViewModel permission) => + string.IsNullOrWhiteSpace(_searchString) + || permission.Name.Contains(_searchString, StringComparison.OrdinalIgnoreCase) is true + || permission.Description.Contains(_searchString, StringComparison.OrdinalIgnoreCase) is true; +} + +public record PermissionViewModel : FSHPermission +{ + public bool Enabled { get; set; } + + public PermissionViewModel(string Description, string Action, string Resource, bool IsBasic = false, bool IsRoot = false) + : base(Description, Action, Resource, IsBasic, IsRoot) + { + } +} \ No newline at end of file diff --git a/src/Client/Pages/Identity/Roles/Roles.razor b/src/Client/Pages/Identity/Roles/Roles.razor new file mode 100644 index 0000000..c24582a --- /dev/null +++ b/src/Client/Pages/Identity/Roles/Roles.razor @@ -0,0 +1,33 @@ +@page "/roles" +@attribute [MustHavePermission(FSHAction.View, FSHResource.Roles)] + +@inject IStringLocalizer L + + + + + + + @if (_canViewRoleClaims) + { + @L["Manage Permission"] + } + + + + @if (!Context.AddEditModal.IsCreate) + { + + + + } + + + + + + + + + \ No newline at end of file diff --git a/src/Client/Pages/Identity/Roles/Roles.razor.cs b/src/Client/Pages/Identity/Roles/Roles.razor.cs new file mode 100644 index 0000000..42a08a4 --- /dev/null +++ b/src/Client/Pages/Identity/Roles/Roles.razor.cs @@ -0,0 +1,60 @@ +using RewardsPlus.BlazorWebAssembly.Client.Components.EntityTable; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; +using RewardsPlus.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; + +namespace RewardsPlus.BlazorWebAssembly.Client.Pages.Identity.Roles; + +public partial class Roles +{ + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + [Inject] + private IRolesClient RolesClient { get; set; } = default!; + + protected EntityClientTableContext Context { get; set; } = default!; + + private bool _canViewRoleClaims; + + protected override async Task OnInitializedAsync() + { + var state = await AuthState; + _canViewRoleClaims = await AuthService.HasPermissionAsync(state.User, FSHAction.View, FSHResource.RoleClaims); + + Context = new( + entityName: L["Role"], + entityNamePlural: L["Roles"], + entityResource: FSHResource.Roles, + searchAction: FSHAction.View, + fields: new() + { + new(role => role.Id, L["Id"]), + new(role => role.Name, L["Name"]), + new(role => role.Description, L["Description"]) + }, + idFunc: role => role.Id, + loadDataFunc: async () => (await RolesClient.GetListAsync()).ToList(), + searchFunc: (searchString, role) => + string.IsNullOrWhiteSpace(searchString) + || role.Name?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true + || role.Description?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true, + createFunc: async role => await RolesClient.RegisterRoleAsync(role), + updateFunc: async (_, role) => await RolesClient.RegisterRoleAsync(role), + deleteFunc: async id => await RolesClient.DeleteAsync(id), + hasExtraActionsFunc: () => _canViewRoleClaims, + canUpdateEntityFunc: e => !FSHRoles.IsDefault(e.Name), + canDeleteEntityFunc: e => !FSHRoles.IsDefault(e.Name), + exportAction: string.Empty); + } + + private void ManagePermissions(string? roleId) + { + ArgumentNullException.ThrowIfNull(roleId, nameof(roleId)); + Navigation.NavigateTo($"/roles/{roleId}/permissions"); + } +} \ No newline at end of file diff --git a/src/Client/Pages/Identity/Users/UserProfile.razor b/src/Client/Pages/Identity/Users/UserProfile.razor new file mode 100644 index 0000000..5eeaddf --- /dev/null +++ b/src/Client/Pages/Identity/Users/UserProfile.razor @@ -0,0 +1,148 @@ +@page "/users/{Id}/profile" +@attribute [MustHavePermission(FSHAction.View, FSHResource.Users)] + +@inject IStringLocalizer _localizer + + +@if (!_loaded) +{ + +} +else +{ + + + @if (_canToggleUserStatus) + { + + + + + @_localizer["Administrator Settings."] + @_localizer["This is an Administrator Only View."] + + + + + + + + @_localizer["Save Changes"] + + + + + + } + + + + +
+ @if (!string.IsNullOrEmpty(_imageUrl)) + { + + } + else + { + @_firstLetterOfName + + } +
+ @_firstName @_lastName + @_email +
+ +
+ @if (!string.IsNullOrEmpty(_imageUrl)) + { + + @_localizer["View"] + + } +
+ +
+
+
+ + + + + @_localizer["Public Profile"] + + + + + + @_firstName + + + @_lastName + + + @_phoneNumber + + + + @_email + + + + + +
+} + +@code +{ +public class CustomStringToBoolConverter : BoolConverter + { + + public CustomStringToBoolConverter() + { + SetFunc = OnSet; + GetFunc = OnGet; + } + private string TrueString = "User Active"; + private string FalseString = "no, at all"; + private string NullString = "I don't know"; + + private string OnGet(bool? value) + { + try + { + return (value == true) ? TrueString : FalseString; + } + catch (Exception e) + { + UpdateGetError("Conversion error: " + e.Message); + return NullString; + } + } + + private bool? OnSet(string arg) + { + if (arg == null) + return null; + try + { + if (arg == TrueString) + return true; + if (arg == FalseString) + return false; + else + return null; + } + catch (FormatException e) + { + UpdateSetError("Conversion error: " + e.Message); + return null; + } + } + + } +} \ No newline at end of file diff --git a/src/Client/Pages/Identity/Users/UserProfile.razor.cs b/src/Client/Pages/Identity/Users/UserProfile.razor.cs new file mode 100644 index 0000000..8e3d0d8 --- /dev/null +++ b/src/Client/Pages/Identity/Users/UserProfile.razor.cs @@ -0,0 +1,74 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Common; +using RewardsPlus.BlazorWebAssembly.Client.Shared; +using RewardsPlus.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; + +namespace RewardsPlus.BlazorWebAssembly.Client.Pages.Identity.Users; + +public partial class UserProfile +{ + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + [Inject] + protected IUsersClient UsersClient { get; set; } = default!; + + [Parameter] + public string? Id { get; set; } + [Parameter] + public string? Title { get; set; } + [Parameter] + public string? Description { get; set; } + + private bool _active; + private bool _emailConfirmed; + private char _firstLetterOfName; + private string? _firstName; + private string? _lastName; + private string? _phoneNumber; + private string? _email; + private string? _imageUrl; + private bool _loaded; + private bool _canToggleUserStatus; + + private async Task ToggleUserStatus() + { + var request = new ToggleUserStatusRequest { ActivateUser = _active, UserId = Id }; + await ApiHelper.ExecuteCallGuardedAsync(() => UsersClient.ToggleStatusAsync(Id, request), Snackbar); + Navigation.NavigateTo("/users"); + } + + [Parameter] + public string? ImageUrl { get; set; } + + protected override async Task OnInitializedAsync() + { + if (await ApiHelper.ExecuteCallGuardedAsync( + () => UsersClient.GetByIdAsync(Id), Snackbar) + is UserDetailsDto user) + { + _firstName = user.FirstName; + _lastName = user.LastName; + _email = user.Email; + _phoneNumber = user.PhoneNumber; + _active = user.IsActive; + _emailConfirmed = user.EmailConfirmed; + _imageUrl = string.IsNullOrEmpty(user.ImageUrl) ? string.Empty : (Config[ConfigNames.ApiBaseUrl] + user.ImageUrl); + Title = $"{_firstName} {_lastName}'s {_localizer["Profile"]}"; + Description = _email; + if (_firstName?.Length > 0) + { + _firstLetterOfName = _firstName.ToUpper().FirstOrDefault(); + } + } + + var state = await AuthState; + _canToggleUserStatus = await AuthService.HasPermissionAsync(state.User, FSHAction.Update, FSHResource.Users); + _loaded = true; + } +} \ No newline at end of file diff --git a/src/Client/Pages/Identity/Users/UserRoles.razor b/src/Client/Pages/Identity/Users/UserRoles.razor new file mode 100644 index 0000000..bc82479 --- /dev/null +++ b/src/Client/Pages/Identity/Users/UserRoles.razor @@ -0,0 +1,67 @@ +@page "/users/{Id}/roles" +@attribute [MustHavePermission(FSHAction.View, FSHResource.UserRoles)] + +@inject IStringLocalizer L + + + +@if (!_loaded) +{ + +} +else +{ + + +
+ + @L["Back"] + + @if (_canEditUsers) + { + + @L["Update"] + + } +
+ + @if (_canSearchRoles) + { + + + } +
+ + + @L["Role Name"] + + + + @L["Description"] + + + + @L["Status"] + + + + + + + + + + + + + + + + + + +
+} \ No newline at end of file diff --git a/src/Client/Pages/Identity/Users/UserRoles.razor.cs b/src/Client/Pages/Identity/Users/UserRoles.razor.cs new file mode 100644 index 0000000..399b6e7 --- /dev/null +++ b/src/Client/Pages/Identity/Users/UserRoles.razor.cs @@ -0,0 +1,77 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; +using RewardsPlus.BlazorWebAssembly.Client.Shared; +using RewardsPlus.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; + +namespace RewardsPlus.BlazorWebAssembly.Client.Pages.Identity.Users; + +public partial class UserRoles +{ + [Parameter] + public string? Id { get; set; } + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + [Inject] + protected IUsersClient UsersClient { get; set; } = default!; + + private List _userRolesList = default!; + + private string _title = string.Empty; + private string _description = string.Empty; + + private string _searchString = string.Empty; + + private bool _canEditUsers; + private bool _canSearchRoles; + private bool _loaded; + + protected override async Task OnInitializedAsync() + { + var state = await AuthState; + _canEditUsers = await AuthService.HasPermissionAsync(state.User, FSHAction.Update, FSHResource.Users); + _canSearchRoles = await AuthService.HasPermissionAsync(state.User, FSHAction.View, FSHResource.UserRoles); + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => UsersClient.GetByIdAsync(Id), Snackbar) + is UserDetailsDto user) + { + _title = $"{user.FirstName} {user.LastName}"; + _description = string.Format(L["Manage {0} {1}'s Roles"], user.FirstName, user.LastName); + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => UsersClient.GetRolesAsync(user.Id.ToString()), Snackbar) + is ICollection response) + { + _userRolesList = response.ToList(); + } + } + + _loaded = true; + } + + private async Task SaveAsync() + { + var request = new UserRolesRequest() + { + UserRoles = _userRolesList + }; + + if (await ApiHelper.ExecuteCallGuardedAsync( + () => UsersClient.AssignRolesAsync(Id, request), + Snackbar, + successMessage: L["Updated User Roles."]) + is not null) + { + Navigation.NavigateTo("/users"); + } + } + + private bool Search(UserRoleDto userRole) => + string.IsNullOrWhiteSpace(_searchString) + || userRole.RoleName?.Contains(_searchString, StringComparison.OrdinalIgnoreCase) is true; +} \ No newline at end of file diff --git a/src/Client/Pages/Identity/Users/Users.razor b/src/Client/Pages/Identity/Users/Users.razor new file mode 100644 index 0000000..f2d93ec --- /dev/null +++ b/src/Client/Pages/Identity/Users/Users.razor @@ -0,0 +1,46 @@ +@page "/users" +@attribute [MustHavePermission(FSHAction.View, FSHResource.Users)] + +@inject IStringLocalizer L + + + + + + @L["View Profile"] + @if (_canViewRoles) + { + @L["Manage Roles"] + } + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Client/Pages/Identity/Users/Users.razor.cs b/src/Client/Pages/Identity/Users/Users.razor.cs new file mode 100644 index 0000000..609412a --- /dev/null +++ b/src/Client/Pages/Identity/Users/Users.razor.cs @@ -0,0 +1,95 @@ +using RewardsPlus.BlazorWebAssembly.Client.Components.EntityTable; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; +using RewardsPlus.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Pages.Identity.Users; + +public partial class Users +{ + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + + [Inject] + protected IUsersClient UsersClient { get; set; } = default!; + + protected EntityClientTableContext Context { get; set; } = default!; + + private bool _canExportUsers; + private bool _canViewRoles; + + // Fields for editform + protected string Password { get; set; } = string.Empty; + protected string ConfirmPassword { get; set; } = string.Empty; + + private bool _passwordVisibility; + private InputType _passwordInput = InputType.Password; + private string _passwordInputIcon = Icons.Material.Filled.VisibilityOff; + + protected override async Task OnInitializedAsync() + { + var user = (await AuthState).User; + _canExportUsers = await AuthService.HasPermissionAsync(user, FSHAction.Export, FSHResource.Users); + _canViewRoles = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.UserRoles); + + Context = new( + entityName: L["User"], + entityNamePlural: L["Users"], + entityResource: FSHResource.Users, + searchAction: FSHAction.View, + updateAction: string.Empty, + deleteAction: string.Empty, + fields: new() + { + new(user => user.FirstName, L["First Name"]), + new(user => user.LastName, L["Last Name"]), + new(user => user.UserName, L["UserName"]), + new(user => user.Email, L["Email"]), + new(user => user.PhoneNumber, L["PhoneNumber"]), + new(user => user.EmailConfirmed, L["Email Confirmation"], Type: typeof(bool)), + new(user => user.IsActive, L["Active"], Type: typeof(bool)) + }, + idFunc: user => user.Id, + loadDataFunc: async () => (await UsersClient.GetListAsync()).ToList(), + searchFunc: (searchString, user) => + string.IsNullOrWhiteSpace(searchString) + || user.FirstName?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true + || user.LastName?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true + || user.Email?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true + || user.PhoneNumber?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true + || user.UserName?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true, + createFunc: user => UsersClient.CreateAsync(user), + hasExtraActionsFunc: () => true, + exportAction: string.Empty); + } + + private void ViewProfile(in Guid userId) => + Navigation.NavigateTo($"/users/{userId}/profile"); + + private void ManageRoles(in Guid userId) => + Navigation.NavigateTo($"/users/{userId}/roles"); + + private void TogglePasswordVisibility() + { + if (_passwordVisibility) + { + _passwordVisibility = false; + _passwordInputIcon = Icons.Material.Filled.VisibilityOff; + _passwordInput = InputType.Password; + } + else + { + _passwordVisibility = true; + _passwordInputIcon = Icons.Material.Filled.Visibility; + _passwordInput = InputType.Text; + } + + Context.AddEditModal.ForceRender(); + } +} \ No newline at end of file diff --git a/src/Client/Pages/Index.razor b/src/Client/Pages/Index.razor new file mode 100644 index 0000000..42798ac --- /dev/null +++ b/src/Client/Pages/Index.razor @@ -0,0 +1,95 @@ +@page "/home" +@page "/" + +@inject IStringLocalizer L + + + + +
+ +
+
+ + @L["fullstackhero's"] + @L["Blazor WebAssembly Boilerplate"] + + + + + @L["Built with the goodness of"] MudBlazor @L["Component Library"]. + + + @L["Compatible with"] fullstackhero .NET WebAPI Boilerplate v1. + + + +
+ @L["Get Started"] + @L["Star on GitHub"] +
+
+ + @L["Version 1.0"] + + + + + @L["In case you are stuck anywhere or have any queries regarding this implementation, I have compiled a Quick Start Guide for you reference."] + @L["Read The Guide"] + + + + + + + + + @L["Here are few articles that should help you get started with Blazor."] + + + + + + + + + + + + @L["Application Claims of the currently logged in user."] + + @if (Claims is not null) + { + @foreach (var claim in Claims) + { + + + @claim.Type + + @claim.Value + + } + } + + + + + + @L["Liked this Boilerplate? Star us on Github!"] + +
+
+ +@code { + [CascadingParameter] + public Task AuthState { get; set; } = default!; + + public IEnumerable? Claims { get; set; } + + protected override async Task OnInitializedAsync() + { + var authState = await AuthState; + Claims = authState.User.Claims; + } +} \ No newline at end of file diff --git a/src/Client/Pages/Multitenancy/Tenants.razor b/src/Client/Pages/Multitenancy/Tenants.razor new file mode 100644 index 0000000..3f3da22 --- /dev/null +++ b/src/Client/Pages/Multitenancy/Tenants.razor @@ -0,0 +1,107 @@ +@page "/tenants" +@attribute [MustHavePermission(FSHAction.View, FSHResource.Tenants)] + +@inject IStringLocalizer L +@inject IAuthenticationService Authentication + + + + + + + + + + + + + + + + + + @if (Authentication.ProviderType == AuthProvider.AzureAd) + { + + + + } + + + @if(_canUpgrade) + { + @L["Upgrade Subscription"] + } + + @((context.ShowDetails == true) ? L["Hide"] : L["Show"]) @L["Tenant Details"] + + @if (_canModify) + { + @if (!context.IsActive) + { + @L["Activate Tenant"] + } + else + { + @L["Deactivate Tenant"] + } + } + + + + @if (context.ShowDetails) + { + + + + + + @L["Details for Tenant"] : + @context.Id + + + + + + + + @if(string.IsNullOrEmpty(context.ConnectionString?.Trim())) + { + @L["Shared Database"] + } + else + { + + + } + + @if (Authentication.ProviderType == AuthProvider.AzureAd) + { + + + + + } + +
@L["Connection String"] + + @context.ConnectionString?.Trim() + +
@L["Issuer"] + + + @context.Issuer?.Trim() + + +
+
+
+ +
+ } +
+ +
\ No newline at end of file diff --git a/src/Client/Pages/Multitenancy/Tenants.razor.cs b/src/Client/Pages/Multitenancy/Tenants.razor.cs new file mode 100644 index 0000000..7d23257 --- /dev/null +++ b/src/Client/Pages/Multitenancy/Tenants.razor.cs @@ -0,0 +1,121 @@ +using RewardsPlus.BlazorWebAssembly.Client.Components.EntityTable; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; +using RewardsPlus.BlazorWebAssembly.Client.Shared; +using RewardsPlus.WebApi.Shared.Authorization; +using Mapster; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Pages.Multitenancy; + +public partial class Tenants +{ + [Inject] + private ITenantsClient TenantsClient { get; set; } = default!; + private string? _searchString; + protected EntityClientTableContext Context { get; set; } = default!; + private List _tenants = new(); + public EntityTable EntityTable { get; set; } = default!; + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + + private bool _canUpgrade; + private bool _canModify; + + protected override async Task OnInitializedAsync() + { + Context = new( + entityName: L["Tenant"], + entityNamePlural: L["Tenants"], + entityResource: FSHResource.Tenants, + searchAction: FSHAction.View, + deleteAction: string.Empty, + updateAction: string.Empty, + fields: new() + { + new(tenant => tenant.Id, L["Id"]), + new(tenant => tenant.Name, L["Name"]), + new(tenant => tenant.AdminEmail, L["Admin Email"]), + new(tenant => tenant.ValidUpto.ToString("MMM dd, yyyy"), L["Valid Upto"]), + new(tenant => tenant.IsActive, L["Active"], Type: typeof(bool)) + }, + loadDataFunc: async () => _tenants = (await TenantsClient.GetListAsync()).Adapt>(), + searchFunc: (searchString, tenantDto) => + string.IsNullOrWhiteSpace(searchString) + || tenantDto.Name.Contains(searchString, StringComparison.OrdinalIgnoreCase), + createFunc: tenant => TenantsClient.CreateAsync(tenant.Adapt()), + hasExtraActionsFunc: () => true, + exportAction: string.Empty); + + var state = await AuthState; + _canUpgrade = await AuthService.HasPermissionAsync(state.User, FSHAction.UpgradeSubscription, FSHResource.Tenants); + _canModify = await AuthService.HasPermissionAsync(state.User, FSHAction.Update, FSHResource.Tenants); + } + + private void ViewTenantDetails(string id) + { + var tenant = _tenants.First(f => f.Id == id); + tenant.ShowDetails = !tenant.ShowDetails; + foreach (var otherTenants in _tenants.Except(new[] { tenant })) + { + otherTenants.ShowDetails = false; + } + } + + private async Task ViewUpgradeSubscriptionModalAsync(string id) + { + var tenant = _tenants.First(f => f.Id == id); + var parameters = new DialogParameters + { + { + nameof(UpgradeSubscriptionModal.Request), + new UpgradeSubscriptionRequest + { + TenantId = tenant.Id, + ExtendedExpiryDate = tenant.ValidUpto + } + } + }; + var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true, DisableBackdropClick = true }; + var dialog = DialogService.Show(L["Upgrade Subscription"], parameters, options); + var result = await dialog.Result; + if (!result.Cancelled) + { + await EntityTable.ReloadDataAsync(); + } + } + + private async Task DeactivateTenantAsync(string id) + { + if (await ApiHelper.ExecuteCallGuardedAsync( + () => TenantsClient.DeactivateAsync(id), + Snackbar, + null, + L["Tenant Deactivated."]) is not null) + { + await EntityTable.ReloadDataAsync(); + } + } + + private async Task ActivateTenantAsync(string id) + { + if (await ApiHelper.ExecuteCallGuardedAsync( + () => TenantsClient.ActivateAsync(id), + Snackbar, + null, + L["Tenant Activated."]) is not null) + { + await EntityTable.ReloadDataAsync(); + } + } + + public class TenantDetail : TenantDto + { + public bool ShowDetails { get; set; } + } +} \ No newline at end of file diff --git a/src/Client/Pages/Multitenancy/UpgradeSubscriptionModal.razor b/src/Client/Pages/Multitenancy/UpgradeSubscriptionModal.razor new file mode 100644 index 0000000..48921de --- /dev/null +++ b/src/Client/Pages/Multitenancy/UpgradeSubscriptionModal.razor @@ -0,0 +1,58 @@ +@inject IStringLocalizer L +@inject ITenantsClient TenantsClient + + + + + + + @L["Upgrade Subscription"] + + + + + + + + + + + + + + + + + @L["Cancel"] + @L["Upgrade"] + + + + +@code +{ + [Parameter] public UpgradeSubscriptionRequest Request { get; set; } = new(); + [CascadingParameter] private MudDialogInstance MudDialog { get; set; } = default!; + DateTime? date = DateTime.Today; + + protected override void OnInitialized() => + date = Request.ExtendedExpiryDate; + + private async Task UpgradeSubscriptionAsync() + { + Request.ExtendedExpiryDate = date.HasValue ? date.Value : Request.ExtendedExpiryDate; + if (await ApiHelper.ExecuteCallGuardedAsync( + () => TenantsClient.UpgradeSubscriptionAsync(Request.TenantId, Request), + Snackbar, + null, + L["Upgraded Subscription."]) is not null) + { + MudDialog.Close(); + } + } + + public void Cancel() + { + MudDialog.Cancel(); + } +} \ No newline at end of file diff --git a/src/Client/Pages/Personal/AuditLogs.razor b/src/Client/Pages/Personal/AuditLogs.razor new file mode 100644 index 0000000..d10503a --- /dev/null +++ b/src/Client/Pages/Personal/AuditLogs.razor @@ -0,0 +1,131 @@ +@page "/audit-logs" + +@inject IStringLocalizer L + + + + + + + @L["Search in Old Values"] + @L["Search in New Values"] + + + @L["Clear"] + @L["Cancel"] + @L["Ok"] + + + + + + @((context.ShowDetails == true) ? L["Hide"] : L["Show"]) @L["Trail Details"] + + + + @if (context.ShowDetails) + { + + + + + + @L["Details for Trail ID"] : @context.Id + + + + + + @if (!string.IsNullOrEmpty(context.AffectedColumns)) + { + + + + + } + + + + + @if (!string.IsNullOrEmpty(context.OldValues)) + { + + + + + } + @if (!string.IsNullOrEmpty(context.NewValues)) + { + + + + + } + +
@L["Columns Affected"] + + @foreach (var column in context.AffectedColumns.Trim('[').Trim(']').Split(',')) + { + @column.Replace('"', ' ').Trim() + } + +
@L["Primary Key"] + + @context.PrimaryKey?.Trim('{').Trim('}').Replace('"', ' ').Trim() + +
@L["Old Values"] + + + @foreach (var value in context.OldValues.Trim('{').Trim('}').Split(',')) + { + @if (_searchInOldValues) + { + + + + } + else + { + @value.Replace('"', ' ').Trim() + } + } + +
@L["New Values"] + + + @foreach (var value in context.NewValues.Trim('{').Trim('}').Split(',')) + { + @if (_searchInNewValues) + { + + + + } + else + { + @value.Replace('"', ' ').Trim() + } + } + +
+
+
+ +
+ } +
+ +
+ +@code { + private RenderFragment DateFieldTemplate => trail => __builder => + { + + @L["Local"] : @trail.LocalTime.ToString("G") + + + @L["UTC"] : @trail.DateTime.ToString("G") + + }; +} \ No newline at end of file diff --git a/src/Client/Pages/Personal/AuditLogs.razor.cs b/src/Client/Pages/Personal/AuditLogs.razor.cs new file mode 100644 index 0000000..cd71c2c --- /dev/null +++ b/src/Client/Pages/Personal/AuditLogs.razor.cs @@ -0,0 +1,71 @@ +using RewardsPlus.BlazorWebAssembly.Client.Components.EntityTable; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using Mapster; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Pages.Personal; + +public partial class AuditLogs +{ + [Inject] + private IPersonalClient PersonalClient { get; set; } = default!; + + protected EntityClientTableContext Context { get; set; } = default!; + + private string? _searchString; + private MudDateRangePicker _dateRangePicker = default!; + private DateRange? _dateRange; + private bool _searchInOldValues; + private bool _searchInNewValues; + private List _trails = new(); + + // Configure Automapper + static AuditLogs() => + TypeAdapterConfig.NewConfig().Map( + dest => dest.LocalTime, + src => DateTime.SpecifyKind(src.DateTime, DateTimeKind.Utc).ToLocalTime()); + + protected override void OnInitialized() + { + Context = new( + entityNamePlural: L["Trails"], + searchAction: true.ToString(), + fields: new() + { + new(audit => audit.Id, L["Id"]), + new(audit => audit.TableName, L["Table Name"]), + new(audit => audit.DateTime, L["Date"], Template: DateFieldTemplate), + new(audit => audit.Type, L["Type"]) + }, + loadDataFunc: async () => _trails = (await PersonalClient.GetLogsAsync()).Adapt>(), + searchFunc: (searchString, trail) => + (string.IsNullOrWhiteSpace(searchString) // check Search String + || trail.TableName?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true + || (_searchInOldValues && + trail.OldValues?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true) + || (_searchInNewValues && + trail.NewValues?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true)) + && ((_dateRange?.Start is null && _dateRange?.End is null) // check Date Range + || (_dateRange?.Start is not null && _dateRange.End is null && trail.DateTime >= _dateRange.Start) + || (_dateRange?.Start is null && _dateRange?.End is not null && trail.DateTime <= _dateRange.End + new TimeSpan(0, 11, 59, 59, 999)) + || (trail.DateTime >= _dateRange!.Start && trail.DateTime <= _dateRange.End + new TimeSpan(0, 11, 59, 59, 999))), + hasExtraActionsFunc: () => true); + } + + private void ShowBtnPress(Guid id) + { + var trail = _trails.First(f => f.Id == id); + trail.ShowDetails = !trail.ShowDetails; + foreach (var otherTrail in _trails.Except(new[] { trail })) + { + otherTrail.ShowDetails = false; + } + } + + public class RelatedAuditTrail : AuditDto + { + public bool ShowDetails { get; set; } + public DateTime LocalTime { get; set; } + } +} \ No newline at end of file diff --git a/src/Client/Pages/Personal/Dashboard.razor b/src/Client/Pages/Personal/Dashboard.razor new file mode 100644 index 0000000..5e2fd94 --- /dev/null +++ b/src/Client/Pages/Personal/Dashboard.razor @@ -0,0 +1,65 @@ +@page "/dashboard" +@attribute [MustHavePermission(FSHAction.View, FSHResource.Dashboard)] + +@inject IStringLocalizer L + + + +@if (!_loaded) +{ + +} +else +{ + + + + +
+ @L["Products"] + @ProductCount +
+
+
+ + + +
+ @L["Brands"] + @BrandCount +
+
+
+ + + +
+ @L["Registered Users"] + + @UserCount +
+
+
+ + + +
+ @L["Registered Roles"] + + @RoleCount +
+
+
+ + + + + +
+} \ No newline at end of file diff --git a/src/Client/Pages/Personal/Dashboard.razor.cs b/src/Client/Pages/Personal/Dashboard.razor.cs new file mode 100644 index 0000000..a67e66c --- /dev/null +++ b/src/Client/Pages/Personal/Dashboard.razor.cs @@ -0,0 +1,62 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Notifications; +using RewardsPlus.BlazorWebAssembly.Client.Shared; +using RewardsPlus.WebApi.Shared.Notifications; +using MediatR.Courier; +using Microsoft.AspNetCore.Components; + +namespace RewardsPlus.BlazorWebAssembly.Client.Pages.Personal; + +public partial class Dashboard +{ + [Parameter] + public int ProductCount { get; set; } + [Parameter] + public int BrandCount { get; set; } + [Parameter] + public int UserCount { get; set; } + [Parameter] + public int RoleCount { get; set; } + + [Inject] + private IDashboardClient DashboardClient { get; set; } = default!; + [Inject] + private ICourier Courier { get; set; } = default!; + + private readonly string[] _dataEnterBarChartXAxisLabels = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + private readonly List _dataEnterBarChartSeries = new(); + private bool _loaded; + + protected override async Task OnInitializedAsync() + { + Courier.SubscribeWeak>(async _ => + { + await LoadDataAsync(); + StateHasChanged(); + }); + + await LoadDataAsync(); + + _loaded = true; + } + + private async Task LoadDataAsync() + { + if (await ApiHelper.ExecuteCallGuardedAsync( + () => DashboardClient.GetAsync(), + Snackbar) + is StatsDto statsDto) + { + ProductCount = statsDto.ProductCount; + BrandCount = statsDto.BrandCount; + UserCount = statsDto.UserCount; + RoleCount = statsDto.RoleCount; + foreach (var item in statsDto.DataEnterBarChart) + { + _dataEnterBarChartSeries + .RemoveAll(x => x.Name.Equals(item.Name, StringComparison.OrdinalIgnoreCase)); + _dataEnterBarChartSeries.Add(new MudBlazor.ChartSeries { Name = item.Name, Data = item.Data?.ToArray() }); + } + } + } +} \ No newline at end of file diff --git a/src/Client/Program.cs b/src/Client/Program.cs new file mode 100644 index 0000000..470dacd --- /dev/null +++ b/src/Client/Program.cs @@ -0,0 +1,30 @@ +using System.Globalization; +using RewardsPlus.BlazorWebAssembly.Client; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Common; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences; +using Microsoft.AspNetCore.Components.Web; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; + +var builder = WebAssemblyHostBuilder.CreateDefault(args); + +builder.RootComponents.Add("#app"); +builder.RootComponents.Add("head::after"); + +builder.Services.AddClientServices(builder.Configuration); + +var host = builder.Build(); + +var storageService = host.Services.GetRequiredService(); +if (storageService != null) +{ + CultureInfo culture; + if (await storageService.GetPreference() is ClientPreference preference) + culture = new CultureInfo(preference.LanguageCode); + else + culture = new CultureInfo(LocalizationConstants.SupportedLanguages.FirstOrDefault()?.Code ?? "en-US"); + CultureInfo.DefaultThreadCurrentCulture = culture; + CultureInfo.DefaultThreadCurrentUICulture = culture; +} + +await host.RunAsync(); \ No newline at end of file diff --git a/src/Client/Properties/launchSettings.json b/src/Client/Properties/launchSettings.json new file mode 100644 index 0000000..ec01420 --- /dev/null +++ b/src/Client/Properties/launchSettings.json @@ -0,0 +1,30 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:21716", + "sslPort": 44331 + } + }, + "profiles": { + "FSH.BlazorWebAssembly": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:5002;http://localhost:5003", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/src/Client/Resources/Components/Common/TablePager.ar.resx b/src/Client/Resources/Components/Common/TablePager.ar.resx new file mode 100644 index 0000000..61567a8 --- /dev/null +++ b/src/Client/Resources/Components/Common/TablePager.ar.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} من {all_items} + + + صف لكل صفحة + + \ No newline at end of file diff --git a/src/Client/Resources/Components/Common/TablePager.de.resx b/src/Client/Resources/Components/Common/TablePager.de.resx new file mode 100644 index 0000000..bce5fdf --- /dev/null +++ b/src/Client/Resources/Components/Common/TablePager.de.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} von {all_items} + + + Zeilen je Seite: + + \ No newline at end of file diff --git a/src/Client/Resources/Components/Common/TablePager.en.resx b/src/Client/Resources/Components/Common/TablePager.en.resx new file mode 100644 index 0000000..eef54b7 --- /dev/null +++ b/src/Client/Resources/Components/Common/TablePager.en.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} of {all_items} + + + Rows per page: + + \ No newline at end of file diff --git a/src/Client/Resources/Components/Common/TablePager.es.resx b/src/Client/Resources/Components/Common/TablePager.es.resx new file mode 100644 index 0000000..9971ad9 --- /dev/null +++ b/src/Client/Resources/Components/Common/TablePager.es.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} de {all_items} + + + Registros por página: + + \ No newline at end of file diff --git a/src/Client/Resources/Components/Common/TablePager.fr.resx b/src/Client/Resources/Components/Common/TablePager.fr.resx new file mode 100644 index 0000000..4ed5249 --- /dev/null +++ b/src/Client/Resources/Components/Common/TablePager.fr.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} sur {all_items} + + + Lignes par page : + + \ No newline at end of file diff --git a/src/Client/Resources/Components/Common/TablePager.id.resx b/src/Client/Resources/Components/Common/TablePager.id.resx new file mode 100644 index 0000000..b45e839 --- /dev/null +++ b/src/Client/Resources/Components/Common/TablePager.id.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} dari {all_items} + + + Baris per halaman: + + \ No newline at end of file diff --git a/src/Client/Resources/Components/Common/TablePager.it.resx b/src/Client/Resources/Components/Common/TablePager.it.resx new file mode 100644 index 0000000..338aa89 --- /dev/null +++ b/src/Client/Resources/Components/Common/TablePager.it.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} di {all_items} + + + Righe per pagina: + + \ No newline at end of file diff --git a/src/Client/Resources/Components/Common/TablePager.km.resx b/src/Client/Resources/Components/Common/TablePager.km.resx new file mode 100644 index 0000000..ba27d45 --- /dev/null +++ b/src/Client/Resources/Components/Common/TablePager.km.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} នៃ {all_items} + + + ជួរដេកក្នុងមួយទំព័រ៖ + + \ No newline at end of file diff --git a/src/Client/Resources/Components/Common/TablePager.nl.resx b/src/Client/Resources/Components/Common/TablePager.nl.resx new file mode 100644 index 0000000..bac82ce --- /dev/null +++ b/src/Client/Resources/Components/Common/TablePager.nl.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} of {all_items} + + + Rijen per pagina: + + \ No newline at end of file diff --git a/src/Client/Resources/Components/Common/TablePager.ru.resx b/src/Client/Resources/Components/Common/TablePager.ru.resx new file mode 100644 index 0000000..7a5d02c --- /dev/null +++ b/src/Client/Resources/Components/Common/TablePager.ru.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} из {all_items} + + + Строк на странице: + + \ No newline at end of file diff --git a/src/Client/Resources/Components/Common/TablePager.sv.resx b/src/Client/Resources/Components/Common/TablePager.sv.resx new file mode 100644 index 0000000..d28249a --- /dev/null +++ b/src/Client/Resources/Components/Common/TablePager.sv.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + {first_item}-{last_item} of {all_items} + + + Rader per sida: + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Register.ar.resx b/src/Client/Resources/Pages/Account/Register.ar.resx new file mode 100644 index 0000000..bc64cb0 --- /dev/null +++ b/src/Client/Resources/Pages/Account/Register.ar.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + هل لديك حساب؟ + + + بريد الالكتروني + + + أوافق على الشروط والخصوصية + + + كلمه السر + + + رقم الهاتف + + + اشتراك + + + تسجيل الدخول + + + اشتراك + + + اسم المستخدم + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Register.de.resx b/src/Client/Resources/Pages/Account/Register.de.resx new file mode 100644 index 0000000..59166f3 --- /dev/null +++ b/src/Client/Resources/Pages/Account/Register.de.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Bereits registriert? + + + E-Mail + + + Ich stimme den Nutzungs- und Datenschutzbedingungen zu. + + + Passwort + + + Telefon + + + Registrieren + + + Anmelden + + + Registrieren + + + Benutzername + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Register.en.resx b/src/Client/Resources/Pages/Account/Register.en.resx new file mode 100644 index 0000000..d8c326d --- /dev/null +++ b/src/Client/Resources/Pages/Account/Register.en.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Already have an account? + + + E-mail + + + I agree to the terms and privacy + + + Password + + + Phone Number + + + Register + + + Sign In + + + Sign Up + + + Username + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Register.es.resx b/src/Client/Resources/Pages/Account/Register.es.resx new file mode 100644 index 0000000..8ff1bdf --- /dev/null +++ b/src/Client/Resources/Pages/Account/Register.es.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ¿Ya tiene una cuenta? + + + Correo + + + Acepto los términos y condiciones + + + Contraseña + + + Teléfono + + + Registrarse + + + Ingresar + + + Registrarse + + + Usuario + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Register.fr.resx b/src/Client/Resources/Pages/Account/Register.fr.resx new file mode 100644 index 0000000..e912e94 --- /dev/null +++ b/src/Client/Resources/Pages/Account/Register.fr.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Vous possédez déjà un compte ? + + + Courriel + + + J'accepte les conditions d'utilisation et la politique de confidentialité + + + Mot de passe + + + Numéro de téléphone + + + S'inscrire + + + Se connecter + + + S'inscrire + + + Nom d'utilisateur + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Register.id.resx b/src/Client/Resources/Pages/Account/Register.id.resx new file mode 100644 index 0000000..a9f2a0d --- /dev/null +++ b/src/Client/Resources/Pages/Account/Register.id.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Sudah punya akun? + + + E-mail + + + Saya setuju akan ketentuan dan kebijakan privasi + + + Sandi + + + Nomor Telepon + + + Daftar + + + Masuk + + + Daftar + + + Nama pengguna + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Register.it.resx b/src/Client/Resources/Pages/Account/Register.it.resx new file mode 100644 index 0000000..9cb4fdc --- /dev/null +++ b/src/Client/Resources/Pages/Account/Register.it.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Sei già registrato? + + + E-Mail + + + Accetto i termini e la privacy + + + Telefono + + + Registrati + + + Accedi + + + Iscriviti + + + Utente + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Register.km.resx b/src/Client/Resources/Pages/Account/Register.km.resx new file mode 100644 index 0000000..f6f8870 --- /dev/null +++ b/src/Client/Resources/Pages/Account/Register.km.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + មានគណនីរួចហើយ? + + + អ៊ីមែល + + + ខ្ញុំយល់ស្របនឹងលក្ខខណ្ឌនិងភាពឯកជន + + + លេខសម្ងាត់ + + + លេខទូរស័ព្ទ + + + ចុះឈ្មោះ + + + ចូល + + + ចុះ​ឈ្មោះ + + + ឈ្មោះ​អ្នកប្រើប្រាស់ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Register.nl.resx b/src/Client/Resources/Pages/Account/Register.nl.resx new file mode 100644 index 0000000..0be70ca --- /dev/null +++ b/src/Client/Resources/Pages/Account/Register.nl.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Heb je al een account? + + + E-mail + + + Ik ga akkoord met de voorwaarden en privacy + + + Wachtwoord + + + Telefoonnummer + + + Registreren + + + Aanmelden + + + Inschrijven + + + Gebruikersnaam + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Register.ru.resx b/src/Client/Resources/Pages/Account/Register.ru.resx new file mode 100644 index 0000000..1ac7f04 --- /dev/null +++ b/src/Client/Resources/Pages/Account/Register.ru.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Уже имеете аккаунт? + + + E-mail + + + Я согласен с условиями и конфиденциальностью + + + Пароль + + + Номер телефона + + + Зарегистрировать + + + Авторизация + + + Регистрация + + + Username + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Register.sv.resx b/src/Client/Resources/Pages/Account/Register.sv.resx new file mode 100644 index 0000000..a8984ec --- /dev/null +++ b/src/Client/Resources/Pages/Account/Register.sv.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Har du redan ett konto? + + + Epost + + + Jag godkänner villkoren och integriteten + + + Lösenord + + + Telefonnummer + + + Registrera + + + Logga In + + + Bli Medlem + + + Användarnamn + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Reset.ar.resx b/src/Client/Resources/Pages/Account/Reset.ar.resx new file mode 100644 index 0000000..dfc9fd2 --- /dev/null +++ b/src/Client/Resources/Pages/Account/Reset.ar.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أوافق على الشروط والخصوصية + + + كلمة مرور جديدة + + + ضع كلمة مرور جديدة + + + لم يتم العثور على الرمز! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Reset.de.resx b/src/Client/Resources/Pages/Account/Reset.de.resx new file mode 100644 index 0000000..530dfed --- /dev/null +++ b/src/Client/Resources/Pages/Account/Reset.de.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ich stimme den Nutzungs- und Datenschutzbestimmungen zu. + + + Neues Passwort + + + Neues Passwort festlegen + + + Token nicht gefunden! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Reset.en.resx b/src/Client/Resources/Pages/Account/Reset.en.resx new file mode 100644 index 0000000..51f60ad --- /dev/null +++ b/src/Client/Resources/Pages/Account/Reset.en.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + I agree to the terms and privacy + + + New Password + + + Set new password + + + Token Not Found! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Reset.es.resx b/src/Client/Resources/Pages/Account/Reset.es.resx new file mode 100644 index 0000000..f6f44bc --- /dev/null +++ b/src/Client/Resources/Pages/Account/Reset.es.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acepto los términos y condiciones + + + Nueva contraseña + + + Establecer contraseña + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Reset.fr.resx b/src/Client/Resources/Pages/Account/Reset.fr.resx new file mode 100644 index 0000000..8019f31 --- /dev/null +++ b/src/Client/Resources/Pages/Account/Reset.fr.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + J'accepte les conditions d'utilisation et la politique de confidentialité + + + Nouveau mot de passe + + + Définir le nouveau mot de passe + + + Jeton introuvable ! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Reset.id.resx b/src/Client/Resources/Pages/Account/Reset.id.resx new file mode 100644 index 0000000..d169911 --- /dev/null +++ b/src/Client/Resources/Pages/Account/Reset.id.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Saya setuju akan ketentuan dan kebijakan privasi + + + Sandi baru + + + Atur sandi baru + + + Token Tidak Ditemukan! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Reset.it.resx b/src/Client/Resources/Pages/Account/Reset.it.resx new file mode 100644 index 0000000..0d29f14 --- /dev/null +++ b/src/Client/Resources/Pages/Account/Reset.it.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Accetto i termini e la privacy + + + Nuova Password + + + Token non trovato! + + + Imposta nuova password + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Reset.km.resx b/src/Client/Resources/Pages/Account/Reset.km.resx new file mode 100644 index 0000000..e302b84 --- /dev/null +++ b/src/Client/Resources/Pages/Account/Reset.km.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ខ្ញុំយល់ស្របនឹងលក្ខខណ្ឌនិងភាពឯកជន + + + ពាក្យសម្ងាត់​ថ្មី + + + កំណត់ពាក្យសម្ងាត់ថ្មី + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Reset.nl.resx b/src/Client/Resources/Pages/Account/Reset.nl.resx new file mode 100644 index 0000000..30f308e --- /dev/null +++ b/src/Client/Resources/Pages/Account/Reset.nl.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ik ga akkoord met de voorwaarden en privacy + + + Nieuw wachtwoord + + + Nieuw wachtwoord instellen + + + Token niet gevonden! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Reset.ru.resx b/src/Client/Resources/Pages/Account/Reset.ru.resx new file mode 100644 index 0000000..acf21ac --- /dev/null +++ b/src/Client/Resources/Pages/Account/Reset.ru.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Я согласен с условиями и конфиденциальностью + + + Новый пароль + + + Установить новый пароль + + + Токен не найден! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Account/Reset.sv.resx b/src/Client/Resources/Pages/Account/Reset.sv.resx new file mode 100644 index 0000000..f1f44a3 --- /dev/null +++ b/src/Client/Resources/Pages/Account/Reset.sv.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Jag godkänner villkoren och integriteten + + + Nytt Lösenord + + + Det nya lösenordet + + + Token hittades inte! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Authentication.ar.resx b/src/Client/Resources/Pages/Authentication/Authentication.ar.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Authentication.ar.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Authentication.de.resx b/src/Client/Resources/Pages/Authentication/Authentication.de.resx new file mode 100644 index 0000000..94f8d99 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Authentication.de.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Du wurdest erfolgreich ausgeloggt. + + + Klicke hier, um dich wieder einzuloggen. + + + Du wirst eingeloggt... + + + Überprüfe Berechtigungen... + + + Entschuldigung, dein Login ist fehlgeschlagen. Versuche es noch einmal oder kontaktiere den Support. + + + Du wirst ausgeloggt... + + + Entschuldigung, dein Logout ist fehlgeschlagen. Versuche es noch einmal oder kontaktiere den Support. + + + Profil wird abgerufen... + + + Konto wird registriert... + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Authentication.en.resx b/src/Client/Resources/Pages/Authentication/Authentication.en.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Authentication.en.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Authentication.es.resx b/src/Client/Resources/Pages/Authentication/Authentication.es.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Authentication.es.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Authentication.fr.resx b/src/Client/Resources/Pages/Authentication/Authentication.fr.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Authentication.fr.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Authentication.id.resx b/src/Client/Resources/Pages/Authentication/Authentication.id.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Authentication.id.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Authentication.it.resx b/src/Client/Resources/Pages/Authentication/Authentication.it.resx new file mode 100644 index 0000000..c015459 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Authentication.it.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Sei stato disconnesso con successo. + + + Clicca qui per accedere indietro + + + Registrarti in ... + + + Controllo Autorizzazioni ... + + + Siamo spiacenti, il tuo login è fallito. Si prega di riprovare o contattare il supporto. + + + Disattivandoti ... + + + Siamo spiacenti, operazione di disconnessione fallito. Si prega di riprovare o contattare il supporto. + + + Recupero del profilo ... + + + Registrazione dell'account ... + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Authentication.km.resx b/src/Client/Resources/Pages/Authentication/Authentication.km.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Authentication.km.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Authentication.nl.resx b/src/Client/Resources/Pages/Authentication/Authentication.nl.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Authentication.nl.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Authentication.ru.resx b/src/Client/Resources/Pages/Authentication/Authentication.ru.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Authentication.ru.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Authentication.sv.resx b/src/Client/Resources/Pages/Authentication/Authentication.sv.resx new file mode 100644 index 0000000..c331d00 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Authentication.sv.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + You were successfully logged out. + + + Click here to log back in + + + Logging you in... + + + Checking permissions... + + + Sorry, your login failed. Please try again or contact support. + + + Logging you out... + + + Sorry, log out operation failed. Please try again or contact support. + + + Retrieving profile... + + + Registering account... + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/ForgotPassword.ar.resx b/src/Client/Resources/Pages/Authentication/ForgotPassword.ar.resx new file mode 100644 index 0000000..14e0972 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/ForgotPassword.ar.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + تم! + + + البريد الإلكتروني + + + أدخل عنوان البريد الإلكتروني المرتبط بحسابك وستتلقى رسالة بريد إلكتروني تحتوي على رابط لإعادة تعيين كلمة المرور الخاصة بك + + + هل نسيت كلمة السر? + + + إعادة تعيين كلمة المرور + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/ForgotPassword.de.resx b/src/Client/Resources/Pages/Authentication/ForgotPassword.de.resx new file mode 100644 index 0000000..f949b86 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/ForgotPassword.de.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Fertig! + + + E-Mail + + + E-Mail-Adresse eingeben, mit welcher das Konto verknüpft ist, um eine E-Mail zum zurücksetzen des Passworts zu erhalten. + + + Passwort vergessen? + + + Passwort zurücksetzen + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/ForgotPassword.en.resx b/src/Client/Resources/Pages/Authentication/ForgotPassword.en.resx new file mode 100644 index 0000000..5e4f57a --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/ForgotPassword.en.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Done! + + + E-Mail + + + Enter the email address linked to your account and you will recieve an email containing a link to reset your password + + + Forgot password? + + + Reset Password + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/ForgotPassword.es.resx b/src/Client/Resources/Pages/Authentication/ForgotPassword.es.resx new file mode 100644 index 0000000..31824cf --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/ForgotPassword.es.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Correo + + + Ingresa la dirección de correo vinculada a su cuenta y recibirá un correo con un enlace para blanquear la contraseña + + + ¿Olvidó su contraseña? + + + Blanquear contraseña + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/ForgotPassword.fr.resx b/src/Client/Resources/Pages/Authentication/ForgotPassword.fr.resx new file mode 100644 index 0000000..d887377 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/ForgotPassword.fr.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Terminé ! + + + Courriel + + + Sasissez le courriel lié à votre compte et vous y recevrez un message contenant un lien pour réinitialiser votre mot de passe + + + Mot de passe oublié ? + + + Réinitialiser le mot de passe + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/ForgotPassword.id.resx b/src/Client/Resources/Pages/Authentication/ForgotPassword.id.resx new file mode 100644 index 0000000..52c8afd --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/ForgotPassword.id.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Selesai! + + + E-Mail + + + Masukkan alamat email yang terhubung ke akun anda dan anda akan menerima email berisi link untuk mereset password anda + + + Lupa password? + + + Reset Password + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/ForgotPassword.it.resx b/src/Client/Resources/Pages/Authentication/ForgotPassword.it.resx new file mode 100644 index 0000000..b300815 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/ForgotPassword.it.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Password dimenticata? + + + E-Mail + + + Ripristina Password + + + Fatto! + + + Inserisci l'indirizzo E-Mail collegato al tuo utente e riceverai un link per il ripristino della password. + + + Possiamo aiutarti ripristinando la password. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/ForgotPassword.km.resx b/src/Client/Resources/Pages/Authentication/ForgotPassword.km.resx new file mode 100644 index 0000000..b574e84 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/ForgotPassword.km.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + អ៊ីម៉ែល + + + បញ្ចូលអាសយដ្ឋានអ៊ីមែលដែលភ្ជាប់ទៅគណនីរបស់អ្នកហើយអ្នកនឹងទទួលបានអ៊ីមែលដែលមានតំណភ្ជាប់ដើម្បីកំណត់លេខសម្ងាត់របស់អ្នកឡើងវិញ + + + ភ្លេច​លេខសំងាត់​? + + + កំណត់ពាក្យសម្ងាត់ឡើងវិញ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/ForgotPassword.nl.resx b/src/Client/Resources/Pages/Authentication/ForgotPassword.nl.resx new file mode 100644 index 0000000..d725b6c --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/ForgotPassword.nl.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + E-mail + + + Voer het e-mailadres in dat aan uw account is gekoppeld en u ontvangt een e-mail met een link om uw wachtwoord opnieuw in te stellen + + + Wachtwoord vergeten? + + + Wachtwoord opnieuw instellen + + + Klaar! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/ForgotPassword.ru.resx b/src/Client/Resources/Pages/Authentication/ForgotPassword.ru.resx new file mode 100644 index 0000000..9ff2cdc --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/ForgotPassword.ru.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Готово! + + + E-Mail + + + Введите email-адрес, прикреплённый к вашему аккаунту, и вы получите письмо, соржащее ссылку для сброса вашего пароля + + + Забыли пароль? + + + Сбросить пароль + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/ForgotPassword.sv.resx b/src/Client/Resources/Pages/Authentication/ForgotPassword.sv.resx new file mode 100644 index 0000000..7553815 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/ForgotPassword.sv.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Klart! + + + Epost + + + Fyll i din Epost-adress kopplat till ditt konto och du får ett mail med en länk för att nollställa ditt lösenord. + + + Glömt Lösenord? + + + Nollställ Lösenord + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Login.ar.resx b/src/Client/Resources/Pages/Authentication/Login.ar.resx new file mode 100644 index 0000000..a30f0a0 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Login.ar.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + تسجيل الدخول مع أوراق الاعتماد الخاصة بك. + + + ليس لديك حساب؟ + + + بريد الالكتروني + + + البريد الالكتروني مطلوب! + + + قم بتعبئة بيانات اعتماد المسؤول + + + املأ بيانات اعتماد المستخدم الأساسية + + + هل نسيت كلمة السر؟ + + + كلمه السر + + + كلمة المرور مطلوبة! + + + سجل هنا + + + تذكرنى؟ + + + تسجيل الدخول + + + عنوان + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Login.de.resx b/src/Client/Resources/Pages/Authentication/Login.de.resx new file mode 100644 index 0000000..4812f2f --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Login.de.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Mit Zugangsdaten anmelden + + + Du hast noch keine Konto? + + + E-Mail + + + E-Mail wird benötigt. + + + Gib deine Zugangsdaten + + + Mit Zugangsdaten des Administrators ausfüllen + + + Mit Basis-Zugangsdaten ausfüllen + + + Passwort vergessen? + + + Passwort + + + Passwort wird benötigt! + + + Registriere dich hier + + + Zugangsdaten speichern? + + + Anmelden + + + Anmelden + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Login.en.resx b/src/Client/Resources/Pages/Authentication/Login.en.resx new file mode 100644 index 0000000..e13f761 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Login.en.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Login with your Credentials. + + + Don't have an account? + + + E-mail + + + Email is required! + + + Enter your credentials to get started. + + + Fill Administrator Credentials + + + Fill Basic User Credentials + + + Forgot password? + + + Password + + + Password is required! + + + Register here + + + Remember me? + + + Sign In + + + Sign In + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Login.es.resx b/src/Client/Resources/Pages/Authentication/Login.es.resx new file mode 100644 index 0000000..3c5e771 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Login.es.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ingrese con sus credenciales. + + + ¿No tiene una cuenta? + + + Correo + + + El Correo es requerido! + + + Completar con Credenciales Administrador + + + Completar con Credenciales Usuario + + + ¿Olvidó su Contraseña? + + + Contraseña + + + La Contraseña es requerida! + + + Registrarse aquí + + + ¿Recordarme? + + + Ingresar + + + Ingresar + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Login.fr.resx b/src/Client/Resources/Pages/Authentication/Login.fr.resx new file mode 100644 index 0000000..8692631 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Login.fr.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Connectez-vous avec vos identifiants. + + + Courriel + + + Un courriel est requis ! + + + Mot de passe oublié ? + + + Mot de passe + + + Mot de passe requis ! + + + Se souvenir de moi ? + + + Connexion + + + Connexion + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Login.id.resx b/src/Client/Resources/Pages/Authentication/Login.id.resx new file mode 100644 index 0000000..28006ca --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Login.id.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Masuk dengan Kredensial Anda. + + + Tidak punya akun? + + + E-mail + + + Email wajib diisi! + + + Isi Kredensial Administrator + + + Isi Kredensial Pengguna Basic + + + Lupa sandi? + + + Sandi + + + Sandi wajib diisi! + + + Daftar di sini + + + Ingat saya? + + + Masuk + + + Masuk + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Login.it.resx b/src/Client/Resources/Pages/Authentication/Login.it.resx new file mode 100644 index 0000000..bb48a76 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Login.it.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Accedi con le tue credenziali. + + + E-Mail + + + È richiesto un indirizzo E-Mail + + + Inserisci le tue credenziali per iniziare. + + + Utilizza credenziali amministrative + + + Utilizza credenziali utente base + + + Password dimenticata? + + + Password + + + È richiesta una password! + + + Ricordati di me? + + + Accedi + + + Accedi + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Login.km.resx b/src/Client/Resources/Pages/Authentication/Login.km.resx new file mode 100644 index 0000000..1bf008e --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Login.km.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ឡុកចូលប្រព័ន្ធជាមួយលេខកូដសម្ងាត់អ្នក + + + អ៊ីម៉ែល + + + ត្រូវការបំពេញអ៊ីម៉ែល + + + ភ្លេចលេខកូដសម្ងាត់? + + + លេខកូដសម្ងាត់ + + + ត្រូវការបំពេញលេខកូដសម្ងាត់ + + + ចងចាំក្នុងប្រព័ន្ធ? + + + ឡុកចូល + + + ឡុកចូល + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Login.nl.resx b/src/Client/Resources/Pages/Authentication/Login.nl.resx new file mode 100644 index 0000000..e0d271e --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Login.nl.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Log in met uw inloggegevens. + + + E-mail + + + E-mail is vereist! + + + Wachtwoord vergeten? + + + Wachtwoord + + + Wachtwoord is vereist! + + + Aanmelden + + + Aanmelden + + + Heb je geen account? + + + Beheerdersreferenties invullen + + + Basisgebruikersreferenties invullen + + + Schrijf je hier in + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Login.ru.resx b/src/Client/Resources/Pages/Authentication/Login.ru.resx new file mode 100644 index 0000000..ad69eb7 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Login.ru.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Авторизуйтесь с помощью ваших учётных данных. + + + У вас ещё нет аккаунта? + + + E-mail + + + Email обязателен! + + + Заполнить учётными данными администратора + + + Заполнить учётными данными пользователя с базовыми правами + + + Забыли пароль? + + + Пароль + + + Пароль обязателен! + + + Зарегистрируйтесь здесь + + + Запомнить меня? + + + Авторизоваться + + + Авторизация + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Login.sv.resx b/src/Client/Resources/Pages/Authentication/Login.sv.resx new file mode 100644 index 0000000..d236777 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Login.sv.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Logga in med dina uppgifter + + + Har du inget konto? + + + Epost + + + Epost är obligatoriskt + + + Fyll i Administratör Användaruppgifter + + + Fyll i Grundläggande Användaruppgifter + + + Glömt Lösenord? + + + Lösenord + + + Lösenord är obligatoriskt! + + + Registrera här + + + Kom ihåg mig? + + + Logga In + + + Logga In + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Register.ar.resx b/src/Client/Resources/Pages/Authentication/Register.ar.resx new file mode 100644 index 0000000..94332f5 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Register.ar.resx @@ -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 + + + هل لديك حساب؟ + + + تأكيد كلمة المرور + + + بريد الالكتروني + + + الاسم الأول + + + الكنية + + + كلمه السر + + + رقم الهاتف + + + يسجل + + + تسجيل الدخول + + + اسم االمستخدم + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Register.de.resx b/src/Client/Resources/Pages/Authentication/Register.de.resx new file mode 100644 index 0000000..1bfb8a3 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Register.de.resx @@ -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 + + + Du hast schon ein Konto? + + + Passwort bestätigen + + + E-Mail + + + Vorname + + + Nachname + + + Passwort + + + Telefonnummer + + + Registrieren + + + Einloggen + + + Benutzername + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Register.en.resx b/src/Client/Resources/Pages/Authentication/Register.en.resx new file mode 100644 index 0000000..fe26547 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Register.en.resx @@ -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 + + + Already have an account? + + + Confirm Password + + + E-mail + + + First Name + + + Last Name + + + Password + + + Phone Number + + + Register + + + Sign In + + + User Name + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Register.es.resx b/src/Client/Resources/Pages/Authentication/Register.es.resx new file mode 100644 index 0000000..8010e7c --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Register.es.resx @@ -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 + + + ¿Ya tiene una cuenta? + + + Confirmar Contraseña + + + Correo + + + Nombre + + + Apellido + + + Contraseña + + + Número de Teléfono + + + Registrarse + + + Ingresar + + + Nombre de Usuario + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Register.fr.resx b/src/Client/Resources/Pages/Authentication/Register.fr.resx new file mode 100644 index 0000000..41e6323 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Register.fr.resx @@ -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 + + + Vous possédez déjà un compte ? + + + Confirmation du mot de passe + + + Courriel + + + Prénom + + + Nom + + + Mot de passe + + + Numéro de téléphone + + + S'inscrire + + + Se connecter + + + Nom d'utilisateur + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Register.id.resx b/src/Client/Resources/Pages/Authentication/Register.id.resx new file mode 100644 index 0000000..bbc2810 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Register.id.resx @@ -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 + + + Sudah punya akun? + + + Konfirmasi Password + + + E-mail + + + Nama Depan + + + Nama Belakang + + + Sandi + + + Nomor Telepon + + + Daftar + + + Masuk + + + User Name + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Register.it.resx b/src/Client/Resources/Pages/Authentication/Register.it.resx new file mode 100644 index 0000000..86387eb --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Register.it.resx @@ -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 + + + Hai già un account? + + + Conferma Password + + + E-mail + + + Nome + + + Cognome + + + Accetto i termini e la privacy + + + Telefono + + + Registrati + + + Registrati + + + Username + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Register.km.resx b/src/Client/Resources/Pages/Authentication/Register.km.resx new file mode 100644 index 0000000..0cf656e --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Register.km.resx @@ -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 + + + មានគណនីរួចហើយ? + + + បញ្ជាក់លេខកូដសម្ងាត់ + + + អ៊ីម៉ែល + + + នាមខ្លួន + + + នាមត្រកូល + + + លេខកូដសម្ងាត់ + + + លេខទូរស័ព្ទ + + + ចុះឈ្មោះ + + + ឡុកចូល + + + ឈ្មោះអ្នកប្រើប្រាស់ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Register.nl.resx b/src/Client/Resources/Pages/Authentication/Register.nl.resx new file mode 100644 index 0000000..e355b93 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Register.nl.resx @@ -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 + + + Heb je al een account? + + + Wachtwoord bevestigen + + + E-mail + + + Voornaam + + + Achternaam + + + Wachtwoord + + + Telefoonnummer + + + Registreren + + + Aanmelden + + + Gebruikersnaam + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Register.ru.resx b/src/Client/Resources/Pages/Authentication/Register.ru.resx new file mode 100644 index 0000000..6d4d7ed --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Register.ru.resx @@ -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 + + + У вас уже есть аккаунт? + + + Подтверждение пароля + + + E-mail + + + Имя + + + Фамилия + + + Пароль + + + Номер телефона + + + Зарегистрировать + + + Авторизоваться + + + User Name + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Authentication/Register.sv.resx b/src/Client/Resources/Pages/Authentication/Register.sv.resx new file mode 100644 index 0000000..d3ac6a2 --- /dev/null +++ b/src/Client/Resources/Pages/Authentication/Register.sv.resx @@ -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 + + + Har du redan ett konto? + + + Bekräfta lösenord + + + E-post + + + Förnamn + + + Efternamn + + + Lösenord + + + Telefonnummer + + + Registrera dig + + + Logga In + + + Användarnamn + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditBrandModal.ar.resx b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.ar.resx new file mode 100644 index 0000000..32a2c4e --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.ar.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أضف العلامة التجارية + + + تم حفظ العلامة التجارية! + + + تم تحديث العلامة التجارية! + + + إلغاء + + + وصف + + + المعرّف + + + اسم + + + حفظ + + + ضريبة + + + تحديث + + + تحديث العلامة التجارية + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditBrandModal.de.resx b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.de.resx new file mode 100644 index 0000000..618b6ed --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.de.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Marke hinzufügen + + + Marke gespeichert! + + + Marke aktualisiert! + + + Abbrechen + + + Beschreibung + + + Id + + + Name + + + Speichern + + + Steuer + + + Aktualisieren + + + Martke Aktualisieren + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditBrandModal.en.resx b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.en.resx new file mode 100644 index 0000000..b8de313 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.en.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Brand + + + Brand Saved! + + + Brand Updated! + + + Cancel + + + Description + + + Id + + + Name + + + Save + + + Tax + + + Update + + + Update Brand + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditBrandModal.es.resx b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.es.resx new file mode 100644 index 0000000..bb9b491 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.es.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Agregar Marca + + + Marca Guardada! + + + Marca Actualizada! + + + Cancelar + + + Descripción + + + Id + + + Nombre + + + Guardar + + + Impuestos + + + Actualizar + + + Actualizar Marca + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditBrandModal.fr.resx b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.fr.resx new file mode 100644 index 0000000..732642a --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.fr.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ajouter une marque + + + Marque enregistrée ! + + + Marque mise à jour ! + + + Annuler + + + Description + + + Identifiant + + + Nom + + + Sauvegarder + + + Taxe + + + Mettre à jour + + + Édition d'une marque + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditBrandModal.id.resx b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.id.resx new file mode 100644 index 0000000..635c20b --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.id.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tambah Merek + + + Merek Tersimpan! + + + Merek Diperbarui! + + + Batal + + + Deskripsi + + + Id + + + Nama + + + Simpan + + + Pajak + + + Perbarui + + + Perbarui Merek + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditBrandModal.it.resx b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.it.resx new file mode 100644 index 0000000..56dc1eb --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.it.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Nuova marca + + + Marca salvata! + + + Marca aggiornata! + + + Annulla + + + Descrizione + + + Id + + + Nome + + + Salva + + + Imposta + + + Aggiorna + + + Aggiorna marca + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditBrandModal.km.resx b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.km.resx new file mode 100644 index 0000000..f29d99f --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.km.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បន្ថែមម៉ាក + + + ម៉ាកបានរក្សាទុក! + + + ម៉ាកបានធ្វើបច្ចុប្បន្នភាព + + + បោះបង់ + + + ការពិពណ៌នា + + + លេខកូដសម្ងាល់ + + + ឈ្មោះ + + + រក្សាទុក + + + ពន្ធ + + + បច្ចុប្បន្នភាព + + + បច្ចុប្បន្នភាពម៉ាក + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditBrandModal.nl.resx b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.nl.resx new file mode 100644 index 0000000..13c6a94 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.nl.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Merk toevoegen + + + Merk gered! + + + Merk bijgewerkt! + + + Annuleren + + + Beschrijving + + + Id + + + Naam + + + Opslaan + + + Belasting + + + Update + + + Merk bijwerken + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditBrandModal.ru.resx b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.ru.resx new file mode 100644 index 0000000..2e506f3 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditBrandModal.ru.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Добавить бренд + + + Бренд сохранён + + + Бренд обновлён + + + Отмена + + + Описание + + + Id + + + Наименование + + + Сохранить + + + Сбор + + + Обновить + + + Обновить бренд + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditProductModal.ar.resx b/src/Client/Resources/Pages/Catalog/AddEditProductModal.ar.resx new file mode 100644 index 0000000..bcb9ce0 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditProductModal.ar.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أضف منتج + + + الشفره + + + ماركة + + + إلغاء + + + حذف + + + وصف + + + المعرّف + + + اسم + + + تم حفظ المنتج! + + + تم تحديث المنتج! + + + تقييم + + + حفظ + + + تحديث + + + تحديث المنتج + + + تحميل + + + عرض + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditProductModal.de.resx b/src/Client/Resources/Pages/Catalog/AddEditProductModal.de.resx new file mode 100644 index 0000000..1bf6eaa --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditProductModal.de.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Produkt hinzufügen + + + Strichcode + + + Marke + + + Abbrechen + + + Löschen + + + Beschreibung + + + Id + + + Name + + + Produkte gespeichert + + + Produkt aktualisiert + + + Bewertung + + + Speichern + + + Aktualisieren + + + Produkt aktualisieren + + + Upload + + + Ansicht + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditProductModal.en.resx b/src/Client/Resources/Pages/Catalog/AddEditProductModal.en.resx new file mode 100644 index 0000000..ef00fca --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditProductModal.en.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Product + + + Barcode + + + Brand + + + Cancel + + + Delete + + + Description + + + Id + + + Name + + + Product Saved! + + + Product Updated! + + + Rate + + + Save + + + Update + + + Update Product + + + Upload + + + View + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditProductModal.es.resx b/src/Client/Resources/Pages/Catalog/AddEditProductModal.es.resx new file mode 100644 index 0000000..1dabb2f --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditProductModal.es.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Agregar Producto + + + Código de barra + + + Marca + + + Cancelar + + + Eliminar + + + Descripción + + + Id + + + Nombre + + + Producto Guardado! + + + Producto Actualizado! + + + Precio + + + Guardar + + + Actualizar + + + Actualizar Producto + + + Subir + + + Ver + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditProductModal.fr.resx b/src/Client/Resources/Pages/Catalog/AddEditProductModal.fr.resx new file mode 100644 index 0000000..4ba8a22 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditProductModal.fr.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ajouter un produit + + + Code barre + + + Marque + + + Annuler + + + Supprimer + + + Description + + + Identifiant + + + Nom + + + Produit enregistré ! + + + Produit mis à jour ! + + + Note + + + Sauvegarder + + + Mettre à jour + + + Édition d'un produit + + + Téléverser + + + Voir + + diff --git a/src/Client/Resources/Pages/Catalog/AddEditProductModal.id.resx b/src/Client/Resources/Pages/Catalog/AddEditProductModal.id.resx new file mode 100644 index 0000000..770fbfa --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditProductModal.id.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tambah Produk + + + Barcode + + + Merek + + + Batal + + + Hapus + + + Deskripsi + + + Id + + + Nama + + + Produk Tersimpan! + + + Produk Diperbarui! + + + Nilai + + + Simpan + + + Perbarui + + + Perbarui Produk + + + Unggah + + + View + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditProductModal.it.resx b/src/Client/Resources/Pages/Catalog/AddEditProductModal.it.resx new file mode 100644 index 0000000..1d11a75 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditProductModal.it.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aggiungi prodotto + + + Barcode + + + Marca + + + Annulla + + + Elimina + + + Descrizione + + + Id + + + Nome + + + Prodotto Salvato! + + + Prodotto Aggiornato! + + + Vota + + + Salva + + + Aggiorna + + + Aggiorna Prodotto + + + Carica + + + View + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditProductModal.km.resx b/src/Client/Resources/Pages/Catalog/AddEditProductModal.km.resx new file mode 100644 index 0000000..06f7050 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditProductModal.km.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បន្ថែមផលិតផល + + + បាកូដ + + + ម៉ាក + + + បោះបង់ + + + លុប + + + ការពិពណ៌នា + + + លេខកូដសម្ងាល់ + + + ឈ្មោះ + + + ផលិតផលបានរក្សាទុក + + + ផលិតផលបានធ្វើបច្ចុប្បន្នភាព + + + អត្រា + + + រក្សាទុក + + + បច្ចុប្បន្នភាព + + + ធ្វើបច្ចុប្បន្នភាពផលិតផល + + + ផ្ទុកឡើង + + + បង្ហាញ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditProductModal.nl.resx b/src/Client/Resources/Pages/Catalog/AddEditProductModal.nl.resx new file mode 100644 index 0000000..f81d047 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditProductModal.nl.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Product toevoegen + + + Barcode + + + Merk + + + Annuleren + + + Verwijderen + + + Beschrijving + + + Id + + + Naam + + + Product opgeslagen! + + + Product bijgewerkt! + + + Verhouding + + + Opslaan + + + Update + + + Product bijwerken + + + Uploaden + + + Bekijken + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditProductModal.ru.resx b/src/Client/Resources/Pages/Catalog/AddEditProductModal.ru.resx new file mode 100644 index 0000000..58dbb12 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditProductModal.ru.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Добавить продукт + + + Баркод + + + Бренд + + + Отмена + + + Удалить + + + Описание + + + Id + + + Наименование + + + Продукт сохранён + + + Продукт обновлён + + + Рейтинг + + + Сохранить + + + Обновить + + + Обновить продукт + + + Загрузить + + + Просмотр + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/AddEditProductModal.sv.resx b/src/Client/Resources/Pages/Catalog/AddEditProductModal.sv.resx new file mode 100644 index 0000000..1882727 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/AddEditProductModal.sv.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Lägg till produkt + + + Streckkod + + + Varumärke + + + Avbryt + + + Radera + + + Beskrivning + + + Id + + + Namn + + + Produkt Sparad! + + + Produkt Uppdaterad! + + + Betygsätt + + + Spara + + + Uppdatera + + + Uppdatera Produkt + + + Ladda upp + + + View + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Brands.ar.resx b/src/Client/Resources/Pages/Catalog/Brands.ar.resx new file mode 100644 index 0000000..45c2a98 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Brands.ar.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أجراءات + + + أضف العلامة التجارية + + + يحدها + + + العلامات التجارية + + + تصدير الماركات + + + إنشاء + + + حذف + + + حذف المحتوى + + + كثيف + + + وصف + + + تعديل + + + تصدير + + + تم تصدير العلامات التجارية المفلترة + + + المعرّف + + + استيراد + + + إدارة العلامات التجارية. + + + اسم + + + لا توجد إجراءات مسموح بها + + + إعادة تحميل + + + ابحث عن العلامات التجارية + + + مخطط + + + ضريبة + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Brands.de.resx b/src/Client/Resources/Pages/Catalog/Brands.de.resx new file mode 100644 index 0000000..88c287c --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Brands.de.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Marke hinzufügen + + + Gerahmt + + + Marken + + + Marken exportiert + + + Hinzufügen + + + Löschen + + + Inhalt löschen + + + Schmal + + + Beschreibung + + + Bearbeiten + + + Exportieren + + + Gefilterte Marken exportiert + + + Id + + + Importieren + + + Marken verwalten. + + + Name + + + Keine Aktionen erlaubt + + + Neu laden + + + Nach Marken suchen + + + Gebändert + + + Steuer + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Brands.en.resx b/src/Client/Resources/Pages/Catalog/Brands.en.resx new file mode 100644 index 0000000..27b237c --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Brands.en.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Add Brand + + + Bordered + + + Brands + + + Brands exported + + + Create + + + Delete + + + Delete Content + + + Dense + + + Description + + + Edit + + + Export + + + Filtered Brands exported + + + Id + + + Import + + + Manage Brands. + + + Name + + + No Allowed Actions + + + Reload + + + Search for Brands + + + Striped + + + Tax + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Brands.es.resx b/src/Client/Resources/Pages/Catalog/Brands.es.resx new file mode 100644 index 0000000..35aebe0 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Brands.es.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acciones + + + Agregar Marca + + + Bordeado + + + Marcas + + + Marcas Exportadas + + + Crear + + + Borrar + + + ¿Desea eliminar el registro? + + + Denso + + + Descripción + + + Editar + + + Exportar + + + Marcas filtradas exportadas + + + Id + + + Importar + + + Gestionar Marcas + + + Nombre + + + Acciones no Permitidas + + + Recargar + + + Buscar Marcas + + + Rayado + + + Impuestos + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Brands.fr.resx b/src/Client/Resources/Pages/Catalog/Brands.fr.resx new file mode 100644 index 0000000..5ccf553 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Brands.fr.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Ajouter un marque + + + Avec bordures + + + Marques + + + Marques exportées + + + Créer + + + Supprimer + + + Supprimer la marque + + + Dense + + + Description + + + Éditer + + + Exporter + + + Marques filtrées exportées + + + Identifiant + + + Importer + + + Gérer les marques + + + Nom + + + Aucune action autorisée + + + Recharger + + + Chercher des marques + + + Rayé + + + Taxe + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Brands.id.resx b/src/Client/Resources/Pages/Catalog/Brands.id.resx new file mode 100644 index 0000000..81a2f01 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Brands.id.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tindakan + + + Tambah Merek + + + Merek + + + Brands exported + + + Tambah + + + Hapus + + + Hapus Konten + + + Deskripsi + + + Sunting + + + Ekspor + + + Filtered Brands exported + + + Id + + + Import + + + Kelola Merek. + + + Nama + + + No Allowed Actions + + + Muat Ulang + + + Cari Merek + + + Pajak + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Brands.it.resx b/src/Client/Resources/Pages/Catalog/Brands.it.resx new file mode 100644 index 0000000..346068b --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Brands.it.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Azioni + + + Aggiungi marca + + + Marche + + + Brands exported + + + Crea + + + Elimina + + + Cancella contenuto + + + Descrizione + + + Modifica + + + Export + + + Filtered Brands exported + + + Id + + + Import + + + Gestione marca. + + + Nome + + + Nessuna azione consentita + + + Ricarica + + + Ricerca marche + + + Imposta + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Brands.km.resx b/src/Client/Resources/Pages/Catalog/Brands.km.resx new file mode 100644 index 0000000..20a35b7 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Brands.km.resx @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + មុខងារ + + + បន្ថែមម៉ាក + + + ម៉ាក + + + ម៉ាកបាននាំចេញ + + + បង្កើត + + + លុប + + + ការពិពណ៌នា + + + កែប្រែ + + + នាំចេញ + + + ច្រោះម៉ាកបាននាំចេញ + + + លេខកូដសម្ងាល់ + + + Import + + + គ្រប់គ្រងម៉ាក + + + ឈ្មោះ + + + មិនមានសិទ្ធិ + + + ផ្ទុកឡើងវិញ + + + ស្វែងរកម៉ាក + + + ពន្ធ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Brands.nl.resx b/src/Client/Resources/Pages/Catalog/Brands.nl.resx new file mode 100644 index 0000000..d3e5aec --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Brands.nl.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acties + + + Merk toevoegen + + + Grenst aan + + + Merken + + + Geëxporteerde merken + + + Aanmaken + + + Verwijderen + + + Inhoud verwijderen + + + Dicht + + + Beschrijving + + + Bewerken + + + Exporteren + + + Gefilterde merken geëxporteerd + + + Id + + + Importeren + + + Beheer merken. + + + Naam + + + Geen toegestane acties + + + Herladen + + + Zoeken naar merken + + + Gestreept + + + Belasting + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Brands.ru.resx b/src/Client/Resources/Pages/Catalog/Brands.ru.resx new file mode 100644 index 0000000..1c34c46 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Brands.ru.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Действия + + + Добавить бренд + + + Обрамлённый + + + Бренды + + + Бренды экспортированы + + + Создать + + + Удалить + + + Удалить контент + + + Компактный + + + Описание + + + Редактировать + + + Экспорт в Excel + + + Отфильтрованные бренды экспортированы + + + Id + + + Импорт + + + Управление брендами. + + + Наименование + + + Нет доступных действий + + + Перезагрузить + + + Поиск брендов... + + + Чередующийся + + + Сбор + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Brands.sv.resx b/src/Client/Resources/Pages/Catalog/Brands.sv.resx new file mode 100644 index 0000000..934d8d1 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Brands.sv.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Åtgärder + + + Lägg till varumärke + + + Varumärken + + + Brands exported + + + Skapa + + + Radera + + + Ta bort innehåll + + + Beskrivning + + + Redigera + + + Exportera + + + Filtered Brands exported + + + Id + + + Import + + + Hantera varumärken. + + + Namn + + + No Allowed Actions + + + Ladda om + + + Sök efter varumärken + + + Moms + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Products.ar.resx b/src/Client/Resources/Pages/Catalog/Products.ar.resx new file mode 100644 index 0000000..e84ef69 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Products.ar.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أجراءات + + + الشفره + + + يحدها + + + ماركة + + + إنشاء + + + حذف + + + حذف المحتوى + + + كثيف + + + وصف + + + تعديل + + + تصدير + + + تصدير المنتجات المفلترة + + + المعرّف + + + إدارة المنتجات. + + + اسم + + + لا توجد إجراءات مسموح بها + + + منتجات + + + تصدير المنتجات + + + تقييم + + + إعادة تحميل + + + بحث + + + مخطط + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Products.de.resx b/src/Client/Resources/Pages/Catalog/Products.de.resx new file mode 100644 index 0000000..d3ab068 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Products.de.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Strichcode + + + Gerahmt + + + Marke + + + Hinzufügen + + + Löschen + + + Inhalt löschen + + + Schmal + + + Beschreibung + + + Bearbeiten + + + Exportieren + + + Gefilterte Produkte exportiert + + + Id + + + Produkte verwalten + + + Maximale Bewertung + + + Minimale Bewertung + + + Name + + + Keine Aktionen erlaubt + + + Produkte + + + Produkte exportiert + + + Bewertung + + + Neu laden + + + Suchen + + + Gebändert + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Products.en.resx b/src/Client/Resources/Pages/Catalog/Products.en.resx new file mode 100644 index 0000000..1c633ca --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Products.en.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Barcode + + + Bordered + + + Brand + + + Create + + + Delete + + + Delete Content + + + Dense + + + Description + + + Edit + + + Export + + + Filtered Products exported + + + Id + + + Manage Products. + + + Maximum Rate + + + Minimum Rate + + + Name + + + No Allowed Actions + + + Products + + + Products exported + + + Rate + + + Reload + + + Search + + + Striped + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Products.es.resx b/src/Client/Resources/Pages/Catalog/Products.es.resx new file mode 100644 index 0000000..3da508d --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Products.es.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acciones + + + Código de barra + + + Bordeado + + + Marca + + + Crear + + + Borrar + + + ¿Desea eliminar el registro? + + + Denso + + + Descripción + + + Editar + + + Exportar + + + Productos filtrados exportados + + + Id + + + Gestionar Productos + + + Nombre + + + Acciones no Permitidas + + + Productos + + + Productos exportados + + + Precio + + + Recargar + + + Buscar + + + Rayado + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Products.fr.resx b/src/Client/Resources/Pages/Catalog/Products.fr.resx new file mode 100644 index 0000000..ebf66a8 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Products.fr.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Code barre + + + Avec bordures + + + Marque + + + Créer + + + Supprimer + + + Supprimer le produit + + + Dense + + + Description + + + Éditer + + + Exporter + + + Produits filtrés exportés + + + Identifiant + + + Gérer les produits. + + + Nom + + + Aucune action autorisée + + + Produits + + + Products exported + + + Note + + + Recharger + + + Chercher + + + Rayé + + diff --git a/src/Client/Resources/Pages/Catalog/Products.id.resx b/src/Client/Resources/Pages/Catalog/Products.id.resx new file mode 100644 index 0000000..15d8d77 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Products.id.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tindakan + + + Barcode + + + Merek + + + Tambah + + + Hapus + + + Hapus Konten + + + Deskripsi + + + Sunting + + + Ekspor + + + Filtered Products exported + + + Id + + + Kelola Produk. + + + Nama + + + No Allowed Actions + + + Produk + + + Products exported + + + Nilai + + + Muat Ulang + + + Cari + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Products.it.resx b/src/Client/Resources/Pages/Catalog/Products.it.resx new file mode 100644 index 0000000..a218fa3 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Products.it.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Azioni + + + Descrizione + + + Id + + + Nome + + + Prodotti + + + Ricarica + + + Marca + + + Cancella contenuto + + + Ricerca + + + Tasso + + + Gestione prodotti. + + + Modifica + + + Elimina + + + Crea + + + Barcode + + + Prodotti esportati + + + Prodotti filtrati esportati + + + Nessuna azione consentita + + + Tasso massimo + + + Tasso minimo + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Products.km.resx b/src/Client/Resources/Pages/Catalog/Products.km.resx new file mode 100644 index 0000000..6cbf00d --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Products.km.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + មុខងារ + + + បាកូដ + + + បង្កើត + + + លុប + + + ការពិពណ៌នា + + + កែប្រែ + + + ច្រោះផលិតផលបាននាំចេញ + + + លេខកូដសម្ងាល់ + + + គ្រប់គ្រងផលិតផល + + + ឈ្មោះ + + + គ្មានសិទ្ធិ + + + ផលិតផល + + + ផលិតផលនាំចេញ + + + អត្រា + + + ផ្ទុកឡើងវិញ + + + ស្វែងរក + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Products.nl.resx b/src/Client/Resources/Pages/Catalog/Products.nl.resx new file mode 100644 index 0000000..cc4ced9 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Products.nl.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acties + + + Barcode + + + Aanmaken + + + Verwijderen + + + Beschrijving + + + Bewerken + + + Gefilterde producten geëxporteerd + + + Id + + + Producten beheren. + + + Naam + + + Geen toegestane acties + + + Producten + + + Uitgevoerde producten + + + Verhouding + + + Herladen + + + Zoeken + + + Grenst aan + + + Merk + + + Inhoud verwijderen + + + Dicht + + + Exporteren + + + Gestreept + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Products.ru.resx b/src/Client/Resources/Pages/Catalog/Products.ru.resx new file mode 100644 index 0000000..b2ae187 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Products.ru.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Действия + + + Баркод + + + Обрамлённый + + + Бренд + + + Создать + + + Удалить + + + Удалить контент + + + Компактный + + + Описание + + + Редактировать + + + Экспорт в Excel + + + Отфильтрованные продукты экспортированы + + + Id + + + Управление продуктами. + + + Наименование + + + Нет доступных действий + + + Продукты + + + Продукты экспортированы + + + Рейтинг + + + Перезагрузить + + + Поиск продуктов... + + + Чередующийся + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Catalog/Products.sv.resx b/src/Client/Resources/Pages/Catalog/Products.sv.resx new file mode 100644 index 0000000..43994b0 --- /dev/null +++ b/src/Client/Resources/Pages/Catalog/Products.sv.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Åtgärder + + + Streckkod + + + Varumärke + + + Skapa + + + Radera + + + Ta bort innehåll + + + Beskrivning + + + Redigera + + + Exportera + + + Filtered Products exported + + + Id + + + Hantera Produkter. + + + Namn + + + No Allowed Actions + + + Produkter + + + Products exported + + + Betygsätta + + + Ladda om + + + Sök + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Communication/Chat.ar.resx b/src/Client/Resources/Pages/Communication/Chat.ar.resx new file mode 100644 index 0000000..6637bd9 --- /dev/null +++ b/src/Client/Resources/Pages/Communication/Chat.ar.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + دردشة + + + جهات الاتصال + + + دليل مفصل للمزيد. + + + أدخل رسالتك... + + + مسجّل الدخول. + + + تسجيل الخروج. + + + رسالة جديدة من {0} + + + يرسل + + + هل تريد أن تفهم كيف يتم تنفيذ الدردشة في BlazorHero؟ قم بإحالة هذا + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Communication/Chat.de.resx b/src/Client/Resources/Pages/Communication/Chat.de.resx new file mode 100644 index 0000000..0555b5b --- /dev/null +++ b/src/Client/Resources/Pages/Communication/Chat.de.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Chat + + + Kontakte + + + Detaillierte Anleitung für mehr. + + + Gibt deine Nachricht ein... + + + Eingeloggt. + + + Ausgeloggt. + + + Neue Nachricht von {0} + + + Absenden + + + Du möchtest verstehen, wie der Chat in FullStackHero implementiert ist? Lies hier + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Communication/Chat.en.resx b/src/Client/Resources/Pages/Communication/Chat.en.resx new file mode 100644 index 0000000..7b318d4 --- /dev/null +++ b/src/Client/Resources/Pages/Communication/Chat.en.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + chat + + + contacts + + + detailed guide for more. + + + Enter your message... + + + Logged In. + + + Logged Out. + + + New Message From {0} + + + Send + + + Want to understand how Chat is implemented in BlazorHero ? Refer this + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Communication/Chat.es.resx b/src/Client/Resources/Pages/Communication/Chat.es.resx new file mode 100644 index 0000000..702f3f7 --- /dev/null +++ b/src/Client/Resources/Pages/Communication/Chat.es.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + chat + + + contactos + + + guía detallada para mas. + + + Ingrese su mensaje... + + + Contectado. + + + Desconectado. + + + Nuevo mensaje de {0} + + + Enviar + + + ¿Quiere entender como el Chat está implmentado en BlazorHero? Mirar esta referencia + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Communication/Chat.fr.resx b/src/Client/Resources/Pages/Communication/Chat.fr.resx new file mode 100644 index 0000000..9b67e0b --- /dev/null +++ b/src/Client/Resources/Pages/Communication/Chat.fr.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Conversations + + + Contacts + + + guide détaillé pour en savoir plus. + + + Entrez votre message. + + + Connecté. + + + Déconnecté. + + + Nouveau message de {0} + + + Envoyer + + + Vous voulez comprendre comment le chat est implémenté dans BlazorHero ? Jettez un œil à ce + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Communication/Chat.id.resx b/src/Client/Resources/Pages/Communication/Chat.id.resx new file mode 100644 index 0000000..a9e65c4 --- /dev/null +++ b/src/Client/Resources/Pages/Communication/Chat.id.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + obrolan + + + kontak + + + panduan rinci lebih lanjut. + + + Tulis pesan anda... + + + Logged In. + + + Logged Out. + + + New Message From {0} + + + Kirim + + + Ingin tau bagaimana cara obrolan diimplementasi di BlazorHero ? Lihat + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Communication/Chat.it.resx b/src/Client/Resources/Pages/Communication/Chat.it.resx new file mode 100644 index 0000000..534c625 --- /dev/null +++ b/src/Client/Resources/Pages/Communication/Chat.it.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + chat + + + contatti + + + guida dettagliata per saperne di più. + + + Inserisci il tuo messaggio ... + + + Logged In. + + + Logged Out. + + + New Message From {0} + + + Invia + + + Vuoi capire come viene implementata la chat in BlazorHero? Guarda qui + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Communication/Chat.km.resx b/src/Client/Resources/Pages/Communication/Chat.km.resx new file mode 100644 index 0000000..f492f0a --- /dev/null +++ b/src/Client/Resources/Pages/Communication/Chat.km.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ជជែក + + + ឈ្មោះទំនាក់ទំនង + + + ការណែនាំលំអិត + + + វាយបញ្ចូលសាររបស់អ្នក + + + ឡុកចូល។ + + + ឡុកចេញ។ + + + សារថ្មីមកពី {0} + + + ផ្ញើ + + + ចង់ដឹងអំពីរបៀបសរសេរកូដមុខងារជជែកក្នុងប្លេហ្សឺហេរ៉ូ ចូលទៅកាន់តំណភ្ជាប់នេះ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Communication/Chat.nl.resx b/src/Client/Resources/Pages/Communication/Chat.nl.resx new file mode 100644 index 0000000..7b2a08f --- /dev/null +++ b/src/Client/Resources/Pages/Communication/Chat.nl.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Gesprek + + + Contactpersonen + + + gedetailleerde gids voor meer. + + + Voer uw bericht in... + + + Ingelogd. + + + Uitgelogd. + + + Nieuw bericht van {0} + + + Verzenden + + + Wilt u begrijpen hoe een Chat wordt geïmplementeerd in BlazorHero ? Ga dan naar deze + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Communication/Chat.ru.resx b/src/Client/Resources/Pages/Communication/Chat.ru.resx new file mode 100644 index 0000000..e2e8a9e --- /dev/null +++ b/src/Client/Resources/Pages/Communication/Chat.ru.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + чат + + + контакты + + + подробному руководству для получения дополнительной информации. + + + Введите ваше сообщение... + + + авторизовался. + + + вышел. + + + Новое сообщение от {0} + + + Отправить + + + Хотите понять, как реализован чат в BlazorHero ? Обратитесь к этому + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Communication/Chat.sv.resx b/src/Client/Resources/Pages/Communication/Chat.sv.resx new file mode 100644 index 0000000..0fa02a8 --- /dev/null +++ b/src/Client/Resources/Pages/Communication/Chat.sv.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + chatt + + + kontakter + + + detaljerad guide för mer. + + + Ditt meddelande... + + + Logged In. + + + Logged Out. + + + New Message From {0} + + + Skicka + + + Vill du förstå hur Chatt implementeras i BlazorHero? Se detta + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Home.ar.resx b/src/Client/Resources/Pages/Content/Home.ar.resx new file mode 100644 index 0000000..06018d1 --- /dev/null +++ b/src/Client/Resources/Pages/Content/Home.ar.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + بليزر للمبتدئين - بدء استخدام بليزر + + + Blazor Hero عبارة عن نموذج للحل الشامل للهندسة المعمارية النظيفة لتجميع الويب Blazor الذي تم إنشاؤه باستخدام + + + بناء تطبيق دردشة مع Blazor ، Identity ، و SignalR + + + الاحتفال بـ 1500 نجمة على جيثب! + + + مكتبة المكونات + + + المصادقة المخصصة في Blazor WebAssembly - بالتفصيل + + + قالب معماري نظيف لـ Blazor Web-Assembly + + + التوثيق - قريبا + + + استكشاف هيكل مشروع Blazor + + + ابدء + + + مستودع جيثب: لا تنسى ترك نجم ؛) + + + إليك بعض المقالات التي من المفترض أن تساعدك في البدء باستخدام Blazor. + + + كيفية تنفيذ Blazor CRUD باستخدام Entity Framework Core؟ + + + تنفيذ Blazor CRUD باستخدام مكتبة مكونات Mudblazor في .NET 5 + + + روابط مهمة + + + في حال كنت عالقًا في أي مكان أو كان لديك أي استفسارات بخصوص هذا التنفيذ ، فقد قمت بتجميع دليل البدء السريع للرجوع إليه + + + مصادر التعلم + + + أحب BlazorHero؟ نجمة لنا على جيثب! + + + هندسة البصل في ASP.NET Core مع CQRS - مفصل + + + صفحة المشروع + + + دليل البدء السريع + + + اقرأ الدليل + + + ادعمني! + + + بلازور هيرو + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Home.de.resx b/src/Client/Resources/Pages/Content/Home.de.resx new file mode 100644 index 0000000..64fdfeb --- /dev/null +++ b/src/Client/Resources/Pages/Content/Home.de.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor für Anfänger - Erste Schritte in Blazor + + + Blazor Hero ist ein All-In-One Clean Architecture Lösungstemplate für Blazor Web-Assembly, erstellt mit + + + Baue eine Chat-Anwendung With Blazor, Identity, And SignalR + + + Wir feiern 1,500 Sterne auf Github! + + + Komponentenbibliothek + + + Benutzerdefinierte Authentifizierung in Blazor WebAssembly im Detail + + + Clean Architecture Vorlage für Blazor Web-Assembly + + + Dokumentation - demnächst + + + Erforsche die Blazor Projektstruktur + + + Erste Schritte + + + Github Repository : Vergiss nicht, einen Stern zu hinterlassen ;) + + + Hier sind ein paar Artikel, die dir beimn Einstieg in Blazor helfen sollten. + + + Wie implementierst du Blazor CRUD mit Entity Framework Core? + + + Implementiere Blazor CRUD mit der Mudblazor Komponentenbibliothek in .NET 5 + + + Wichtige Verknüpfungen + + + Falls du irgendwo steckenbleiben solltest, oder Fragen zu dieser Implementierung hast, habe ich eine Schnellstartanleitung für dich erstellt. + + + Lernmittel + + + Dir gefällt BlazorHero? Hinterlasse einen Stern auf Github! + + + Zwiebelarchitektur in ASP.NET Core mit CQRS im Detail + + + Projektseite + + + Schnellstartanleitung + + + Lies die Anleitung + + + Unterstütze mich! + + + Blazor Hero + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Home.en.resx b/src/Client/Resources/Pages/Content/Home.en.resx new file mode 100644 index 0000000..1d1c273 --- /dev/null +++ b/src/Client/Resources/Pages/Content/Home.en.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor For Beginners – Getting Started With Blazor + + + Blazor Hero is an All-In-One Clean Architecture Solution Template For Blazor Web-Assembly built with + + + Building A Chat Application With Blazor, Identity, And SignalR + + + Celebrating 1,500 Stars on Github! + + + Component Library + + + Custom Authentication In Blazor WebAssembly – Detailed + + + Clean Architecture Template For Blazor Web-Assembly + + + Documentation - Coming Soon + + + Exploring Blazor Project Structure + + + Getting Started + + + Github Repository : Do Not Forget to Leave a Star ;) + + + Here are few articles that should help you get started with Blazor. + + + How To Implement Blazor CRUD Using Entity Framework Core? + + + Implementing Blazor CRUD Using Mudblazor Component Library In .NET 5 + + + Important Links + + + In case you are stuck anywhere or have any queries regarding this implementation, I have compiled a Quick Start Guide for you reference. + + + Learning Resources + + + Liked BlazorHero? Star us on Github! + + + Onion Architecture In ASP.NET Core With CQRS – Detailed + + + Project Page + + + Quick Start Guide + + + Read The Guide + + + Support Me! + + + Blazor Hero + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Home.es.resx b/src/Client/Resources/Pages/Content/Home.es.resx new file mode 100644 index 0000000..f5e12b4 --- /dev/null +++ b/src/Client/Resources/Pages/Content/Home.es.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor para Principiantes – Iniciarse con Blazor + + + Blazor Hero es un template de Solución de Arquitectura todo-en-uno para Blazor Web-Assembly, hecho con la Librería de Componentes + + + Construir una Aplicación de Chat con Blazor, Identity y SignalR + + + Celebrando 1,500 Estrellas en Github! + + + + + + Autenticación Personalizada en Blazor WebAssembly – Detallado + + + Template de Arquitectura Limpia para Blazor Web-Assembly + + + Documentación - Pronto + + + Explorando la estructura de un Proyecto Blazor + + + Iniciarse + + + Repositorio en Github: No olvides dejar una estrella ;) + + + Aquí hay unos artículos que te ayudarán a iniciarte el Blazor. + + + ¿Cómo implementar un CRUD en Blazro usando Entity Framework Core? + + + Implementando un CRUD en Blazor usando la librería de componentes Mudblazor en .NET 5 + + + Links Importantes + + + En caso que tengas problemas para avanzar o tengas preguntas sobre la implementación, he compilado una Guía de Inicio Rápido para tu referencia. + + + Recursos para Aprendizaje + + + ¿Te gustó BlazorHero? Deja una estrella en Github! + + + Arquitectura Onion en ASP.NET Core con CQRS – Detalle + + + Página del proyecto + + + Guía de Inicio Rápido + + + Lee la guía + + + Apoyarme! + + + Blazor Hero + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Home.fr.resx b/src/Client/Resources/Pages/Content/Home.fr.resx new file mode 100644 index 0000000..0024b82 --- /dev/null +++ b/src/Client/Resources/Pages/Content/Home.fr.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor For Beginners – Getting Started With Blazor + + + Blazor Hero est un modèle de solution propre et tout en un pour Blazor Web-Assembly, construit avec la bibliothèque de composants + + + Building A Chat Application With Blazor, Identity, And SignalR + + + Celebrating 1,500 Stars on Github! + + + + + + Custom Authentication In Blazor WebAssembly – Detailed + + + Modèle d'architecture propre pour Blasor Web-Assembly + + + Documentation - Coming Soon + + + Exploring Blazor Project Structure + + + Getting Started + + + Github Repository : Do Not Forget to Leave a Star ;) + + + Here are few articles that should help you get started with Blazor. + + + How To Implement Blazor CRUD Using Entity Framework Core? + + + Implementing Blazor CRUD Using Mudblazor Component Library In .NET 5 + + + Important Links + + + In case you are stuck anywhere or have any queries regarding this implementation, I have compiled a Quick Start Guide for you reference. + + + Learning Resources + + + Liked BlazorHero? Star us on Github! + + + Onion Architecture In ASP.NET Core With CQRS – Detailed + + + Project Page + + + Quick Start Guide + + + Read The Guide + + + Support Me! + + + Blazor Hero + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Home.id.resx b/src/Client/Resources/Pages/Content/Home.id.resx new file mode 100644 index 0000000..32c38ef --- /dev/null +++ b/src/Client/Resources/Pages/Content/Home.id.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor For Beginners – Getting Started With Blazor + + + Blazor Hero adalah sebuah Template Solusi Clean Architecture All-In-One Untuk Blazor Web-Assembly + + + Blazor Hero is an All-In-One Clean Architecture Solution Template For Blazor Web-Assembly built with + + + Building A Chat Application With Blazor, Identity, And SignalR + + + Celebrating 1,500 Stars on Github! + + + Pustaka Komponen + + + Component Library + + + Custom Authentication In Blazor WebAssembly – Detailed + + + Template Clean Architecture Untuk Blazor Web-Assembly + + + Documentation - Coming Soon + + + Exploring Blazor Project Structure + + + Getting Started + + + Github Repository : Do Not Forget to Leave a Star ;) + + + Here are few articles that should help you get started with Blazor. + + + How To Implement Blazor CRUD Using Entity Framework Core? + + + Implementing Blazor CRUD Using Mudblazor Component Library In .NET 5 + + + Important Links + + + In case you are stuck anywhere or have any queries regarding this implementation, I have compiled a Quick Start Guide for you reference. + + + Learning Resources + + + Liked BlazorHero? Star us on Github! + + + Onion Architecture In ASP.NET Core With CQRS – Detailed + + + Halaman Proyek + + + Quick Start Guide + + + Read The Guide + + + Dukung Saya! + + + Blazor Hero + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Home.it.resx b/src/Client/Resources/Pages/Content/Home.it.resx new file mode 100644 index 0000000..e004f55 --- /dev/null +++ b/src/Client/Resources/Pages/Content/Home.it.resx @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Descrizione + + + Blazor Hero + + + Libreria di compoenti + + + Supportami! + + + Blazor Hero + + + Blazor For Beginners – Getting Started With Blazor + + + Blazor Hero is an All-In-One Clean Architecture Solution Template For Blazor Web-Assembly built with + + + Building A Chat Application With Blazor, Identity, And SignalR + + + Celebrating 1,500 Stars on Github! + + + Component Library + + + Custom Authentication In Blazor WebAssembly – Detailed + + + Exploring Blazor Project Structure + + + Getting Started + + + Github Repository : Do Not Forget to Leave a Star ;) + + + Here are few articles that should help you get started with Blazor. + + + How To Implement Blazor CRUD Using Entity Framework Core? + + + Implementing Blazor CRUD Using Mudblazor Component Library In .NET 5 + + + Important Links + + + In case you are stuck anywhere or have any queries regarding this implementation, I have compiled a Quick Start Guide for you reference. + + + Learning Resources + + + Liked BlazorHero? Star us on Github! + + + Onion Architecture In ASP.NET Core With CQRS – Detailed + + + Quick Start Guide + + + Read The Guide + + + Documentation - Coming Soon + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Home.km.resx b/src/Client/Resources/Pages/Content/Home.km.resx new file mode 100644 index 0000000..7fccc0b --- /dev/null +++ b/src/Client/Resources/Pages/Content/Home.km.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ប្លេហ្សឺសម្រាប់ការចាប់ផ្តើម - ចាំផ្តើមជាមួយប្លេហ្សឺ + + + Blazor Hero is an All-In-One Clean Architecture Solution Template For Blazor Web-Assembly built with + + + Building A Chat Application With Blazor, Identity, And SignalR + + + Celebrating 1,500 Stars on Github! + + + Component Library + + + Custom Authentication In Blazor WebAssembly – Detailed + + + គំរូកម្មវិធីដែលអភិវឌ្ឍតាមបច្ចេកវិទ្យា Blazor Web-Assembly + + + ឯកសារណែនាំលម្អិត មកដល់ឆាប់ៗនេះ + + + គ្រោងថតរបស់គម្រោង + + + ចាប់ផ្តើម + + + Github Repository : Do Not Forget to Leave a Star ;) + + + Here are few articles that should help you get started with Blazor. + + + How To Implement Blazor CRUD Using Entity Framework Core? + + + Implementing Blazor CRUD Using Mudblazor Component Library In .NET 5 + + + Important Links + + + In case you are stuck anywhere or have any queries regarding this implementation, I have compiled a Quick Start Guide for you reference. + + + ធនធានសិក្សា + + + Liked BlazorHero? Star us on Github! + + + Onion Architecture In ASP.NET Core With CQRS – Detailed + + + ទំព័រគម្រោង + + + ការណែនាំសង្ខេប + + + អានការណែនា + + + គាំទ្រយើងខ្ញុំ! + + + ប្លេហ្សឺ ហេរ៉ូ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Home.nl.resx b/src/Client/Resources/Pages/Content/Home.nl.resx new file mode 100644 index 0000000..6ec8ae5 --- /dev/null +++ b/src/Client/Resources/Pages/Content/Home.nl.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor voor beginners – Aan de slag met Blazor + + + Blazor Hero is een alles-in-één schone architectuuroplossing sjabloon voor Blazor web-assembly gebouwd met + + + Een chattoepassing bouwen met Blazor, Identity en SignalR + + + Inmiddels 1500 sterren op Github! + + + Componentbibliotheek + + + Aangepaste verificatie in Blazor WebAssembly - Gedetailleerd + + + Schone architectuursjabloon voor Blazor Web-Assembly + + + Documentatie - Binnenkort beschikbaar + + + Blazor-projectstructuur verkennen + + + Opstarten + + + Github Repository : Vergeet niet om een ster achter te laten ;) + + + Hier zijn enkele artikelen die u moeten helpen aan de slag te gaan met Blazor. + + + Hoe Blazor CRUD implementeren met Entity Framework Core? + + + Blazor CRUD implementeren met mudblazor-componentbibliotheek in .NET 5 + + + Belangrijke links + + + Verhoog dat u ergens vastzit of heb vragen over deze implementatie, ik heb een Quick Start Guide voor u samengesteld. + + + Leermiddelen + + + Vind je BlazorHero leuk? Geef een ster op Github! + + + Onion Architecture In ASP.NET Core Met CQRS – Gedetailleerd + + + Projectpagina + + + Snelstartgids + + + Lees de gids + + + Steun mij! + + + Blazor Held + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Home.ru.resx b/src/Client/Resources/Pages/Content/Home.ru.resx new file mode 100644 index 0000000..c1d6b11 --- /dev/null +++ b/src/Client/Resources/Pages/Content/Home.ru.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor For Beginners – Getting Started With Blazor + + + Blazor Hero - это All-In-One шаблон решения с применением "чистой" архитектуры для Blazor Web-Assembly, построенный с помощью + + + Building A Chat Application With Blazor, Identity, And SignalR + + + Достигнуто 1,500 Звёзд на Github! + + + библиотеки компонентов + + + Custom Authentication In Blazor WebAssembly – Detailed + + + Шаблон "чистой" архитектуры для Blazor Web-Assembly + + + Документация - скоро появится + + + Exploring Blazor Project Structure + + + Начало работы + + + Репозиторий Github : не забудьте поставить звезду ;) + + + Вот несколько статей, которые должны помочь вам начать работу с Blazor. + + + How To Implement Blazor CRUD Using Entity Framework Core? + + + Implementing Blazor CRUD Using Mudblazor Component Library In .NET 5 + + + Важные ссылки + + + Если вы где-то застряли или у вас есть какие-либо вопросы относительно этой реализации, я составил для вас краткое руководство по началу работы. + + + Учебные ресурсы + + + Нравится BlazorHero? Поставьте звезду на Github! + + + Onion Architecture In ASP.NET Core With CQRS – Detailed + + + Страница проекта + + + Краткое руководство по началу работы + + + Прочитать руководство + + + Поддержать меня! + + + Blazor Hero + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Home.sv.resx b/src/Client/Resources/Pages/Content/Home.sv.resx new file mode 100644 index 0000000..a9bcdcc --- /dev/null +++ b/src/Client/Resources/Pages/Content/Home.sv.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor för nybörjare - Komma igång med Blazor + + + Blazor Hero är en allt-i-ett-ren mall för arkitekturlösningar för Blazor Web-Assembly byggd med + + + Bygga en Chattapplikation med Blazor, Identity och SignalR + + + Celebrating 1,500 Stars on Github! + + + Komponentbibliotek + + + Anpassad autentisering i Blazor WebAssembly - Detaljerad + + + Ren arkitekturmall för Blazor Web-Assembly + + + Documentation - Coming Soon + + + Utforska Blazor-projektets struktur + + + Komma igång + + + Github Repository : Glöm inte att lämna en stjärna ;) + + + Här är några artiklar som kan hjälpa dig att komma igång med Blazor. + + + Hur implementerar jag Blazor CRUD med Entity Framework Core? + + + Implementering av Blazor CRUD med Mudblazor Komponent Library i .NET 5 + + + Viktiga länkar + + + Öka att du har fastnat någonstans eller har några frågor angående denna implementering, jag har sammanställt en snabbstartsguide som referens. + + + Lärande resurser + + + Liked BlazorHero? Star us on Github! + + + Onion Architecture In ASP.NET Core With CQRS – Detaljerad + + + Projektsida + + + Snabbstartsguide + + + Läs guiden + + + Stöd Mig! + + + Blazor Hero + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Resources.ar.resx b/src/Client/Resources/Pages/Content/Resources.ar.resx new file mode 100644 index 0000000..4f13a27 --- /dev/null +++ b/src/Client/Resources/Pages/Content/Resources.ar.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + الوصول إلى الموارد هنا. + + + رهيبة بليزر + + + مكان رائع للتعلم والعثور على معلومات ومشاريع / أمثلة حول Blazor. + + + موارد + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Resources.de.resx b/src/Client/Resources/Pages/Content/Resources.de.resx new file mode 100644 index 0000000..9000594 --- /dev/null +++ b/src/Client/Resources/Pages/Content/Resources.de.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Auf Ressourcen zugreifen. + + + Awesome Blazor + + + Großartige Seite zum Lernen von Blazor. Es gibt eine Vielzahl an Informationen, Projekten und Beispielen. + + + Ressourcen + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Resources.en.resx b/src/Client/Resources/Pages/Content/Resources.en.resx new file mode 100644 index 0000000..4254cab --- /dev/null +++ b/src/Client/Resources/Pages/Content/Resources.en.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Access Resources here. + + + Awesome Blazor + + + Great place to learn, find information and projects/examples about Blazor. + + + Resources + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Resources.es.resx b/src/Client/Resources/Pages/Content/Resources.es.resx new file mode 100644 index 0000000..0f6b656 --- /dev/null +++ b/src/Client/Resources/Pages/Content/Resources.es.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acceder a los recursos aquí + + + Awesome Blazor + + + Estupendo lugar para aprender, buscar información y proyectos/ejemplos sobre Blazor. + + + Recursos + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Resources.fr.resx b/src/Client/Resources/Pages/Content/Resources.fr.resx new file mode 100644 index 0000000..fdccea8 --- /dev/null +++ b/src/Client/Resources/Pages/Content/Resources.fr.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Accédez aux ressouces ici. + + + Awesome Blazor + + + Bon endroit pour apprendre, trouver des informations et des projets / exemples avec Blazor. + + + Ressources + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Resources.id.resx b/src/Client/Resources/Pages/Content/Resources.id.resx new file mode 100644 index 0000000..5233f41 --- /dev/null +++ b/src/Client/Resources/Pages/Content/Resources.id.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Akses Resources di sini. + + + Awesome Blazor + + + Tempat yang bagus untuk belajar, mencari informasi dan proyek/contoh tentang Blazor. + + + Resources + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Resources.it.resx b/src/Client/Resources/Pages/Content/Resources.it.resx new file mode 100644 index 0000000..2d8f2f6 --- /dev/null +++ b/src/Client/Resources/Pages/Content/Resources.it.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Risorse + + + Ottimo posto per imparare, trovare informazioni e progetti/esempi su Blazor. + + + Eccezionale Blazor + + + Accedi alle risorse qui. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Resources.km.resx b/src/Client/Resources/Pages/Content/Resources.km.resx new file mode 100644 index 0000000..fe1c3c3 --- /dev/null +++ b/src/Client/Resources/Pages/Content/Resources.km.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ចូលប្រើធនធាននៅទីនេះ + + + ធនធានប្លេហ្សឺមហាសាល + + + កន្លែងដ៏ល្អដើម្បីរៀនស្វែងរកព័ត៌មាននិងគម្រោង / ឧទាហរណ៍គំរូរបស់ប្លេហ្សឺ + + + ធនធាន + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Resources.nl.resx b/src/Client/Resources/Pages/Content/Resources.nl.resx new file mode 100644 index 0000000..a6e54ef --- /dev/null +++ b/src/Client/Resources/Pages/Content/Resources.nl.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Hier kunt u bronnen openen. + + + Geweldige Blazor + + + Geweldige plek om te leren, informatie en projecten / voorbeelden over Blazor te vinden. + + + Bronnen + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Resources.ru.resx b/src/Client/Resources/Pages/Content/Resources.ru.resx new file mode 100644 index 0000000..c69e400 --- /dev/null +++ b/src/Client/Resources/Pages/Content/Resources.ru.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Доступ к ресурсам здесь. + + + Awesome Blazor + + + Отличное место для обучения, где можно найти информацию и проекты/примеры о Blazor. + + + Ресурсы + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Content/Resources.sv.resx b/src/Client/Resources/Pages/Content/Resources.sv.resx new file mode 100644 index 0000000..163625f --- /dev/null +++ b/src/Client/Resources/Pages/Content/Resources.sv.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Få tillgång till resurser här. + + + Fantastisk Blazor + + + Bra ställe att lära sig, hitta information och projekt / exempel om Blazor. + + + Resurser + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Account.ar.resx b/src/Client/Resources/Pages/Identity/Account/Account.ar.resx new file mode 100644 index 0000000..a1e51f2 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Account.ar.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + الحساب + + + إدارة حسابك + + + الملف الشخصي + + + حماية + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Account.de.resx b/src/Client/Resources/Pages/Identity/Account/Account.de.resx new file mode 100644 index 0000000..a309580 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Account.de.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Konto + + + Konto verwalten + + + Profil + + + Sicherheit + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Account.en.resx b/src/Client/Resources/Pages/Identity/Account/Account.en.resx new file mode 100644 index 0000000..8153dbd --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Account.en.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Manage your account + + + Profile + + + Security + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Account.es.resx b/src/Client/Resources/Pages/Identity/Account/Account.es.resx new file mode 100644 index 0000000..d838676 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Account.es.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cuenta + + + Gestione su cuenta + + + Perfil + + + Seguridad + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Account.fr.resx b/src/Client/Resources/Pages/Identity/Account/Account.fr.resx new file mode 100644 index 0000000..3ff7ab8 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Account.fr.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Compte + + + Gérez votre compte + + + Profile + + + Sécurité + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Account.id.resx b/src/Client/Resources/Pages/Identity/Account/Account.id.resx new file mode 100644 index 0000000..7ee6bd2 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Account.id.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Akun + + + Kelola akun anda + + + Profil + + + Keamanan + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Account.it.resx b/src/Client/Resources/Pages/Identity/Account/Account.it.resx new file mode 100644 index 0000000..d4c0346 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Account.it.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Gestisci il tuo account + + + Profilo + + + Sicurezza + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Account.km.resx b/src/Client/Resources/Pages/Identity/Account/Account.km.resx new file mode 100644 index 0000000..d3e124c --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Account.km.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + គណនី + + + គ្រប់គ្រង​គណនី​របស់​អ្នក + + + ប្រវត្តិរូប + + + សន្តិសុខ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Account.nl.resx b/src/Client/Resources/Pages/Identity/Account/Account.nl.resx new file mode 100644 index 0000000..4e3d049 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Account.nl.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Uw account beheren + + + Profiel + + + Beveiliging + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Account.ru.resx b/src/Client/Resources/Pages/Identity/Account/Account.ru.resx new file mode 100644 index 0000000..5344d37 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Account.ru.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Аккаунт + + + Управление вашим аккаунтом + + + Профиль + + + Безопасность + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Account.sv.resx b/src/Client/Resources/Pages/Identity/Account/Account.sv.resx new file mode 100644 index 0000000..2bfbf5c --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Account.sv.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Konto + + + Hantera ditt konto + + + Profil + + + Säkerhet + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Profile.ar.resx b/src/Client/Resources/Pages/Identity/Account/Profile.ar.resx new file mode 100644 index 0000000..549b9dc --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Profile.ar.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + حذف صورة + + + حذف الصورة + + + هل تريد حذف صورة ملف تعريف {0} + + + بريد الالكتروني + + + الاسم الأول + + + الكنية + + + رقم الهاتف + + + الملف الشخصي + + + تفاصيل الملف الشخصي + + + تمت إضافة صورة الملف الشخصي. + + + تم حذف صورة الملف الشخصي. + + + حفظ التغييرات + + + تحميل الصور + + + تم تحديث ملفك الشخصي. الرجاء تسجيل الدخول للمتابعة. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Profile.de.resx b/src/Client/Resources/Pages/Identity/Account/Profile.de.resx new file mode 100644 index 0000000..badb9b7 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Profile.de.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Bild löschen + + + Bild löschen + + + Möchtest du das Profilbild von {0} löschen + + + E-Mail + + + Vorname + + + Nachname + + + Telefon + + + Profil + + + Profildetails + + + Profilbild hinzugefügt. + + + Profilbild gelöscht. + + + Änderungen speichern + + + Bild hochladen + + + Profil aktualisiert. Zum Fortfahren anmelden. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Profile.en.resx b/src/Client/Resources/Pages/Identity/Account/Profile.en.resx new file mode 100644 index 0000000..708594b --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Profile.en.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Delete Image + + + Delete Picture + + + Do you want to delete the profile picture of {0} + + + Email + + + First Name + + + Last Name + + + Phone Number + + + Profile + + + Profile Details + + + Profile picture added. + + + Profile picture deleted. + + + Save Changes + + + Upload Image + + + Your Profile has been updated. Please Login to Continue. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Profile.es.resx b/src/Client/Resources/Pages/Identity/Account/Profile.es.resx new file mode 100644 index 0000000..add91bb --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Profile.es.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Borrar Imagen + + + Borrar Imagen + + + ¿Quiere borrar la imagen de perfil de {0} + + + Correo + + + Nombre + + + Apellido + + + Teléfono + + + Perfil + + + Detalle del perfil + + + Imagen de Perfil agregada. + + + Imagen de Perfil borrada. + + + Guardar cambios + + + Cargar Imagen + + + Tu perfil fue actualizado, por favor ingrese para continuar. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Profile.fr.resx b/src/Client/Resources/Pages/Identity/Account/Profile.fr.resx new file mode 100644 index 0000000..9dd3d5c --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Profile.fr.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Supprimer image + + + Supprimer photo + + + Voulez-vous supprimer la photo de profil de {0} + + + Courriel + + + Prénom + + + Nom + + + Numéro de téléphone + + + Profil + + + Détails du profil + + + Photo de profil ajouté. + + + Photo de profil supprimée. + + + Sauvagarder les changements + + + Téléverser une image + + + Votre profil a été mis à jour. Merci de vous reconnecter pour continuer. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Profile.id.resx b/src/Client/Resources/Pages/Identity/Account/Profile.id.resx new file mode 100644 index 0000000..238596e --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Profile.id.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Hapus Gambar + + + Hapus Gambar + + + Do you want to delete the profile picture of {0} + + + Email + + + Nama Depan + + + Nama Belakang + + + Nomor Telepon + + + Profil + + + Detail Profil + + + Profile picture added. + + + Profile picture deleted. + + + Simpan Perubahan + + + Unggah Gambar + + + Profil Anda telah diperbarui. Login untuk Melanjutkan. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Profile.it.resx b/src/Client/Resources/Pages/Identity/Account/Profile.it.resx new file mode 100644 index 0000000..3848468 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Profile.it.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Elimina Immagine + + + Elimina Immagine + + + Do you want to delete the profile picture of {0} + + + Email + + + Nome + + + Cognome + + + Telefono + + + Profilo + + + Dettagli profilo + + + Profile picture added. + + + Profile picture deleted. + + + Salvare le modifiche + + + Carica immagine + + + Il tuo profilo è stato aggiornato. Accedere per continuare. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Profile.km.resx b/src/Client/Resources/Pages/Identity/Account/Profile.km.resx new file mode 100644 index 0000000..56fd8a9 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Profile.km.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + លុបរូបភាព + + + លុបរូបភាព + + + តើអ្នកចង់លុបរូបថតប្រូហ្វាល់នៃ {0} + + + អ៊ីមែល + + + នាមខ្លួន + + + នាមត្រកូល + + + លេខទូរស័ព្ទ + + + ប្រវត្តិរូប + + + ព័ត៌មានលម្អិតប្រវត្តិរូប + + + រូបថតប្រូហ្វាល់បានបន្ថែម + + + រូបថតប្រូហ្វាល់បានលុប + + + រក្សាទុកការផ្លាស់ប្តូរ + + + ផ្ទុកឡើងរូបភាព + + + ពត៌មានរបស់អ្នកត្រូវបានធ្វើបច្ចុប្បន្នភាព។ សូមចូលដើម្បីបន្ត។ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Profile.nl.resx b/src/Client/Resources/Pages/Identity/Account/Profile.nl.resx new file mode 100644 index 0000000..faba084 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Profile.nl.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Afbeelding verwijderen + + + Wilt u de profielfoto van {0} verwijderen? + + + Email + + + Voornaam + + + Achternaam + + + Telefoonnummer + + + Profiel + + + Profielgegevens + + + Profielfoto toegevoegd. + + + Profielfoto verwijderd. + + + Wijzigingen opslaan + + + Uw profiel is bijgewerkt. Log in om door te gaan. + + + Afbeelding verwijderen + + + Afbeelding uploaden + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Profile.ru.resx b/src/Client/Resources/Pages/Identity/Account/Profile.ru.resx new file mode 100644 index 0000000..c08082a --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Profile.ru.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Удалить изображение + + + Вы действительно хотите удалить изображение профиля {0} + + + Email + + + Имя + + + Фамилия + + + Номер телефона + + + Профиль + + + Детали профиля + + + Изображение профиля добавлено. + + + Изображение профиля удалено. + + + Сохранить изменения + + + Загрузить изображение + + + Ваш профиль был обновлён. Пожалуйста, авторизуйтесь, чтобы продолжить. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Profile.sv.resx b/src/Client/Resources/Pages/Identity/Account/Profile.sv.resx new file mode 100644 index 0000000..48cf3c5 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Profile.sv.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Radera Bild + + + Radera Bild + + + Do you want to delete the profile picture of {0} + + + E-post + + + Förnamn + + + Efternamn + + + Telefonnummer + + + Profil + + + Profil Detaljer + + + Profile picture added. + + + Profile picture deleted. + + + Spara Ändringar + + + Ladda upp bild + + + Din profil har uppdaterats. Var vänlig logga in för att fortsätta. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Security.ar.resx b/src/Client/Resources/Pages/Identity/Account/Security.ar.resx new file mode 100644 index 0000000..8e0d14b --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Security.ar.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + تغيير كلمة المرور + + + كلمة المرور الحالي + + + كلمة سر خاطئة. + + + كلمه السر + + + تم تغيير كلمة السر! + + + تأكيد كلمة المرور + + + مطلوب تأكيد كلمة المرور! + + + كلمة المرور مطلوبة! + + + يجب ألا يقل طول كلمة المرور عن 8 + + + يجب أن تحتوي كلمة المرور على حرف كبير واحد على الأقل + + + يجب أن تحتوي كلمة المرور على رقم واحد على الأقل + + + يجب أن تحتوي كلمة المرور على حرف صغير واحد على الأقل + + + كلمات المرور غير متطابقة + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Security.de.resx b/src/Client/Resources/Pages/Identity/Account/Security.de.resx new file mode 100644 index 0000000..593ce75 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Security.de.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Passwort ändern + + + Aktuelles Passwort + + + Falsches Passwort. + + + Passwort + + + Passwort geändert! + + + Passwortwiederholung + + + Passwortwiederholung wird benötigt! + + + Passwort wird benötigt! + + + Passwort muss mindestens 8 Zeichen lang sein + + + Passwort muss mindestens einen Großbuchstaben enthalten + + + Passwort muss mindestens eine Zahl enthalten + + + Passwort muss mindestens einen Kleinbuchstaben enthalten + + + Passwörter stimmen nicht überein. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Security.en.resx b/src/Client/Resources/Pages/Identity/Account/Security.en.resx new file mode 100644 index 0000000..9de3a3e --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Security.en.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Change Password + + + Current Password + + + Incorrect Password. + + + Password + + + Password Changed! + + + Password Confirmation + + + Password Confirmation is required! + + + Password is required! + + + Password must be at least of length 8 + + + Password must contain at least one capital letter + + + Password must contain at least one digit + + + Password must contain at least one lowercase letter + + + Passwords don't match + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Security.es.resx b/src/Client/Resources/Pages/Identity/Account/Security.es.resx new file mode 100644 index 0000000..998fab6 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Security.es.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cambiar contraseña + + + Contraseña actual + + + Contraseña + + + Confirmación de contraseña + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Security.fr.resx b/src/Client/Resources/Pages/Identity/Account/Security.fr.resx new file mode 100644 index 0000000..b98c7ae --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Security.fr.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Changer le mot de passe + + + Mot de passe actuel + + + Mot de passe incorrect. + + + Mot de passe + + + Mot de passe changé ! + + + Mot de passe confirmé ! + + + Confirmation du mot de passe requise ! + + + Mot de passe requis ! + + + Le mot de passe doit au moins contenir 8 caractères ! + + + Le mot de passe doit au moins contenir une lettre majuscule + + + Le mot de passe doit au moins contenir un chiffre + + + Le mot de passe doit au moins contenir une minuscule + + + Les mots de passes de correspondent pas + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Security.id.resx b/src/Client/Resources/Pages/Identity/Account/Security.id.resx new file mode 100644 index 0000000..6f68328 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Security.id.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ubah sandi + + + Sandi saat Ini + + + Sandi salah. + + + Sandi + + + Sandi diperbarui! + + + Konfirmasi sandi + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Security.it.resx b/src/Client/Resources/Pages/Identity/Account/Security.it.resx new file mode 100644 index 0000000..787c422 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Security.it.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cambia password + + + Password corrente + + + Password non corretta. + + + Password + + + Password cambiata! + + + Conferma password + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Security.km.resx b/src/Client/Resources/Pages/Identity/Account/Security.km.resx new file mode 100644 index 0000000..9f41488 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Security.km.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ផ្លាស់ប្តូរពាក្យសម្ងាត់ + + + លេខសំងាត់​បច្ចុប្បន្ន + + + ពាក្យសម្ងាត់ + + + ការ​បញ្ជាក់​ពាក្យ​សម្ងាត់ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Security.nl.resx b/src/Client/Resources/Pages/Identity/Account/Security.nl.resx new file mode 100644 index 0000000..54116f3 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Security.nl.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Wachtwoord wijzigen + + + Huidig wachtwoord + + + Wachtwoord + + + Wachtwoordbevestiging + + + Onjuist wachtwoord. + + + Wachtwoord gewijzigd! + + + Lösenordsbekräftelse krävs! + + + Wachtwoord is vereist! + + + Wachtwoord moet uit minimaal 8 karakters bestaan! + + + Wachtwoord moet uit minimaal 1 hoofdletter bestaan! + + + Wachtwoord moet uit minimaal 1 nummer! + + + Wachtwoord moet uit minimaal 1 kleine letter! + + + Wachtwoorden komen niet overeen! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Security.ru.resx b/src/Client/Resources/Pages/Identity/Account/Security.ru.resx new file mode 100644 index 0000000..6240d95 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Security.ru.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Изменить пароль + + + Текущий пароль + + + Неверный пароль. + + + Пароль + + + Пароль изменён! + + + Подтверждение пароля + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Account/Security.sv.resx b/src/Client/Resources/Pages/Identity/Account/Security.sv.resx new file mode 100644 index 0000000..1fa3c42 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Account/Security.sv.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ändra lösenord + + + Nuvarande lösenord + + + Fel lösenord. + + + Lösenord + + + Lösenord Ändrat! + + + Lösenordsbekräftelse + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RegisterUserModal.ar.resx b/src/Client/Resources/Pages/Identity/RegisterUserModal.ar.resx new file mode 100644 index 0000000..aa9eed6 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RegisterUserModal.ar.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + المستخدم نشط؟ + + + هل تريد تأكيد البريد الإلكتروني تلقائيًا؟ + + + إلغاء + + + تأكيد كلمة المرور + + + بريد الالكتروني + + + الاسم الأول + + + الكنية + + + كلمه السر + + + رقم الهاتف + + + الملف الشخصي + + + تفاصيل الملف الشخصي + + + تسجيل + + + تسجيل المستخدم + + + حفظ التغييرات + + + اسم االمستخدم + + + مستخدم مسجل! + + + مستخدم مسجل. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RegisterUserModal.de.resx b/src/Client/Resources/Pages/Identity/RegisterUserModal.de.resx new file mode 100644 index 0000000..06149d5 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RegisterUserModal.de.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Benutzer aktivieren? + + + E-Mail automatisch bestätigen? + + + Abbrechen + + + Passwort wiederholen + + + E-Mail + + + Vorname + + + Nachname + + + Passwort + + + Telefon + + + Profil + + + Profildetails + + + Registrieren + + + Benutzer registrieren + + + Änderungen speichern + + + Benutzername + + + Benutzer registriert! + + + Benutzer registriert. Eine Bestätigungsemail wurde an die angegebene E-Mail-Adresse versendet. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RegisterUserModal.en.resx b/src/Client/Resources/Pages/Identity/RegisterUserModal.en.resx new file mode 100644 index 0000000..02e1e86 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RegisterUserModal.en.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Activate User? + + + Auto Confirm Email? + + + Cancel + + + Confirm Password + + + Email + + + First Name + + + Last Name + + + Password + + + Phone Number + + + Profile + + + Profile Details + + + Register + + + Register User + + + Save Changes + + + User Name + + + User Registered! + + + User Registered. Confirmation Mail has been delivered to the Mailbox. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RegisterUserModal.es.resx b/src/Client/Resources/Pages/Identity/RegisterUserModal.es.resx new file mode 100644 index 0000000..ff8e8ee --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RegisterUserModal.es.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ¿Activar usuario? + + + ¿Autoconfirmar correo? + + + Cancelar + + + Confirmar contraseña + + + Correo + + + Nombre + + + Apellido + + + Contraseña + + + Teléfono + + + Perfil + + + Detalle del perfil + + + Registrar + + + Usuario registrado + + + Guardar cambios + + + Usuario + + + Usuario Registrado! + + + Usuario Registrado. Un correo de confirmación fue enviado a su casilla de correo. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RegisterUserModal.fr.resx b/src/Client/Resources/Pages/Identity/RegisterUserModal.fr.resx new file mode 100644 index 0000000..3c2d06a --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RegisterUserModal.fr.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Utilisateur actif ? + + + Confirmer automatiquement le courriel ? + + + Annuler + + + Confirmer le mot de passe + + + Courriel + + + Prénom + + + Nom + + + Mot de passe + + + Numéro de téléphone + + + Profil + + + Détails du profil + + + Inscrire + + + Inscrire l'utilisateur + + + Sauvegarder les changements. + + + Nom d'utilisateur + + + Utilisateur enregistré. + + + Utilisateur enregistré. Un courriel de confirmation a lui été envoyé. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RegisterUserModal.id.resx b/src/Client/Resources/Pages/Identity/RegisterUserModal.id.resx new file mode 100644 index 0000000..b26268a --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RegisterUserModal.id.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktifkan Pengguna? + + + Konfirmasi Email Otomatis? + + + Batal + + + Konfirmasi Sandi + + + Email + + + Nama Depan + + + Nama Belakang + + + Sandi + + + Nomor Telepon + + + Profil + + + Detail Profil + + + Daftar + + + Daftar Pengguna + + + Simpan Perubahan + + + User Name + + + Pengguna Terdaftar! + + + Pengguna Terdaftar. Email konfirmasi telah dikirim ke email Anda. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RegisterUserModal.it.resx b/src/Client/Resources/Pages/Identity/RegisterUserModal.it.resx new file mode 100644 index 0000000..2999209 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RegisterUserModal.it.resx @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Auto conferma E-Mail? + + + Annulla + + + Conferma password + + + Email + + + Nome + + + Cognome + + + Password + + + Telefono + + + Profilo + + + Dettagli profilo + + + Registrati + + + Registra utente + + + Salvare le modifiche + + + Nome utente + + + Utente registrato! + + + Utente registrato. Una mail di conferma è stata inviata alla vostra casella E-Mail. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RegisterUserModal.km.resx b/src/Client/Resources/Pages/Identity/RegisterUserModal.km.resx new file mode 100644 index 0000000..821eb89 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RegisterUserModal.km.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ធ្វើឱ្យអ្នកប្រើប្រាស់សកម្ម? + + + បញ្ជាក់អ៊ីមែលដោយស្វ័យប្រវត្តិ? + + + បោះបង់ + + + បញ្ជាក់ពាក្យសម្ងាត់ + + + អ៊ីមែល + + + នាមខ្លួន + + + នាមត្រកូល + + + ពាក្យសម្ងាត់ + + + លេខទូរស័ព្ទ + + + ប្រវត្តិរូប + + + ប្រវត្តិរូបលម្អិត + + + ចុះឈ្មោះ + + + ចុះឈ្មោះអ្នកប្រើប្រាស់ + + + រក្សាការកែប្រែ + + + ឈ្មោះអ្នកប្រើប្រាស់ + + + អ្នកប្រើប្រាស់ត្រូវបានចុះឈ្មោះរួចរាល់ + + + អ្នកប្រើប្រាស់ត្រូវបានចុះឈ្មោះរួចរាល់ សារអ៊ីម៉ែលបញ្ជាក់នឹងត្រូវផ្ញើទៅកាន់ប្រអប់សាររបស់អ្នក! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RegisterUserModal.nl.resx b/src/Client/Resources/Pages/Identity/RegisterUserModal.nl.resx new file mode 100644 index 0000000..39a5449 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RegisterUserModal.nl.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Gebruiker activeren? + + + E-mail automatisch bevestigen? + + + Annuleren + + + Wachtwoord bevestigen + + + Email + + + Voornaam + + + Achternaam + + + Wachtwoord + + + Telefoonnummer + + + Profiel + + + Profielgegevens + + + Registreren + + + Gebruiker registreren + + + Wijzigingen opslaan + + + Gebruikersnaam + + + Gebruiker geregistreerd! + + + Geregistreerde gebruiker. Bevestigingsmail is afgeleverd bij de mailbox. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RegisterUserModal.ru.resx b/src/Client/Resources/Pages/Identity/RegisterUserModal.ru.resx new file mode 100644 index 0000000..15c69df --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RegisterUserModal.ru.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Активировать пользователя? + + + Подтвердить email автоматически? + + + Отмена + + + Подтверждение пароля + + + Email + + + Имя + + + Фамилия + + + Пароль + + + Номер телефона + + + Профиль + + + Детали профиля + + + Зарегистрировать + + + Регистрация пользователя + + + Сохранить изменения + + + Username + + + Пользователь зарегистрирован + + + Пользователь зарегистрирован. Письмо для подтверждения будет отправлено по почте. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RegisterUserModal.sv.resx b/src/Client/Resources/Pages/Identity/RegisterUserModal.sv.resx new file mode 100644 index 0000000..949f8d8 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RegisterUserModal.sv.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktivera användare? + + + Bekräfta e-post automatiskt? + + + Avbryt + + + Bekräfta lösenord + + + E-post + + + Förnamn + + + Efternamn + + + Lösenord + + + Telefonnummer + + + Profil + + + Profil Detaljer + + + Registrera + + + Registrera användare + + + Spara ändringar + + + Användarnamn + + + Användare Registrerad! + + + Användare registrerad. Bekräftelsemeddelande har skickats till brevlådan. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Reset.ar.resx b/src/Client/Resources/Pages/Identity/Reset.ar.resx new file mode 100644 index 0000000..cfc5c47 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Reset.ar.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + تأكيد كلمة المرور + + + بريد الالكتروني + + + أدخل البريد الإلكتروني لإعادة تعيين كلمة المرور + + + كلمه السر + + + إعادة تعيين كلمة المرور + + + لم يتم العثور على الرمز! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Reset.de.resx b/src/Client/Resources/Pages/Identity/Reset.de.resx new file mode 100644 index 0000000..00eb773 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Reset.de.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Passwort bestätigen + + + E-Mail + + + E-Mail-Adresse eingeben um, das Passwort zurückzusetzen + + + Passwort + + + Passwort zurücksetzen + + + Token nicht gefunden! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Reset.en.resx b/src/Client/Resources/Pages/Identity/Reset.en.resx new file mode 100644 index 0000000..4e4a724 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Reset.en.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Confirm Password + + + E-mail + + + Enter email for password reset + + + Password + + + Reset password + + + Token Not Found! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Reset.es.resx b/src/Client/Resources/Pages/Identity/Reset.es.resx new file mode 100644 index 0000000..cf79b0c --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Reset.es.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Confirmar Contraseña + + + Correo + + + Ingrese correo para blanquear contraseña + + + Contraseña + + + Blanquear Contraseña + + + Token no encontrado! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Reset.fr.resx b/src/Client/Resources/Pages/Identity/Reset.fr.resx new file mode 100644 index 0000000..a38eed5 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Reset.fr.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Confirmer le mot de passe + + + Courriel + + + Entrez le courriel pour la réinitialisation du mot de passe + + + Mot de passe + + + Réinitialiser le mot de passe + + + Jeton introuvable ! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Reset.id.resx b/src/Client/Resources/Pages/Identity/Reset.id.resx new file mode 100644 index 0000000..4e4a724 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Reset.id.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Confirm Password + + + E-mail + + + Enter email for password reset + + + Password + + + Reset password + + + Token Not Found! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Reset.it.resx b/src/Client/Resources/Pages/Identity/Reset.it.resx new file mode 100644 index 0000000..4e4a724 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Reset.it.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Confirm Password + + + E-mail + + + Enter email for password reset + + + Password + + + Reset password + + + Token Not Found! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Reset.km.resx b/src/Client/Resources/Pages/Identity/Reset.km.resx new file mode 100644 index 0000000..895f21c --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Reset.km.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + លេខកូដសម្ងាត់បញ្ជាក់ + + + អ៊ីំម៉ែល + + + បញ្ចូលអ៊ីម៉ែលដើម្បីកំណត់លេខកូដសម្ងាត់ឡើងវិញ + + + លេខកូដសម្ងាត់ + + + កំណត់លេខកូដសម្ងាត់ឡើងវិញ + + + ធូឃីនរកមិនឃើញ! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Reset.nl.resx b/src/Client/Resources/Pages/Identity/Reset.nl.resx new file mode 100644 index 0000000..d1617f7 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Reset.nl.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Wachtwoord bevestigen + + + E-mail + + + Voer uw E-mail in voor het opnieuw instellen van het wachtwoord! + + + Wachtwoord + + + Wachtwoord opnieuw instellen + + + Token niet gevonden! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Reset.ru.resx b/src/Client/Resources/Pages/Identity/Reset.ru.resx new file mode 100644 index 0000000..47208bc --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Reset.ru.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Подтверждение пароля + + + E-mail + + + Введите email для сброса ппароля + + + Пароль + + + Сбросить пароль + + + Токен не найден! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Reset.sv.resx b/src/Client/Resources/Pages/Identity/Reset.sv.resx new file mode 100644 index 0000000..4e4a724 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Reset.sv.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Confirm Password + + + E-mail + + + Enter email for password reset + + + Password + + + Reset password + + + Token Not Found! + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RoleModal.ar.resx b/src/Client/Resources/Pages/Identity/RoleModal.ar.resx new file mode 100644 index 0000000..ea2c146 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RoleModal.ar.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أضف دورًا + + + إلغاء + + + وصف + + + معرف الدور + + + اسم الدور + + + حفظ الدور + + + تحديث الدور + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RoleModal.de.resx b/src/Client/Resources/Pages/Identity/RoleModal.de.resx new file mode 100644 index 0000000..3ad22b6 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RoleModal.de.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Rolle hinzufügen + + + Abbrechen + + + Beschreibung + + + Rollen ID + + + Rollenname + + + Rolle speichern + + + Rolle aktualisieren + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RoleModal.en.resx b/src/Client/Resources/Pages/Identity/RoleModal.en.resx new file mode 100644 index 0000000..a9dfc58 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RoleModal.en.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Role + + + Cancel + + + Description + + + Role ID + + + Role Name + + + Save Role + + + Update Role + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RoleModal.es.resx b/src/Client/Resources/Pages/Identity/RoleModal.es.resx new file mode 100644 index 0000000..059eae4 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RoleModal.es.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Agregar Rol + + + Cancelar + + + Descripción + + + ID de Rol + + + Nombre de Rol + + + Guardar + + + Actualizar + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RoleModal.fr.resx b/src/Client/Resources/Pages/Identity/RoleModal.fr.resx new file mode 100644 index 0000000..88f6a63 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RoleModal.fr.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ajouter un rôle + + + Annuler + + + Description + + + Identifiant du rôle + + + Nom du rôle + + + Sauvegarder le rôle + + + Mettre à jour le rôle + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RoleModal.id.resx b/src/Client/Resources/Pages/Identity/RoleModal.id.resx new file mode 100644 index 0000000..ba2c181 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RoleModal.id.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tambah Wewenang + + + Batal + + + Description + + + Wewenang berhasil dibuat! + + + ID Wewenang + + + Nama Wewenang + + + Simpan Wewenang + + + Perbarui Wewenang + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RoleModal.it.resx b/src/Client/Resources/Pages/Identity/RoleModal.it.resx new file mode 100644 index 0000000..eba449c --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RoleModal.it.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Attivare l'utente? + + + Annulla + + + Description + + + Id ruolo + + + Nome ruolo + + + Salvare ruolo + + + Aggiorna ruolo + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RoleModal.km.resx b/src/Client/Resources/Pages/Identity/RoleModal.km.resx new file mode 100644 index 0000000..eaa3005 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RoleModal.km.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បន្ថែមតួនាទី + + + បោះបង់ + + + ពិពណ៌នា + + + លេខសម្គាល់តួនាទី + + + ឈ្មោះតួនាទី + + + រក្សាទុកតួនាទី + + + ធ្វើបច្ចុប្បន្នភាពតួនាទី + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RoleModal.nl.resx b/src/Client/Resources/Pages/Identity/RoleModal.nl.resx new file mode 100644 index 0000000..26ddbae --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RoleModal.nl.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Rol toevoegen + + + Annuleren + + + Beschrijving + + + Rol-ID + + + Rolnaam + + + Rol opslaan + + + Rol bijwerken + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RoleModal.ru.resx b/src/Client/Resources/Pages/Identity/RoleModal.ru.resx new file mode 100644 index 0000000..a66eebf --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RoleModal.ru.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Добавить роль + + + Отмена + + + Описание + + + ID роли + + + Имя роли + + + Сохранить роль + + + Обновить роль + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/RoleModal.sv.resx b/src/Client/Resources/Pages/Identity/RoleModal.sv.resx new file mode 100644 index 0000000..d01cb2e --- /dev/null +++ b/src/Client/Resources/Pages/Identity/RoleModal.sv.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Lägg till roll + + + Avbryt + + + Description + + + Roll ID + + + Roll Namn + + + Spara Roll + + + Uppdatera Roll + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/RolePermissions.ar.resx b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.ar.resx new file mode 100644 index 0000000..d40cc37 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.ar.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + كل الأذونات + + + تطبيق + + + يحدها + + + كثيف + + + وصف + + + هنا يمكنك ترك تعليق لهذا الإذن للدور الحالي + + + إدارة الإذن + + + إدارة أذونات {0} {1} + + + اسم الإذن + + + ابحث عن أذونات + + + حالة + + + مخطط + + + نوع + + + تحديث أذونات الدور + + + سيتم حفظها فقط عند تحديد الإذن + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/RolePermissions.de.resx b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.de.resx new file mode 100644 index 0000000..bc9a1e6 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.de.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Alle Berechtigungen + + + Anwenden + + + Gerahmt + + + Schmal + + + Beschreibung + + + Hier kann ein Kommentar für diese Berechtigung der aktuellen Rolle hinterlassen werden + + + Berechtigungen verwalten + + + Verwalte {0} Berechtigungen von {1} + + + Berechtigungsname + + + Nach Berechtigungen suchen + + + Status + + + Gebändert + + + Typ + + + Rollenberechtigungen verwalten + + + Wird nur gespeichert wenn Berechtigung ausgewählt + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/RolePermissions.en.resx b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.en.resx new file mode 100644 index 0000000..83f81ed --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.en.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + All Permissions + + + Apply + + + Bordered + + + Dense + + + Description + + + Here you can leave a comment for this permission for the current role + + + Manage Permission + + + Manage {0} {1}'s Permissions + + + Permission Name + + + Search For Permissions + + + Status + + + Striped + + + Type + + + Update Role Permissions + + + Will be saved only when selected Permission + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/RolePermissions.es.resx b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.es.resx new file mode 100644 index 0000000..358154c --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.es.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Todos los Permisos + + + Aplicar + + + Bordeado + + + Denso + + + Descripción + + + Aquí puede dejar un comentario para este permiso para el rol actual + + + Administrar Permisos + + + Administrar los permisos de {0} {1} + + + Nombre del Permiso + + + Buscar Permisos + + + Estado + + + Rayado + + + Tipo + + + Actualizar los Permisos del Rol + + + Será guardado únicamente cuando se seleccione Permisos + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/RolePermissions.fr.resx b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.fr.resx new file mode 100644 index 0000000..8b5380b --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.fr.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Toutes les permissions + + + Appliquer + + + Avec bordures + + + Dense + + + Description + + + Vous pouvez laisser ici un commentaire pour expliquer la permission de ce rôle. + + + Gérer la permission + + + Gérer les permissions du rôle {0} {1} + + + Nom de la permission + + + Rechercher une permission + + + Statut + + + Rayé + + + Type + + + Mettre à jour les permissions du rôle + + + Va être sauvegardé seulement si la permission est sélectionnée + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/RolePermissions.id.resx b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.id.resx new file mode 100644 index 0000000..6698c6a --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.id.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + All Permissions + + + Apply + + + Description + + + Here you can leave a comment for this permission for the current role + + + Pengaturan Izin + + + Pengaturan {0} {1} Izin + + + Nama Wewenang + + + Status + + + Tipe + + + Perbarui Izin Wewenang + + + Will be saved only when selected Permission + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/RolePermissions.it.resx b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.it.resx new file mode 100644 index 0000000..56b3c0d --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.it.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tutti le autorizzazioni + + + Applica + + + Descrizione + + + Qui puoi lasciare un commento per questa autorizzazione per il ruolo corrente + + + Gestisci autorizzazione + + + Gestisci {0} {1} Autorizzazioni + + + Nome autorizzazioni + + + Status + + + Questa è una visualizzazione solo amministratore + + + Salva autorizzazioni + + + Aggiorna le autorizzazioni del ruolo + + + Saranno salvati solo i permessi selezionati + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/RolePermissions.km.resx b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.km.resx new file mode 100644 index 0000000..10fa383 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.km.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + សិទ្ធិទាំងអស់ + + + អនុវត្ត + + + ពិពណ៌នា + + + ទីនេះអ្នកអាចដាក់កំណត់សម្គាល់សិទ្ធិសម្រាប់តួនាទីមួយនេះបាន + + + គ្រង់គ្រងសិទ្ធិ + + + គ្រប់គ្រង {0} {1} សិទ្ធិ + + + ឈ្មោះសិទ្ធិ + + + ស្ថានភាព + + + ប្រភេទ + + + បច្ចុប្បន្នភាពសិទ្ធិរបស់តួនាទី + + + ត្រូវបានរក្សាទុកចំពោះសិទ្ធិដែលបានជ្រើសរើសតែប៉ុណ្ណោះ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/RolePermissions.nl.resx b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.nl.resx new file mode 100644 index 0000000..ac114dc --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.nl.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Alle machtigingen + + + Toepassen + + + Grenst aan + + + Dicht + + + Beschrijving + + + Hier kunt u een opmerking achterlaten voor deze machtiging voor de huidige rol + + + Machtiging beheren + + + Machtigingen van {0} {1} beheren + + + Naam machtiging + + + Zoeken naar machtigingen + + + Status + + + Gestreept + + + Type + + + Rolmachtigingen bijwerken + + + Wordt alleen opgeslagen wanneer deze optie Is geselecteerd + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/RolePermissions.ru.resx b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.ru.resx new file mode 100644 index 0000000..752fc9c --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.ru.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Все права + + + Применить + + + Обрамлённый + + + Компактный + + + Описание + + + Здесь вы можете оставить комментарий к этому разрешению для текущей роли + + + Управление правами + + + Управление правами {0} {1} + + + Имя права + + + Найти права + + + Статус + + + Чередующийся + + + Тип + + + Обновить права роли + + + Будет сохранено только при выбранном разрешении + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/RolePermissions.sv.resx b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.sv.resx new file mode 100644 index 0000000..f45df6a --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/RolePermissions.sv.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + All Permissions + + + Apply + + + Description + + + Here you can leave a comment for this permission for the current role + + + Hantera Behörighet + + + Hantera {0} {1} Behörigheter + + + Permission Name + + + Status + + + Typ + + + Uppdatera Rollbehörigheter + + + Will be saved only when selected Permission + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/Roles.ar.resx b/src/Client/Resources/Pages/Identity/Roles/Roles.ar.resx new file mode 100644 index 0000000..fd3def1 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/Roles.ar.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أجراءات + + + يحدها + + + إنشاء + + + حذف + + + هل تريد حذف الدور بالمعرف {0}؟ + + + كثيف + + + وصف + + + يحرر + + + المعرف + + + إدارة الإذن + + + إدارة الأدوار. + + + لا توجد إجراءات مسموح بها + + + إعادة تحميل + + + دور + + + الأدوار + + + البحث عن الأدوار ... + + + مخطط + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/Roles.de.resx b/src/Client/Resources/Pages/Identity/Roles/Roles.de.resx new file mode 100644 index 0000000..dab2a04 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/Roles.de.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Gerahmt + + + Hinzufügen + + + Löschen + + + Möchtest du die Rolle mit der Id {0} löschen? + + + Schmal + + + Beschreibung + + + Bearbeiten + + + Id + + + Berechtigungen verwalten + + + Rollen verwalten. + + + Keine Aktionen erlaubt + + + Neu laden + + + Rolle + + + Rollen + + + Nach Rollen suchen... + + + Gebändert + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/Roles.en.resx b/src/Client/Resources/Pages/Identity/Roles/Roles.en.resx new file mode 100644 index 0000000..0fa1138 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/Roles.en.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Bordered + + + Create + + + Delete + + + Do you want to delete the role with Id {0}? + + + Dense + + + Description + + + Edit + + + Id + + + Manage Permission + + + Manage Roles. + + + No Allowed Actions + + + Reload + + + Role + + + Roles + + + Search for Roles... + + + Striped + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/Roles.es.resx b/src/Client/Resources/Pages/Identity/Roles/Roles.es.resx new file mode 100644 index 0000000..1d2ab77 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/Roles.es.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acciones + + + Bordeado + + + Crear + + + Borrar + + + ¿Deseas borrar el rol con el Id {0}? + + + Denso + + + Descripción + + + Editar + + + Id + + + Administrar Permisos + + + Gestionar Roles + + + Acciones no Permitidas + + + Recargar + + + Rol + + + Roles + + + Buscar Roles + + + Rayado + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/Roles.fr.resx b/src/Client/Resources/Pages/Identity/Roles/Roles.fr.resx new file mode 100644 index 0000000..24b39cc --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/Roles.fr.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Avec bordures + + + Créer + + + Supprimer + + + Voulez-vous supprimer le rôle d'identifiant {0}? + + + Dense + + + Description + + + Éditer + + + Identifiant + + + Gérer la permission + + + Gérer les rôles + + + Aucune action autorisée + + + Recharger + + + Rôle + + + Rôles + + + Rechercher des rôles + + + Rayé + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/Roles.id.resx b/src/Client/Resources/Pages/Identity/Roles/Roles.id.resx new file mode 100644 index 0000000..7c09d81 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/Roles.id.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tindakan + + + Tambah + + + Hapus + + + Hapus wewenang dengan Id {0}? + + + Description + + + Sunting + + + Id + + + Atur Perizinan + + + Atur Wewenang. + + + No Allowed Actions + + + Muat Ulang + + + Wewenang + + + Wewenang + + + Cari Wewenang... + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/Roles.it.resx b/src/Client/Resources/Pages/Identity/Roles/Roles.it.resx new file mode 100644 index 0000000..fbd73a3 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/Roles.it.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Azioni + + + Crea + + + Elimina + + + Vuoi eliminare il ruolo con Id {0}? + + + Description + + + Modifica + + + Id + + + Gestisci autorizzazione + + + Gestisci ruoli. + + + No Allowed Actions + + + Ricarica + + + Ruolo + + + Ruoli + + + Ricerca ruoli... + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/Roles.km.resx b/src/Client/Resources/Pages/Identity/Roles/Roles.km.resx new file mode 100644 index 0000000..eca7c51 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/Roles.km.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + មុខងារ + + + បង្កើត + + + លុប + + + តើអ្នកចង់លុបតួនាទីជាមួយលេខសម្គាល់ {0} ទេ? + + + ពិពណ៌នា + + + កែប្រែ + + + លេខកូដ + + + គ្រប់គ្រងតួនាទី + + + សកម្មភាពមិនត្រូវបានអនុញ្ញាត្ត + + + ផ្ទុកឡើងវិញ + + + តួនាទី + + + ស្វែងរកតួនាទី ... + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/Roles.nl.resx b/src/Client/Resources/Pages/Identity/Roles/Roles.nl.resx new file mode 100644 index 0000000..e64ccda --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/Roles.nl.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acties + + + Aanmaken + + + Verwijderen + + + Wilt u de rol verwijderen met Id {0}? + + + Beschrijving + + + Bewerken + + + Id + + + Rollen beheren. + + + Geen toegestane acties + + + Herladen + + + Rollen + + + Rollen zoeken... + + + Grenst aan + + + Dicht + + + Machtiging beheren + + + Rol + + + Gestreept + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/Roles.ru.resx b/src/Client/Resources/Pages/Identity/Roles/Roles.ru.resx new file mode 100644 index 0000000..283844d --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/Roles.ru.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Действия + + + Обрамлённый + + + Создать + + + Удалить + + + Вы действительно хотите удалить роль с Id {0}? + + + Компактный + + + Описание + + + Редактировать + + + Id + + + Управление правами + + + Управление ролями. + + + Нет доступных действий + + + Перезагрузить + + + Роль + + + Роли + + + Поиск ролей... + + + Чередующийся + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Roles/Roles.sv.resx b/src/Client/Resources/Pages/Identity/Roles/Roles.sv.resx new file mode 100644 index 0000000..0b9f79f --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Roles/Roles.sv.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Åtgärder + + + Skapa + + + Radera + + + Vill du ta bort rollen med Id {0}? + + + Description + + + Redigera + + + Id + + + Hantera Behörighet + + + Hantera Roller. + + + No Allowed Actions + + + Ladda Om + + + Roll + + + Roller + + + Sök efter Roll... + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserProfile.ar.resx b/src/Client/Resources/Pages/Identity/Users/UserProfile.ar.resx new file mode 100644 index 0000000..9a71a7f --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserProfile.ar.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + نشيط؟ + + + إعدادات المسؤول. + + + البريد الإلكتروني + + + الاسم الأول + + + الكنية + + + رقم الهاتف + + + الملف الشخصي + + + حساب عام + + + حفظ التغييرات + + + هذا هو العرض المسؤول فقط. + + + تم تحديث حالة المستخدم. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserProfile.de.resx b/src/Client/Resources/Pages/Identity/Users/UserProfile.de.resx new file mode 100644 index 0000000..7ae4716 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserProfile.de.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktiv? + + + Administrator Einstellungen + + + E-Mail + + + Vorname + + + Nachname + + + Telefon + + + Profil + + + Öffentliches Profil + + + Änderungen speichern + + + Diese Ansicht ist nur für den Administrator. + + + Benutzerstatus aktualisiert. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserProfile.en.resx b/src/Client/Resources/Pages/Identity/Users/UserProfile.en.resx new file mode 100644 index 0000000..f98093b --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserProfile.en.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Active? + + + Administrator Settings. + + + E-Mail + + + First Name + + + Last Name + + + Phone Number + + + Profile + + + Public Profile + + + Save Changes + + + This is an Administrator Only View. + + + Updated User Status. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserProfile.es.resx b/src/Client/Resources/Pages/Identity/Users/UserProfile.es.resx new file mode 100644 index 0000000..6acdc56 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserProfile.es.resx @@ -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 + + + ¿Activo? + + + Configuraciones de Administrador + + + Correo + + + Nombre + + + Apellido + + + Teléfono + + + Perfil + + + Perfil Público + + + Guardar cambios + + + Esta es una vista solo de Administrador + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserProfile.fr.resx b/src/Client/Resources/Pages/Identity/Users/UserProfile.fr.resx new file mode 100644 index 0000000..4ce1ad8 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserProfile.fr.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actif ? + + + Paramètres pour les administateurs. + + + Courriel + + + Prénom + + + Nom + + + Numéro de téléphone + + + Profil + + + Profil public + + + Sauvegarder les changements + + + Ceci est visible uniquement par les administrateurs. + + + Statut de l'utilisateur mis à jour. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserProfile.id.resx b/src/Client/Resources/Pages/Identity/Users/UserProfile.id.resx new file mode 100644 index 0000000..56bde38 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserProfile.id.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktif? + + + Pengaturan Administrator. + + + E-Mail + + + Nama Depan + + + Nama Belakang + + + Nomor Telepon + + + Profil + + + Profil Publik + + + Simpan Perubahan + + + Ini adalah tampilan khusus Administrator. + + + Perbarui Status Pengguna. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserProfile.it.resx b/src/Client/Resources/Pages/Identity/Users/UserProfile.it.resx new file mode 100644 index 0000000..3bea79d --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserProfile.it.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Attivato ? + + + Impostazioni amministratore. + + + E-Mail + + + Nome + + + Cognome + + + Telefono + + + Profilo + + + Profilo pubblico + + + Salvare le modifiche + + + Questa è una visualizzazione solo amministratore. + + + Aggiorna status utente. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserProfile.km.resx b/src/Client/Resources/Pages/Identity/Users/UserProfile.km.resx new file mode 100644 index 0000000..fb3e505 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserProfile.km.resx @@ -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 + + + សកម្ម? + + + ការកំណត់អ្នកគ្រប់គ្រង + + + អ៊ីមែល + + + នាមខ្លួន + + + នាមត្រកូល + + + លេខទូរស័ព្ទ + + + ប្រវត្តិរូប + + + ប្រវត្តិរូបសាធារណៈ + + + រក្សាទុកការផ្លាស់ប្តូរ + + + ផ្ទាំងសម្រាប់តែអ្នកប្រើប្រាស់មានសិទ្ធិជារដ្ឋបាលប្រព័ន្ធទេ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserProfile.nl.resx b/src/Client/Resources/Pages/Identity/Users/UserProfile.nl.resx new file mode 100644 index 0000000..17c4cd3 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserProfile.nl.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actief? + + + Beheerdersinstellingen + + + E-mail + + + Voornaam + + + Achternaam + + + Telefoonnummer + + + Profiel + + + Openbaar profiel + + + Wijzigingen opslaan + + + Dit is alleen een weergave voor beheerders. + + + Bijgewerkte gebruikersstatus. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserProfile.ru.resx b/src/Client/Resources/Pages/Identity/Users/UserProfile.ru.resx new file mode 100644 index 0000000..ca0349c --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserProfile.ru.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Активный? + + + Настройки администратора. + + + E-Mail + + + Имя + + + Фамилия + + + Номер телефона + + + Профиль + + + Публичные данные профиля + + + Сохранить изменения + + + Эта стрица доступна только администраторам. + + + Статус пользователя обновлён. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserProfile.sv.resx b/src/Client/Resources/Pages/Identity/Users/UserProfile.sv.resx new file mode 100644 index 0000000..ad47191 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserProfile.sv.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktiv? + + + Administratörsinställningar. + + + E-post + + + Förnamn + + + Efternamn + + + Telefonnummer + + + Profil + + + Offentlig profil + + + Spara ändringar + + + Detta är enbart en administratörsvy. + + + Uppdaterad användarstatus. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserRoles.ar.resx b/src/Client/Resources/Pages/Identity/Users/UserRoles.ar.resx new file mode 100644 index 0000000..74663cc --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserRoles.ar.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Bordered + + + Dense + + + Manage {0} {1}'s Roles + + + Role Name + + + Roles Updated! + + + Search For User Roles + + + Status + + + Striped + + + Update User Roles + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserRoles.de.resx b/src/Client/Resources/Pages/Identity/Users/UserRoles.de.resx new file mode 100644 index 0000000..cd38ab3 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserRoles.de.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Gerahmt + + + Schmal + + + Rollen von {0} {1}'s verwalten + + + Rollenname + + + Rollen aktualisiert! + + + Nach Benutzerrollen suchen + + + Status + + + Gebändert + + + Nutzerrolle aktualisieren + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserRoles.en.resx b/src/Client/Resources/Pages/Identity/Users/UserRoles.en.resx new file mode 100644 index 0000000..74663cc --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserRoles.en.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Bordered + + + Dense + + + Manage {0} {1}'s Roles + + + Role Name + + + Roles Updated! + + + Search For User Roles + + + Status + + + Striped + + + Update User Roles + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserRoles.es.resx b/src/Client/Resources/Pages/Identity/Users/UserRoles.es.resx new file mode 100644 index 0000000..f4b8b24 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserRoles.es.resx @@ -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 + + + Bordeado + + + Denso + + + Descripción + + + Administrar Roles de {0} {1} + + + Nombre del Rol + + + Roles actualizados! + + + Buscar por Rol de Usuario + + + Estado + + + Rayado + + + Actualizar Roles de Usuario + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserRoles.fr.resx b/src/Client/Resources/Pages/Identity/Users/UserRoles.fr.resx new file mode 100644 index 0000000..e56749a --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserRoles.fr.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Avec bordures + + + Dense + + + Gérer les rôles de {0} {1} + + + Nom du rôle + + + Rôles mis à jour + + + Rechercher parmis les rôles de l'utilisateur + + + Statut + + + Rayé + + + Mettre à jour les rôles de l'utilisateur + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserRoles.id.resx b/src/Client/Resources/Pages/Identity/Users/UserRoles.id.resx new file mode 100644 index 0000000..5015c9e --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserRoles.id.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Pengaturan {0} {1} Wewenang + + + Nama Wewenang + + + Wewenang Diperbarui! + + + Status + + + Perbarui Wewenang Pengguna + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserRoles.it.resx b/src/Client/Resources/Pages/Identity/Users/UserRoles.it.resx new file mode 100644 index 0000000..ac5b7c0 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserRoles.it.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Manage {0} {1}'s Roles + + + Nome ruolo + + + Ruoli aggiornati! + + + Stato + + + Aggiorna ruoli utente + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserRoles.km.resx b/src/Client/Resources/Pages/Identity/Users/UserRoles.km.resx new file mode 100644 index 0000000..706e0a6 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserRoles.km.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Manage {0} {1}'s Roles + + + ឈ្មោះតួនាទី + + + តួនាទីត្រូវបានធ្វើបច្ចុប្បន្នភាព! + + + ស្ថានភាព + + + បច្ចុប្បន្នភាពតួនាទីរបស់អ្នកប្រើប្រាស់ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserRoles.nl.resx b/src/Client/Resources/Pages/Identity/Users/UserRoles.nl.resx new file mode 100644 index 0000000..e515e39 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserRoles.nl.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Rollen van {0} {1} beheren + + + Rolnaam + + + Rollen bijgewerkt! + + + Status + + + Gebruikersrollen bijwerken + + + Grenst aan + + + Dicht + + + Zoeken naar gebruikersrollen + + + Gestreept + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserRoles.ru.resx b/src/Client/Resources/Pages/Identity/Users/UserRoles.ru.resx new file mode 100644 index 0000000..a934c03 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserRoles.ru.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Обрамлённый + + + Компактный + + + Управление Ролями {0} {1} + + + Имя роли + + + Роли обновлены! + + + Поиск ролей пользователя + + + Статус + + + Чередующийся + + + Обновить роли пользователя + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/UserRoles.sv.resx b/src/Client/Resources/Pages/Identity/Users/UserRoles.sv.resx new file mode 100644 index 0000000..4963a5f --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/UserRoles.sv.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Hantera {0} {1} Roller + + + Rollnamn + + + Roller uppdaterade! + + + Status + + + Uppdatera användarroller + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/Users.ar.resx b/src/Client/Resources/Pages/Identity/Users/Users.ar.resx new file mode 100644 index 0000000..09b0624 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/Users.ar.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أجراءات + + + نشيط + + + يحدها + + + إنشاء + + + كثيف + + + بريد الالكتروني + + + تأكيد البريد الإلكتروني + + + تصدير + + + تم تصدير المستخدمين الذين تمت تصفيتهم + + + الاسم الأول + + + الكنية + + + إدارة الأدوار + + + ادارة المستخدمين + + + لا توجد إجراءات مسموح بها + + + غير مسموح. + + + رقم الهاتف + + + تسجيل مستخدم جديد + + + إعادة تحميل + + + البحث عن المستخدمين + + + مخطط + + + اسم االمستخدم + + + المستخدمون + + + تصدير المستخدمين + + + عرض الصفحة الشخصية + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/Users.de.resx b/src/Client/Resources/Pages/Identity/Users/Users.de.resx new file mode 100644 index 0000000..48abf2c --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/Users.de.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Aktiv + + + Gerahmt + + + Passwort bestätigen + + + Hinzufügen + + + Schmal + + + E-Mail + + + E-Mail bestätigt + + + Export + + + Gefilterte Benutzer exportiert + + + Vorname + + + Nachname + + + Rollen verwalten + + + Nutzer verwalten + + + Keine Aktionen erlaubt + + + Nicht erlaubt. + + + Passwort + + + Telefonnummer + + + Neuen Nutzer anlegen + + + Neu laden + + + Nach Benutzern suchen + + + Gebändert + + + Benutzername + + + Nutzer + + + Benutzer exportiert + + + Profil anzeigen + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/Users.en.resx b/src/Client/Resources/Pages/Identity/Users/Users.en.resx new file mode 100644 index 0000000..2251438 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/Users.en.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Active + + + Bordered + + + Confirm Password + + + Create + + + Dense + + + Email + + + Email Confirmation + + + Export + + + Filtered Users exported + + + First Name + + + Last Name + + + Manage Roles + + + Manage Users + + + No Allowed Actions + + + Not Allowed. + + + Password + + + Phone Number + + + Register New User + + + Reload + + + Search For Users + + + Striped + + + User Name + + + Users + + + Users exported + + + View Profile + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/Users.es.resx b/src/Client/Resources/Pages/Identity/Users/Users.es.resx new file mode 100644 index 0000000..9a9793a --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/Users.es.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acciones + + + Activo + + + Bordeado + + + Crear + + + Denso + + + Correo + + + Confirmación de correo + + + Exportar + + + Usuarios Filtrados exportados + + + Nombre + + + Apellido + + + Gestionar Roles + + + Gestionar Usuarios + + + Acciones no Permitidas + + + No Permitido + + + Teléfono + + + Nuevo usuario + + + Recargar + + + Buscar usuarios + + + Rayado + + + Nombre de Usuario + + + Usuarios + + + Usuarios exportados + + + Ver perfil + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/Users.fr.resx b/src/Client/Resources/Pages/Identity/Users/Users.fr.resx new file mode 100644 index 0000000..771937f --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/Users.fr.resx @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Actif + + + Créer + + + Courriel + + + Confirmation du courriel + + + Exporter + + + Utilisateurs filtrés exportés + + + Prénom + + + Nom + + + Gérer les rôles + + + Gérer les utilisateurs + + + Aucune action autorisée + + + Enregistrer un nouvel utilisateur + + + Recharger + + + Rechercher des utilisateurs + + + Utilisateurs + + + Utilisateurs exportés + + + Voir le profil + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/Users.id.resx b/src/Client/Resources/Pages/Identity/Users/Users.id.resx new file mode 100644 index 0000000..4b1f5dd --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/Users.id.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tindakan + + + Aktif + + + Tambah Pengguna + + + Email + + + Konfirmasi Email + + + Export + + + Filtered Users exported + + + Nama Depan + + + Nama Belakang + + + Atur Wewenang + + + Atur Pengguna + + + No Allowed Actions + + + Tidak Diizinkan. + + + Daftar Pengguna Baru + + + Muat Ulang + + + Cari Pengguna + + + Pengguna + + + Users exported + + + Lihat Profil + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/Users.it.resx b/src/Client/Resources/Pages/Identity/Users/Users.it.resx new file mode 100644 index 0000000..7d50b0c --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/Users.it.resx @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Azioni + + + Attiva + + + Conferma Password + + + Crea + + + Email + + + Conferma E-Mail + + + Export + + + Filtered Users exported + + + Nome + + + Cognome + + + Gestisci ruoli + + + Gestisci utenti + + + No Allowed Actions + + + Non autorizzato. + + + Password + + + Numero di telefono + + + Numero di telefono + + + Registra nuovo utente + + + Ricarica + + + Ricerca utenti + + + Nome utente + + + Nome utente + + + Utenti + + + Users exported + + + Vedi profilo + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/Users.km.resx b/src/Client/Resources/Pages/Identity/Users/Users.km.resx new file mode 100644 index 0000000..7e26532 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/Users.km.resx @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + មុខងារ + + + សកម្ម + + + បង្កើត + + + អ៊ីម៉ែល + + + អ៊ីម៉ែលបញ្ជាក់ + + + នាំចេញ + + + ច្រោះអ្នកប្រើប្រាស់បាននាំចេញ + + + នាមខ្លួន + + + នាមត្រកូល + + + កំណត់សិទ្ធិអ្នកប្រើប្រាស់ + + + កំណត់អ្នកប្រើប្រាស់ + + + សកម្មភាពមិនអនុញ្ញាត្ត + + + ចុះឈ្មោះអ្នកប្រើប្រាស់ថ្មី + + + ផ្ទុកឡើងវិញ + + + ស្វែងរកអ្នកប្រើប្រាស់ + + + អ្នកប្រើប្រាស់ + + + អ្នកប្រើប្រាស់បាននាំចេញ + + + បង្ហាញព័ត៌មានផ្ទាល់ខ្លួន + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/Users.nl.resx b/src/Client/Resources/Pages/Identity/Users/Users.nl.resx new file mode 100644 index 0000000..80ee914 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/Users.nl.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acties + + + Actief + + + Aanmaken + + + Email + + + Bevestiging per e-mail + + + Exporteren + + + Gefilterde gebruikers geëxporteerd + + + Voornaam + + + Achternaam + + + Rollen beheren + + + Gebruikers beheren + + + Geen toegestane acties + + + Nieuwe gebruiker registreren + + + Herladen + + + Gebruikers zoeken + + + Gebruikers + + + Gebruikers geëxporteerd + + + Profiel weergeven + + + Grenst aan + + + Dicht + + + Niet toegestaan. + + + Telefoonnummer + + + Gestreept + + + Gebruikersnaam + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/Users.ru.resx b/src/Client/Resources/Pages/Identity/Users/Users.ru.resx new file mode 100644 index 0000000..9b83555 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/Users.ru.resx @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Действия + + + Активный + + + Обрамлённый + + + Создать + + + Компактный + + + Email + + + Email подтверждён + + + Экспорт в Excel + + + Отфильтрованные пользователи экспортированы + + + Имя + + + Фамилия + + + Управление ролями + + + Управление пользователями + + + Нет доступных действий + + + Не разрешено. + + + Номер телефона + + + Зарегистрировать нового пользователя + + + Перезагрузить + + + Поиск пользователя... + + + Чередующийся + + + UserName + + + Пользователи + + + Пользователи экспортированы + + + Посмотреть профиль + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Identity/Users/Users.sv.resx b/src/Client/Resources/Pages/Identity/Users/Users.sv.resx new file mode 100644 index 0000000..bdc6cd6 --- /dev/null +++ b/src/Client/Resources/Pages/Identity/Users/Users.sv.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Åtgärder + + + Aktiv + + + Skapa + + + E-post + + + E-post Bekräftelse + + + Export + + + Filtered Users exported + + + Förnamn + + + Efternamn + + + Hantera Roller + + + Hantera Användare + + + No Allowed Actions + + + Inte Tillåtet. + + + Registrera ny användare + + + Ladda om + + + Sök efter användare + + + Användare + + + Users exported + + + Visa Profil + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Index.de.resx b/src/Client/Resources/Pages/Index.de.resx new file mode 100644 index 0000000..e998e26 --- /dev/null +++ b/src/Client/Resources/Pages/Index.de.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor WASM Vorlage + + + Erstellt mit dem Besten von + + + Kompatibel mit + + + Komponentenbibliothek + + + Falls du irgendwo steckenbleiben solltest, oder Fragen zu dieser Implementierung hast, habe ich eine Schnellstartanleitung für dich erstellt. + + + Anleitung lesen + + + Version 1.0 + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Index.en.resx b/src/Client/Resources/Pages/Index.en.resx new file mode 100644 index 0000000..14ddac7 --- /dev/null +++ b/src/Client/Resources/Pages/Index.en.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor WASM Boilerplate + + + Built with the goodness of + + + Compatible with + + + Component Library + + + In case you are stuck anywhere or have any queries regarding this implementation, I have compiled a Quick Start Guide for you reference. + + + Read The Guide + + + Version 1.0 + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Index.it.resx b/src/Client/Resources/Pages/Index.it.resx new file mode 100644 index 0000000..cb76ac0 --- /dev/null +++ b/src/Client/Resources/Pages/Index.it.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Blazor WASM Boilerplate + + + Sviluppato con l'ultilizzo di componenti della libreria + + + Compatibile con + + + Component Library + + + Nel caso in cui tu sia bloccato ovunque o hai domande riguardanti questa implementazione, ho compilato una guida rapida per il tuo riferimento. + + + GUIDA + + + Versione 1.0 + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentModal.ar.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.ar.resx new file mode 100644 index 0000000..c32c8b3 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.ar.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أضف مستند + + + الغاء + + + وصف + + + نوع المستند + + + تنزيل + + + رقم المعرف + + + عام؟ + + + حفظ + + + عنوان + + + تحديث + + + تحديث المستند + + + رفع + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentModal.de.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.de.resx new file mode 100644 index 0000000..5c863a4 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.de.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dokument hinzufügen + + + Abbrechen + + + Beschreibung + + + Dokumenttyp + + + Herunterladen + + + Id + + + Öffentlich? + + + Speichern + + + Titel + + + Aktualisieren + + + Dokument aktualisieren + + + Hochladen + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentModal.en.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.en.resx new file mode 100644 index 0000000..87f6df1 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.en.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Document + + + Cancel + + + Description + + + Document Type + + + Download + + + Id + + + Is Public? + + + Save + + + Title + + + Update + + + Update Document + + + Upload + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentModal.es.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.es.resx new file mode 100644 index 0000000..dc71795 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.es.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Agregar Documento + + + Cancelar + + + Descripción + + + Tipo de Documento + + + Descargar + + + Id + + + ¿Es Público? + + + Guardar + + + Título + + + Actualizar + + + Actualizar Documento + + + Subir + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentModal.fr.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.fr.resx new file mode 100644 index 0000000..2e1cc02 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.fr.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ajouter un document + + + Annuler + + + Description + + + Type du document + + + Télécharger + + + Identifiant + + + Est public ? + + + Sauvegarder + + + Titre + + + Mettre à jour + + + Mettre à jour le document + + + Téléverser + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentModal.id.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.id.resx new file mode 100644 index 0000000..afa6f30 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.id.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tambah Dokumen + + + Batal + + + Deskripsi + + + Document Type + + + Unduh + + + Id + + + Dokumen Publik? + + + Simpan + + + Judul + + + Perbarui + + + Perbarui Dokumen + + + Unggah + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentModal.it.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.it.resx new file mode 100644 index 0000000..6c14e3b --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.it.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aggiungi documento + + + Annulla + + + Descrizione + + + Document Type + + + Download + + + Id + + + È pubblico? + + + Salva + + + Titolo + + + Aggiorna + + + Aggiorna Documento + + + Carica + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentModal.km.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.km.resx new file mode 100644 index 0000000..0797109 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.km.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បន្ថែមឯកសារ + + + បោះបង់ + + + ការពិពណ៌នា + + + ប្រភេទឯកសារ + + + ទាញយក + + + លេខកូដសម្គាល់ + + + ជាសាធារណះ? + + + រក្សាទុក + + + ចំណងជើង + + + បច្ចុប្បន្នភាព + + + បច្ចុប្បន្នភាពឯកសារ + + + ផ្ទុកឡើង + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentModal.nl.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.nl.resx new file mode 100644 index 0000000..3da7669 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.nl.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Document toevoegen + + + Annuleren + + + Beschrijving + + + Documenttype + + + Downloaden + + + Id + + + Is het openbaar? + + + Opslaan + + + Titel + + + Update + + + Document bijwerken + + + Uploaden + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentModal.ru.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.ru.resx new file mode 100644 index 0000000..4da98f0 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.ru.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Добавить документ + + + Отмена + + + Описание + + + Тип документа + + + Скачать + + + Id + + + Публичный? + + + Сохранить + + + Заголовок + + + Обновить + + + Обновить документ + + + Загрузить + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentModal.sv.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.sv.resx new file mode 100644 index 0000000..e23d6b5 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentModal.sv.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Lägg till dokument + + + Avbryt + + + Beskrivning + + + Document Type + + + Ladda ner + + + Id + + + Är Offentlig? + + + Spara + + + Rubrik + + + Uppdatera + + + Uppdatera Dokument + + + Ladda Upp + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ar.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ar.resx new file mode 100644 index 0000000..909c248 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ar.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Document Type + + + الغاء + + + وصف + + + رقم المعرف + + + اسم + + + حثظ + + + تحديث + + + تحديث موع المستند + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.de.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.de.resx new file mode 100644 index 0000000..4b9bf26 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.de.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dokumenttyp hinzufügen + + + Abbrechen + + + Beschreibung + + + Id + + + Name + + + Speichern + + + Aktualisieren + + + Dokumenttyp aktualisieren + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.en.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.en.resx new file mode 100644 index 0000000..8b60e1c --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.en.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Document Type + + + Cancel + + + Description + + + Id + + + Name + + + Save + + + Update + + + Update Document Type + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.es.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.es.resx new file mode 100644 index 0000000..647a528 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.es.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Agregar Tipo de Documento + + + Cancelar + + + Descripción + + + Id + + + Nombre + + + Guardar + + + Actualizar + + + Actualizar Tipo de Documento + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.fr.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.fr.resx new file mode 100644 index 0000000..a0b980d --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.fr.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ajouter un type de document + + + Annuler + + + Description + + + Identifiant + + + Nom + + + Sauvegarder + + + Mettre à jour + + + Mettre à jour le type de document + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.km.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.km.resx new file mode 100644 index 0000000..bd07f65 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.km.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បន្ថែមប្រភេទឯកសារ + + + បោះបង់ + + + ពិពណ៌នា + + + លេខកូដ + + + ឈ្មោះ + + + រក្សាទុក + + + បច្ចុប្បន្នភាព + + + បច្ចុប្បន្នភាពប្រភេទឯកសារ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.nl.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.nl.resx new file mode 100644 index 0000000..cb353bf --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.nl.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Documenttype toevoegen + + + Annuleren + + + Beschrijving + + + Id + + + Naam + + + Opslaan + + + Update + + + Documenttype bijwerken + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ru.resx b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ru.resx new file mode 100644 index 0000000..0f7290e --- /dev/null +++ b/src/Client/Resources/Pages/Misc/AddEditDocumentTypeModal.ru.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Добавить тип документа + + + Отмена + + + Описание + + + Id + + + Наименование + + + Сохранить + + + Обновить + + + Обновить тип документа + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentStore.ar.resx b/src/Client/Resources/Pages/Misc/DocumentStore.ar.resx new file mode 100644 index 0000000..ae36281 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentStore.ar.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أجراءات + + + يحدها + + + تصفح المستندات المتاحة. + + + إنشاء + + + تاريخ الإنشاء + + + حذف + + + حذف المحتوى + + + كثيف + + + وصف + + + متجر المستندات + + + نوع الوثيقة + + + تحميل + + + يحرر + + + المعرف + + + عام + + + إدارة السمات الموسعة + + + لا توجد إجراءات مسموح بها + + + صاحب + + + إعادة تحميل + + + بحث + + + مخطط + + + عنوان + + + أنت + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentStore.de.resx b/src/Client/Resources/Pages/Misc/DocumentStore.de.resx new file mode 100644 index 0000000..d7f094f --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentStore.de.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Gerahmt + + + Verfügbare Dokumente durchsuchen. + + + Erstellen + + + Erstellungsdatum + + + Löschen + + + Inhalt löschen + + + Schmal + + + Beschreibung + + + Dokumentenspeicher + + + Dokumenttyp + + + Herunterladen + + + Bearbeiten + + + Id + + + Öffentlich + + + Erweiterte Attribute verwalten + + + Keine Aktionen erlaubt + + + Eigentümer + + + Neu laden + + + Suche + + + Gebändert + + + Titel + + + Du + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentStore.en.resx b/src/Client/Resources/Pages/Misc/DocumentStore.en.resx new file mode 100644 index 0000000..68cb0bb --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentStore.en.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Bordered + + + Browse Available Documents. + + + Create + + + Date Created + + + Delete + + + Delete Content + + + Dense + + + Description + + + Document Store + + + Document Type + + + Download + + + Edit + + + Id + + + Is Public + + + Manage Extended Attributes + + + No Allowed Actions + + + Owner + + + Reload + + + Search + + + Striped + + + Title + + + you + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentStore.es.resx b/src/Client/Resources/Pages/Misc/DocumentStore.es.resx new file mode 100644 index 0000000..74654a0 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentStore.es.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acciones + + + Bordeado + + + Navegar Documentos Disponibles. + + + Crear + + + Fecha de Creación + + + Borrar + + + ¿Desea eliminar el registro? + + + Denso + + + Descripción + + + Almacén de Documentos + + + Tipo de Documento + + + Descarga + + + Editar + + + Id + + + Es Público + + + Administrar Atributos Extendidos + + + Acciones no Permitidas + + + Propietario + + + Recargar + + + Buscar + + + Rayado + + + Título + + + Ud. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentStore.fr.resx b/src/Client/Resources/Pages/Misc/DocumentStore.fr.resx new file mode 100644 index 0000000..5247805 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentStore.fr.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Avec bordures + + + Parcourir les documents disponibles. + + + Créer + + + Date de création + + + Supprimer + + + Supprimer l'élément + + + Dense + + + Description + + + Stockage de documents + + + Type de document + + + Télécharger + + + Éditer + + + Identifiant + + + Est public + + + Gérer les attributs étendus + + + Aucune action autorisée + + + Propriétaire + + + Recharger + + + Rechercher + + + Rayé + + + Titre + + + vous + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentStore.id.resx b/src/Client/Resources/Pages/Misc/DocumentStore.id.resx new file mode 100644 index 0000000..4586f7d --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentStore.id.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Tindakan + + + Telusuri Dokumen yang Tersedia. + + + Tambah Dokumen + + + Tanggal Dibuat + + + Hapus + + + Delete Content + + + Deskripsi + + + Penyimpanan Dokumen + + + Document Type + + + Unduh + + + Sunting + + + Id + + + Dokumen Publik + + + Manage Extended Attributes + + + No Allowed Actions + + + Pemilik + + + Muat Ulang + + + Cari + + + Judul + + + you + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentStore.it.resx b/src/Client/Resources/Pages/Misc/DocumentStore.it.resx new file mode 100644 index 0000000..51932c2 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentStore.it.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Azioni + + + Sfoglia i documenti disponibili. + + + Crea + + + Data di Creazione + + + Elimina + + + Delete Content + + + Descrizione + + + Archivio documenti + + + Document Type + + + Download + + + Modifica + + + Id + + + E' Pubblico + + + Manage Extended Attributes + + + No Allowed Actions + + + Proprietario + + + Ricarica + + + Cerca + + + Titolo + + + you + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentStore.km.resx b/src/Client/Resources/Pages/Misc/DocumentStore.km.resx new file mode 100644 index 0000000..d1d4b53 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentStore.km.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + សកម្មភាព + + + រកមើលឯកសារមានទាំងអស់ + + + បង្កើត + + + កាលបរិឆ្ឆេទបង្កើត + + + លុប + + + អត្ថបទត្រូវបានលុប + + + ការពិពណ៌នា + + + តំបន់រក្សាទុកឯកសារ + + + ប្រភេទឯកសារ + + + ទាញយក + + + កែប្រែ + + + លេខកូដសម្ងាត់ + + + ធ្វើអោយជាសាធារណះ + + + គ្រប់គ្រង ជួរឈរបន្ថែម + + + សកម្មភាពមិនបានអនុញ្ញាត្ត + + + ម្ខាស់ + + + ផ្ទុកឡើងវិញ + + + ស្វែងរក + + + ចំណងជើង + + + អ្នក + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentStore.nl.resx b/src/Client/Resources/Pages/Misc/DocumentStore.nl.resx new file mode 100644 index 0000000..5f962f4 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentStore.nl.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acties + + + Grenst aan + + + Blader door beschikbare documenten. + + + Aanmaken + + + Datum gemaakt + + + Verwijderen + + + Inhoud verwijderen + + + Dicht + + + Beschrijving + + + Documentopslag + + + Documenttype + + + Downloaden + + + Bewerken + + + Id + + + Is openbaar + + + Uitgebreide kenmerken beheren + + + Geen toegestane acties + + + Eigenaar + + + Herladen + + + Zoeken + + + Gestreept + + + Titel + + + jij + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentStore.ru.resx b/src/Client/Resources/Pages/Misc/DocumentStore.ru.resx new file mode 100644 index 0000000..6f251e4 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentStore.ru.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Действия + + + Обрамлённый + + + Обзор доступных документов. + + + Создать + + + Дата создания + + + Удалить + + + Удалить контент + + + Компактный + + + Описание + + + Хранилище документов + + + Тип документа + + + Скачать + + + Редактировать + + + Id + + + Публичный + + + Управление атрибутами + + + Нет доступных действий + + + Владелец + + + Перезагрузить + + + Поиск документов + + + Чередующийся + + + Заголовок + + + Вы + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentStore.sv.resx b/src/Client/Resources/Pages/Misc/DocumentStore.sv.resx new file mode 100644 index 0000000..869cdea --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentStore.sv.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Åtgärder + + + Bläddra i tillgängliga dokument. + + + Skapa + + + Skapat datum + + + Radera + + + Delete Content + + + Beskrivning + + + Dokument Förvaring + + + Document Type + + + Ladda Ner + + + Ändra + + + Id + + + Är Offentlig + + + Manage Extended Attributes + + + No Allowed Actions + + + Ägare + + + Ladda Om + + + Sök + + + Rubrik + + + you + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentTypes.ar.resx b/src/Client/Resources/Pages/Misc/DocumentTypes.ar.resx new file mode 100644 index 0000000..d317b38 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentTypes.ar.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أجراءات + + + يحدها + + + إنشاء + + + حذف + + + حذف المحتوى + + + كثيف + + + وصف + + + أنواع المستندات + + + أنواع المستندات التي تم تصديرها + + + يحرر + + + يصدر + + + تم تصدير أنواع المستندات التي تمت تصفيتها + + + المعرف + + + إدارة أنواع المستندات. + + + اسم + + + لا توجد إجراءات مسموح بها + + + إعادة تحميل + + + ابحث عن أنواع المستندات + + + مخطط + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentTypes.de.resx b/src/Client/Resources/Pages/Misc/DocumentTypes.de.resx new file mode 100644 index 0000000..930df1f --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentTypes.de.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Gerahmt + + + Erstellen + + + Löschen + + + Inhalt löschen + + + Schmal + + + Beschreibung + + + Dokumenttypen + + + Dokumenttypen exportiert + + + Bearbeiten + + + Export + + + Gefilterte Dokumenttypen exportiert + + + Id + + + Dokumenttypen verwalten. + + + Name + + + Keine Aktionen erlaubt + + + Neu laden + + + Nach Dokumenttypen suchen + + + Gebändert + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentTypes.en.resx b/src/Client/Resources/Pages/Misc/DocumentTypes.en.resx new file mode 100644 index 0000000..ba73b34 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentTypes.en.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Bordered + + + Create + + + Delete + + + Delete Content + + + Dense + + + Description + + + Document Types + + + Document Types exported + + + Edit + + + Export + + + Filtered Document Types exported + + + Id + + + Manage Document Types. + + + Name + + + No Allowed Actions + + + Reload + + + Search for Document Types + + + Striped + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentTypes.es.resx b/src/Client/Resources/Pages/Misc/DocumentTypes.es.resx new file mode 100644 index 0000000..527d617 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentTypes.es.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acciones + + + Bordeado + + + Crear + + + Borrar + + + ¿Desea borrar el registro? + + + Denso + + + Descripción + + + Tipos de Documentos + + + Tipos de Documentos exportados + + + Editar + + + Exportar + + + Tipos de Documentos Filtrados exportados + + + Id + + + Administar Tipos de Documentos. + + + Nombre + + + Acciones no Permitidas + + + Recargar + + + Buscar Tipos de Documentos + + + Rayado + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentTypes.fr.resx b/src/Client/Resources/Pages/Misc/DocumentTypes.fr.resx new file mode 100644 index 0000000..19ca0fb --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentTypes.fr.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Avec bordures + + + Création + + + Suppression + + + Supprimer l'élément + + + Dense + + + Description + + + Types de documents + + + Types de documents exportés + + + Éditer + + + Exporter + + + Types de documents filtrés exportés + + + Identifiants + + + Gérer les types de documents + + + Nom + + + Aucune action autorisée + + + Recharger + + + Rechercher parmis les types de documents + + + Rayé + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentTypes.km.resx b/src/Client/Resources/Pages/Misc/DocumentTypes.km.resx new file mode 100644 index 0000000..2ab117c --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentTypes.km.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + សកម្មភាព + + + ព្រុំប្រទល់ + + + បង្កើត + + + លុប + + + លុបខ្លឹមសារ + + + ពង្រួម + + + ពិពណ៌នា + + + ប្រភេទឯកសារ + + + ប្រភេទឯកសារនាំចេញ + + + កែប្រែ + + + នាំចេញ + + + ច្រោះប្រភេទឯកសារនាំចេញ + + + លេខកូដ + + + គ្រប់គ្រងប្រភេទឯកសារ + + + ឈ្មោះ + + + សកម្មភាពមិនអនុញ្ញាត្ត + + + ផ្ទុកឡើងវិញ + + + ស្វែងរកប្រភេទឯកសារ + + + ឆ្លាស់ពណ៌ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentTypes.nl.resx b/src/Client/Resources/Pages/Misc/DocumentTypes.nl.resx new file mode 100644 index 0000000..65e8af1 --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentTypes.nl.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acties + + + Grenst aan + + + Aanmaken + + + Verwijderen + + + Inhoud verwijderen + + + Dicht + + + Beschrijving + + + Documenttypen + + + Geëxporteerde documenttypen + + + Bewerken + + + Exporteren + + + Gefilterde documenttypen geëxporteerd + + + Id + + + Documenttypen beheren. + + + Naam + + + Geen toegestane acties + + + Herladen + + + Zoeken naar documenttypen + + + Gestreept + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Misc/DocumentTypes.ru.resx b/src/Client/Resources/Pages/Misc/DocumentTypes.ru.resx new file mode 100644 index 0000000..1d369bb --- /dev/null +++ b/src/Client/Resources/Pages/Misc/DocumentTypes.ru.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Действия + + + Обрамлённый + + + Создать + + + Удалить + + + Удалить контент + + + Компактный + + + Описание + + + Типы документов + + + Типы документов экспортированы + + + Редактировать + + + Экспорт в Excel + + + Отфильтрованные типы документов экспортированы + + + Id + + + Управление типами документов. + + + Наименование + + + Нет доступных действий + + + Перезагрузить + + + Поиск типов документов... + + + Чередующийся + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Multitenancy/Tenants.de.resx b/src/Client/Resources/Pages/Multitenancy/Tenants.de.resx new file mode 100644 index 0000000..f0beede --- /dev/null +++ b/src/Client/Resources/Pages/Multitenancy/Tenants.de.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktiv + + + E-Mail-Adresse des Administrators + + + Name + + + Gültig bis + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Multitenancy/Tenants.en.resx b/src/Client/Resources/Pages/Multitenancy/Tenants.en.resx new file mode 100644 index 0000000..383c6a7 --- /dev/null +++ b/src/Client/Resources/Pages/Multitenancy/Tenants.en.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Active + + + Admin Email + + + Name + + + Valid Upto + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Multitenancy/Tenants.it.resx b/src/Client/Resources/Pages/Multitenancy/Tenants.it.resx new file mode 100644 index 0000000..356ba8f --- /dev/null +++ b/src/Client/Resources/Pages/Multitenancy/Tenants.it.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Attivo + + + Email (Adm) + + + Nome + + + Valito fino a + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.de.resx b/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.de.resx new file mode 100644 index 0000000..75eeef9 --- /dev/null +++ b/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.de.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Abbrechen + + + Aktuelles Ablaufdatum + + + Neues Ablaufdatum + + + Aktualisieren + + + Abonnement aktualisieren + + + Abonnement aktualisiert. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.en.resx b/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.en.resx new file mode 100644 index 0000000..c788ea0 --- /dev/null +++ b/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.en.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Current Expiry Date + + + New Expiry Date + + + Upgrade + + + Upgrade Subscription + + + Upgraded Subscription. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.it.resx b/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.it.resx new file mode 100644 index 0000000..87d54c5 --- /dev/null +++ b/src/Client/Resources/Pages/Multitenancy/UpgradeSubscriptionModal.it.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annulla + + + Data di scadenza + + + Nuova data di scadenza + + + Aggiornamento + + + Aggiorna Subscription + + + Subscription Aggiornata. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/AuditLogs.ar.resx b/src/Client/Resources/Pages/Personal/AuditLogs.ar.resx new file mode 100644 index 0000000..2bacb36 --- /dev/null +++ b/src/Client/Resources/Pages/Personal/AuditLogs.ar.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + مسارات المراجعة + + + تم تصدير مسارات التدقيق + + + يحدها + + + الغاء + + + مسح + + + تتأثر الأعمدة + + + تاريخ + + + النطاق الزمني للبحث + + + كثيف + + + تفاصيل معرف الممر + + + تصدير إلى Excel + + + تم تصدير مسارات التدقيق المصفاة + + + إخفاء + + + المعرف + + + محلي + + + قيم جديدة + + + موافق + + + المفتاح الأساسي + + + ابحث عن مسارات + + + ابحث في القيم الجديدة + + + ابحث في القيم القديمة + + + ابحث في القيم القديمة + + + عرض + + + مخطط + + + اسم الجدول + + + تفاضيل + + + نوع + + + التوقيت العالمي + + + أنشطتك الأخيرة. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/AuditLogs.de.resx b/src/Client/Resources/Pages/Personal/AuditLogs.de.resx new file mode 100644 index 0000000..f16282e --- /dev/null +++ b/src/Client/Resources/Pages/Personal/AuditLogs.de.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Prüfpfade + + + Prüfpfade aktualisiert + + + Gerahmt + + + Abbrechen + + + Leeren + + + Betroffene Spalten + + + Datum + + + Zeitraum für Suche + + + Schmal + + + Details zur Prüfpfad-Id + + + Zu Excel exportieren + + + Gefilterte Prüfpfade exported + + + Verstecken + + + Id + + + Lokal + + + Neue Werte + + + Ok + + + Alte Werte + + + Primärschlüssekl + + + Nach Prüfpfaden suchen + + + In neuen Werten suchen + + + In alten Werten suchen + + + Anzeigen + + + Gebändert + + + Tabellenname + + + Prüfpfad-Details + + + Typ + + + UTC + + + Deine letzten Aktivitäten. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/AuditLogs.en.resx b/src/Client/Resources/Pages/Personal/AuditLogs.en.resx new file mode 100644 index 0000000..c6b6a01 --- /dev/null +++ b/src/Client/Resources/Pages/Personal/AuditLogs.en.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Audit Trails + + + Audit Trails exported + + + Bordered + + + Cancel + + + Clear + + + Columns Affected + + + Date + + + Date Range For Searching + + + Dense + + + Details for Trail ID + + + Export To Excel + + + Filtered Audit Trails exported + + + Hide + + + Id + + + Local + + + New Values + + + Ok + + + Old Values + + + Primary Key + + + Search for Trails + + + Search in New Values + + + Search in Old Values + + + Show + + + Striped + + + Table Name + + + Trail Details + + + Type + + + UTC + + + Your Recent Activities. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/AuditLogs.es.resx b/src/Client/Resources/Pages/Personal/AuditLogs.es.resx new file mode 100644 index 0000000..a363e1c --- /dev/null +++ b/src/Client/Resources/Pages/Personal/AuditLogs.es.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Registro de Auditoría + + + Registro de Auditoría exportado + + + Bordeado + + + Cancelar + + + Limpiar + + + Columnas Afectadas + + + Fecha + + + Rango de Fechas para Búsqueda + + + Denso + + + Detalles para Registro ID + + + Exportar a Excel + + + Registros de Auditoría Filtrados exportados + + + Ocultar + + + Id + + + Local + + + Nuevos Valores + + + Ok + + + Valores Anteriores + + + Clave Primaria + + + Buscar Registros + + + Buscar en Valores Nuevos + + + Buscar en Valores Anteriores + + + Mostrar + + + Rayado + + + Nombre de Tabla + + + Detalle de Registro + + + Tipo + + + UTC + + + Su actividad reciente. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/AuditLogs.fr.resx b/src/Client/Resources/Pages/Personal/AuditLogs.fr.resx new file mode 100644 index 0000000..f2029e1 --- /dev/null +++ b/src/Client/Resources/Pages/Personal/AuditLogs.fr.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Pistes d'audit + + + Pistes d'audit exportées + + + Avec bordures + + + Annulées + + + Effacer + + + Colonnes affectées + + + Date + + + Plage de dates pour la recherche + + + Dense + + + Détail de la piste d'identifiant + + + Exporter vers Excel + + + Pistes d'audit filtrés exportées + + + Cacher + + + Identifiant + + + Local + + + Nouvelles valeurs + + + OK + + + Anciennes valeurs + + + Clé primaire + + + Rechercher des pistes + + + Rechercher parmis les nouvelles valeurs + + + Rechercher parmis les anciennes valeurs + + + Afficher + + + Rayé + + + Nom de la table + + + Détails de la piste + + + Type + + + UTC + + + Activité récente + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/AuditLogs.it.resx b/src/Client/Resources/Pages/Personal/AuditLogs.it.resx new file mode 100644 index 0000000..c3eab91 --- /dev/null +++ b/src/Client/Resources/Pages/Personal/AuditLogs.it.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Registro Attività + + + Audit Trails exported + + + Colonne Interessate + + + Data + + + Dettagli per ID Attività + + + Esporta in Excel + + + Filtered Audit Trails exported + + + Nascondi + + + Id + + + Locale + + + Nuovi valori + + + Vecchi valori + + + Chiave Primaria + + + Cerca Attività + + + Mostra + + + Nome Tabella + + + Dettagli Attività + + + Tipo + + + UTC + + + Le tue Attività Recenti. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/AuditLogs.km.resx b/src/Client/Resources/Pages/Personal/AuditLogs.km.resx new file mode 100644 index 0000000..d3a1341 --- /dev/null +++ b/src/Client/Resources/Pages/Personal/AuditLogs.km.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + កំណត់ត្រាប្រព័ន្ធ + + + កំណត់ត្រាប្រព័ន្ធ នាំចេញ + + + ជួរឈរដែលបានកែប្រែ + + + កាលបរិច្ឆេទ + + + កំណត់ត្រាលម្អិតសម្រាប់កំណត់ត្រាដែលមានលេខសម្ងាល់ + + + បម្លែងជា​ Excel + + + ច្រោះកំណត់ត្រាប្រព័ន្ធនាំចេញ + + + បិទ + + + លេខកូដសម្ងាល់ + + + ខាងក្នុង + + + តម្លៃថ្មី + + + តម្លៃចាស់ + + + លេខសម្គាល់គោល + + + ស្វែងរកកំណត់ត្រាប្រព័ន្ធ + + + បង្ហាញ + + + ឈ្មោះតារាង + + + កំណត់ត្រាលម្អិត + + + ប្រភេទ + + + ម៉ោងសកល + + + សកម្មភាពរបស់អ្នកចុងក្រោយ + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/AuditLogs.nl.resx b/src/Client/Resources/Pages/Personal/AuditLogs.nl.resx new file mode 100644 index 0000000..b84bf72 --- /dev/null +++ b/src/Client/Resources/Pages/Personal/AuditLogs.nl.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Audit Trails + + + Audit Trails geëxporteerd + + + Grenst aan + + + Annuleren + + + Duidelijk + + + Betrokken kolommen + + + Datum + + + Datumbereik voor zoeken + + + Dicht + + + Details voor Trail ID + + + Exporteren naar Excel + + + Gefilterde controletrails geëxporteerd + + + Verbergen + + + Id + + + Lokaal + + + Nieuwe Waarden + + + OK + + + Oude Waarden + + + Primary Key + + + Zoeken naar paden + + + Zoeken in nieuwe waarden + + + Zoeken in oude waarden + + + Tonen + + + Gestreept + + + Table Naam + + + Trail Details + + + Type + + + UTC + + + Uw recente activiteiten. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/AuditLogs.ru.resx b/src/Client/Resources/Pages/Personal/AuditLogs.ru.resx new file mode 100644 index 0000000..583705f --- /dev/null +++ b/src/Client/Resources/Pages/Personal/AuditLogs.ru.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Журналы аудита + + + Журналы аудита экспортированы + + + Обрамлённый + + + Отмена + + + Очистить + + + Затронутые стобцы + + + Дата + + + Диапазон дат для поиска + + + Компактный + + + Детали для записи с ID + + + Экспорт в Excel + + + Отфильтрованные журналы аудита экспортированы + + + Скрыть + + + Id + + + Локальное + + + Новые значения + + + Ok + + + Старые значения + + + Первичный ключ + + + Поиск в журналах + + + Искать в новых значениях + + + Искать в старых значениях + + + Показать + + + Чередующийся + + + Имя таблицы + + + Детали записи в журнале + + + Тип + + + UTC + + + Ваша текущая активность. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/AuditLogs.sv.resx b/src/Client/Resources/Pages/Personal/AuditLogs.sv.resx new file mode 100644 index 0000000..3b95b8b --- /dev/null +++ b/src/Client/Resources/Pages/Personal/AuditLogs.sv.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Granskningsspår + + + Audit Trails exported + + + Berörda kolumner + + + Datum + + + Detaljer för Spår ID + + + Exportera till Excel + + + Filtered Audit Trails exported + + + Göm + + + Id + + + Lokalt + + + Nya Värden + + + Gamla Värden + + + Primärnyckel + + + Sök efter spår + + + Visa + + + Tabellnamn + + + Spår Detaljer + + + Typ + + + UTC + + + Dina senaste aktiviteter. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/Dashboard.ar.resx b/src/Client/Resources/Pages/Personal/Dashboard.ar.resx new file mode 100644 index 0000000..a803152 --- /dev/null +++ b/src/Client/Resources/Pages/Personal/Dashboard.ar.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أبريل + + + أغسطس + + + العلامات التجارية + + + الرسوم البيانية قادمة قريبا + + + لوحة القيادة + + + ديسمبر + + + سمات المستند الممتدة + + + أنواع المستندات + + + وثائق + + + فبراير + + + يناير + + + يوليو + + + يونيو + + + مارس + + + مايو + + + نوفمبر + + + أكتوبر + + + منتجات + + + رؤى سريعة. + + + تحديثات الوقت الحقيقي & رؤى مع SignalR. + + + الأدوار المسجلة + + + المستخدمون المسجلون + + + سبتمبر + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/Dashboard.de.resx b/src/Client/Resources/Pages/Personal/Dashboard.de.resx new file mode 100644 index 0000000..a20fd84 --- /dev/null +++ b/src/Client/Resources/Pages/Personal/Dashboard.de.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Apr + + + Aug + + + Marken + + + Diagramme kommen bald... + + + Dashboard + + + Dez + + + Erweiterte Dokumentattribute + + + Dokumenttypen + + + Dokumente + + + Feb + + + Jan + + + Jul + + + Jun + + + Mär + + + Mai + + + Nov + + + Okt + + + Produkte + + + Schnelle Einblicke. + + + Echtzeitaktualisierungen & Einblicke mit SignalR. + + + Registrierte Rollen + + + Registrierte Benutzer + + + Sep + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/Dashboard.en.resx b/src/Client/Resources/Pages/Personal/Dashboard.en.resx new file mode 100644 index 0000000..0ec5a3f --- /dev/null +++ b/src/Client/Resources/Pages/Personal/Dashboard.en.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Apr + + + Aug + + + Brands + + + Charts comming soon ish... + + + Dashboard + + + Dec + + + Document Extended Attributes + + + Document Types + + + Documents + + + Feb + + + Jan + + + Jul + + + Jun + + + Mar + + + May + + + Nov + + + Oct + + + Products + + + Quick Insights. + + + Realtime Updates & Insights with SignalR. + + + Registered Roles + + + Registered Users + + + Sep + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/Dashboard.es.resx b/src/Client/Resources/Pages/Personal/Dashboard.es.resx new file mode 100644 index 0000000..e278606 --- /dev/null +++ b/src/Client/Resources/Pages/Personal/Dashboard.es.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Abr + + + Ago + + + Marcas + + + Próximamente gráficos... + + + Panel de Control + + + Dic + + + Atributos Extendidos de Documentos + + + Tipos de Documentos + + + Documentos + + + Feb + + + Ene + + + Jul + + + Jun + + + Mar + + + May + + + Nov + + + Oct + + + Productos + + + Perspectivas Rápidas. + + + Actualizaciones en Tiempo Real & Perspectivas con SignalR. + + + Roles Registrados + + + Usuarios Registrados + + + Sep + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/Dashboard.fr.resx b/src/Client/Resources/Pages/Personal/Dashboard.fr.resx new file mode 100644 index 0000000..819beeb --- /dev/null +++ b/src/Client/Resources/Pages/Personal/Dashboard.fr.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Avr. + + + Août + + + Marques + + + Tableau de bord + + + Déc. + + + Attributs étendus des documents + + + Types de documents + + + Documents + + + Févr. + + + Janv. + + + Juill. + + + Juin + + + Mars + + + Mai + + + Nov. + + + Oct. + + + Produits + + + Aperçus rapides. + + + Mises à jour en temps réel & aperçus avec SignalR. + + + Roles enregistrés + + + Utilisateurs enregistrés + + + Sept. + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/Dashboard.id.resx b/src/Client/Resources/Pages/Personal/Dashboard.id.resx new file mode 100644 index 0000000..c7a7fed --- /dev/null +++ b/src/Client/Resources/Pages/Personal/Dashboard.id.resx @@ -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 + + + Merek + + + Grafik akan segera hadir... + + + Dasbor + + + Document Extended Attributes + + + Document Types + + + Documents + + + Produk + + + Wawasan Singkat. + + + Wewenang Terdaftar + + + Pengguna Terdaftar + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/Dashboard.it.resx b/src/Client/Resources/Pages/Personal/Dashboard.it.resx new file mode 100644 index 0000000..316467e --- /dev/null +++ b/src/Client/Resources/Pages/Personal/Dashboard.it.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Prodotti + + + Utenti registrati + + + Marche + + + Grafici... coming soon... + + + Dashboard + + + Approfondimenti rapidi. + + + Ruoli registrati + + + Documenti + + + Tipi di documenti + + + Document Extended Attributes + + + Aggiornamenti in tempo reale e approfondimenti con SignalR + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/Dashboard.km.resx b/src/Client/Resources/Pages/Personal/Dashboard.km.resx new file mode 100644 index 0000000..809c44a --- /dev/null +++ b/src/Client/Resources/Pages/Personal/Dashboard.km.resx @@ -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 + + + ម៉ាក + + + ផ្ទាំងឆាតនឹងមកដល់ឆាប់ៗនេះ + + + ផ្ទាំងទិន្នន័យ + + + ជួរឈរឯកសារ + + + ប្រភេទឯកសារ + + + ឯកសារ + + + ផលិតផល + + + ផ្ទាំងទិន្នន័យសង្ខេប + + + ចំនួនតួនាទីសរុប + + + ចំនួនអ្នកប្រើប្រាស់សរុប + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/Dashboard.nl.resx b/src/Client/Resources/Pages/Personal/Dashboard.nl.resx new file mode 100644 index 0000000..d5e9851 --- /dev/null +++ b/src/Client/Resources/Pages/Personal/Dashboard.nl.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Apr + + + Aug + + + Merken + + + Grafieken binnenkort ish... + + + Dashboard + + + Dec + + + Uitgebreide kenmerken van document + + + Documenttypen + + + Documenten + + + Februari + + + Jan + + + Jul + + + Jun + + + Mar + + + Mei + + + Nov + + + Oct + + + Producten + + + Snelle inzichten. + + + Realtime updates en inzichten met SignalR. + + + Geregistreerde rollen + + + Geregistreerde gebruikers + + + Sep + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/Dashboard.ru.resx b/src/Client/Resources/Pages/Personal/Dashboard.ru.resx new file mode 100644 index 0000000..fab4703 --- /dev/null +++ b/src/Client/Resources/Pages/Personal/Dashboard.ru.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Апр + + + Авг + + + Брендов + + + Графики скоро появятся ... + + + Dashboard + + + Дек + + + Расширенных атрибутов документов + + + Типов документов + + + Документов + + + Фев + + + Янв + + + Июл + + + Июн + + + Мрт + + + Май + + + Ноя + + + Окт + + + Продуктов + + + Быстрая информация. + + + Обновления и аналитика в реальном времени с помощью SignalR. + + + Ролей + + + Пользователей + + + Сен + + \ No newline at end of file diff --git a/src/Client/Resources/Pages/Personal/Dashboard.sv.resx b/src/Client/Resources/Pages/Personal/Dashboard.sv.resx new file mode 100644 index 0000000..25c864d --- /dev/null +++ b/src/Client/Resources/Pages/Personal/Dashboard.sv.resx @@ -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 + + + Varumärken + + + Diagram kommer ganska snart... + + + Instrumentpanel + + + Document Extended Attributes + + + Document Types + + + Documents + + + Produkter + + + Snabba insikter. + + + Registrerade Roller + + + Registrerade Användare + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ar.resx b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ar.resx new file mode 100644 index 0000000..5642e31 --- /dev/null +++ b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ar.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + إضافة الخصائص الإضافية + + + إلغاء + + + مسح + + + تاريخ + + + عشري + + + وصف + + + رقم المعرف + + + المعرف الخارجي + + + مجموعة + + + المعرف + + + مفعل؟ + + + Json + + + مفتاح + + + موافق + + + حفظ + + + نص + + + وقت + + + نوع + + + تحديث + + + تحديث الخصائص الإضافية + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.de.resx b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.de.resx new file mode 100644 index 0000000..7c7cd54 --- /dev/null +++ b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.de.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Erweiterte Attribute hinzufügen + + + Abbrechen + + + Leeren + + + Datum + + + Dezimal + + + Beschreibung + + + Objekt-Id + + + Externe Id + + + Gruppe + + + Id + + + Ist Aktiv + + + Json + + + Schlüssel + + + Ok + + + Speichern + + + Text + + + Zeit + + + Typ + + + Aktualisieren + + + Erweiterte Attribute aktualieren + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.en.resx b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.en.resx new file mode 100644 index 0000000..9e1f7c0 --- /dev/null +++ b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.en.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Extended Attribute + + + Cancel + + + Clear + + + Date + + + Decimal + + + Description + + + Entity Id + + + External Id + + + Group + + + Id + + + Is Active + + + Json + + + Key + + + Ok + + + Save + + + Text + + + Time + + + Type + + + Update + + + Update Extended Attribute + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.es.resx b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.es.resx new file mode 100644 index 0000000..e061dff --- /dev/null +++ b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.es.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Agregar Atributo Extendido + + + Cancelar + + + Limpiar + + + Fecha + + + Decimal + + + Descripción + + + Id de Entidad + + + Id Externo + + + Grupo + + + Id + + + ¿Está Activo? + + + Json + + + Clave + + + Ok + + + Guardar + + + Texto + + + Hora + + + Tipo + + + Actualizar + + + Actualizar Atributos Extendidos + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.fr.resx b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.fr.resx new file mode 100644 index 0000000..0cbb20b --- /dev/null +++ b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.fr.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ajouter un attribut étendu + + + Annuler + + + Effacer + + + Date + + + Décimal + + + Description + + + Identifiant de l'entité + + + Identifiant externe + + + Groupe + + + Identifiant + + + Est actif + + + Json + + + Clé + + + OK + + + Sauvegarder + + + Texte + + + Heure + + + Type + + + Mettre à jour + + + Mettre à jour l'attribut étendu + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.id.resx b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.id.resx new file mode 100644 index 0000000..9e1f7c0 --- /dev/null +++ b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.id.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Extended Attribute + + + Cancel + + + Clear + + + Date + + + Decimal + + + Description + + + Entity Id + + + External Id + + + Group + + + Id + + + Is Active + + + Json + + + Key + + + Ok + + + Save + + + Text + + + Time + + + Type + + + Update + + + Update Extended Attribute + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.it.resx b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.it.resx new file mode 100644 index 0000000..ff5ace2 --- /dev/null +++ b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.it.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Extended Attribute + + + Annulla + + + Pulisci + + + Date + + + Decimal + + + Description + + + Entity Id + + + External Id + + + Group + + + Id + + + IsActive + + + Json + + + Key + + + Ok + + + Salva + + + Text + + + Time + + + Type + + + Aggiorna + + + Update Extended Attribute + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.km.resx b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.km.resx new file mode 100644 index 0000000..184bb9f --- /dev/null +++ b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.km.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បន្ធែមជួរឈរ + + + បោះបង់ + + + សម្អាត + + + Date + + + Decimal + + + ពិពណ៌នា + + + Entity Id + + + External Id + + + ក្រុម + + + Id + + + គឺសកម្ម + + + Json + + + Key + + + អូខេ + + + រក្សាទុក + + + Text + + + Time + + + ប្រភេទ + + + បច្ចុប្បន្នភាព + + + បច្ចុប្បន្នភាពជួរឈរបន្ថែម + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.nl.resx b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.nl.resx new file mode 100644 index 0000000..1a8594e --- /dev/null +++ b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.nl.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Uitgebreid kenmerk toevoegen + + + Annuleren + + + Duidelijk + + + Datum + + + Decimaal + + + Beschrijving + + + Entiteits-id + + + Externe id + + + Groep + + + Id + + + Is actief + + + Json + + + Sleutel + + + OK + + + Opslaan + + + Sms + + + Tijd + + + Type + + + Update + + + Uitgebreid kenmerk bijwerken + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ru.resx b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ru.resx new file mode 100644 index 0000000..934224d --- /dev/null +++ b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.ru.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Добавить расширенный атрибут + + + Отмена + + + Очистить + + + Дата + + + Числовое значение + + + Описание + + + Id сущности + + + Внешний Id + + + Группа + + + Id + + + Активный? + + + Json значение + + + Ключ + + + Ок + + + Сохранить + + + Текстовое значение + + + Время + + + Тип + + + Обновить + + + Обновить расширенный атрибут + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.sv.resx b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.sv.resx new file mode 100644 index 0000000..9e1f7c0 --- /dev/null +++ b/src/Client/Resources/Shared/Components/AddEditExtendedAttributeModalLocalization.sv.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Add Extended Attribute + + + Cancel + + + Clear + + + Date + + + Decimal + + + Description + + + Entity Id + + + External Id + + + Group + + + Id + + + Is Active + + + Json + + + Key + + + Ok + + + Save + + + Text + + + Time + + + Type + + + Update + + + Update Extended Attribute + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ar.resx b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ar.resx new file mode 100644 index 0000000..ca79862 --- /dev/null +++ b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ar.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + أجراءات + + + كل المجموعات + + + Bordered + + + إنشاء + + + حذف + + + هل تريد حذف السمة الموسعة؟ + + + كثيف + + + وصف + + + تعديل + + + معرف الكينونة + + + تصدير + + + الخصائص الإضافية التي تم تصديرها + + + معرف خارجي + + + تم تصدير السمات الموسعة التي تمت تصفيتها + + + مجموعة + + + رقم المعرف + + + تضمين حقول الكينونة (تصدير) + + + نشط؟ + + + مفتاح + + + إدارة الخصائص الإضافية {0} + + + إدارة سمات {0} {1} الموسعة + + + لا توجد إجراءات مسموح بها + + + غير مسموح. + + + مجموعة مختارة فقط (تصدير) + + + مالك + + + إعادة تحميل + + + ابحث عن {0} السمات الموسعة + + + مخطط + + + نوع + + + قيمة + + + أنت + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.de.resx b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.de.resx new file mode 100644 index 0000000..f7b7111 --- /dev/null +++ b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.de.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Alle Gruppen + + + Gebändert + + + Erstellen + + + Löschen + + + Erweiterte Attribute löschen? + + + Schmal + + + Beschreibung + + + Bearbeiten + + + Objekt-Id + + + Export + + + Erweiterte Attribute exportiert + + + Externe Id + + + Gefilterte erweiterte Attribute exportiert + + + Gruppe + + + Id + + + Objektfelder einschließen (Export) + + + Ist Aktiv + + + Schlüssel + + + Verwalte {0} erweiterte Attribute + + + Verwalte erweiterte {0} Attribute von {1} + + + No Allowed Actions + + + Not Allowed. + + + Only Selected Group (Export) + + + Owner + + + Reload + + + Search For {0} Extended Attributes + + + Striped + + + Type + + + Value + + + you + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.en.resx b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.en.resx new file mode 100644 index 0000000..4270e95 --- /dev/null +++ b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.en.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + All Groups + + + Bordered + + + Create + + + Delete + + + Delete Extended Attribute? + + + Dense + + + Description + + + Edit + + + Entity Id + + + Export + + + Extended Attributes exported + + + External Id + + + Filtered Extended Attributes exported + + + Group + + + Id + + + Include Entity fields (Export) + + + Is Active + + + Key + + + Manage {0} Extended Attributes + + + Manage {0} {1}'s Extended Attributes + + + No Allowed Actions + + + Not Allowed. + + + Only Selected Group (Export) + + + Owner + + + Reload + + + Search For {0} Extended Attributes + + + Striped + + + Type + + + Value + + + you + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.es.resx b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.es.resx new file mode 100644 index 0000000..1cfea1f --- /dev/null +++ b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.es.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acciones + + + Todos los Grupos + + + Bordeado + + + Crear + + + Borrar + + + ¿Eliminar Atributo Extendido? + + + Denso + + + Descripción + + + Editar + + + Id de Entidad + + + Exportar + + + Atributos Extendidos exportados + + + Id Externo + + + Atributos Extendidos Filtrados exportados + + + Grupo + + + Id + + + Incluir campos de Entidad (Exportar) + + + ¿Está Activo? + + + Clave + + + Administrar Atributos Extendidos ({0}) + + + Administrar los Atributos Extendidos de: {0}-{1} + + + Acciones no Permitidas + + + No Permitido. + + + Solo el Grupo Seleccionado (Exportar) + + + Propietario + + + Recargar + + + Buscar Atributos Extendidos ({0}) + + + Rayado + + + Tipo + + + Valor + + + Ud. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.fr.resx b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.fr.resx new file mode 100644 index 0000000..706054b --- /dev/null +++ b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.fr.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Tous les groupes + + + Avec bordure + + + Créer + + + Supprimer + + + Supprimer l'attribut étendu ? + + + Dense + + + Description + + + Éditer + + + Identifiant de l'entité + + + Exporter + + + Attributs étendus exportés + + + Identifiant externe + + + Attributs étendus filtrés exportés + + + Groupe + + + Identifiant + + + Inclure tous les champs (export) + + + Est actif + + + Clé + + + Gérer les attributs étendus de {0} + + + Gérer les attributs étendus de {0} {1} + + + Aucune action autorisée + + + Non autorisé. + + + Seulement les groupes sélectionné (export) + + + Propriétaire + + + Recharger + + + Rechercher les attributs étendus de {0} + + + Rayé + + + Type + + + Valeur + + + vous + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.id.resx b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.id.resx new file mode 100644 index 0000000..4270e95 --- /dev/null +++ b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.id.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + All Groups + + + Bordered + + + Create + + + Delete + + + Delete Extended Attribute? + + + Dense + + + Description + + + Edit + + + Entity Id + + + Export + + + Extended Attributes exported + + + External Id + + + Filtered Extended Attributes exported + + + Group + + + Id + + + Include Entity fields (Export) + + + Is Active + + + Key + + + Manage {0} Extended Attributes + + + Manage {0} {1}'s Extended Attributes + + + No Allowed Actions + + + Not Allowed. + + + Only Selected Group (Export) + + + Owner + + + Reload + + + Search For {0} Extended Attributes + + + Striped + + + Type + + + Value + + + you + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.it.resx b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.it.resx new file mode 100644 index 0000000..4fb941f --- /dev/null +++ b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.it.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Azioni + + + All Groups + + + Bordered + + + Crea + + + Cancella + + + Delete Extended Attribute? + + + Dense + + + Descrizione + + + Modifica + + + Entity Id + + + Esporta + + + Extended Attributes exported + + + External Id + + + Filtered Extended Attributes exported + + + Gruppo + + + Id + + + Include Entity fields (Export) + + + Attivo + + + Key + + + Manage {0} Extended Attributes + + + Manage {0} {1}'s Extended Attributes + + + Nessuna azione è consentita + + + Non consentito + + + Solo il gruppo selezionato (Export) + + + Owner + + + Ricarica + + + Search For {0} Extended Attributes + + + Striped + + + Tipo + + + Valore + + + you + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.km.resx b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.km.resx new file mode 100644 index 0000000..a88e072 --- /dev/null +++ b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.km.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + សកម្មភាព + + + ក្រុមទាំងអស់ + + + ព្រុំព្រទល់ + + + បង្កើត + + + លុប + + + លុបជួរឈរបន្ថែម? + + + បង្រួម + + + ពិពណ៌នា + + + កែប្រែ + + + Entity Id + + + នាំចេញ + + + ជួរឈរបន្ថែមនាំចេញ + + + External Id + + + ច្រោះជួរឈរបន្ថែមនាំចេញ + + + ក្រុម + + + Id + + + Include Entity fields (Export) + + + គឺសកម្ម + + + Key + + + Manage {0} Extended Attributes + + + Manage {0} {1}'s Extended Attributes + + + មិនត្រូវបានអនុញ្ញាត + + + មិនអនុញ្ញាត្ត + + + Only Selected Group (Export) + + + ម្ចាស់ + + + ផ្ទុកឡើងវិញ + + + Search For {0} Extended Attributes + + + Striped + + + ប្រភេទ + + + តម្លៃ + + + you + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.nl.resx b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.nl.resx new file mode 100644 index 0000000..b54e93e --- /dev/null +++ b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.nl.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Acties + + + Alle groepen + + + Grenst aan + + + Aanmaken + + + Verwijderen + + + Uitgebreid kenmerk verwijderen? + + + Dicht + + + Beschrijving + + + Bewerken + + + Entiteits-id + + + Exporteren + + + Geëxporteerde uitgebreide kenmerken + + + Externe id + + + Gefilterde uitgebreide kenmerken geëxporteerd + + + Groep + + + Id + + + Entiteitsvelden opnemen (exporteren) + + + Is actief + + + Sleutel + + + Uitgebreide kenmerken beheren {0} + + + Uitgebreide kenmerken van {0} {1} beheren + + + Geen toegestane acties + + + Niet toegestaan. + + + Alleen geselecteerde groep (exporteren) + + + Eigenaar + + + Herladen + + + Zoeken naar {0} uitgebreide kenmerken + + + Gestreept + + + Type + + + Waarde + + + jij + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ru.resx b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ru.resx new file mode 100644 index 0000000..7ec3a74 --- /dev/null +++ b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.ru.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Действия + + + Все группы + + + Обрамлённый + + + Создать + + + Удалить + + + Удалить расширенный атрибут? + + + Компактный + + + Описание + + + Редактировать + + + Id сущности + + + Экспорт в Excel + + + Расширенные атрибуты экспортированы + + + Внешний Id + + + Отфильтрованные расширенные атрибуты экспортированы + + + Группа + + + Id + + + Включить поля сущности (Экспорт) + + + Активный? + + + Ключ + + + Управление расширенными атрибутами {0} + + + Управление расширенными атрибутами {1} с Id = {0} + + + Нет доступных действий + + + Нет доступа. + + + Только выбранную группу (Экспорт) + + + Владелец + + + Перезагрузить + + + Поиск расширенных атрибутов {0} + + + Чередующийся + + + Тип + + + Значение + + + Вы + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.sv.resx b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.sv.resx new file mode 100644 index 0000000..4270e95 --- /dev/null +++ b/src/Client/Resources/Shared/Components/ExtendedAttributesLocalization.sv.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + All Groups + + + Bordered + + + Create + + + Delete + + + Delete Extended Attribute? + + + Dense + + + Description + + + Edit + + + Entity Id + + + Export + + + Extended Attributes exported + + + External Id + + + Filtered Extended Attributes exported + + + Group + + + Id + + + Include Entity fields (Export) + + + Is Active + + + Key + + + Manage {0} Extended Attributes + + + Manage {0} {1}'s Extended Attributes + + + No Allowed Actions + + + Not Allowed. + + + Only Selected Group (Export) + + + Owner + + + Reload + + + Search For {0} Extended Attributes + + + Striped + + + Type + + + Value + + + you + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ImportExcelModal.ar.resx b/src/Client/Resources/Shared/Components/ImportExcelModal.ar.resx new file mode 100644 index 0000000..23dee1b --- /dev/null +++ b/src/Client/Resources/Shared/Components/ImportExcelModal.ar.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + إلغاء + + + استيراد + + + الرجاء رفع ملف اكسل! + + + رفع + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ImportExcelModal.de.resx b/src/Client/Resources/Shared/Components/ImportExcelModal.de.resx new file mode 100644 index 0000000..fd884a0 --- /dev/null +++ b/src/Client/Resources/Shared/Components/ImportExcelModal.de.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Abbrechen + + + Importieren + + + Bitte lade eine Excel-Datei hoch! + + + Hochladen + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ImportExcelModal.en.resx b/src/Client/Resources/Shared/Components/ImportExcelModal.en.resx new file mode 100644 index 0000000..7d6c332 --- /dev/null +++ b/src/Client/Resources/Shared/Components/ImportExcelModal.en.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Import + + + Please upload excel file! + + + Upload + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ImportExcelModal.es.resx b/src/Client/Resources/Shared/Components/ImportExcelModal.es.resx new file mode 100644 index 0000000..cb3b505 --- /dev/null +++ b/src/Client/Resources/Shared/Components/ImportExcelModal.es.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancelar + + + Importar + + + Por favor subar el archivo Excel! + + + Subir + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ImportExcelModal.fr.resx b/src/Client/Resources/Shared/Components/ImportExcelModal.fr.resx new file mode 100644 index 0000000..eece67a --- /dev/null +++ b/src/Client/Resources/Shared/Components/ImportExcelModal.fr.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annuler + + + Importer + + + Merci de téléverser un fichier excel ! + + + Téléverser + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ImportExcelModal.id.resx b/src/Client/Resources/Shared/Components/ImportExcelModal.id.resx new file mode 100644 index 0000000..7d6c332 --- /dev/null +++ b/src/Client/Resources/Shared/Components/ImportExcelModal.id.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Import + + + Please upload excel file! + + + Upload + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ImportExcelModal.it.resx b/src/Client/Resources/Shared/Components/ImportExcelModal.it.resx new file mode 100644 index 0000000..7d6c332 --- /dev/null +++ b/src/Client/Resources/Shared/Components/ImportExcelModal.it.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Import + + + Please upload excel file! + + + Upload + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ImportExcelModal.km.resx b/src/Client/Resources/Shared/Components/ImportExcelModal.km.resx new file mode 100644 index 0000000..7d6c332 --- /dev/null +++ b/src/Client/Resources/Shared/Components/ImportExcelModal.km.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Import + + + Please upload excel file! + + + Upload + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ImportExcelModal.nl.resx b/src/Client/Resources/Shared/Components/ImportExcelModal.nl.resx new file mode 100644 index 0000000..719c7eb --- /dev/null +++ b/src/Client/Resources/Shared/Components/ImportExcelModal.nl.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annuleren + + + Importeren + + + Upload excel-bestand! + + + Uploaden + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ImportExcelModal.ru.resx b/src/Client/Resources/Shared/Components/ImportExcelModal.ru.resx new file mode 100644 index 0000000..6cbf650 --- /dev/null +++ b/src/Client/Resources/Shared/Components/ImportExcelModal.ru.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Отмена + + + Импорт + + + Пожалуйста, загрузите excel файл! + + + Загрузить + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/ImportExcelModal.sv.resx b/src/Client/Resources/Shared/Components/ImportExcelModal.sv.resx new file mode 100644 index 0000000..7d6c332 --- /dev/null +++ b/src/Client/Resources/Shared/Components/ImportExcelModal.sv.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Import + + + Please upload excel file! + + + Upload + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/LanguageSelector.ar.resx b/src/Client/Resources/Shared/Components/LanguageSelector.ar.resx new file mode 100644 index 0000000..5ab4357 --- /dev/null +++ b/src/Client/Resources/Shared/Components/LanguageSelector.ar.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dutch - Netherlands + + + English + + + French + + + German + + + Indonesia + + + Italian + + + Khmer + + + Russian + + + Spanish + + + Swedish + + + عربي + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/LanguageSelector.de.resx b/src/Client/Resources/Shared/Components/LanguageSelector.de.resx new file mode 100644 index 0000000..0b8081b --- /dev/null +++ b/src/Client/Resources/Shared/Components/LanguageSelector.de.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Niederländisch - Nederland + + + Englisch - English + + + Französisch - Français + + + Deutsch + + + Indonesisch - bahasa Indonesia + + + Italienisch - Italiano + + + Khmer - ខ្មែរ + + + Russisch - русский + + + Spanisch - Español + + + Schwedisch - Svenska + + + Arabisch - عربي + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/LanguageSelector.en.resx b/src/Client/Resources/Shared/Components/LanguageSelector.en.resx new file mode 100644 index 0000000..5ab4357 --- /dev/null +++ b/src/Client/Resources/Shared/Components/LanguageSelector.en.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dutch - Netherlands + + + English + + + French + + + German + + + Indonesia + + + Italian + + + Khmer + + + Russian + + + Spanish + + + Swedish + + + عربي + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/LanguageSelector.es.resx b/src/Client/Resources/Shared/Components/LanguageSelector.es.resx new file mode 100644 index 0000000..3c1f165 --- /dev/null +++ b/src/Client/Resources/Shared/Components/LanguageSelector.es.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Holandés - Holanda + + + Inglés + + + Francés + + + Alemán + + + Indonesia + + + Italiano + + + Jemer + + + Ruso + + + Español + + + Sueco + + + عربي + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/LanguageSelector.fr.resx b/src/Client/Resources/Shared/Components/LanguageSelector.fr.resx new file mode 100644 index 0000000..09a7e86 --- /dev/null +++ b/src/Client/Resources/Shared/Components/LanguageSelector.fr.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dutch - Netherlands + + + Anglais + + + Français + + + Allemand + + + Indonésie + + + Italien + + + Jemer + + + Russe + + + Espanol + + + Suédois + + + عربي + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/LanguageSelector.id.resx b/src/Client/Resources/Shared/Components/LanguageSelector.id.resx new file mode 100644 index 0000000..e728993 --- /dev/null +++ b/src/Client/Resources/Shared/Components/LanguageSelector.id.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dutch - Netherlands + + + Inggris + + + Perancis + + + Jerman + + + Indonesiano + + + Italia + + + Khmer + + + Rusia + + + Orang Spanyol + + + Orang Swedia + + + عربي + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/LanguageSelector.it.resx b/src/Client/Resources/Shared/Components/LanguageSelector.it.resx new file mode 100644 index 0000000..001bf81 --- /dev/null +++ b/src/Client/Resources/Shared/Components/LanguageSelector.it.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dutch - Netherlands + + + Inglese + + + Francese + + + Tedesco + + + Indonesiano + + + Italiano + + + Khmer + + + Russo + + + Spagnolo + + + Svedese + + + عربي + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/LanguageSelector.nl.resx b/src/Client/Resources/Shared/Components/LanguageSelector.nl.resx new file mode 100644 index 0000000..5ab4357 --- /dev/null +++ b/src/Client/Resources/Shared/Components/LanguageSelector.nl.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Dutch - Netherlands + + + English + + + French + + + German + + + Indonesia + + + Italian + + + Khmer + + + Russian + + + Spanish + + + Swedish + + + عربي + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Components/LanguageSelector.ru.resx b/src/Client/Resources/Shared/Components/LanguageSelector.ru.resx new file mode 100644 index 0000000..9290d77 --- /dev/null +++ b/src/Client/Resources/Shared/Components/LanguageSelector.ru.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Голландский - Нидерланды + + + Английский + + + Французский + + + Немецкий + + + Индонезия + + + Итальянский + + + Кхмерский + + + Русский + + + Испанский + + + Шведский + + + عربي + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.en.resx b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.en.resx new file mode 100644 index 0000000..ad5c1a2 --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.en.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Confirm + + + Delete Confirmation + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.es.resx b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.es.resx new file mode 100644 index 0000000..83a4d45 --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.es.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancelar + + + Confirmar + + + Confirmación de borrado + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.fr.resx b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.fr.resx new file mode 100644 index 0000000..8aa2a1a --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.fr.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annuler + + + Confirmer + + + Confirmation de suppression + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.id.resx b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.id.resx new file mode 100644 index 0000000..33fd900 --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.id.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Batal + + + Konfirmasi + + + Konfirmasi Hapus + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.it.resx b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.it.resx new file mode 100644 index 0000000..a529978 --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.it.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annulla + + + Conferma + + + Conferma eliminazione + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.km.resx b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.km.resx new file mode 100644 index 0000000..819d5ff --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.km.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បោះបង់ + + + បញ្ជាក់ + + + បញ្ជាក់លុប + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.nl.resx b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.nl.resx new file mode 100644 index 0000000..d9fdfce --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.nl.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annuleren + + + Bevestig + + + Verwijder Bevestiging + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.ru.resx b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.ru.resx new file mode 100644 index 0000000..7b147f7 --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.ru.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Отмена + + + Подтвердить + + + Подтвержедние удаления + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.sv.resx b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.sv.resx new file mode 100644 index 0000000..5a9a09f --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/DeleteConfirmation.sv.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Avbryt + + + Bekräfta + + + Radera bekräftelse + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/Logout.en.resx b/src/Client/Resources/Shared/Dialogs/Logout.en.resx new file mode 100644 index 0000000..2bb3110 --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/Logout.en.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancel + + + Logout Confirmation + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/Logout.es.resx b/src/Client/Resources/Shared/Dialogs/Logout.es.resx new file mode 100644 index 0000000..fa3257a --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/Logout.es.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancelar + + + Confirmación de Salida + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/Logout.fr.resx b/src/Client/Resources/Shared/Dialogs/Logout.fr.resx new file mode 100644 index 0000000..8cc6a39 --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/Logout.fr.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annuler + + + Confirmation de déconnexion + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/Logout.id.resx b/src/Client/Resources/Shared/Dialogs/Logout.id.resx new file mode 100644 index 0000000..077f91a --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/Logout.id.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Batal + + + Konfirmasi Keluar + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/Logout.it.resx b/src/Client/Resources/Shared/Dialogs/Logout.it.resx new file mode 100644 index 0000000..d2222c8 --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/Logout.it.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annulla + + + Conferma Logout + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/Logout.km.resx b/src/Client/Resources/Shared/Dialogs/Logout.km.resx new file mode 100644 index 0000000..8438a5c --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/Logout.km.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + បោះបង់ + + + បញ្ជាក់ពីការចាកចេញពីប្រព័ន្ធ + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/Logout.nl.resx b/src/Client/Resources/Shared/Dialogs/Logout.nl.resx new file mode 100644 index 0000000..01f52ed --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/Logout.nl.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annuleren + + + Afmeldbevestiging + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/Logout.ru.resx b/src/Client/Resources/Shared/Dialogs/Logout.ru.resx new file mode 100644 index 0000000..68a6131 --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/Logout.ru.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Отмена + + + Подтверждение выхода + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/Dialogs/Logout.sv.resx b/src/Client/Resources/Shared/Dialogs/Logout.sv.resx new file mode 100644 index 0000000..7ad76d8 --- /dev/null +++ b/src/Client/Resources/Shared/Dialogs/Logout.sv.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Avbryt + + + Bekräftelse För Utloggning + + \ No newline at end of file diff --git "a/src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217DeleteConfirmation.ar.resx" "b/src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217DeleteConfirmation.ar.resx" new file mode 100644 index 0000000..7172f86 --- /dev/null +++ "b/src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217DeleteConfirmation.ar.resx" @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + الغاء + + + تأكيد + + + تأكيد الحذف + + \ No newline at end of file diff --git "a/src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217Logout.ar.resx" "b/src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217Logout.ar.resx" new file mode 100644 index 0000000..c23d9df --- /dev/null +++ "b/src/Client/Resources/Shared/Dialogs/\342\200\217\342\200\217Logout.ar.resx" @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + الغاء + + + تأكيد الخروج + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/MainLayout.de.resx b/src/Client/Resources/Shared/MainLayout.de.resx new file mode 100644 index 0000000..819ef5a --- /dev/null +++ b/src/Client/Resources/Shared/MainLayout.de.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Konto + + + Kauf mir einen Kaffee! + + + Chat? + + + Community + + + Facebook-Gruppe + + + Facebook-Seite + + + Repository forken + + + Ausloggen + + + Möchtest du dich wirklich ausloggen? + + + MudBlazor-Dokumentation + + + Schnellstartanleitung + + + Token aktualisiert. + + + Ressourcen + + + Support + + + Umschalten zum dunklen Modus + + + Rechts nach Links / Links nach Rechts umschalten + + + Willkommen {0} + + + Du wurdest ausgeloggt, weil die Berechtigungen einer deine Rollen aktualisiert wurden. + + + Du wurdest ausgeloggt, weil der Benutzer mit deinem Token gelöscht wurde. + + + Bis bist ausgeloggt. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/MainLayout.en.resx b/src/Client/Resources/Shared/MainLayout.en.resx new file mode 100644 index 0000000..ef2c7d0 --- /dev/null +++ b/src/Client/Resources/Shared/MainLayout.en.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Buy Me A Coffee! + + + Chat? + + + Community + + + Facebook Group + + + Facebook Page + + + Fork Repository + + + Logout + + + Do you really want to Logout? + + + MudBlazor Documentation + + + Quick-Start Guide + + + Refreshed Token. + + + Resources + + + Support + + + Toggle Dark Mode + + + Toggle right-to-left/left-to-right + + + Welcome {0} + + + You are logged out because the Permissions of one of your Roles have been updated. + + + You are logged out because the user with your Token has been deleted. + + + You are Logged Out. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/MainLayout.es.resx b/src/Client/Resources/Shared/MainLayout.es.resx new file mode 100644 index 0000000..79c64e9 --- /dev/null +++ b/src/Client/Resources/Shared/MainLayout.es.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cuenta + + + Buy Me A Coffee! + + + Chat? + + + Comunidad + + + Grupo de Facebook + + + Página de Facebook + + + Salir + + + ¿Realmente quiere salir del sistema? + + + Documentación de MudBlazor + + + Guía de Inicio Rápido + + + Token refrescado. + + + Recursos + + + Soporte + + + Alternar modo oscuro + + + Alternar right-to-left/left-to-right + + + Bienvenido {0} + + + Ha cerrado sesión porque los permisos de su Rol han sido actualizados. + + + Ha cerrado sesión porque el usuario asociado a su Token ha sido borrado. + + + Ha cerrado sesión. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/MainLayout.fr.resx b/src/Client/Resources/Shared/MainLayout.fr.resx new file mode 100644 index 0000000..e3538b8 --- /dev/null +++ b/src/Client/Resources/Shared/MainLayout.fr.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Compte + + + Buy Me A Coffee! + + + Chatter ? + + + Communauté + + + Grouppe Facebook + + + Page Facebook + + + Forker le dépôt + + + Déconnexion + + + Voulez-vous vraiment vous déconnecter ? + + + Documentation MudBlazor + + + Guide de démarrage rapide + + + Jeton raffraîchi + + + Ressources + + + Support + + + Basculer le mode sombre / mode clair + + + Basculer affichage gauche-droite / droite-gauche + + + Bienvenu {0} + + + Vous avez été déconnecté car les permissions de l'un de vos rôles ont été mise à jour. + + + Vous avez été déconnecté car l'utilisateur lié au jeton a été supprimé. + + + Vous êtes déconnecté. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/MainLayout.id.resx b/src/Client/Resources/Shared/MainLayout.id.resx new file mode 100644 index 0000000..33714f0 --- /dev/null +++ b/src/Client/Resources/Shared/MainLayout.id.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Akun + + + Buy Me A Coffee! + + + Chat? + + + Komunitas + + + Grup Facebook + + + Halaman Facebook + + + Fork Repository + + + Keluar + + + Apakah anda yakin ingin Keluar? + + + Dokumentasi MudBlazor + + + Panduan Awal Singkat + + + Refreshed Token. + + + Resources + + + Dukung + + + Toggle Mode Gelap + + + Toggle right-to-left/left-to-right + + + Selamat Datang {0} + + + You are logged out because the Permissions of one of your Roles have been updated. + + + You are logged out because the user with your Token has been deleted. + + + You are Logged Out. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/MainLayout.it.resx b/src/Client/Resources/Shared/MainLayout.it.resx new file mode 100644 index 0000000..5140d04 --- /dev/null +++ b/src/Client/Resources/Shared/MainLayout.it.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Buy Me A Coffee! + + + Chat? + + + Community + + + Gruppo Facebook + + + Pagina Facebook + + + Fork Repository + + + Logout + + + Vuoi effettuare il Logout? + + + Documentazione MudBlazor + + + Guida rapida + + + Refreshed Token. + + + Risorse + + + Supporto + + + Attiva la modalità scura + + + Toggle right-to-left/left-to-right + + + Benvenuto {0} + + + You are logged out because the Permissions of one of your Roles have been updated. + + + You are logged out because the user with your Token has been deleted. + + + You are Logged Out. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/MainLayout.km.resx b/src/Client/Resources/Shared/MainLayout.km.resx new file mode 100644 index 0000000..227e366 --- /dev/null +++ b/src/Client/Resources/Shared/MainLayout.km.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + គណនី + + + ទិញកាហ្វេមួយមក! + + + ឆាត? + + + សហគមន៍ + + + ក្រុមហ្វេសប៊ុក + + + ទំព័រហ្វេសប៊ុក + + + ចាកចេញ + + + តើអ្នកពិតជាចង់ចាកចេញមែនទេ? + + + ឯកសារ MudBlazor + + + ម​គ្គុ​ទេស​ក៍​ចាប់​ផ្តើ​ម​រហ័ស + + + Refreshed Token. + + + ធនធាន + + + គាំទ្រ + + + បិទ / បើកស្បែកងងឹត + + + Toggle right-to-left/left-to-right + + + ស្វាគមន៏ {0} + + + អ្នកត្រូវបានចាកចេញពីប្រព័ន្ធព្រោះសិទ្ធិនៃមុខងារបស់អ្នកត្រូវបានធ្វើបច្ចុប្បន្នភាព + + + អ្នកត្រូវបានចាកចេញពីប្រព័ន្ធព្រោះកូដធូឃីនអ្នកត្រូវបានលុប + + + អ្នកត្រូវបានចាកចេញ + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/MainLayout.nl.resx b/src/Client/Resources/Shared/MainLayout.nl.resx new file mode 100644 index 0000000..9cbbf9e --- /dev/null +++ b/src/Client/Resources/Shared/MainLayout.nl.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Koop me een koffie! + + + Chatten? + + + Community + + + Facebook Groep + + + Facebook Pagina + + + Fork Repository + + + Uitloggen + + + Wil je echt uitloggen? + + + MudBlazor Documentation + + + Snelstartgids + + + Vernieuwd Token. + + + Bronnen + + + Ondersteuning + + + Donkere Modus Schakelen + + + Wissel van rechts naar links/links naar rechts + + + Welkom {0} + + + U bent uitgelogd omdat de machtigingen van een van uw rollen zijn bijgewerkt. + + + U bent uitgelogd omdat de gebruiker met uw Token is verwijderd. + + + U bent uitgelogd. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/MainLayout.ru.resx b/src/Client/Resources/Shared/MainLayout.ru.resx new file mode 100644 index 0000000..1fee9c5 --- /dev/null +++ b/src/Client/Resources/Shared/MainLayout.ru.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Аккаунт + + + Купить мне кофе! + + + К чату? + + + Сообщество + + + Группа Facebook + + + Страница Facebook + + + Репозиторий + + + Выйти + + + Подтверждение выхода + + + Документация MudBlazor + + + Краткое руководство пользователя + + + Токен обновлён. + + + Ресурсы + + + Поддержка + + + Переключить Тёмный режим + + + Переключить справа-на-лево/слева-на-право + + + Добро пожаловать {0} + + + Вы вышли из системы, потому что были обновлены разрешения одной из ваших ролей. + + + Вы вышли из системы, потому что пользователь с вашим токеном был удален. + + + Вы вышли из системы. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/MainLayout.sv.resx b/src/Client/Resources/Shared/MainLayout.sv.resx new file mode 100644 index 0000000..d66bc71 --- /dev/null +++ b/src/Client/Resources/Shared/MainLayout.sv.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Konto + + + Buy Me A Coffee! + + + Chat? + + + Community + + + Facebook Grupp + + + Facebook Sida + + + Fork Repository + + + Logga ut + + + Vill du verkligen logga ut? + + + MudBlazor Dokumentation + + + Snabbstart Guide + + + Refreshed Token. + + + Resurser + + + Support + + + Växla Mörktläge + + + Toggle right-to-left/left-to-right + + + Välkommen {0} + + + You are logged out because the Permissions of one of your Roles have been updated. + + + You are logged out because the user with your Token has been deleted. + + + You are Logged Out. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NavMenu.de.resx b/src/Client/Resources/Shared/NavMenu.de.resx new file mode 100644 index 0000000..8bd8b09 --- /dev/null +++ b/src/Client/Resources/Shared/NavMenu.de.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Konto + + + Administrator + + + Marken + + + Katalog + + + Chat + + + Kommunikation + + + Dashboard + + + Dokumentenverwaltung + + + Dokumentenspeicher + + + Documenttypen + + + FAQs + + + Merkmale + + + Start + + + Protokolle + + + E-Mail + + + Persönlich + + + Produkte + + + Schnellstartanleitung + + + Ressourcen + + + Rollen + + + Swagger + + + Benutzer + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NavMenu.en.resx b/src/Client/Resources/Shared/NavMenu.en.resx new file mode 100644 index 0000000..61adb32 --- /dev/null +++ b/src/Client/Resources/Shared/NavMenu.en.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Administrator + + + Brands + + + Catalog + + + Chat + + + Communication + + + Dashboard + + + Document Management + + + Document Store + + + Document Types + + + FAQs + + + Features + + + Home + + + Logs + + + Mail + + + Personal + + + Products + + + Quick Start Guide + + + Resources + + + Roles + + + Swagger + + + Users + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NavMenu.es.resx b/src/Client/Resources/Shared/NavMenu.es.resx new file mode 100644 index 0000000..6bfbf6e --- /dev/null +++ b/src/Client/Resources/Shared/NavMenu.es.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cuenta + + + Administrador + + + Auditoría + + + Marcas + + + Gestión de catálogo + + + Chat + + + Comunicaciones + + + Panel de Control + + + Administración de Documentos + + + Almacén de Documentos + + + Tipos de Documentos + + + FAQs + + + Características + + + Inicio + + + Mail + + + Personal + + + Productos + + + Guía de Inicio Rápido + + + Recursos + + + Roles + + + Swagger + + + Usuarios + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NavMenu.fr.resx b/src/Client/Resources/Shared/NavMenu.fr.resx new file mode 100644 index 0000000..b888549 --- /dev/null +++ b/src/Client/Resources/Shared/NavMenu.fr.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Compte + + + Administrateur + + + Pistes d'audit + + + Marques + + + Gestion du catalogue + + + Conversations + + + Communication + + + Tableau de bord + + + Gestion des documents + + + Stockage des documents + + + Types de documents + + + FAQ + + + Fonctionnalités + + + Accueil + + + Courriel + + + Renseignements personnels + + + Produits + + + Guide de démarrage rapide + + + Ressources + + + Rôles + + + Swagger + + + Utilisateurs + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NavMenu.id.resx b/src/Client/Resources/Shared/NavMenu.id.resx new file mode 100644 index 0000000..5240880 --- /dev/null +++ b/src/Client/Resources/Shared/NavMenu.id.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Akun + + + Administrator + + + Audit Trails + + + Merek + + + Manajemen Katalog + + + Obrolan + + + Komunikasi + + + Dasbor + + + Document Management + + + Document Store + + + Document Types + + + FAQs + + + Fitur + + + Beranda + + + Mail + + + Personal + + + Produk + + + Panduan Awal Singkat + + + Resources + + + Wewenang + + + Swagger + + + Pengguna + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NavMenu.it.resx b/src/Client/Resources/Shared/NavMenu.it.resx new file mode 100644 index 0000000..371cd91 --- /dev/null +++ b/src/Client/Resources/Shared/NavMenu.it.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Amministratore + + + Marche + + + Gestione catalogo + + + Chat + + + Comunicazione + + + Dashboard + + + Document Management + + + Archivio documenti + + + Document Types + + + FAQs + + + Caratteristiche + + + Home + + + Registro Attività + + + Mail + + + Personale + + + Prodotti + + + Guida rapida + + + Risorse + + + Ruoli + + + Swagger + + + Utenti + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NavMenu.km.resx b/src/Client/Resources/Shared/NavMenu.km.resx new file mode 100644 index 0000000..01df5e7 --- /dev/null +++ b/src/Client/Resources/Shared/NavMenu.km.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + គណនី + + + រដ្ឋបាល + + + ផលិតផល + + + គ្រប់គ្រងកាតាឡុក + + + ទំនាក់ទំនង + + + ការគ្រប់គ្រងឯកសារ + + + ប្រភេទឯកសារ + + + កម្រងសំណួរចម្លើយ + + + មុខងារ + + + ទំព័រដើម + + + ឯកជន + + + ផលិតផល + + + ធនធាន + + + សិទ្ធិប្រើប្រាស់ + + + អ្នកប្រើប្រាស់ + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NavMenu.nl.resx b/src/Client/Resources/Shared/NavMenu.nl.resx new file mode 100644 index 0000000..30d1ce8 --- /dev/null +++ b/src/Client/Resources/Shared/NavMenu.nl.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Account + + + Administrator + + + Audit Trails + + + Merken + + + Catalogusbeheer + + + Chat + + + Communicatie + + + Dashboard + + + Documentbeheer + + + Documentopslag + + + Documenttypen + + + FAQs + + + Functies + + + Hoofdscherm + + + Mail + + + Persoonlijk + + + Producten + + + Snelstartgids + + + Bronnen + + + Rollen + + + Swagger + + + Gebruikers + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NavMenu.ru.resx b/src/Client/Resources/Shared/NavMenu.ru.resx new file mode 100644 index 0000000..253d25a --- /dev/null +++ b/src/Client/Resources/Shared/NavMenu.ru.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Аккаунт + + + Администрирование + + + Журналы аудита + + + Бренды + + + Управление каталогом + + + Чат + + + Коммуникации + + + Dashboard + + + Управление документами + + + Хранилище документов + + + Типы документов + + + FAQ + + + Функции + + + Домашняя + + + Почта + + + Персональные данные + + + Продукты + + + Краткое руководство пользователя + + + Ресурсы + + + Роли + + + Swagger + + + Пользователи + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NavMenu.sv.resx b/src/Client/Resources/Shared/NavMenu.sv.resx new file mode 100644 index 0000000..d85fdd1 --- /dev/null +++ b/src/Client/Resources/Shared/NavMenu.sv.resx @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Konto + + + Administratör + + + Audit Trails + + + Märken + + + Kataloghantering + + + Chatt + + + Kommunikation + + + Översikt + + + Document Management + + + Dokumentlagring + + + Document Types + + + FAQs + + + Funktioner + + + Hem + + + Mail + + + Personal + + + Produkter + + + Snabbstart Guide + + + Resurser + + + Roler + + + Swagger + + + Användare + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NotFoundLayout.de.resx b/src/Client/Resources/Shared/NotFoundLayout.de.resx new file mode 100644 index 0000000..15b332f --- /dev/null +++ b/src/Client/Resources/Shared/NotFoundLayout.de.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Zur Startseite gehen! + + + Die gesuchte Seite existiert nicht! + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NotFoundLayout.en.resx b/src/Client/Resources/Shared/NotFoundLayout.en.resx new file mode 100644 index 0000000..3b95741 --- /dev/null +++ b/src/Client/Resources/Shared/NotFoundLayout.en.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Go Home! + + + The page you were looking for doesn't exist. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NotFoundLayout.es.resx b/src/Client/Resources/Shared/NotFoundLayout.es.resx new file mode 100644 index 0000000..8cda145 --- /dev/null +++ b/src/Client/Resources/Shared/NotFoundLayout.es.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ir a Inicio! + + + La página que busca no existe + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NotFoundLayout.fr.resx b/src/Client/Resources/Shared/NotFoundLayout.fr.resx new file mode 100644 index 0000000..c0d6d60 --- /dev/null +++ b/src/Client/Resources/Shared/NotFoundLayout.fr.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Revenir à l'accueil + + + La page que vous recherchez n'existe pas. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NotFoundLayout.id.resx b/src/Client/Resources/Shared/NotFoundLayout.id.resx new file mode 100644 index 0000000..1b922b7 --- /dev/null +++ b/src/Client/Resources/Shared/NotFoundLayout.id.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Kembali ke Beranda! + + + Halaman yang anda tuju tidak tersedia. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NotFoundLayout.it.resx b/src/Client/Resources/Shared/NotFoundLayout.it.resx new file mode 100644 index 0000000..5f231c6 --- /dev/null +++ b/src/Client/Resources/Shared/NotFoundLayout.it.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Vai alla Home! + + + La pagina che stavi cercando non esiste. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NotFoundLayout.km.resx b/src/Client/Resources/Shared/NotFoundLayout.km.resx new file mode 100644 index 0000000..b6c6f4b --- /dev/null +++ b/src/Client/Resources/Shared/NotFoundLayout.km.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ទៅទំព័រដើម! + + + ទំព័រដែលអ្នកមកកាន់នេះគឺពុំមានទេ! + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NotFoundLayout.nl.resx b/src/Client/Resources/Shared/NotFoundLayout.nl.resx new file mode 100644 index 0000000..39ea8d9 --- /dev/null +++ b/src/Client/Resources/Shared/NotFoundLayout.nl.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ga naar hoofdpagina + + + De pagina die u zocht bestaat niet + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NotFoundLayout.ru.resx b/src/Client/Resources/Shared/NotFoundLayout.ru.resx new file mode 100644 index 0000000..506a4d9 --- /dev/null +++ b/src/Client/Resources/Shared/NotFoundLayout.ru.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + На домашнюю страницу! + + + Страница, которую вы искали, не существует. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/NotFoundLayout.sv.resx b/src/Client/Resources/Shared/NotFoundLayout.sv.resx new file mode 100644 index 0000000..e49cb97 --- /dev/null +++ b/src/Client/Resources/Shared/NotFoundLayout.sv.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Till Start! + + + Sidan du letar efter finns inte. + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/SharedResource.de.resx b/src/Client/Resources/Shared/SharedResource.de.resx new file mode 100644 index 0000000..c6de4f5 --- /dev/null +++ b/src/Client/Resources/Shared/SharedResource.de.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktionen + + + Fortgeschrittene Suche + + + Marke + + + Abbrechen + + + Erstellen + + + Bearbeiten + + + Produkt + + + Produkte + + + Neu laden + + + Suche nach + + + Aktualisieren + + + Benutzer + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/SharedResource.en.resx b/src/Client/Resources/Shared/SharedResource.en.resx new file mode 100644 index 0000000..4ced943 --- /dev/null +++ b/src/Client/Resources/Shared/SharedResource.en.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Actions + + + Advanced Search + + + Brand + + + Cancel + + + Create + + + Edit + + + Product + + + Products + + + Reload + + + Search for + + + Update + + + User + + \ No newline at end of file diff --git a/src/Client/Resources/Shared/SharedResource.it.resx b/src/Client/Resources/Shared/SharedResource.it.resx new file mode 100644 index 0000000..310e16e --- /dev/null +++ b/src/Client/Resources/Shared/SharedResource.it.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Azioni + + + Ricerca avanzata + + + Marchio + + + Annulla + + + Crea + + + Modifica + + + Prodotto + + + Prodotti + + + Ricarica + + + Ricerca per + + + Aggiorna + + + Utente + + \ No newline at end of file diff --git "a/src/Client/Resources/Shared/\342\200\217\342\200\217MainLayout.ar.resx" "b/src/Client/Resources/Shared/\342\200\217\342\200\217MainLayout.ar.resx" new file mode 100644 index 0000000..55bb1c9 --- /dev/null +++ "b/src/Client/Resources/Shared/\342\200\217\342\200\217MainLayout.ar.resx" @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + الحساب + + + اشتري لي قهوة! + + + دردشة؟ + + + تواصل اجتماعي + + + مجموعة الفيسبوك + + + صفحة الفيسبوك + + + نسخ الشوكة + + + تسجيل خروج + + + هل تريد حقًا تسجيل الخروج؟ + + + توثيق MudBlazor + + + دليل البدء السريع + + + Rرمز محدث. + + + الموارد + + + الدعم + + + تبديل الوضع الداكن + + + التبديل من اليمين إلى اليسار / من اليسار إلى اليمين + + + مرحبًا {0} + + + لقد تم تسجيل خروجك لأنه تم تحديث أذونات أحد الأدوار الخاصة بك. + + + لقد تم تسجيل خروجك لأنه تم حذف المستخدم الذي يحمل الرمز المميز الخاص بك. + + + لقد قمت بتسجيل الخروج. + + \ No newline at end of file diff --git "a/src/Client/Resources/Shared/\342\200\217\342\200\217NavMenu.ar.resx" "b/src/Client/Resources/Shared/\342\200\217\342\200\217NavMenu.ar.resx" new file mode 100644 index 0000000..50ba92e --- /dev/null +++ "b/src/Client/Resources/Shared/\342\200\217\342\200\217NavMenu.ar.resx" @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + الحساب + + + الإدارة + + + مسارات المراجعة + + + العلامات التجارية + + + إدارة الكتالوج + + + الدردشة + + + التواصل + + + لوحة الإدارة + + + إدارة المستندات + + + مخزن المستندات + + + أنواع المستندات + + + أسئلة وأجوبة + + + سمات + + + الصفحة الرئيسية + + + بريد + + + شخصي + + + المنتجات + + + دليل البدء السريع + + + الموارد + + + الأدوار + + + Swagger + + + المستخدمون + + \ No newline at end of file diff --git "a/src/Client/Resources/Shared/\342\200\217\342\200\217NotFoundLayout.ar.resx" "b/src/Client/Resources/Shared/\342\200\217\342\200\217NotFoundLayout.ar.resx" new file mode 100644 index 0000000..fa752e5 --- /dev/null +++ "b/src/Client/Resources/Shared/\342\200\217\342\200\217NotFoundLayout.ar.resx" @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + الذهاب للرئيسية! + + + الصفحة التي تبحث عنها غير موجودة. + + \ No newline at end of file diff --git a/src/Client/Shared/ApiHelper.cs b/src/Client/Shared/ApiHelper.cs new file mode 100644 index 0000000..8f82b78 --- /dev/null +++ b/src/Client/Shared/ApiHelper.cs @@ -0,0 +1,86 @@ +using RewardsPlus.BlazorWebAssembly.Client.Components.Common; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Shared; + +public static class ApiHelper +{ + public static async Task ExecuteCallGuardedAsync( + Func> call, + ISnackbar snackbar, + CustomValidation? customValidation = null, + string? successMessage = null) + { + customValidation?.ClearErrors(); + try + { + var result = await call(); + + if (!string.IsNullOrWhiteSpace(successMessage)) + { + snackbar.Add(successMessage, Severity.Info); + } + + return result; + } + catch (ApiException ex) + { + if (ex.Result.Errors is not null) + { + customValidation?.DisplayErrors(ex.Result.Errors); + } + else + { + snackbar.Add("Something went wrong!", Severity.Error); + } + } + catch (ApiException ex) + { + snackbar.Add(ex.Result.Exception, Severity.Error); + } + catch (Exception ex) + { + snackbar.Add(ex.Message, Severity.Error); + } + + return default; + } + + public static async Task ExecuteCallGuardedAsync( + Func call, + ISnackbar snackbar, + CustomValidation? customValidation = null, + string? successMessage = null) + { + customValidation?.ClearErrors(); + try + { + await call(); + + if (!string.IsNullOrWhiteSpace(successMessage)) + { + snackbar.Add(successMessage, Severity.Success); + } + + return true; + } + catch (ApiException ex) + { + if (ex.Result.Errors is not null) + { + customValidation?.DisplayErrors(ex.Result.Errors); + } + else + { + snackbar.Add("Something went wrong!", Severity.Error); + } + } + catch (ApiException ex) + { + snackbar.Add(ex.Result.Exception, Severity.Error); + } + + return false; + } +} \ No newline at end of file diff --git a/src/Client/Shared/BaseLayout.razor b/src/Client/Shared/BaseLayout.razor new file mode 100644 index 0000000..9eaabaa --- /dev/null +++ b/src/Client/Shared/BaseLayout.razor @@ -0,0 +1,33 @@ +@inherits LayoutComponentBase + + + + + + + + + + + + + + @Body + + + + + + + + + + @Body + + + + + + \ No newline at end of file diff --git a/src/Client/Shared/BaseLayout.razor.cs b/src/Client/Shared/BaseLayout.razor.cs new file mode 100644 index 0000000..0bb3d81 --- /dev/null +++ b/src/Client/Shared/BaseLayout.razor.cs @@ -0,0 +1,49 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Theme; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Shared; + +public partial class BaseLayout +{ + private ClientPreference? _themePreference; + private MudTheme _currentTheme = new LightTheme(); + private bool _themeDrawerOpen; + private bool _rightToLeft; + + protected override async Task OnInitializedAsync() + { + _themePreference = await ClientPreferences.GetPreference() as ClientPreference; + if (_themePreference == null) _themePreference = new ClientPreference(); + SetCurrentTheme(_themePreference); + + Snackbar.Add("Like this boilerplate? ", Severity.Normal, config => + { + config.BackgroundBlurred = true; + config.Icon = Icons.Custom.Brands.GitHub; + config.Action = "Star us on Github!"; + config.ActionColor = Color.Primary; + config.Onclick = snackbar => + { + Navigation.NavigateTo("https://github.com/fullstackhero/blazor-wasm-boilerplate"); + return Task.CompletedTask; + }; + }); + } + + private async Task ThemePreferenceChanged(ClientPreference themePreference) + { + SetCurrentTheme(themePreference); + await ClientPreferences.SetPreference(themePreference); + } + + private void SetCurrentTheme(ClientPreference themePreference) + { + _currentTheme = themePreference.IsDarkMode ? new DarkTheme() : new LightTheme(); + _currentTheme.Palette.Primary = themePreference.PrimaryColor; + _currentTheme.Palette.Secondary = themePreference.SecondaryColor; + _currentTheme.LayoutProperties.DefaultBorderRadius = $"{themePreference.BorderRadius}px"; + _currentTheme.LayoutProperties.DefaultBorderRadius = $"{themePreference.BorderRadius}px"; + _rightToLeft = themePreference.IsRTL; + } +} \ No newline at end of file diff --git a/src/Client/Shared/DialogServiceExtensions.cs b/src/Client/Shared/DialogServiceExtensions.cs new file mode 100644 index 0000000..ccd6dd2 --- /dev/null +++ b/src/Client/Shared/DialogServiceExtensions.cs @@ -0,0 +1,19 @@ +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Shared; + +public static class DialogServiceExtensions +{ + public static Task ShowModalAsync(this IDialogService dialogService, DialogParameters parameters) + where TDialog : ComponentBase => + dialogService.ShowModal(parameters).Result; + + public static IDialogReference ShowModal(this IDialogService dialogService, DialogParameters parameters) + where TDialog : ComponentBase + { + var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Medium, FullWidth = true, DisableBackdropClick = true }; + + return dialogService.Show(string.Empty, parameters, options); + } +} \ No newline at end of file diff --git a/src/Client/Shared/MainLayout.razor b/src/Client/Shared/MainLayout.razor new file mode 100644 index 0000000..7eec5df --- /dev/null +++ b/src/Client/Shared/MainLayout.razor @@ -0,0 +1,107 @@ +@inject IStringLocalizer L + + + + + + + @L["fullstackhero"] + + + + @L["Sponsor"] + + + + @L["Community"] + @L["Discord"] + @L["Facebook"] + + LinkedIn + Buy Me a Coffee! + + Open Collective + + @L["Resources"] + @L["Documentation"] + + + + + + + + + + + + + + +
+ + +
+ @L["Community"] + @L["Discord"] + @L["Facebook"] + + LinkedIn + @L["Resources"] + + @L["MudBlazor Documentation"] + + @L["Quick-Start Guide"] +
+ +
+ + + + + +
+ + +
+ + @L["Account"] +
+
+ +
+ + @L["Dashboard"] +
+
+
+ + Logout + +
+
+
+
+
+ + + + + + + + @ChildContent + + + + + \ No newline at end of file diff --git a/src/Client/Shared/MainLayout.razor.cs b/src/Client/Shared/MainLayout.razor.cs new file mode 100644 index 0000000..8eae587 --- /dev/null +++ b/src/Client/Shared/MainLayout.razor.cs @@ -0,0 +1,63 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace RewardsPlus.BlazorWebAssembly.Client.Shared; + +public partial class MainLayout +{ + [Parameter] + public RenderFragment ChildContent { get; set; } = default!; + [Parameter] + public EventCallback OnDarkModeToggle { get; set; } + [Parameter] + public EventCallback OnRightToLeftToggle { get; set; } + + private bool _drawerOpen; + private bool _rightToLeft; + + protected override async Task OnInitializedAsync() + { + if (await ClientPreferences.GetPreference() is ClientPreference preference) + { + _rightToLeft = preference.IsRTL; + _drawerOpen = preference.IsDrawerOpen; + } + } + + private async Task RightToLeftToggle() + { + bool isRtl = await ClientPreferences.ToggleLayoutDirectionAsync(); + _rightToLeft = isRtl; + + await OnRightToLeftToggle.InvokeAsync(isRtl); + } + + public async Task ToggleDarkMode() + { + await OnDarkModeToggle.InvokeAsync(); + } + + private async Task DrawerToggle() + { + _drawerOpen = await ClientPreferences.ToggleDrawerAsync(); + } + + private void Logout() + { + var parameters = new DialogParameters + { + { nameof(Dialogs.Logout.ContentText), $"{L["Logout Confirmation"]}"}, + { nameof(Dialogs.Logout.ButtonText), $"{L["Logout"]}"}, + { nameof(Dialogs.Logout.Color), Color.Error} + }; + + var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true }; + DialogService.Show(L["Logout"], parameters, options); + } + + private void Profile() + { + Navigation.NavigateTo("/account"); + } +} \ No newline at end of file diff --git a/src/Client/Shared/NavMenu.razor b/src/Client/Shared/NavMenu.razor new file mode 100644 index 0000000..9ccb1ba --- /dev/null +++ b/src/Client/Shared/NavMenu.razor @@ -0,0 +1,55 @@ +@inject IStringLocalizer L + + + + @L["Start"] + @L["Home"] + @L["Getting Started"] + @if (_canViewHangfire) + { + @L["Hangfire"] + } + @L["Personal"] + @if (_canViewDashboard) + { + @L["Dashboard"] + } + @L["Account"] + @L["Logs"] + @if (_canViewProducts || _canViewBrands) + { + @L["Management"] + + @if (_canViewProducts) + { + + @L["Products"] + + } + @if (_canViewBrands) + { + + @L["Brands"] + + } + + } + @if (CanViewAdministrationGroup) + { + @L["Administration"] + @if (_canViewUsers) + { + @L["Users"] + } + @if (_canViewRoles) + { + @L["Roles"] + } + @if(_canViewTenants) + { + @L["Tenants"] + } + } + \ No newline at end of file diff --git a/src/Client/Shared/NavMenu.razor.cs b/src/Client/Shared/NavMenu.razor.cs new file mode 100644 index 0000000..1329692 --- /dev/null +++ b/src/Client/Shared/NavMenu.razor.cs @@ -0,0 +1,39 @@ +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth; +using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Common; +using RewardsPlus.WebApi.Shared.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; + +namespace RewardsPlus.BlazorWebAssembly.Client.Shared; + +public partial class NavMenu +{ + [CascadingParameter] + protected Task AuthState { get; set; } = default!; + [Inject] + protected IAuthorizationService AuthService { get; set; } = default!; + + private string? _hangfireUrl; + private bool _canViewHangfire; + private bool _canViewDashboard; + private bool _canViewRoles; + private bool _canViewUsers; + private bool _canViewProducts; + private bool _canViewBrands; + private bool _canViewTenants; + private bool CanViewAdministrationGroup => _canViewUsers || _canViewRoles || _canViewTenants; + + protected override async Task OnParametersSetAsync() + { + _hangfireUrl = Config[ConfigNames.ApiBaseUrl] + "jobs"; + var user = (await AuthState).User; + _canViewHangfire = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.Hangfire); + _canViewDashboard = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.Dashboard); + _canViewRoles = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.Roles); + _canViewUsers = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.Users); + _canViewProducts = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.Products); + _canViewBrands = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.Brands); + _canViewTenants = await AuthService.HasPermissionAsync(user, FSHAction.View, FSHResource.Tenants); + } +} \ No newline at end of file diff --git a/src/Client/Shared/NotFound.razor b/src/Client/Shared/NotFound.razor new file mode 100644 index 0000000..98c36fd --- /dev/null +++ b/src/Client/Shared/NotFound.razor @@ -0,0 +1,56 @@ +@using Infrastructure.Theme +@inherits LayoutComponentBase + + + + +
+ + + + + + + + + + + + + + + + + Not Found + +
+ Go Home +
+
+
+
+ +@code { + private MudTheme _currentTheme = new LightTheme(); + + protected override async Task OnInitializedAsync() + { + _currentTheme = new LightTheme(); + _currentTheme = await ClientPreferences.GetCurrentThemeAsync(); + } +} \ No newline at end of file diff --git a/src/Client/Shared/SharedResource.cs b/src/Client/Shared/SharedResource.cs new file mode 100644 index 0000000..6bca88c --- /dev/null +++ b/src/Client/Shared/SharedResource.cs @@ -0,0 +1,5 @@ +namespace RewardsPlus.BlazorWebAssembly.Client.Shared; + +public class SharedResource +{ +} diff --git a/src/Client/_Imports.razor b/src/Client/_Imports.razor new file mode 100644 index 0000000..da539ad --- /dev/null +++ b/src/Client/_Imports.razor @@ -0,0 +1,42 @@ +@using System.Security.Claims +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components +@using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.AspNetCore.Components.WebAssembly.Authentication +@using Microsoft.AspNetCore.Components.WebAssembly.Http +@using Microsoft.AspNetCore.WebUtilities +@using Microsoft.Extensions.Configuration +@using Microsoft.Extensions.DependencyInjection +@using Microsoft.Extensions.Localization +@using Microsoft.JSInterop +@using RewardsPlus.BlazorWebAssembly.Client +@using RewardsPlus.BlazorWebAssembly.Client.Shared +@using RewardsPlus.BlazorWebAssembly.Client.Pages.Authentication +@using RewardsPlus.BlazorWebAssembly.Client.Pages.Multitenancy +@using RewardsPlus.BlazorWebAssembly.Client.Components.Common +@using RewardsPlus.BlazorWebAssembly.Client.Components.EntityTable +@using RewardsPlus.BlazorWebAssembly.Client.Components.Localization +@using RewardsPlus.BlazorWebAssembly.Client.Components.Notifications +@using RewardsPlus.BlazorWebAssembly.Client.Components.ThemeManager +@using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.ApiClient +@using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Auth +@using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Common +@using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Notifications +@using RewardsPlus.BlazorWebAssembly.Client.Infrastructure.Preferences +@using RewardsPlus.WebApi.Shared.Authorization +@using Blazored.LocalStorage +@using Mapster +@using MediatR.Courier +@using MudBlazor + +@attribute [Authorize] + +@inject NavigationManager Navigation +@inject ISnackbar Snackbar +@inject IDialogService DialogService +@inject IConfiguration Config +@inject IClientPreferenceManager ClientPreferences \ No newline at end of file diff --git a/src/Client/wwwroot/appsettings.Development.json b/src/Client/wwwroot/appsettings.Development.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/src/Client/wwwroot/appsettings.Development.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/Client/wwwroot/appsettings.json b/src/Client/wwwroot/appsettings.json new file mode 100644 index 0000000..704cf56 --- /dev/null +++ b/src/Client/wwwroot/appsettings.json @@ -0,0 +1,10 @@ +{ + "ApiBaseUrl": "https://localhost:5001/", + "AuthProvider": "Jwt", + "AzureAd": { + "Authority": "https://login.microsoftonline.com/organizations", + "ClientId": "", + "ValidateAuthority": true, + "ApiScope": "api:///access_as_user" + } +} \ No newline at end of file diff --git a/src/Client/wwwroot/css/fsh.css b/src/Client/wwwroot/css/fsh.css new file mode 100644 index 0000000..a44b634 --- /dev/null +++ b/src/Client/wwwroot/css/fsh.css @@ -0,0 +1,72 @@ +.fsh-center-text { + text-align: center !important; +} + +.mud-button-filled { + box-shadow: 0 3px 1px -2px rgb(0 0 0 / 30%), 0 2px 2px 0 rgb(0 0 0 / 0), 0 1px 5px 0 rgb(0 0 0 / 10%) !important; +} + +.mud-dialog { + box-shadow: 0 3px 1px -2px rgb(0 0 0 / 10%), 0 2px 2px 0 rgb(0 0 0 / 0), 0 10px 10px 0 rgb(0 0 0 / 5%) !important; +} + +.mud-nav-link { + white-space: normal !important; + padding: 12px 16px 12px 38px; +} + + .mud-nav-link.active:not(.mud-nav-link-disabled) { + border-right: 3px solid var(--mud-palette-primary); + background-color: rgba(var(--mud-palette-primary-rgb), 0.1); + } + +.mud-table { + padding: 20px !important; + margin-bottom: 20px !important; +} + +.mud-card { + margin-bottom: 20px !important; +} + +#blazor-error-ui { + color: var(--mud-palette-drawer-text); + background: var(--mud-palette-drawer-background); +} + +.mud-overlay-dark { + backdrop-filter: blur(2px); +} + +.mud-card-header .mud-card-header-avatar { + margin-inline-end: 10px !important; +} + +.mud-nav-link { + padding: 12px 16px 12px 15px !important; +} + +.mud-dialog-content { + max-height: 75vh !important; + overflow: auto !important; + overflow-x: hidden !important; +} + +.mud-grid-spacing-xs-3 { + margin: 0px !important; + margin-left: -12px !important; +} + +.mud-table-toolbar +{ + flex-wrap:wrap; + margin-bottom:20px!important; +} + +::-webkit-scrollbar { + width: 2px!important; + height: 6px!important; +} +.fsh-nav-child { + padding-left: 10px !important; +} \ No newline at end of file diff --git a/src/Client/wwwroot/favicon.ico b/src/Client/wwwroot/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fd58c54d08dcde4e4c40e4c8187a3d8bb79829d6 GIT binary patch literal 18409 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 literal 0 HcmV?d00001 diff --git a/src/Client/wwwroot/full-stack-hero-logo.png b/src/Client/wwwroot/full-stack-hero-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..05bdf45be151f25724da91e566fc9e7c9ab3f2c7 GIT binary patch literal 160036 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ℑ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

)!RQS&Mik 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 + + + + + + Blazor WebAssembly Boilerplate + + + + + + + + + + + + +

+ + +
+
+
+
+
+ +
+
+
+ +
+ + + + + + + + + \ No newline at end of file diff --git a/src/Client/wwwroot/manifest.json b/src/Client/wwwroot/manifest.json new file mode 100644 index 0000000..c95abce --- /dev/null +++ b/src/Client/wwwroot/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "Blazor WebAssembly Boilerplate", + "short_name": "Blazor WebAssembly Boilerplate", + "start_url": "./", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#3eaf7c", + "prefer_related_applications": false, + "icons": [ + { + "src": "full-stack-hero-logo.png", + "type": "image/png", + "sizes": "512x512" + }, + { + "src": "full-stack-hero-logo.png", + "type": "image/png", + "sizes": "192x192" + } + ] +} \ No newline at end of file diff --git a/src/Client/wwwroot/service-worker.js b/src/Client/wwwroot/service-worker.js new file mode 100644 index 0000000..0c4fa6b --- /dev/null +++ b/src/Client/wwwroot/service-worker.js @@ -0,0 +1,4 @@ +// In development, always fetch from the network and do not enable offline support. +// This is because caching would make development more difficult (changes would not +// be reflected on the first load after each change). +self.addEventListener('fetch', () => { }); \ No newline at end of file diff --git a/src/Client/wwwroot/service-worker.published.js b/src/Client/wwwroot/service-worker.published.js new file mode 100644 index 0000000..a88a6e9 --- /dev/null +++ b/src/Client/wwwroot/service-worker.published.js @@ -0,0 +1,48 @@ +// Caution! Be sure you understand the caveats before publishing an application with +// offline support. See https://aka.ms/blazor-offline-considerations + +self.importScripts('./service-worker-assets.js'); +self.addEventListener('install', event => event.waitUntil(onInstall(event))); +self.addEventListener('activate', event => event.waitUntil(onActivate(event))); +self.addEventListener('fetch', event => event.respondWith(onFetch(event))); + +const cacheNamePrefix = 'offline-cache-'; +const cacheName = `${cacheNamePrefix}${self.assetsManifest.version}`; +const offlineAssetsInclude = [/\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/, /\.blat$/, /\.dat$/]; +const offlineAssetsExclude = [/^service-worker\.js$/]; + +async function onInstall(event) { + console.info('Service worker: Install'); + + // Fetch and cache all matching items from the assets manifest + const assetsRequests = self.assetsManifest.assets + .filter(asset => offlineAssetsInclude.some(pattern => pattern.test(asset.url))) + .filter(asset => !offlineAssetsExclude.some(pattern => pattern.test(asset.url))) + .map(asset => new Request(asset.url, { integrity: asset.hash, cache: 'no-cache' })); + await caches.open(cacheName).then(cache => cache.addAll(assetsRequests)); +} + +async function onActivate(event) { + console.info('Service worker: Activate'); + + // Delete unused caches + const cacheKeys = await caches.keys(); + await Promise.all(cacheKeys + .filter(key => key.startsWith(cacheNamePrefix) && key !== cacheName) + .map(key => caches.delete(key))); +} + +async function onFetch(event) { + let cachedResponse = null; + if (event.request.method === 'GET') { + // For all navigation requests, try to serve index.html from cache + // If you need some URLs to be server-rendered, edit the following check to exclude those URLs + const shouldServeIndexHtml = event.request.mode === 'navigate'; + + const request = shouldServeIndexHtml ? 'index.html' : event.request; + const cache = await caches.open(cacheName); + cachedResponse = await cache.match(request); + } + + return cachedResponse || fetch(event.request); +} \ No newline at end of file diff --git a/src/Host/Host.csproj b/src/Host/Host.csproj new file mode 100644 index 0000000..50cd34d --- /dev/null +++ b/src/Host/Host.csproj @@ -0,0 +1,24 @@ + + + + net6.0 + FSH.BlazorWebAssembly.Host + FSH.BlazorWebAssembly.Host + + + + + + + + + + + + + + Always + + + + \ No newline at end of file diff --git a/src/Host/Pages/Error.cshtml b/src/Host/Pages/Error.cshtml new file mode 100644 index 0000000..9257435 --- /dev/null +++ b/src/Host/Pages/Error.cshtml @@ -0,0 +1,44 @@ +@page +@model RewardsPlus.BlazorWebAssembly.Server.Pages.ErrorModel + + + + + + + + Error + + + + + +
+
+

Error.

+

An error occurred while processing your request.

+ + @if (Model.ShowRequestId) + { +

+ Request ID: @Model.RequestId +

+ } + +

Development Mode

+

+ Swapping to the Development environment displays detailed information about the error + that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the + ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

+
+
+ + + diff --git a/src/Host/Pages/Error.cshtml.cs b/src/Host/Pages/Error.cshtml.cs new file mode 100644 index 0000000..84fedd9 --- /dev/null +++ b/src/Host/Pages/Error.cshtml.cs @@ -0,0 +1,19 @@ +using System.Diagnostics; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace RewardsPlus.BlazorWebAssembly.Server.Pages; + +[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] +[IgnoreAntiforgeryToken] +public class ErrorModel : PageModel +{ + public string? RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + public void OnGet() + { + RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + } +} \ No newline at end of file diff --git a/src/Host/Program.cs b/src/Host/Program.cs new file mode 100644 index 0000000..098865c --- /dev/null +++ b/src/Host/Program.cs @@ -0,0 +1,26 @@ +var builder = WebApplication.CreateBuilder(args); +builder.Services.AddControllersWithViews(); +builder.Services.AddRazorPages(); + +var app = builder.Build(); + +if (app.Environment.IsDevelopment()) +{ + app.UseWebAssemblyDebugging(); +} +else +{ + app.UseExceptionHandler("/Error"); + app.UseHsts(); +} + +app.UseHttpsRedirection(); +app.UseBlazorFrameworkFiles(); +app.UseStaticFiles(); +app.UseRouting(); + +app.MapRazorPages(); +app.MapControllers(); +app.MapFallbackToFile("index.html"); + +app.Run(); \ No newline at end of file diff --git a/src/Host/Properties/launchSettings.json b/src/Host/Properties/launchSettings.json new file mode 100644 index 0000000..a24d289 --- /dev/null +++ b/src/Host/Properties/launchSettings.json @@ -0,0 +1,30 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:21716", + "sslPort": 44331 + } + }, + "profiles": { + "FSH.BlazorWebAssembly.Server": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:5002;http://localhost:5003", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/src/Host/appsettings.Development.json b/src/Host/appsettings.Development.json new file mode 100644 index 0000000..1b2d3ba --- /dev/null +++ b/src/Host/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} \ No newline at end of file diff --git a/src/Host/appsettings.json b/src/Host/appsettings.json new file mode 100644 index 0000000..ec04bc1 --- /dev/null +++ b/src/Host/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} \ No newline at end of file diff --git a/src/Shared/Authorization/ClaimsPrincipalExtensions.cs b/src/Shared/Authorization/ClaimsPrincipalExtensions.cs new file mode 100644 index 0000000..71a5ff1 --- /dev/null +++ b/src/Shared/Authorization/ClaimsPrincipalExtensions.cs @@ -0,0 +1,39 @@ +using RewardsPlus.WebApi.Shared.Authorization; + +namespace System.Security.Claims; + +public static class ClaimsPrincipalExtensions +{ + public static string? GetEmail(this ClaimsPrincipal principal) + => principal.FindFirstValue(ClaimTypes.Email); + + public static string? GetTenant(this ClaimsPrincipal principal) + => principal.FindFirstValue(FSHClaims.Tenant); + + public static string? GetFullName(this ClaimsPrincipal principal) + => principal?.FindFirst(FSHClaims.Fullname)?.Value; + + public static string? GetFirstName(this ClaimsPrincipal principal) + => principal?.FindFirst(ClaimTypes.Name)?.Value; + + public static string? GetSurname(this ClaimsPrincipal principal) + => principal?.FindFirst(ClaimTypes.Surname)?.Value; + + public static string? GetPhoneNumber(this ClaimsPrincipal principal) + => principal.FindFirstValue(ClaimTypes.MobilePhone); + + public static string? GetUserId(this ClaimsPrincipal principal) + => principal.FindFirstValue(ClaimTypes.NameIdentifier); + + public static string? GetImageUrl(this ClaimsPrincipal principal) + => principal.FindFirstValue(FSHClaims.ImageUrl); + + public static DateTimeOffset GetExpiration(this ClaimsPrincipal principal) => + DateTimeOffset.FromUnixTimeSeconds(Convert.ToInt64( + principal.FindFirstValue(FSHClaims.Expiration))); + + private static string? FindFirstValue(this ClaimsPrincipal principal, string claimType) => + principal is null + ? throw new ArgumentNullException(nameof(principal)) + : principal.FindFirst(claimType)?.Value; +} \ No newline at end of file diff --git a/src/Shared/Authorization/FSHClaims.cs b/src/Shared/Authorization/FSHClaims.cs new file mode 100644 index 0000000..08be955 --- /dev/null +++ b/src/Shared/Authorization/FSHClaims.cs @@ -0,0 +1,11 @@ +namespace RewardsPlus.WebApi.Shared.Authorization; + +public static class FSHClaims +{ + public const string Tenant = "tenant"; + public const string Fullname = "fullName"; + public const string Permission = "permission"; + public const string ImageUrl = "image_url"; + public const string IpAddress = "ipAddress"; + public const string Expiration = "exp"; +} \ No newline at end of file diff --git a/src/Shared/Authorization/FSHPermissions.cs b/src/Shared/Authorization/FSHPermissions.cs new file mode 100644 index 0000000..4758485 --- /dev/null +++ b/src/Shared/Authorization/FSHPermissions.cs @@ -0,0 +1,80 @@ +using System.Collections.ObjectModel; + +namespace RewardsPlus.WebApi.Shared.Authorization; + +public static class FSHAction +{ + public const string View = nameof(View); + public const string Search = nameof(Search); + public const string Create = nameof(Create); + public const string Update = nameof(Update); + public const string Delete = nameof(Delete); + public const string Export = nameof(Export); + public const string Generate = nameof(Generate); + public const string Clean = nameof(Clean); + public const string UpgradeSubscription = nameof(UpgradeSubscription); +} + +public static class FSHResource +{ + public const string Tenants = nameof(Tenants); + public const string Dashboard = nameof(Dashboard); + public const string Hangfire = nameof(Hangfire); + public const string Users = nameof(Users); + public const string UserRoles = nameof(UserRoles); + public const string Roles = nameof(Roles); + public const string RoleClaims = nameof(RoleClaims); + public const string Products = nameof(Products); + public const string Brands = nameof(Brands); +} + +public static class FSHPermissions +{ + private static readonly FSHPermission[] _all = new FSHPermission[] + { + new("View Dashboard", FSHAction.View, FSHResource.Dashboard), + new("View Hangfire", FSHAction.View, FSHResource.Hangfire), + new("View Users", FSHAction.View, FSHResource.Users), + new("Search Users", FSHAction.Search, FSHResource.Users), + new("Create Users", FSHAction.Create, FSHResource.Users), + new("Update Users", FSHAction.Update, FSHResource.Users), + new("Delete Users", FSHAction.Delete, FSHResource.Users), + new("Export Users", FSHAction.Export, FSHResource.Users), + new("View UserRoles", FSHAction.View, FSHResource.UserRoles), + new("Update UserRoles", FSHAction.Update, FSHResource.UserRoles), + new("View Roles", FSHAction.View, FSHResource.Roles), + new("Create Roles", FSHAction.Create, FSHResource.Roles), + new("Update Roles", FSHAction.Update, FSHResource.Roles), + new("Delete Roles", FSHAction.Delete, FSHResource.Roles), + new("View RoleClaims", FSHAction.View, FSHResource.RoleClaims), + new("Update RoleClaims", FSHAction.Update, FSHResource.RoleClaims), + new("View Products", FSHAction.View, FSHResource.Products, IsBasic: true), + new("Search Products", FSHAction.Search, FSHResource.Products, IsBasic: true), + new("Create Products", FSHAction.Create, FSHResource.Products), + new("Update Products", FSHAction.Update, FSHResource.Products), + new("Delete Products", FSHAction.Delete, FSHResource.Products), + new("Export Products", FSHAction.Export, FSHResource.Products), + new("View Brands", FSHAction.View, FSHResource.Brands, IsBasic: true), + new("Search Brands", FSHAction.Search, FSHResource.Brands, IsBasic: true), + new("Create Brands", FSHAction.Create, FSHResource.Brands), + new("Update Brands", FSHAction.Update, FSHResource.Brands), + new("Delete Brands", FSHAction.Delete, FSHResource.Brands), + new("Generate Brands", FSHAction.Generate, FSHResource.Brands), + new("Clean Brands", FSHAction.Clean, FSHResource.Brands), + new("View Tenants", FSHAction.View, FSHResource.Tenants, IsRoot: true), + new("Create Tenants", FSHAction.Create, FSHResource.Tenants, IsRoot: true), + new("Update Tenants", FSHAction.Update, FSHResource.Tenants, IsRoot: true), + new("Upgrade Tenant Subscription", FSHAction.UpgradeSubscription, FSHResource.Tenants, IsRoot: true) + }; + + public static IReadOnlyList All { get; } = new ReadOnlyCollection(_all); + public static IReadOnlyList Root { get; } = new ReadOnlyCollection(_all.Where(p => p.IsRoot).ToArray()); + public static IReadOnlyList Admin { get; } = new ReadOnlyCollection(_all.Where(p => !p.IsRoot).ToArray()); + public static IReadOnlyList Basic { get; } = new ReadOnlyCollection(_all.Where(p => p.IsBasic).ToArray()); +} + +public record FSHPermission(string Description, string Action, string Resource, bool IsBasic = false, bool IsRoot = false) +{ + public string Name => NameFor(Action, Resource); + public static string NameFor(string action, string resource) => $"Permissions.{resource}.{action}"; +} \ No newline at end of file diff --git a/src/Shared/Authorization/FSHRoles.cs b/src/Shared/Authorization/FSHRoles.cs new file mode 100644 index 0000000..c38fa27 --- /dev/null +++ b/src/Shared/Authorization/FSHRoles.cs @@ -0,0 +1,17 @@ +using System.Collections.ObjectModel; + +namespace RewardsPlus.WebApi.Shared.Authorization; + +public static class FSHRoles +{ + public static string Admin = nameof(Admin); + public static string Basic = nameof(Basic); + + public static IReadOnlyList DefaultRoles { get; } = new ReadOnlyCollection(new[] + { + Admin, + Basic + }); + + public static bool IsDefault(string roleName) => DefaultRoles.Any(r => r == roleName); +} \ No newline at end of file diff --git a/src/Shared/Events/IEvent.cs b/src/Shared/Events/IEvent.cs new file mode 100644 index 0000000..f2cccc9 --- /dev/null +++ b/src/Shared/Events/IEvent.cs @@ -0,0 +1,5 @@ +namespace RewardsPlus.WebApi.Shared.Events; + +public interface IEvent +{ +} \ No newline at end of file diff --git a/src/Shared/MultiTenancy/MultitenancyConstants.cs b/src/Shared/MultiTenancy/MultitenancyConstants.cs new file mode 100644 index 0000000..d5ae1e1 --- /dev/null +++ b/src/Shared/MultiTenancy/MultitenancyConstants.cs @@ -0,0 +1,15 @@ +namespace RewardsPlus.WebApi.Shared.Multitenancy; + +public class MultitenancyConstants +{ + public static class Root + { + public const string Id = "root"; + public const string Name = "Root"; + public const string EmailAddress = "admin@root.com"; + } + + public const string DefaultPassword = "123Pa$$word!"; + + public const string TenantIdName = "tenant"; +} \ No newline at end of file diff --git a/src/Shared/Notifications/BasicNotification.cs b/src/Shared/Notifications/BasicNotification.cs new file mode 100644 index 0000000..a7e8bde --- /dev/null +++ b/src/Shared/Notifications/BasicNotification.cs @@ -0,0 +1,15 @@ +namespace RewardsPlus.WebApi.Shared.Notifications; + +public class BasicNotification : INotificationMessage +{ + public enum LabelType + { + Information, + Success, + Warning, + Error + } + + public string? Message { get; set; } + public LabelType Label { get; set; } +} \ No newline at end of file diff --git a/src/Shared/Notifications/INotificationMessage.cs b/src/Shared/Notifications/INotificationMessage.cs new file mode 100644 index 0000000..f059af0 --- /dev/null +++ b/src/Shared/Notifications/INotificationMessage.cs @@ -0,0 +1,5 @@ +namespace RewardsPlus.WebApi.Shared.Notifications; + +public interface INotificationMessage +{ +} \ No newline at end of file diff --git a/src/Shared/Notifications/JobNotification.cs b/src/Shared/Notifications/JobNotification.cs new file mode 100644 index 0000000..9ada2a2 --- /dev/null +++ b/src/Shared/Notifications/JobNotification.cs @@ -0,0 +1,8 @@ +namespace RewardsPlus.WebApi.Shared.Notifications; + +public class JobNotification : INotificationMessage +{ + public string? Message { get; set; } + public string? JobId { get; set; } + public decimal Progress { get; set; } +} \ No newline at end of file diff --git a/src/Shared/Notifications/NotificationConstants.cs b/src/Shared/Notifications/NotificationConstants.cs new file mode 100644 index 0000000..5a3d407 --- /dev/null +++ b/src/Shared/Notifications/NotificationConstants.cs @@ -0,0 +1,6 @@ +namespace RewardsPlus.WebApi.Shared.Notifications; + +public static class NotificationConstants +{ + public const string NotificationFromServer = nameof(NotificationFromServer); +} \ No newline at end of file diff --git a/src/Shared/Notifications/StatsChangedNotification.cs b/src/Shared/Notifications/StatsChangedNotification.cs new file mode 100644 index 0000000..1201fff --- /dev/null +++ b/src/Shared/Notifications/StatsChangedNotification.cs @@ -0,0 +1,5 @@ +namespace RewardsPlus.WebApi.Shared.Notifications; + +public class StatsChangedNotification : INotificationMessage +{ +} \ No newline at end of file diff --git a/src/Shared/Shared.csproj b/src/Shared/Shared.csproj new file mode 100644 index 0000000..72eb13f --- /dev/null +++ b/src/Shared/Shared.csproj @@ -0,0 +1,7 @@ + + + net6.0 + FSH.WebApi.Shared + FSH.WebApi.Shared + + \ No newline at end of file diff --git a/stylecop.json b/stylecop.json new file mode 100644 index 0000000..95ceebe --- /dev/null +++ b/stylecop.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", + "settings": { + "orderingRules": { + "systemUsingDirectivesFirst": true, + "usingDirectivesPlacement": "outsideNamespace" + }, + "layoutRules": { + "newlineAtEndOfFile": "omit" + } + } +} \ No newline at end of file