alias management improvements

This commit is contained in:
Shaun Walker 2022-01-06 13:37:29 -05:00
parent 6af5682548
commit f7c1e7b706
4 changed files with 37 additions and 30 deletions

View File

@ -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();
} }
} }

View File

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

View File

@ -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)

View File

@ -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;