Browse Source

Implemented tenant switch

pull/441/head
Halil ibrahim Kalkan 8 years ago
parent
commit
88e45d2916
  1. 12
      framework/Volo.Abp.sln
  2. 21
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml
  3. 74
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs
  4. 3
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/_ViewImports.cshtml
  5. 16
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/tenant-switch.js
  6. 0
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Properties/launchSettings.json
  7. 16
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj
  8. 61
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/AbpAspNetCoreMvcUiMultiTenancyModule.cs
  9. 14
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Components/TenantSwitch/Default.cshtml
  10. 41
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Components/TenantSwitch/TenantSwitchViewComponent.cs
  11. 10
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/AbpUiMultiTenancyResource.cs
  12. 9
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json
  13. 9
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/tr.json
  14. 21
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/MultiTenancyToolbarContributor.cs
  15. 15
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch/AbpAspNetCoreMvcUITenantSwitchModule.cs
  16. 34
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js
  17. 38
      framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/RazorPages/AbpPageModel.cs
  18. 6
      framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs
  19. 20
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/CurrentTenantExtensions.cs

12
framework/Volo.Abp.sln

@ -212,7 +212,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.RabbitMQ", "src\Vo
EndProject 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}" 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 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 EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution 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}.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.ActiveCfg = Release|Any CPU
{D3E07597-BB3D-4249-B873-607E2C128C0E}.Release|Any CPU.Build.0 = 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 {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6C67A0E0-5C0A-47C1-9B04-616B8820B377}.Debug|Any CPU.Build.0 = Debug|Any CPU {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6C67A0E0-5C0A-47C1-9B04-616B8820B377}.Release|Any CPU.ActiveCfg = Release|Any CPU {77A621CF-9562-411B-A707-C7C02CC3B8FA}.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}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -706,7 +706,7 @@ Global
{DA7A2C04-E8C4-48AA-A37E-27C25BCE280A} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {DA7A2C04-E8C4-48AA-A37E-27C25BCE280A} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{D91DE561-F403-416F-BD0B-DBF0BA1C4447} = {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} {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 EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5}

21
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<AbpUiMultiTenancyResource> L
@{
Layout = null;
}
<abp-dynamic-form abp-model="@Model.Input" asp-page="/Abp/MultiTenancy/TenantSwitchModal">
<abp-modal>
<abp-modal-header title="@L["SwitchTenant"].Value"></abp-modal-header>
<abp-modal-body>
<abp-form-content />
<p>@L["SwitchTenantHint"]</p>
</abp-modal-body>
@* TODO: A "Submit" would be better than "Save"! *@
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer>
</abp-modal>
</abp-dynamic-form>

74
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<AspNetCoreMultiTenancyOptions> 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; }
}
}
}

3
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

16
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);

0
framework/src/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch/Properties/launchSettings.json → framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Properties/launchSettings.json

16
framework/src/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch.csproj → framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj

@ -4,16 +4,28 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch</AssemblyName> <AssemblyName>Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch</PackageId> <PackageId>Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback> <AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute> <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute> <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute> <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<IsPackable>true</IsPackable> <IsPackable>true</IsPackable>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<RootNamespace />
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="Pages\**\*.cshtml" />
<EmbeddedResource Include="Pages\**\*.js" />
<EmbeddedResource Include="Volo\Abp\AspNetCore\Mvc\UI\MultiTenancy\Components\**\*.cshtml" />
<EmbeddedResource Include="Volo\Abp\AspNetCore\Mvc\UI\MultiTenancy\Localization\*.json" />
<Content Remove="Pages\**\*.cshtml" />
<Content Remove="Pages\**\*.js" />
<Content Remove="Volo\Abp\AspNetCore\Mvc\UI\MultiTenancy\Components\**\*.cshtml" />
<Content Remove="Volo\Abp\AspNetCore\Mvc\UI\MultiTenancy\Localization\*.json" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Volo.Abp.AspNetCore.MultiTenancy\Volo.Abp.AspNetCore.MultiTenancy.csproj" /> <ProjectReference Include="..\Volo.Abp.AspNetCore.MultiTenancy\Volo.Abp.AspNetCore.MultiTenancy.csproj" />
<ProjectReference Include="..\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj" /> <ProjectReference Include="..\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj" />

61
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<AbpMvcDataAnnotationsLocalizationOptions>(options =>
{
options.AddAssemblyResource(
typeof(AbpUiMultiTenancyResource),
typeof(AbpAspNetCoreMvcUiMultiTenancyModule).Assembly
);
});
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<VirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpAspNetCoreMvcUiMultiTenancyModule>();
});
Configure<ToolbarOptions>(options =>
{
options.Contributors.Add(new MultiTenancyToolbarContributor());
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<AbpUiMultiTenancyResource>("en")
.AddVirtualJson("/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization");
});
Configure<BundlingOptions>(options =>
{
options.ScriptBundles
.Get(StandardBundles.Scripts.Global)
.AddFiles(
"/Pages/Abp/MultiTenancy/tenant-switch.js"
);
});
}
}
}

14
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
<li class="nav-item">
<a id="TenantSwitchToolbarLink" href="#">
@if (Model.Tenant == null)
{
<text>@@host</text>
}
else
{
<text>@@@Model.Tenant.Name</text>
}
</a>
</li>

41
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
{
/// <summary>
/// -1,000,000
/// </summary>
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<IViewComponentResult> 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; }
}
}
}

10
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
{
}
}

9
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."
}
}

9
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."
}
}

21
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;
}
}
}

15
framework/src/Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch/AbpAspNetCoreMvcUITenantSwitchModule.cs

@ -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
{
}
}

34
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 = []; var _callbacks = [];
return { return {
add: function (callback) { add: function(callback) {
_callbacks.push(callback); _callbacks.push(callback);
}, },
triggerAll: function (thisObj, argumentList) { triggerAll: function(thisObj, argumentList) {
for (var i = 0; i < _callbacks.length; i++) { for (var i = 0; i < _callbacks.length; i++) {
_callbacks[i].apply(thisObj, argumentList); _callbacks[i].apply(thisObj, argumentList);
} }
} }
} };
}; };
return function (options) { return function (options) {
@ -54,7 +54,7 @@ $.validator.defaults.ignore = ''; //TODO: Would be better if we can apply only f
function _removeContainer() { function _removeContainer() {
_$modalContainer && _$modalContainer.remove(); _$modalContainer && _$modalContainer.remove();
}; }
function _createContainer() { function _createContainer() {
_removeContainer(); _removeContainer();
@ -66,6 +66,7 @@ $.validator.defaults.ignore = ''; //TODO: Would be better if we can apply only f
_$modal = _$modalContainer.find('.modal'); _$modal = _$modalContainer.find('.modal');
_$form = _$modalContainer.find('form'); _$form = _$modalContainer.find('form');
if (_$form.length) { if (_$form.length) {
//TODO: data-ajaxForm comparison seems wrong!
if (_$form.attr('data-ajaxForm') === undefined || _$form.attr('data-ajaxForm') === false) { if (_$form.attr('data-ajaxForm') === undefined || _$form.attr('data-ajaxForm') === false) {
_$form.abpAjaxForm(); _$form.abpAjaxForm();
} }
@ -131,52 +132,51 @@ $.validator.defaults.ignore = ''; //TODO: Would be better if we can apply only f
_$modal.modal('hide'); _$modal.modal('hide');
}; };
var _onClose = function (onCloseCallback) { var _onClose = function(onCloseCallback) {
_onCloseCallbacks.add(onCloseCallback); _onCloseCallbacks.add(onCloseCallback);
} };
var _onResult = function (callback) { var _onResult = function(callback) {
_onResultCallbacks.add(callback); _onResultCallbacks.add(callback);
} };
_publicApi = { _publicApi = {
open: _open, open: _open,
reopen: function () { reopen: function() {
_open(_args); _open(_args);
}, },
close: _close, close: _close,
getModalId: function () { getModalId: function() {
return _modalId; return _modalId;
}, },
getModal: function () { getModal: function() {
return _$modal; return _$modal;
}, },
getForm: function () { getForm: function() {
return _$form; return _$form;
}, },
getArgs: function () { getArgs: function() {
return _args; return _args;
}, },
getOptions: function () { getOptions: function() {
return _options; return _options;
}, },
setResult: function () { setResult: function() {
_onResultCallbacks.triggerAll(_publicApi, arguments); _onResultCallbacks.triggerAll(_publicApi, arguments);
}, },
onClose: _onClose, onClose: _onClose,
onResult: _onResult onResult: _onResult
} };
return _publicApi; return _publicApi;

38
framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/RazorPages/AbpPageModel.cs

@ -1,11 +1,12 @@
using System; using Microsoft.AspNetCore.Authorization;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using System;
using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Mvc.UI.Alerts; using Volo.Abp.AspNetCore.Mvc.UI.Alerts;
using Volo.Abp.AspNetCore.Mvc.Validation; using Volo.Abp.AspNetCore.Mvc.Validation;
using Volo.Abp.Guids; using Volo.Abp.Guids;
@ -20,6 +21,10 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.RazorPages
{ {
public abstract class AbpPageModel : PageModel public abstract class AbpPageModel : PageModel
{ {
public IClock Clock { get; set; }
public AlertList Alerts => AlertManager.Alerts;
public IUnitOfWorkManager UnitOfWorkManager { get; set; } public IUnitOfWorkManager UnitOfWorkManager { get; set; }
public IObjectMapper ObjectMapper { get; set; } public IObjectMapper ObjectMapper { get; set; }
@ -28,6 +33,29 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.RazorPages
public ILoggerFactory LoggerFactory { get; set; } 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 ICurrentUser CurrentUser { get; set; }
public ICurrentTenant CurrentTenant { get; set; } public ICurrentTenant CurrentTenant { get; set; }
@ -40,12 +68,8 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.RazorPages
public IAlertManager AlertManager { get; set; } public IAlertManager AlertManager { get; set; }
public AlertList Alerts => AlertManager.Alerts;
protected IUnitOfWork CurrentUnitOfWork => UnitOfWorkManager?.Current; protected IUnitOfWork CurrentUnitOfWork => UnitOfWorkManager?.Current;
public IClock Clock { get; set; }
protected ILogger Logger => _lazyLogger.Value; protected ILogger Logger => _lazyLogger.Value;
private Lazy<ILogger> _lazyLogger => new Lazy<ILogger>(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true); private Lazy<ILogger> _lazyLogger => new Lazy<ILogger>(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true);

6
framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs

@ -90,5 +90,11 @@ namespace Volo.Abp.Modularity
{ {
ServiceConfigurationContext.Services.Configure(configureOptions); ServiceConfigurationContext.Services.Configure(configureOptions);
} }
protected void PreConfigure<TOptions>(Action<TOptions> configureOptions)
where TOptions : class
{
ServiceConfigurationContext.Services.PreConfigure(configureOptions);
}
} }
} }

20
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;
}
}
}
Loading…
Cancel
Save