From 88e45d2916529bcd1876946b3d9936f0221db42c Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 10 Sep 2018 13:39:25 +0300 Subject: [PATCH] Implemented tenant switch --- framework/Volo.Abp.sln | 12 +-- .../Abp/MultiTenancy/TenantSwitchModal.cshtml | 21 ++++++ .../MultiTenancy/TenantSwitchModal.cshtml.cs | 74 +++++++++++++++++++ .../Abp/MultiTenancy/_ViewImports.cshtml | 3 + .../Pages/Abp/MultiTenancy/tenant-switch.js | 16 ++++ .../Properties/launchSettings.json | 0 ...Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj} | 16 +++- .../AbpAspNetCoreMvcUiMultiTenancyModule.cs | 61 +++++++++++++++ .../Components/TenantSwitch/Default.cshtml | 14 ++++ .../TenantSwitch/TenantSwitchViewComponent.cs | 41 ++++++++++ .../Localization/AbpUiMultiTenancyResource.cs | 10 +++ .../Mvc/UI/MultiTenancy/Localization/en.json | 9 +++ .../Mvc/UI/MultiTenancy/Localization/tr.json | 9 +++ .../MultiTenancyToolbarContributor.cs | 21 ++++++ .../AbpAspNetCoreMvcUITenantSwitchModule.cs | 15 ---- .../bootstrap/modal-manager.js | 34 ++++----- .../Mvc/UI/RazorPages/AbpPageModel.cs | 38 ++++++++-- .../Volo/Abp/Modularity/AbpModule.cs | 6 ++ .../MultiTenancy/CurrentTenantExtensions.cs | 20 +++++ 19 files changed, 373 insertions(+), 47 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/_ViewImports.cshtml create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/tenant-switch.js rename framework/src/{Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch => Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy}/Properties/launchSettings.json (100%) rename framework/src/{Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch.csproj => Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj} (54%) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/AbpAspNetCoreMvcUiMultiTenancyModule.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Components/TenantSwitch/Default.cshtml create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Components/TenantSwitch/TenantSwitchViewComponent.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/AbpUiMultiTenancyResource.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/tr.json create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/MultiTenancyToolbarContributor.cs delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch/AbpAspNetCoreMvcUITenantSwitchModule.cs create mode 100644 framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/CurrentTenantExtensions.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 16f2d55c9d..7c81ccd6e7 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -212,7 +212,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.RabbitMQ", "src\Vo EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Emailing.Tests", "test\Volo.Abp.Emailing.Tests\Volo.Abp.Emailing.Tests.csproj", "{D3E07597-BB3D-4249-B873-607E2C128C0E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch", "src\Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch\Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch.csproj", "{6C67A0E0-5C0A-47C1-9B04-616B8820B377}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy", "src\Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy\Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj", "{77A621CF-9562-411B-A707-C7C02CC3B8FA}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -600,10 +600,10 @@ Global {D3E07597-BB3D-4249-B873-607E2C128C0E}.Debug|Any CPU.Build.0 = Debug|Any CPU {D3E07597-BB3D-4249-B873-607E2C128C0E}.Release|Any CPU.ActiveCfg = Release|Any CPU {D3E07597-BB3D-4249-B873-607E2C128C0E}.Release|Any CPU.Build.0 = Release|Any CPU - {6C67A0E0-5C0A-47C1-9B04-616B8820B377}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6C67A0E0-5C0A-47C1-9B04-616B8820B377}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6C67A0E0-5C0A-47C1-9B04-616B8820B377}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6C67A0E0-5C0A-47C1-9B04-616B8820B377}.Release|Any CPU.Build.0 = Release|Any CPU + {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -706,7 +706,7 @@ Global {DA7A2C04-E8C4-48AA-A37E-27C25BCE280A} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {D91DE561-F403-416F-BD0B-DBF0BA1C4447} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {D3E07597-BB3D-4249-B873-607E2C128C0E} = {447C8A77-E5F0-4538-8687-7383196D04EA} - {6C67A0E0-5C0A-47C1-9B04-616B8820B377} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {77A621CF-9562-411B-A707-C7C02CC3B8FA} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml new file mode 100644 index 0000000000..b7b8887a01 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml @@ -0,0 +1,21 @@ +@page +@using Microsoft.AspNetCore.Mvc.Localization +@using Pages.Abp.MultiTenancy +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal +@using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.Localization +@model TenantSwitchModalModel +@inject IHtmlLocalizer L +@{ + Layout = null; +} + + + + + +

@L["SwitchTenantHint"]

+
+ @* TODO: A "Submit" would be better than "Save"! *@ + +
+
\ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs new file mode 100644 index 0000000000..aa1108d4e5 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs @@ -0,0 +1,74 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using Volo.Abp; +using Volo.Abp.AspNetCore.MultiTenancy; +using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.Localization; +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; +using Volo.Abp.MultiTenancy; + +namespace Pages.Abp.MultiTenancy +{ + public class TenantSwitchModalModel : AbpPageModel + { + [BindProperty] + public TenantInfoModel Input { get; set; } + + protected ITenantStore TenantStore { get; } + protected AspNetCoreMultiTenancyOptions Options { get; } + + public TenantSwitchModalModel( + ITenantStore tenantStore, + IOptions options) + { + TenantStore = tenantStore; + Options = options.Value; + LocalizationResourceType = typeof(AbpUiMultiTenancyResource); + } + + public async Task OnGetAsync() + { + Input = new TenantInfoModel(); + + if (CurrentTenant.IsAvailable) + { + var tenant = await TenantStore.FindAsync(CurrentTenant.GetId()); + Input.Name = tenant?.Name; + } + } + + public async Task OnPostAsync() + { + if (Input.Name.IsNullOrEmpty()) + { + Response.Cookies.Delete(Options.TenantKey); + } + else + { + var tenant = await TenantStore.FindAsync(Input.Name); + if (tenant == null) + { + throw new UserFriendlyException(L["GivenTenantIsNotAvailable", Input.Name]); + } + + Response.Cookies.Append( + Options.TenantKey, + tenant.Id.ToString(), + new CookieOptions + { + Path = "/", + HttpOnly = false, + Expires = DateTimeOffset.Now.AddYears(10) + } + ); + } + } + + public class TenantInfoModel + { + public string Name { get; set; } + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/_ViewImports.cshtml b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/_ViewImports.cshtml new file mode 100644 index 0000000000..225780c2c2 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/_ViewImports.cshtml @@ -0,0 +1,3 @@ +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/tenant-switch.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/tenant-switch.js new file mode 100644 index 0000000000..57a01a3740 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/tenant-switch.js @@ -0,0 +1,16 @@ +(function($) { + + var tenantSwitchModal = new abp.ModalManager(abp.appPath + 'Abp/MultiTenancy/TenantSwitchModal'); + + $(function() { + $('#TenantSwitchToolbarLink').click(function(e) { + e.preventDefault(); + tenantSwitchModal.open(); + }); + + tenantSwitchModal.onResult(function() { + location.reload(); + }); + }); + +})(jQuery); \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Properties/launchSettings.json similarity index 100% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch/Properties/launchSettings.json rename to framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Properties/launchSettings.json diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj similarity index 54% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch.csproj rename to framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj index 1e8257fd8f..f8bbf69c9a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj @@ -4,16 +4,28 @@ netstandard2.0 - Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch - Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch + Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy + Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; false false false true Library + + + + + + + + + + + + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/AbpAspNetCoreMvcUiMultiTenancyModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/AbpAspNetCoreMvcUiMultiTenancyModule.cs new file mode 100644 index 0000000000..13b58dd32d --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/AbpAspNetCoreMvcUiMultiTenancyModule.cs @@ -0,0 +1,61 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AspNetCore.MultiTenancy; +using Volo.Abp.AspNetCore.Mvc.Localization; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.Localization; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; +using Volo.Abp.VirtualFileSystem; + +namespace Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy +{ + [DependsOn( + typeof(AbpAspNetCoreMvcUiThemeSharedModule), + typeof(AbpAspNetCoreMultiTenancyModule) + )] + public class AbpAspNetCoreMvcUiMultiTenancyModule : AbpModule + { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(options => + { + options.AddAssemblyResource( + typeof(AbpUiMultiTenancyResource), + typeof(AbpAspNetCoreMvcUiMultiTenancyModule).Assembly + ); + }); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + + Configure(options => + { + options.Contributors.Add(new MultiTenancyToolbarContributor()); + }); + + Configure(options => + { + options.Resources + .Add("en") + .AddVirtualJson("/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization"); + }); + + Configure(options => + { + options.ScriptBundles + .Get(StandardBundles.Scripts.Global) + .AddFiles( + "/Pages/Abp/MultiTenancy/tenant-switch.js" + ); + }); + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Components/TenantSwitch/Default.cshtml b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Components/TenantSwitch/Default.cshtml new file mode 100644 index 0000000000..c275048621 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Components/TenantSwitch/Default.cshtml @@ -0,0 +1,14 @@ +@using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.Components.TenantSwitch +@model TenantSwitchViewComponent.TenantSwitchViewModel + \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Components/TenantSwitch/TenantSwitchViewComponent.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Components/TenantSwitch/TenantSwitchViewComponent.cs new file mode 100644 index 0000000000..739dc71b5b --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Components/TenantSwitch/TenantSwitchViewComponent.cs @@ -0,0 +1,41 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.Components.TenantSwitch +{ + public class TenantSwitchViewComponent : AbpViewComponent + { + /// + /// -1,000,000 + /// + public const int Order = -1_000_000; + + protected ITenantStore TenantStore { get; } + + protected ICurrentTenant CurrentTenant { get; } + + public TenantSwitchViewComponent(ITenantStore tenantStore, ICurrentTenant currentTenant) + { + TenantStore = tenantStore; + CurrentTenant = currentTenant; + } + + public async Task InvokeAsync() + { + var model = new TenantSwitchViewModel(); + + if (CurrentTenant.Id.HasValue) + { + model.Tenant = await TenantStore.FindAsync(CurrentTenant.GetId()); + } + + return View("~/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Components/TenantSwitch/Default.cshtml", model); + } + + public class TenantSwitchViewModel + { + public TenantInfo Tenant { get; set; } + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/AbpUiMultiTenancyResource.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/AbpUiMultiTenancyResource.cs new file mode 100644 index 0000000000..cbaaeadbf3 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/AbpUiMultiTenancyResource.cs @@ -0,0 +1,10 @@ +using Volo.Abp.Localization; + +namespace Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.Localization +{ + [LocalizationResourceName("AbpUiMultiTenancy")] + public class AbpUiMultiTenancyResource + { + + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json new file mode 100644 index 0000000000..2f19b5eb1f --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json @@ -0,0 +1,9 @@ +{ + "culture": "en", + "texts": { + "GivenTenantIsNotAvailable": "Given tenant is not available: {0}", + "SwitchTenant": "Switch tenant", + "Name": "Name", + "SwitchTenantHint": "Leave the name field blank to switch to the host side." + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/tr.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/tr.json new file mode 100644 index 0000000000..5bbd020497 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/tr.json @@ -0,0 +1,9 @@ +{ + "culture": "tr", + "texts": { + "GivenTenantIsNotAvailable": "İstenilen müşteri bulunamadı: {0}", + "SwitchTenant": "Müşteri değiştir", + "Name": "İsim", + "SwitchTenantHint": "Host tarafına geçmek için isim alanını boş bırakın." + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/MultiTenancyToolbarContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/MultiTenancyToolbarContributor.cs new file mode 100644 index 0000000000..d6a6f54b61 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/MultiTenancyToolbarContributor.cs @@ -0,0 +1,21 @@ +using System.Threading.Tasks; +using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.Components.TenantSwitch; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars; + +namespace Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy +{ + public class MultiTenancyToolbarContributor : IToolbarContributor + { + public Task ConfigureToolbarAsync(IToolbarConfigurationContext context) + { + if (context.Toolbar.Name != StandardToolbars.Main) + { + return Task.CompletedTask; + } + + context.Toolbar.Items.Add(new ToolbarItem(typeof(TenantSwitchViewComponent), TenantSwitchViewComponent.Order)); + + return Task.CompletedTask; + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch/AbpAspNetCoreMvcUITenantSwitchModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch/AbpAspNetCoreMvcUITenantSwitchModule.cs deleted file mode 100644 index 8ea3a55411..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch/AbpAspNetCoreMvcUITenantSwitchModule.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Volo.Abp.AspNetCore.MultiTenancy; -using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; -using Volo.Abp.Modularity; - -namespace Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch -{ - [DependsOn( - typeof(AbpAspNetCoreMvcUiThemeSharedModule), - typeof(AbpAspNetCoreMultiTenancyModule) - )] - public class AbpAspNetCoreMvcUiTenantSwitchModule : AbpModule - { - - } -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js index 245735c7f2..e327bd79ed 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js @@ -16,17 +16,17 @@ $.validator.defaults.ignore = ''; //TODO: Would be better if we can apply only f var _callbacks = []; return { - add: function (callback) { + add: function(callback) { _callbacks.push(callback); }, - triggerAll: function (thisObj, argumentList) { + triggerAll: function(thisObj, argumentList) { for (var i = 0; i < _callbacks.length; i++) { _callbacks[i].apply(thisObj, argumentList); } } - } + }; }; return function (options) { @@ -54,7 +54,7 @@ $.validator.defaults.ignore = ''; //TODO: Would be better if we can apply only f function _removeContainer() { _$modalContainer && _$modalContainer.remove(); - }; + } function _createContainer() { _removeContainer(); @@ -66,6 +66,7 @@ $.validator.defaults.ignore = ''; //TODO: Would be better if we can apply only f _$modal = _$modalContainer.find('.modal'); _$form = _$modalContainer.find('form'); if (_$form.length) { + //TODO: data-ajaxForm comparison seems wrong! if (_$form.attr('data-ajaxForm') === undefined || _$form.attr('data-ajaxForm') === false) { _$form.abpAjaxForm(); } @@ -131,52 +132,51 @@ $.validator.defaults.ignore = ''; //TODO: Would be better if we can apply only f _$modal.modal('hide'); }; - var _onClose = function (onCloseCallback) { + var _onClose = function(onCloseCallback) { _onCloseCallbacks.add(onCloseCallback); - } + }; - var _onResult = function (callback) { + var _onResult = function(callback) { _onResultCallbacks.add(callback); - } + }; _publicApi = { - open: _open, - reopen: function () { + reopen: function() { _open(_args); }, close: _close, - getModalId: function () { + getModalId: function() { return _modalId; }, - getModal: function () { + getModal: function() { return _$modal; }, - getForm: function () { + getForm: function() { return _$form; }, - getArgs: function () { + getArgs: function() { return _args; }, - getOptions: function () { + getOptions: function() { return _options; }, - setResult: function () { + setResult: function() { _onResultCallbacks.triggerAll(_publicApi, arguments); }, onClose: _onClose, onResult: _onResult - } + }; return _publicApi; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/RazorPages/AbpPageModel.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/RazorPages/AbpPageModel.cs index fc2e46d42a..78b9d407a5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/RazorPages/AbpPageModel.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/RazorPages/AbpPageModel.cs @@ -1,11 +1,12 @@ -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.ViewFeatures; +using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using System; +using System.Threading.Tasks; using Volo.Abp.AspNetCore.Mvc.UI.Alerts; using Volo.Abp.AspNetCore.Mvc.Validation; using Volo.Abp.Guids; @@ -20,6 +21,10 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.RazorPages { public abstract class AbpPageModel : PageModel { + public IClock Clock { get; set; } + + public AlertList Alerts => AlertManager.Alerts; + public IUnitOfWorkManager UnitOfWorkManager { get; set; } public IObjectMapper ObjectMapper { get; set; } @@ -28,6 +33,29 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.RazorPages public ILoggerFactory LoggerFactory { get; set; } + public IStringLocalizerFactory StringLocalizerFactory { get; set; } + + public IStringLocalizer L + { + get + { + if (_localizer == null) + { + if (LocalizationResourceType == null) + { + throw new AbpException($"{nameof(LocalizationResourceType)} should be set before using the {nameof(L)} object!"); + } + + _localizer = StringLocalizerFactory.Create(LocalizationResourceType); + } + + return _localizer; + } + } + private IStringLocalizer _localizer; + + protected Type LocalizationResourceType { get; set; } + public ICurrentUser CurrentUser { get; set; } public ICurrentTenant CurrentTenant { get; set; } @@ -40,12 +68,8 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.RazorPages public IAlertManager AlertManager { get; set; } - public AlertList Alerts => AlertManager.Alerts; - protected IUnitOfWork CurrentUnitOfWork => UnitOfWorkManager?.Current; - public IClock Clock { get; set; } - protected ILogger Logger => _lazyLogger.Value; private Lazy _lazyLogger => new Lazy(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs index 90f0487d88..a430a4b6f2 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs @@ -90,5 +90,11 @@ namespace Volo.Abp.Modularity { ServiceConfigurationContext.Services.Configure(configureOptions); } + + protected void PreConfigure(Action configureOptions) + where TOptions : class + { + ServiceConfigurationContext.Services.PreConfigure(configureOptions); + } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/CurrentTenantExtensions.cs b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/CurrentTenantExtensions.cs new file mode 100644 index 0000000000..67684c030f --- /dev/null +++ b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/CurrentTenantExtensions.cs @@ -0,0 +1,20 @@ +using System; +using JetBrains.Annotations; + +namespace Volo.Abp.MultiTenancy +{ + public static class CurrentTenantExtensions + { + public static Guid GetId([NotNull] this ICurrentTenant currentTenant) + { + Check.NotNull(currentTenant, nameof(currentTenant)); + + if (currentTenant.Id == null) + { + throw new AbpException("Current Tenant Id is not available!"); + } + + return currentTenant.Id.Value; + } + } +} \ No newline at end of file