Merge pull request #486 from sbwalker/master
added ability to set default container at the page level, expanded size of role description in upgrade script for 0.9.2
This commit is contained in:
commit
51c27ae0e5
|
@ -24,7 +24,7 @@
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<select id="container" class="form-control" @bind="@_containerType">
|
<select id="container" class="form-control" @bind="@_containerType">
|
||||||
<option value=""><Select Container></option>
|
<option value="-"><Inherit From Page Or Site></option>
|
||||||
@foreach (KeyValuePair<string, string> container in _containers)
|
@foreach (KeyValuePair<string, string> container in _containers)
|
||||||
{
|
{
|
||||||
<option value="@container.Key">@container.Value</option>
|
<option value="@container.Key">@container.Value</option>
|
||||||
|
@ -107,6 +107,14 @@
|
||||||
_title = ModuleState.Title;
|
_title = ModuleState.Title;
|
||||||
_containers = ThemeService.GetContainerTypes(await ThemeService.GetThemesAsync());
|
_containers = ThemeService.GetContainerTypes(await ThemeService.GetThemesAsync());
|
||||||
_containerType = ModuleState.ContainerType;
|
_containerType = ModuleState.ContainerType;
|
||||||
|
if (!string.IsNullOrEmpty(PageState.Page.DefaultContainerType) && _containerType == PageState.Page.DefaultContainerType)
|
||||||
|
{
|
||||||
|
_containerType = "-";
|
||||||
|
}
|
||||||
|
if (_containerType == PageState.Site.DefaultContainerType)
|
||||||
|
{
|
||||||
|
_containerType = "-";
|
||||||
|
}
|
||||||
_allPages = ModuleState.AllPages.ToString();
|
_allPages = ModuleState.AllPages.ToString();
|
||||||
_permissions = ModuleState.Permissions;
|
_permissions = ModuleState.Permissions;
|
||||||
_permissionNames = ModuleState.ModuleDefinition.PermissionNames;
|
_permissionNames = ModuleState.ModuleDefinition.PermissionNames;
|
||||||
|
@ -136,7 +144,15 @@
|
||||||
var pagemodule = await PageModuleService.GetPageModuleAsync(ModuleState.PageModuleId);
|
var pagemodule = await PageModuleService.GetPageModuleAsync(ModuleState.PageModuleId);
|
||||||
pagemodule.PageId = int.Parse(_pageId);
|
pagemodule.PageId = int.Parse(_pageId);
|
||||||
pagemodule.Title = _title;
|
pagemodule.Title = _title;
|
||||||
pagemodule.ContainerType = _containerType;
|
pagemodule.ContainerType = (_containerType != "-") ? _containerType : string.Empty;
|
||||||
|
if (!string.IsNullOrEmpty(pagemodule.ContainerType) && pagemodule.ContainerType == PageState.Page.DefaultContainerType)
|
||||||
|
{
|
||||||
|
pagemodule.ContainerType = string.Empty;
|
||||||
|
}
|
||||||
|
if (!string.IsNullOrEmpty(pagemodule.ContainerType) && pagemodule.ContainerType == PageState.Site.DefaultContainerType)
|
||||||
|
{
|
||||||
|
pagemodule.ContainerType = string.Empty;
|
||||||
|
}
|
||||||
await PageModuleService.UpdatePageModuleAsync(pagemodule);
|
await PageModuleService.UpdatePageModuleAsync(pagemodule);
|
||||||
await PageModuleService.UpdatePageModuleOrderAsync(pagemodule.PageId, pagemodule.Pane);
|
await PageModuleService.UpdatePageModuleOrderAsync(pagemodule.PageId, pagemodule.Pane);
|
||||||
|
|
||||||
|
|
|
@ -101,7 +101,7 @@
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<select id="Theme" class="form-control" @onchange="(e => ThemeChanged(e))">
|
<select id="Theme" class="form-control" @onchange="(e => ThemeChanged(e))">
|
||||||
<option value="-"><Select Theme></option>
|
<option value="-"><Inherit From Site></option>
|
||||||
@foreach (KeyValuePair<string, string> item in _themes)
|
@foreach (KeyValuePair<string, string> item in _themes)
|
||||||
{
|
{
|
||||||
if (item.Key == _themetype)
|
if (item.Key == _themetype)
|
||||||
|
@ -122,7 +122,7 @@
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<select id="Layout" class="form-control" @bind="@_layouttype">
|
<select id="Layout" class="form-control" @bind="@_layouttype">
|
||||||
<option value="-"><Select Layout></option>
|
<option value="-"><Inherit From Site></option>
|
||||||
@foreach (KeyValuePair<string, string> panelayout in _panelayouts)
|
@foreach (KeyValuePair<string, string> panelayout in _panelayouts)
|
||||||
{
|
{
|
||||||
if (panelayout.Key == _layouttype)
|
if (panelayout.Key == _layouttype)
|
||||||
|
@ -137,6 +137,20 @@
|
||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<Label For="defaultContainer" HelpText="Select the default container for the page">Default Container: </Label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<select id="defaultContainer" class="form-control" @bind="@_containertype">
|
||||||
|
<option value="-"><Inherit From Site></option>
|
||||||
|
@foreach (KeyValuePair<string, string> container in _containers)
|
||||||
|
{
|
||||||
|
<option value="@container.Key">@container.Value</option>
|
||||||
|
}
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<Label For="Icon" HelpText="Optionally provide an icon for this page which will be displayed in the site navigation">Icon: </Label>
|
<Label For="Icon" HelpText="Optionally provide an icon for this page which will be displayed in the site navigation">Icon: </Label>
|
||||||
|
@ -187,6 +201,7 @@
|
||||||
@code {
|
@code {
|
||||||
private Dictionary<string, string> _themes;
|
private Dictionary<string, string> _themes;
|
||||||
private Dictionary<string, string> _panelayouts;
|
private Dictionary<string, string> _panelayouts;
|
||||||
|
private Dictionary<string, string> _containers = new Dictionary<string, string>();
|
||||||
private List<Theme> _themeList;
|
private List<Theme> _themeList;
|
||||||
private List<Page> _pageList;
|
private List<Page> _pageList;
|
||||||
private string _name;
|
private string _name;
|
||||||
|
@ -202,6 +217,7 @@
|
||||||
private string _mode = "view";
|
private string _mode = "view";
|
||||||
private string _themetype = "-";
|
private string _themetype = "-";
|
||||||
private string _layouttype = "-";
|
private string _layouttype = "-";
|
||||||
|
private string _containertype = "-";
|
||||||
private string _icon = string.Empty;
|
private string _icon = string.Empty;
|
||||||
private string _permissions = string.Empty;
|
private string _permissions = string.Empty;
|
||||||
private PermissionGrid _permissionGrid;
|
private PermissionGrid _permissionGrid;
|
||||||
|
@ -216,11 +232,9 @@
|
||||||
_pageList = PageState.Pages;
|
_pageList = PageState.Pages;
|
||||||
_children = PageState.Pages.Where(item => item.ParentId == null).ToList();
|
_children = PageState.Pages.Where(item => item.ParentId == null).ToList();
|
||||||
|
|
||||||
_themetype = PageState.Site.DefaultThemeType;
|
|
||||||
_layouttype = PageState.Site.DefaultLayoutType;
|
|
||||||
|
|
||||||
_themes = ThemeService.GetThemeTypes(_themeList);
|
_themes = ThemeService.GetThemeTypes(_themeList);
|
||||||
_panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype);
|
_panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype);
|
||||||
|
_containers = ThemeService.GetContainerTypes(_themeList);
|
||||||
|
|
||||||
_permissions = string.Empty;
|
_permissions = string.Empty;
|
||||||
}
|
}
|
||||||
|
@ -351,16 +365,20 @@
|
||||||
page.Url = _url;
|
page.Url = _url;
|
||||||
page.EditMode = (_mode == "edit" ? true : false);
|
page.EditMode = (_mode == "edit" ? true : false);
|
||||||
page.ThemeType = (_themetype != "-") ? _themetype : string.Empty;
|
page.ThemeType = (_themetype != "-") ? _themetype : string.Empty;
|
||||||
page.LayoutType = (_layouttype != "-") ? _layouttype : string.Empty;
|
if (!string.IsNullOrEmpty(page.ThemeType) && page.ThemeType == PageState.Site.DefaultThemeType)
|
||||||
if (page.ThemeType == PageState.Site.DefaultThemeType)
|
|
||||||
{
|
{
|
||||||
page.ThemeType = string.Empty;
|
page.ThemeType = string.Empty;
|
||||||
}
|
}
|
||||||
|
page.LayoutType = (_layouttype != "-") ? _layouttype : string.Empty;
|
||||||
if (page.LayoutType == PageState.Site.DefaultLayoutType)
|
if (!string.IsNullOrEmpty(page.LayoutType) && page.LayoutType == PageState.Site.DefaultLayoutType)
|
||||||
{
|
{
|
||||||
page.LayoutType = string.Empty;
|
page.LayoutType = string.Empty;
|
||||||
}
|
}
|
||||||
|
page.DefaultContainerType = (_containertype != "-") ? _containertype : string.Empty;
|
||||||
|
if (!string.IsNullOrEmpty(page.DefaultContainerType) && page.DefaultContainerType == PageState.Site.DefaultContainerType)
|
||||||
|
{
|
||||||
|
page.DefaultContainerType = string.Empty;
|
||||||
|
}
|
||||||
page.Icon = (_icon == null ? string.Empty : _icon);
|
page.Icon = (_icon == null ? string.Empty : _icon);
|
||||||
page.Permissions = _permissionGrid.GetPermissions();
|
page.Permissions = _permissionGrid.GetPermissions();
|
||||||
page.IsPersonalizable = (_ispersonalizable == null ? false : Boolean.Parse(_ispersonalizable));
|
page.IsPersonalizable = (_ispersonalizable == null ? false : Boolean.Parse(_ispersonalizable));
|
||||||
|
|
|
@ -112,7 +112,7 @@
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<select id="Theme" class="form-control" @onchange="(e => ThemeChanged(e))">
|
<select id="Theme" class="form-control" @onchange="(e => ThemeChanged(e))">
|
||||||
<option value="-"><Select Theme></option>
|
<option value="-"><Inherit From Site></option>
|
||||||
@foreach (KeyValuePair<string, string> item in _themes)
|
@foreach (KeyValuePair<string, string> item in _themes)
|
||||||
{
|
{
|
||||||
if (item.Key == _themetype)
|
if (item.Key == _themetype)
|
||||||
|
@ -133,7 +133,7 @@
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<select id="Layout" class="form-control" @bind="@_layouttype">
|
<select id="Layout" class="form-control" @bind="@_layouttype">
|
||||||
<option value="-"><Select Layout></option>
|
<option value="-"><Inherit From Site></option>
|
||||||
@foreach (KeyValuePair<string, string> panelayout in _panelayouts)
|
@foreach (KeyValuePair<string, string> panelayout in _panelayouts)
|
||||||
{
|
{
|
||||||
if (panelayout.Key == _layouttype)
|
if (panelayout.Key == _layouttype)
|
||||||
|
@ -148,6 +148,20 @@
|
||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<Label For="defaultContainer" HelpText="Select the default container for the page">Default Container: </Label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<select id="defaultContainer" class="form-control" @bind="@_containertype">
|
||||||
|
<option value="-"><Inherit From Site></option>
|
||||||
|
@foreach (KeyValuePair<string, string> container in _containers)
|
||||||
|
{
|
||||||
|
<option value="@container.Key">@container.Value</option>
|
||||||
|
}
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<Label For="Icon" HelpText="Optionally provide an icon for this page which will be displayed in the site navigation">Icon: </Label>
|
<Label For="Icon" HelpText="Optionally provide an icon for this page which will be displayed in the site navigation">Icon: </Label>
|
||||||
|
@ -200,6 +214,7 @@
|
||||||
@code {
|
@code {
|
||||||
private Dictionary<string, string> _themes;
|
private Dictionary<string, string> _themes;
|
||||||
private Dictionary<string, string> _panelayouts;
|
private Dictionary<string, string> _panelayouts;
|
||||||
|
private Dictionary<string, string> _containers = new Dictionary<string, string>();
|
||||||
private List<Theme> _themeList;
|
private List<Theme> _themeList;
|
||||||
private List<Page> _pageList;
|
private List<Page> _pageList;
|
||||||
private int _pageId;
|
private int _pageId;
|
||||||
|
@ -217,6 +232,7 @@
|
||||||
private string _mode;
|
private string _mode;
|
||||||
private string _themetype = "-";
|
private string _themetype = "-";
|
||||||
private string _layouttype = "-";
|
private string _layouttype = "-";
|
||||||
|
private string _containertype = "-";
|
||||||
private string _icon;
|
private string _icon;
|
||||||
private string _permissions;
|
private string _permissions;
|
||||||
private string _createdby;
|
private string _createdby;
|
||||||
|
@ -241,6 +257,7 @@
|
||||||
_children = PageState.Pages.Where(item => item.ParentId == null).ToList();
|
_children = PageState.Pages.Where(item => item.ParentId == null).ToList();
|
||||||
|
|
||||||
_themes = ThemeService.GetThemeTypes(_themeList);
|
_themes = ThemeService.GetThemeTypes(_themeList);
|
||||||
|
_containers = ThemeService.GetContainerTypes(_themeList);
|
||||||
|
|
||||||
_pageId = Int32.Parse(PageState.QueryString["id"]);
|
_pageId = Int32.Parse(PageState.QueryString["id"]);
|
||||||
var page = PageState.Pages.FirstOrDefault(item => item.PageId == _pageId);
|
var page = PageState.Pages.FirstOrDefault(item => item.PageId == _pageId);
|
||||||
|
@ -270,16 +287,21 @@
|
||||||
_ispersonalizable = page.IsPersonalizable.ToString();
|
_ispersonalizable = page.IsPersonalizable.ToString();
|
||||||
_mode = (page.EditMode) ? "edit" : "view";
|
_mode = (page.EditMode) ? "edit" : "view";
|
||||||
_themetype = page.ThemeType;
|
_themetype = page.ThemeType;
|
||||||
_panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype);
|
|
||||||
_layouttype = page.LayoutType;
|
|
||||||
if (_themetype == PageState.Site.DefaultThemeType)
|
if (_themetype == PageState.Site.DefaultThemeType)
|
||||||
{
|
{
|
||||||
_themetype = "-";
|
_themetype = "-";
|
||||||
}
|
}
|
||||||
|
_panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype);
|
||||||
|
_layouttype = page.LayoutType;
|
||||||
if (_layouttype == PageState.Site.DefaultLayoutType)
|
if (_layouttype == PageState.Site.DefaultLayoutType)
|
||||||
{
|
{
|
||||||
_layouttype = "-";
|
_layouttype = "-";
|
||||||
}
|
}
|
||||||
|
_containertype = page.DefaultContainerType;
|
||||||
|
if (string.IsNullOrEmpty(_containertype))
|
||||||
|
{
|
||||||
|
_containertype = "-";
|
||||||
|
}
|
||||||
_icon = page.Icon;
|
_icon = page.Icon;
|
||||||
_permissions = page.Permissions;
|
_permissions = page.Permissions;
|
||||||
_createdby = page.CreatedBy;
|
_createdby = page.CreatedBy;
|
||||||
|
@ -426,15 +448,20 @@
|
||||||
page.Url = _url;
|
page.Url = _url;
|
||||||
page.EditMode = (_mode == "edit");
|
page.EditMode = (_mode == "edit");
|
||||||
page.ThemeType = (_themetype != "-") ? _themetype : string.Empty;
|
page.ThemeType = (_themetype != "-") ? _themetype : string.Empty;
|
||||||
page.LayoutType = (_layouttype != "-") ? _layouttype : string.Empty;
|
if (!string.IsNullOrEmpty(page.ThemeType) && page.ThemeType == PageState.Site.DefaultThemeType)
|
||||||
if (page.ThemeType == PageState.Site.DefaultThemeType)
|
|
||||||
{
|
{
|
||||||
page.ThemeType = string.Empty;
|
page.ThemeType = string.Empty;
|
||||||
}
|
}
|
||||||
if (page.LayoutType == PageState.Site.DefaultLayoutType)
|
page.LayoutType = (_layouttype != "-") ? _layouttype : string.Empty;
|
||||||
|
if (!string.IsNullOrEmpty(page.LayoutType) && page.LayoutType == PageState.Site.DefaultLayoutType)
|
||||||
{
|
{
|
||||||
page.LayoutType = string.Empty;
|
page.LayoutType = string.Empty;
|
||||||
}
|
}
|
||||||
|
page.DefaultContainerType = (_containertype != "-") ? _containertype : string.Empty;
|
||||||
|
if (!string.IsNullOrEmpty(page.DefaultContainerType) && page.DefaultContainerType == PageState.Site.DefaultContainerType)
|
||||||
|
{
|
||||||
|
page.DefaultContainerType = string.Empty;
|
||||||
|
}
|
||||||
page.Icon = _icon ?? string.Empty;
|
page.Icon = _icon ?? string.Empty;
|
||||||
page.Permissions = _permissionGrid.GetPermissions();
|
page.Permissions = _permissionGrid.GetPermissions();
|
||||||
page.IsPersonalizable = (_ispersonalizable != null && Boolean.Parse(_ispersonalizable));
|
page.IsPersonalizable = (_ispersonalizable != null && Boolean.Parse(_ispersonalizable));
|
||||||
|
|
|
@ -260,7 +260,7 @@
|
||||||
if (PageState == null || reload >= Reload.Page)
|
if (PageState == null || reload >= Reload.Page)
|
||||||
{
|
{
|
||||||
modules = await ModuleService.GetModulesAsync(site.SiteId);
|
modules = await ModuleService.GetModulesAsync(site.SiteId);
|
||||||
modules = ProcessModules(modules, page.PageId, _pagestate.ModuleId, _pagestate.Action, page.Panes, site.DefaultContainerType);
|
modules = ProcessModules(modules, page.PageId, _pagestate.ModuleId, _pagestate.Action, page.Panes, (!string.IsNullOrEmpty(page.DefaultContainerType)) ? page.DefaultContainerType : site.DefaultContainerType);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -166,6 +166,7 @@ namespace Oqtane.Controllers
|
||||||
page.EditMode = false;
|
page.EditMode = false;
|
||||||
page.ThemeType = parent.ThemeType;
|
page.ThemeType = parent.ThemeType;
|
||||||
page.LayoutType = parent.LayoutType;
|
page.LayoutType = parent.LayoutType;
|
||||||
|
page.DefaultContainerType = parent.DefaultContainerType;
|
||||||
page.Icon = parent.Icon;
|
page.Icon = parent.Icon;
|
||||||
page.Permissions = new List<Permission> {
|
page.Permissions = new List<Permission> {
|
||||||
new Permission(PermissionNames.View, userid, true),
|
new Permission(PermissionNames.View, userid, true),
|
||||||
|
|
|
@ -19,12 +19,14 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Remove="Scripts\Tenant.0.9.1.sql" />
|
<None Remove="Scripts\Tenant.0.9.1.sql" />
|
||||||
|
<None Remove="Scripts\Tenant.0.9.2.sql" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="Modules\HtmlText\Scripts\HtmlText.1.0.0.sql" />
|
<EmbeddedResource Include="Modules\HtmlText\Scripts\HtmlText.1.0.0.sql" />
|
||||||
<EmbeddedResource Include="Modules\HtmlText\Scripts\HtmlText.Uninstall.sql" />
|
<EmbeddedResource Include="Modules\HtmlText\Scripts\HtmlText.Uninstall.sql" />
|
||||||
<EmbeddedResource Include="Scripts\Master.0.9.0.sql" />
|
<EmbeddedResource Include="Scripts\Master.0.9.0.sql" />
|
||||||
|
<EmbeddedResource Include="Scripts\Tenant.0.9.2.sql" />
|
||||||
<EmbeddedResource Include="Scripts\Tenant.0.9.1.sql" />
|
<EmbeddedResource Include="Scripts\Tenant.0.9.1.sql" />
|
||||||
<EmbeddedResource Include="Scripts\Tenant.0.9.0.sql" />
|
<EmbeddedResource Include="Scripts\Tenant.0.9.0.sql" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
|
@ -757,6 +757,7 @@ namespace Oqtane.Repository
|
||||||
EditMode = pagetemplate.EditMode,
|
EditMode = pagetemplate.EditMode,
|
||||||
ThemeType = "",
|
ThemeType = "",
|
||||||
LayoutType = "",
|
LayoutType = "",
|
||||||
|
DefaultContainerType = "",
|
||||||
Icon = pagetemplate.Icon,
|
Icon = pagetemplate.Icon,
|
||||||
Permissions = pagetemplate.PagePermissions,
|
Permissions = pagetemplate.PagePermissions,
|
||||||
IsPersonalizable = pagetemplate.IsPersonalizable,
|
IsPersonalizable = pagetemplate.IsPersonalizable,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
|
|
||||||
migration script
|
Version 0.9.1 migration script
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
18
Oqtane.Server/Scripts/Tenant.0.9.2.sql
Normal file
18
Oqtane.Server/Scripts/Tenant.0.9.2.sql
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Version 0.9.2 migration script
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
ALTER TABLE [dbo].[Role]
|
||||||
|
ALTER COLUMN [Description] VARCHAR (256) NOT NULL
|
||||||
|
GO
|
||||||
|
|
||||||
|
ALTER TABLE [dbo].[Page] ADD
|
||||||
|
[DefaultContainerType] [nvarchar](200) NULL
|
||||||
|
GO
|
||||||
|
|
||||||
|
UPDATE [dbo].[Page]
|
||||||
|
SET [DefaultContainerType] = ''
|
||||||
|
GO
|
||||||
|
|
|
@ -15,6 +15,7 @@ namespace Oqtane.Models
|
||||||
public string Url { get; set; }
|
public string Url { get; set; }
|
||||||
public string ThemeType { get; set; }
|
public string ThemeType { get; set; }
|
||||||
public string LayoutType { get; set; }
|
public string LayoutType { get; set; }
|
||||||
|
public string DefaultContainerType { get; set; }
|
||||||
public string Icon { get; set; }
|
public string Icon { get; set; }
|
||||||
public bool IsNavigation { get; set; }
|
public bool IsNavigation { get; set; }
|
||||||
public bool EditMode { get; set; }
|
public bool EditMode { get; set; }
|
||||||
|
|
Loading…
Reference in New Issue
Block a user