CSS separation, multi-tenancy fixes
This commit is contained in:
		@ -5,6 +5,7 @@
 | 
			
		||||
@inject IAliasService AliasService
 | 
			
		||||
@inject ISiteService SiteService
 | 
			
		||||
@inject IThemeService  ThemeService
 | 
			
		||||
@inject IUserService UserService
 | 
			
		||||
 | 
			
		||||
@if (tenants == null)
 | 
			
		||||
{
 | 
			
		||||
@ -12,74 +13,93 @@
 | 
			
		||||
}
 | 
			
		||||
else
 | 
			
		||||
{
 | 
			
		||||
    <table class="table table-borderless">
 | 
			
		||||
<table class="table table-borderless">
 | 
			
		||||
    <tr>
 | 
			
		||||
        <td>
 | 
			
		||||
            <label for="Name" class="control-label">Tenant: </label>
 | 
			
		||||
        </td>
 | 
			
		||||
        <td>
 | 
			
		||||
            <select class="form-control" @onchange="(e => TenantChanged(e))">
 | 
			
		||||
                <option value="-1"><Select Tenant></option>
 | 
			
		||||
                @foreach (Tenant tenant in tenants)
 | 
			
		||||
                {
 | 
			
		||||
                    <option value="@tenant.TenantId">@tenant.Name</option>
 | 
			
		||||
                }
 | 
			
		||||
            </select>
 | 
			
		||||
        </td>
 | 
			
		||||
    </tr>
 | 
			
		||||
    <tr>
 | 
			
		||||
        <td>
 | 
			
		||||
            <label for="Name" class="control-label">Name: </label>
 | 
			
		||||
        </td>
 | 
			
		||||
        <td>
 | 
			
		||||
            <input class="form-control" @bind="@name" />
 | 
			
		||||
        </td>
 | 
			
		||||
    </tr>
 | 
			
		||||
    <tr>
 | 
			
		||||
        <td>
 | 
			
		||||
            <label for="Name" class="control-label">Aliases: </label>
 | 
			
		||||
        </td>
 | 
			
		||||
        <td>
 | 
			
		||||
            <textarea class="form-control" @bind="@urls" rows="3" />
 | 
			
		||||
        </td>
 | 
			
		||||
    </tr>
 | 
			
		||||
    <tr>
 | 
			
		||||
        <td>
 | 
			
		||||
            <label for="Name" class="control-label">Logo: </label>
 | 
			
		||||
        </td>
 | 
			
		||||
        <td>
 | 
			
		||||
            <input class="form-control" @bind="@logo" />
 | 
			
		||||
        </td>
 | 
			
		||||
    </tr>
 | 
			
		||||
    <tr>
 | 
			
		||||
        <td>
 | 
			
		||||
            <label for="Name" class="control-label">Default Theme: </label>
 | 
			
		||||
        </td>
 | 
			
		||||
        <td>
 | 
			
		||||
            <select class="form-control" @bind="@themetype">
 | 
			
		||||
                <option value=""><Select Theme></option>
 | 
			
		||||
                @foreach (KeyValuePair<string, string> item in themes)
 | 
			
		||||
                {
 | 
			
		||||
                    <option value="@item.Key">@item.Value</option>
 | 
			
		||||
                }
 | 
			
		||||
            </select>
 | 
			
		||||
        </td>
 | 
			
		||||
    </tr>
 | 
			
		||||
    <tr>
 | 
			
		||||
        <td>
 | 
			
		||||
            <label for="Name" class="control-label">Default Layout: </label>
 | 
			
		||||
        </td>
 | 
			
		||||
        <td>
 | 
			
		||||
            <select class="form-control" @bind="@layouttype">
 | 
			
		||||
                <option value=""><Select Layout></option>
 | 
			
		||||
                @foreach (KeyValuePair<string, string> panelayout in panelayouts)
 | 
			
		||||
                {
 | 
			
		||||
                    <option value="@panelayout.Key">@panelayout.Value</option>
 | 
			
		||||
                }
 | 
			
		||||
            </select>
 | 
			
		||||
        </td>
 | 
			
		||||
    </tr>
 | 
			
		||||
    @if (!isinitialized)
 | 
			
		||||
    {
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td>
 | 
			
		||||
                <label for="Name" class="control-label">Tenant: </label>
 | 
			
		||||
                <label for="Name" class="control-label">Host Username:</label>
 | 
			
		||||
            </td>
 | 
			
		||||
            <td>
 | 
			
		||||
                <select class="form-control" @bind="@tenantid">
 | 
			
		||||
                    <option value="-1"><Select Tenant></option>
 | 
			
		||||
                    @foreach (Tenant tenant in tenants)
 | 
			
		||||
                    {
 | 
			
		||||
                        <option value="@tenant.TenantId">@tenant.Name</option>
 | 
			
		||||
                    }
 | 
			
		||||
                </select>
 | 
			
		||||
                <input class="form-control" @bind="@username" disabled />
 | 
			
		||||
            </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td>
 | 
			
		||||
                <label for="Name" class="control-label">Name: </label>
 | 
			
		||||
                <label for="Name" class="control-label">Host Password:</label>
 | 
			
		||||
            </td>
 | 
			
		||||
            <td>
 | 
			
		||||
                <input class="form-control" @bind="@name" />
 | 
			
		||||
                <input type="password" class="form-control" @bind="@password" />
 | 
			
		||||
            </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td>
 | 
			
		||||
                <label for="Name" class="control-label">Aliases: </label>
 | 
			
		||||
            </td>
 | 
			
		||||
            <td>
 | 
			
		||||
                <textarea class="form-control" @bind="@urls" rows="3" />
 | 
			
		||||
            </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td>
 | 
			
		||||
                <label for="Name" class="control-label">Logo: </label>
 | 
			
		||||
            </td>
 | 
			
		||||
            <td>
 | 
			
		||||
                <input class="form-control" @bind="@logo" />
 | 
			
		||||
            </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td>
 | 
			
		||||
                <label for="Name" class="control-label">Default Theme: </label>
 | 
			
		||||
            </td>
 | 
			
		||||
            <td>
 | 
			
		||||
                <select class="form-control" @bind="@themetype">
 | 
			
		||||
                    <option value=""><Select Theme></option>
 | 
			
		||||
                    @foreach (KeyValuePair<string, string> item in themes)
 | 
			
		||||
                    {
 | 
			
		||||
                        <option value="@item.Key">@item.Value</option>
 | 
			
		||||
                    }
 | 
			
		||||
                </select>
 | 
			
		||||
            </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td>
 | 
			
		||||
                <label for="Name" class="control-label">Default Layout: </label>
 | 
			
		||||
            </td>
 | 
			
		||||
            <td>
 | 
			
		||||
                <select class="form-control" @bind="@layouttype">
 | 
			
		||||
                    <option value=""><Select Layout></option>
 | 
			
		||||
                    @foreach (KeyValuePair<string, string> panelayout in panelayouts)
 | 
			
		||||
                    {
 | 
			
		||||
                        <option value="@panelayout.Key">@panelayout.Value</option>
 | 
			
		||||
                    }
 | 
			
		||||
                </select>
 | 
			
		||||
            </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
    </table>
 | 
			
		||||
    }
 | 
			
		||||
</table>
 | 
			
		||||
    <button type="button" class="btn btn-success" @onclick="SaveSite">Save</button>
 | 
			
		||||
    <NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
 | 
			
		||||
}
 | 
			
		||||
@ -97,6 +117,9 @@ else
 | 
			
		||||
    string logo = "";
 | 
			
		||||
    string themetype = "";
 | 
			
		||||
    string layouttype = "";
 | 
			
		||||
    bool isinitialized = true;
 | 
			
		||||
    string username = "";
 | 
			
		||||
    string password = "";
 | 
			
		||||
 | 
			
		||||
    protected override async Task OnInitializedAsync()
 | 
			
		||||
    {
 | 
			
		||||
@ -104,35 +127,103 @@ else
 | 
			
		||||
        urls = PageState.Alias.Name;
 | 
			
		||||
        themes = ThemeService.GetThemeTypes(PageState.Themes);
 | 
			
		||||
        panelayouts = ThemeService.GetPaneLayoutTypes(PageState.Themes);
 | 
			
		||||
        username = PageState.User.Username;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void TenantChanged(ChangeEventArgs e)
 | 
			
		||||
    {
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            tenantid = (string)e.Value;
 | 
			
		||||
            if (tenantid != "-1")
 | 
			
		||||
            {
 | 
			
		||||
                Tenant tenant = tenants.Where(item => item.TenantId == int.Parse(tenantid)).FirstOrDefault();
 | 
			
		||||
                if (tenant != null)
 | 
			
		||||
                {
 | 
			
		||||
                    isinitialized = tenant.IsInitialized;
 | 
			
		||||
                    StateHasChanged();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception ex)
 | 
			
		||||
        {
 | 
			
		||||
            AddModuleMessage(ex.Message, MessageType.Error);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private async Task SaveSite()
 | 
			
		||||
    {
 | 
			
		||||
        if (tenantid != "-1" && name != "" && urls != "" && themetype != "")
 | 
			
		||||
        {
 | 
			
		||||
            Site site = new Site();
 | 
			
		||||
            site.TenantId = int.Parse(tenantid);
 | 
			
		||||
            site.Name = name;
 | 
			
		||||
            site.Logo = (logo == null ? "" : logo);
 | 
			
		||||
            site.DefaultThemeType = themetype;
 | 
			
		||||
            site.DefaultLayoutType = (layouttype == null ? "" : layouttype);
 | 
			
		||||
            site = await SiteService.AddSiteAsync(site);
 | 
			
		||||
            bool isvalid = true;
 | 
			
		||||
 | 
			
		||||
            urls = urls.Replace("\n", ",");
 | 
			
		||||
            foreach(string name in urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
 | 
			
		||||
            if (!isinitialized)
 | 
			
		||||
            {
 | 
			
		||||
                Alias alias = new Alias();
 | 
			
		||||
                alias.Name = name;
 | 
			
		||||
                alias.TenantId = int.Parse(tenantid);
 | 
			
		||||
                alias.SiteId = site.SiteId;
 | 
			
		||||
                await AliasService.AddAliasAsync(alias);
 | 
			
		||||
                User user = new User();
 | 
			
		||||
                user.SiteId = PageState.Site.SiteId;
 | 
			
		||||
                user.Username = username;
 | 
			
		||||
                user.Password = password;
 | 
			
		||||
                user = await UserService.LoginUserAsync(user, false, false);
 | 
			
		||||
                isvalid = user.IsAuthenticated;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            NavigationManager.NavigateTo("http://" + urls.Split(',')[0], true);
 | 
			
		||||
            if (isvalid)
 | 
			
		||||
            {
 | 
			
		||||
                List<Alias> aliases = new List<Alias>();
 | 
			
		||||
                urls = urls.Replace("\n", ",");
 | 
			
		||||
                foreach (string name in urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
 | 
			
		||||
                {
 | 
			
		||||
                    Alias alias = new Alias();
 | 
			
		||||
                    alias.Name = name;
 | 
			
		||||
                    alias.TenantId = int.Parse(tenantid);
 | 
			
		||||
                    alias.SiteId = -1;
 | 
			
		||||
                    alias = await AliasService.AddAliasAsync(alias);
 | 
			
		||||
                    aliases.Add(alias);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                Site site = new Site();
 | 
			
		||||
                site.TenantId = int.Parse(tenantid);
 | 
			
		||||
                site.Name = name;
 | 
			
		||||
                site.Logo = (logo == null ? "" : logo);
 | 
			
		||||
                site.DefaultThemeType = themetype;
 | 
			
		||||
                site.DefaultLayoutType = (layouttype == null ? "" : layouttype);
 | 
			
		||||
                site = await SiteService.AddSiteAsync(site, aliases[0]);
 | 
			
		||||
 | 
			
		||||
                foreach(Alias alias in aliases)
 | 
			
		||||
                {
 | 
			
		||||
                    alias.SiteId = site.SiteId;
 | 
			
		||||
                    await AliasService.UpdateAliasAsync(alias);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (!isinitialized)
 | 
			
		||||
                {
 | 
			
		||||
                    User user = new User();
 | 
			
		||||
                    user.SiteId = site.SiteId;
 | 
			
		||||
                    user.Username = username;
 | 
			
		||||
                    user.Password = password;
 | 
			
		||||
                    user.Email = PageState.User.Email;
 | 
			
		||||
                    user.DisplayName = PageState.User.DisplayName;
 | 
			
		||||
                    user = await UserService.AddUserAsync(user, aliases[0]);
 | 
			
		||||
 | 
			
		||||
                    if (user != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        Tenant tenant = tenants.Where(item => item.TenantId == int.Parse(tenantid)).FirstOrDefault();
 | 
			
		||||
                        tenant.IsInitialized = true;
 | 
			
		||||
                        await TenantService.UpdateTenantAsync(tenant);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                Uri uri = new Uri(NavigationManager.Uri);
 | 
			
		||||
                NavigationManager.NavigateTo(uri.Scheme + "://" + aliases[0].Name, true);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                AddModuleMessage("Invalid Host Password", MessageType.Error);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            ModuleInstance.AddModuleMessage("You Must Provide A Tenant, Site Name, Alias, And Default Theme", MessageType.Warning);
 | 
			
		||||
            AddModuleMessage("You Must Provide A Tenant, Site Name, Alias, And Default Theme", MessageType.Warning);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -88,6 +88,7 @@ else
 | 
			
		||||
    Dictionary<string, string> themes = new Dictionary<string, string>();
 | 
			
		||||
    Dictionary<string, string> panelayouts = new Dictionary<string, string>();
 | 
			
		||||
 | 
			
		||||
    Alias Alias;
 | 
			
		||||
    int siteid;
 | 
			
		||||
    string name = "";
 | 
			
		||||
    List<Alias> aliases;
 | 
			
		||||
@ -109,9 +110,10 @@ else
 | 
			
		||||
        {
 | 
			
		||||
            themes = ThemeService.GetThemeTypes(PageState.Themes);
 | 
			
		||||
            panelayouts = ThemeService.GetPaneLayoutTypes(PageState.Themes);
 | 
			
		||||
            Alias = PageState.Aliases.Where(item => item.AliasId == Int32.Parse(PageState.QueryString["id"])).FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
            siteid = Int32.Parse(PageState.QueryString["id"]);
 | 
			
		||||
            Site site = await SiteService.GetSiteAsync(siteid);
 | 
			
		||||
            siteid = Alias.SiteId;
 | 
			
		||||
            Site site = await SiteService.GetSiteAsync(siteid, Alias);
 | 
			
		||||
            if (site != null)
 | 
			
		||||
            {
 | 
			
		||||
                name = site.Name;
 | 
			
		||||
@ -135,7 +137,7 @@ else
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception ex)
 | 
			
		||||
        {
 | 
			
		||||
            ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error);
 | 
			
		||||
            AddModuleMessage(ex.Message, MessageType.Error);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -143,12 +145,12 @@ else
 | 
			
		||||
    {
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            await SiteService.DeleteSiteAsync(PageState.Site.SiteId);
 | 
			
		||||
            await SiteService.DeleteSiteAsync(siteid, Alias);
 | 
			
		||||
            NavigationManager.NavigateTo(NavigateUrl());
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception ex)
 | 
			
		||||
        {
 | 
			
		||||
            ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error);
 | 
			
		||||
            AddModuleMessage(ex.Message, MessageType.Error);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -89,6 +89,7 @@ else
 | 
			
		||||
    Dictionary<string, string> themes = new Dictionary<string, string>();
 | 
			
		||||
    Dictionary<string, string> panelayouts = new Dictionary<string, string>();
 | 
			
		||||
 | 
			
		||||
    Alias Alias;
 | 
			
		||||
    int siteid;
 | 
			
		||||
    string name = "";
 | 
			
		||||
    List<Alias> aliases;
 | 
			
		||||
@ -111,9 +112,10 @@ else
 | 
			
		||||
        {
 | 
			
		||||
            themes = ThemeService.GetThemeTypes(PageState.Themes);
 | 
			
		||||
            panelayouts = ThemeService.GetPaneLayoutTypes(PageState.Themes);
 | 
			
		||||
            Alias = PageState.Aliases.Where(item => item.AliasId == Int32.Parse(PageState.QueryString["id"])).FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
            siteid = Int32.Parse(PageState.QueryString["id"]);
 | 
			
		||||
            Site site = await SiteService.GetSiteAsync(siteid);
 | 
			
		||||
            siteid = Alias.SiteId;
 | 
			
		||||
            Site site = await SiteService.GetSiteAsync(siteid, Alias);
 | 
			
		||||
            if (site != null)
 | 
			
		||||
            {
 | 
			
		||||
                name = site.Name;
 | 
			
		||||
@ -137,7 +139,7 @@ else
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception ex)
 | 
			
		||||
        {
 | 
			
		||||
            ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error);
 | 
			
		||||
            AddModuleMessage(ex.Message, MessageType.Error);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -147,7 +149,7 @@ else
 | 
			
		||||
        {
 | 
			
		||||
            if (name != "" && urls != "" && themetype != "")
 | 
			
		||||
            {
 | 
			
		||||
                Site site = await SiteService.GetSiteAsync(siteid);
 | 
			
		||||
                Site site = await SiteService.GetSiteAsync(siteid, Alias);
 | 
			
		||||
                if (site != null)
 | 
			
		||||
                {
 | 
			
		||||
                    site.Name = name;
 | 
			
		||||
@ -156,7 +158,7 @@ else
 | 
			
		||||
                    site.DefaultLayoutType = (layouttype == null ? "" : layouttype);
 | 
			
		||||
                    site.IsDeleted = (isdeleted == null ? true : Boolean.Parse(isdeleted));
 | 
			
		||||
 | 
			
		||||
                    site = await SiteService.UpdateSiteAsync(site);
 | 
			
		||||
                    site = await SiteService.UpdateSiteAsync(site, Alias);
 | 
			
		||||
 | 
			
		||||
                    urls = urls.Replace("\n", ",");
 | 
			
		||||
                    string[] names = urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
 | 
			
		||||
@ -184,12 +186,12 @@ else
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                ModuleInstance.AddModuleMessage("You Must Provide A Site Name, Alias, And Default Theme", MessageType.Warning);
 | 
			
		||||
                AddModuleMessage("You Must Provide A Site Name, Alias, And Default Theme", MessageType.Warning);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception ex)
 | 
			
		||||
        {
 | 
			
		||||
            ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error);
 | 
			
		||||
            AddModuleMessage(ex.Message, MessageType.Error);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
@namespace Oqtane.Modules.Admin.Sites
 | 
			
		||||
@inherits ModuleBase
 | 
			
		||||
 | 
			
		||||
@inject ISiteService SiteService
 | 
			
		||||
@inject NavigationManager NavigationManager
 | 
			
		||||
@inject IAliasService AliasService
 | 
			
		||||
 | 
			
		||||
@if (sites == null)
 | 
			
		||||
{
 | 
			
		||||
@ -18,9 +18,9 @@ else
 | 
			
		||||
            <th> </th>
 | 
			
		||||
        </Header>
 | 
			
		||||
        <Row>
 | 
			
		||||
            <td>@context.Name</td>
 | 
			
		||||
            <td><ActionLink Action="Edit" Parameters="@($"id=" + context.SiteId.ToString())" /></td>
 | 
			
		||||
            <td><ActionLink Action="Delete" Parameters="@($"id=" + context.SiteId.ToString())" Class="btn btn-danger" /></td>
 | 
			
		||||
            <td><a href="@(scheme + context.Name)">@context.Name</a></td>
 | 
			
		||||
            <td><ActionLink Action="Edit" Parameters="@($"id=" + context.AliasId.ToString())" /></td>
 | 
			
		||||
            <td><ActionLink Action="Delete" Parameters="@($"id=" + context.AliasId.ToString())" Class="btn btn-danger" /></td>
 | 
			
		||||
        </Row>
 | 
			
		||||
    </Pager>
 | 
			
		||||
}
 | 
			
		||||
@ -28,10 +28,21 @@ else
 | 
			
		||||
@code {
 | 
			
		||||
    public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Host; } }
 | 
			
		||||
 | 
			
		||||
    List<Site> sites;
 | 
			
		||||
    List<Alias> sites;
 | 
			
		||||
    string scheme;
 | 
			
		||||
 | 
			
		||||
    protected override async Task OnInitializedAsync()
 | 
			
		||||
    protected override void OnInitialized()
 | 
			
		||||
    {
 | 
			
		||||
        sites = await SiteService.GetSitesAsync();
 | 
			
		||||
        Uri uri = new Uri(NavigationManager.Uri);
 | 
			
		||||
        scheme = uri.Scheme + "://";
 | 
			
		||||
 | 
			
		||||
        sites = new List<Alias>();
 | 
			
		||||
        foreach (Alias alias in PageState.Aliases.OrderBy(item => item.Name))
 | 
			
		||||
        {
 | 
			
		||||
            if (!sites.Exists(item => item.TenantId == alias.TenantId && item.SiteId == alias.SiteId))
 | 
			
		||||
            {
 | 
			
		||||
                sites.Add(alias);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user