mirror of
https://github.com/oqtane/oqtane.framework.git
synced 2025-05-20 19:44:23 +00:00
alias management improvements
This commit is contained in:
parent
6af5682548
commit
f7c1e7b706
@ -158,7 +158,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Section>
|
</Section>
|
||||||
@if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
|
@if (_aliases != null && UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
|
||||||
{
|
{
|
||||||
<Section Name="Aliases" Heading="Aliases" ResourceKey="Aliases">
|
<Section Name="Aliases" Heading="Aliases" ResourceKey="Aliases">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
@ -172,7 +172,7 @@
|
|||||||
<Label Class="col-sm-3" For="defaultalias" HelpText="The default alias for the site. Requests for non-default aliases will be redirected to the default alias." ResourceKey="DefaultAlias">Default Alias: </Label>
|
<Label Class="col-sm-3" For="defaultalias" HelpText="The default alias for the site. Requests for non-default aliases will be redirected to the default alias." ResourceKey="DefaultAlias">Default Alias: </Label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<select id="defaultalias" class="form-select" @bind="@_defaultalias" required>
|
<select id="defaultalias" class="form-select" @bind="@_defaultalias" required>
|
||||||
@foreach (string name in _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
|
@foreach (string name in _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(sValue => sValue.Trim()).ToArray())
|
||||||
{
|
{
|
||||||
<option value="@name">@name</option>
|
<option value="@name">@name</option>
|
||||||
}
|
}
|
||||||
@ -395,18 +395,20 @@
|
|||||||
{
|
{
|
||||||
if (_name != string.Empty && _urls != string.Empty && _themetype != "-" && _containertype != "-")
|
if (_name != string.Empty && _urls != string.Empty && _themetype != "-" && _containertype != "-")
|
||||||
{
|
{
|
||||||
_urls = Regex.Replace(_urls, @"\r\n?|\n", ","); // convert line breaks to commas
|
|
||||||
var unique = true;
|
var unique = true;
|
||||||
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
|
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
|
||||||
{
|
{
|
||||||
|
_urls = Regex.Replace(_urls, @"\r\n?|\n", ","); // convert line breaks to commas
|
||||||
|
var aliases = await AliasService.GetAliasesAsync();
|
||||||
foreach (string name in _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(sValue => sValue.Trim()).ToArray())
|
foreach (string name in _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(sValue => sValue.Trim()).ToArray())
|
||||||
{
|
{
|
||||||
var alias = _aliases.Where(item => item.Name == name).FirstOrDefault();
|
var alias = aliases.Where(item => item.Name == name).FirstOrDefault();
|
||||||
if (alias != null && unique)
|
if (alias != null && unique)
|
||||||
{
|
{
|
||||||
unique = (alias.TenantId == PageState.Site.TenantId && alias.SiteId == PageState.Site.SiteId);
|
unique = (alias.TenantId == PageState.Site.TenantId && alias.SiteId == PageState.Site.SiteId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (unique && string.IsNullOrEmpty(_defaultalias)) unique = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unique)
|
if (unique)
|
||||||
@ -489,18 +491,17 @@
|
|||||||
{
|
{
|
||||||
var names = _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
|
var names = _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
|
||||||
.Select(sValue => sValue.Trim()).ToArray();
|
.Select(sValue => sValue.Trim()).ToArray();
|
||||||
foreach (Alias alias in _aliases.Where(item => item.SiteId == site.SiteId && item.TenantId == site.TenantId).ToList())
|
foreach (Alias alias in _aliases)
|
||||||
{
|
{
|
||||||
if (!names.Contains(alias.Name))
|
if (!names.Contains(alias.Name.Trim()))
|
||||||
{
|
{
|
||||||
await AliasService.DeleteAliasAsync(alias.AliasId);
|
await AliasService.DeleteAliasAsync(alias.AliasId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!names.Contains(_defaultalias)) { _defaultalias = names[0]; }
|
|
||||||
|
|
||||||
foreach (string name in names)
|
foreach (string name in names)
|
||||||
{
|
{
|
||||||
var alias = _aliases.Find(item => item.Name == name);
|
var alias = _aliases.Find(item => item.Name.Trim() == name);
|
||||||
if (alias == null)
|
if (alias == null)
|
||||||
{
|
{
|
||||||
alias = new Alias();
|
alias = new Alias();
|
||||||
@ -512,8 +513,9 @@
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (alias.IsDefault != (alias.Name == _defaultalias))
|
if (alias.Name != name || alias.IsDefault != (alias.Name.Trim() == _defaultalias))
|
||||||
{
|
{
|
||||||
|
alias.Name = name;
|
||||||
alias.IsDefault = (name == _defaultalias);
|
alias.IsDefault = (name == _defaultalias);
|
||||||
await AliasService.UpdateAliasAsync(alias);
|
await AliasService.UpdateAliasAsync(alias);
|
||||||
}
|
}
|
||||||
@ -534,7 +536,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else // deuplicate alias or default alias not specified
|
||||||
{
|
{
|
||||||
AddModuleMessage(Localizer["Message.Aliases.Taken"], MessageType.Warning);
|
AddModuleMessage(Localizer["Message.Aliases.Taken"], MessageType.Warning);
|
||||||
}
|
}
|
||||||
@ -622,13 +624,12 @@
|
|||||||
_urls = string.Empty;
|
_urls = string.Empty;
|
||||||
_defaultalias = string.Empty;
|
_defaultalias = string.Empty;
|
||||||
_aliases = await AliasService.GetAliasesAsync();
|
_aliases = await AliasService.GetAliasesAsync();
|
||||||
foreach (Alias alias in _aliases.Where(item => item.SiteId == PageState.Site.SiteId && item.TenantId == PageState.Site.TenantId).ToList())
|
_aliases = _aliases.Where(item => item.SiteId == PageState.Site.SiteId && item.TenantId == PageState.Site.TenantId).OrderBy(item => item.AliasId).ToList();
|
||||||
|
foreach (Alias alias in _aliases)
|
||||||
{
|
{
|
||||||
_urls += (_urls == string.Empty) ? alias.Name : ", " + alias.Name;
|
_urls += (_urls == string.Empty) ? alias.Name.Trim() : ", " + alias.Name.Trim();
|
||||||
if (alias.IsDefault && string.IsNullOrEmpty(_defaultalias))
|
if (alias.IsDefault) _defaultalias = alias.Name.Trim();
|
||||||
{
|
|
||||||
_defaultalias = alias.Name;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (string.IsNullOrEmpty(_defaultalias)) _defaultalias = _aliases.First().Name.Trim();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,7 @@
|
|||||||
<value>Site Settings Saved</value>
|
<value>Site Settings Saved</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Message.Aliases.Taken" xml:space="preserve">
|
<data name="Message.Aliases.Taken" xml:space="preserve">
|
||||||
<value>An Alias Specified Has Already Been Used For Another Site</value>
|
<value>The Default Alias Has Not Been Specified Or An Alias Was Specified That Has Already Been Used For Another Site</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Message.Required.SiteName" xml:space="preserve">
|
<data name="Message.Required.SiteName" xml:space="preserve">
|
||||||
<value>You Must Provide A Site Name, Alias, And Default Theme/Container</value>
|
<value>You Must Provide A Site Name, Alias, And Default Theme/Container</value>
|
||||||
|
@ -8,9 +8,9 @@ namespace Oqtane.Migrations.Master
|
|||||||
{
|
{
|
||||||
[DbContext(typeof(MasterDBContext))]
|
[DbContext(typeof(MasterDBContext))]
|
||||||
[Migration("Master.03.00.02.01")]
|
[Migration("Master.03.00.02.01")]
|
||||||
public class AddAliasRedirect : MultiDatabaseMigration
|
public class AddAliasIsDefault : MultiDatabaseMigration
|
||||||
{
|
{
|
||||||
public AddAliasRedirect(IDatabase database) : base(database)
|
public AddAliasIsDefault(IDatabase database) : base(database)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ namespace Oqtane.Migrations.Master
|
|||||||
//Add Column to Alias table
|
//Add Column to Alias table
|
||||||
var aliasEntityBuilder = new AliasEntityBuilder(migrationBuilder, ActiveDatabase);
|
var aliasEntityBuilder = new AliasEntityBuilder(migrationBuilder, ActiveDatabase);
|
||||||
aliasEntityBuilder.AddBooleanColumn("IsDefault", true);
|
aliasEntityBuilder.AddBooleanColumn("IsDefault", true);
|
||||||
aliasEntityBuilder.UpdateColumn("IsDefault", "1", "bool", "");
|
aliasEntityBuilder.UpdateColumn("IsDefault", "0", "bool", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Down(MigrationBuilder migrationBuilder)
|
protected override void Down(MigrationBuilder migrationBuilder)
|
@ -86,12 +86,17 @@ namespace Oqtane.Pages
|
|||||||
// redirect non-default alias
|
// redirect non-default alias
|
||||||
if (!alias.IsDefault)
|
if (!alias.IsDefault)
|
||||||
{
|
{
|
||||||
var redirect = _aliases.GetAliases()
|
var aliases = _aliases.GetAliases().Where(item => item.TenantId == alias.TenantId && item.SiteId == alias.SiteId);
|
||||||
.Where(item => item.TenantId == alias.TenantId && item.SiteId == alias.SiteId && item.IsDefault)
|
if (aliases.Where(item => item.IsDefault).FirstOrDefault() != null)
|
||||||
.FirstOrDefault();
|
|
||||||
if (redirect != null)
|
|
||||||
{
|
{
|
||||||
return RedirectPermanent(url.Replace(alias.Name, redirect.Name));
|
return RedirectPermanent(url.Replace(alias.Name, aliases.Where(item => item.IsDefault).FirstOrDefault().Name));
|
||||||
|
}
|
||||||
|
else // no default specified - use first alias
|
||||||
|
{
|
||||||
|
if (alias.Name.Trim() != aliases.First().Name.Trim())
|
||||||
|
{
|
||||||
|
return RedirectPermanent(url.Replace(alias.Name, aliases.First().Name));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -303,7 +308,7 @@ namespace Oqtane.Pages
|
|||||||
var obj = Activator.CreateInstance(type) as IHostResources;
|
var obj = Activator.CreateInstance(type) as IHostResources;
|
||||||
foreach (var resource in obj.Resources)
|
foreach (var resource in obj.Resources)
|
||||||
{
|
{
|
||||||
ProcessResource(resource);
|
ProcessResource(resource, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -323,7 +328,7 @@ namespace Oqtane.Pages
|
|||||||
{
|
{
|
||||||
if (resource.Declaration == ResourceDeclaration.Global)
|
if (resource.Declaration == ResourceDeclaration.Global)
|
||||||
{
|
{
|
||||||
ProcessResource(resource);
|
ProcessResource(resource, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -341,24 +346,25 @@ namespace Oqtane.Pages
|
|||||||
var obj = Activator.CreateInstance(type) as IThemeControl;
|
var obj = Activator.CreateInstance(type) as IThemeControl;
|
||||||
if (obj.Resources != null)
|
if (obj.Resources != null)
|
||||||
{
|
{
|
||||||
|
int count = 0; // required for local stylesheets for current theme
|
||||||
foreach (var resource in obj.Resources)
|
foreach (var resource in obj.Resources)
|
||||||
{
|
{
|
||||||
if (resource.Declaration == ResourceDeclaration.Global || (Utilities.GetFullTypeName(type.AssemblyQualifiedName) == ThemeType && resource.ResourceType == ResourceType.Stylesheet))
|
if (resource.Declaration == ResourceDeclaration.Global || (Utilities.GetFullTypeName(type.AssemblyQualifiedName) == ThemeType && resource.ResourceType == ResourceType.Stylesheet))
|
||||||
{
|
{
|
||||||
ProcessResource(resource);
|
ProcessResource(resource, count++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void ProcessResource(Resource resource)
|
private void ProcessResource(Resource resource, int count)
|
||||||
{
|
{
|
||||||
switch (resource.ResourceType)
|
switch (resource.ResourceType)
|
||||||
{
|
{
|
||||||
case ResourceType.Stylesheet:
|
case ResourceType.Stylesheet:
|
||||||
if (!HeadResources.Contains(resource.Url, StringComparison.OrdinalIgnoreCase))
|
if (!HeadResources.Contains(resource.Url, StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
var id = (resource.Declaration == ResourceDeclaration.Global) ? "" : "id=\"app-stylesheet-" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "-00\" ";
|
var id = (resource.Declaration == ResourceDeclaration.Global) ? "" : "id=\"app-stylesheet-" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "-" + count.ToString("00") + "\" ";
|
||||||
HeadResources += "<link " + id + "rel=\"stylesheet\" href=\"" + resource.Url + "\"" + CrossOrigin(resource.CrossOrigin) + Integrity(resource.Integrity) + " />" + Environment.NewLine;
|
HeadResources += "<link " + id + "rel=\"stylesheet\" href=\"" + resource.Url + "\"" + CrossOrigin(resource.CrossOrigin) + Integrity(resource.Integrity) + " />" + Environment.NewLine;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user