<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Extending the Contextual Management UI</title><link>https://community.telligent.com/community/11/w/developer-training/65058/extending-the-contextual-management-ui</link><description /><dc:language>en-US</dc:language><generator>14.0.0.586 14</generator><item><title>Extending the Contextual Management UI</title><link>https://community.telligent.com/community/11/w/developer-training/65058/extending-the-contextual-management-ui</link><pubDate>Wed, 05 Aug 2020 15:08:29 GMT</pubDate><guid isPermaLink="false">a5fab4f2-6ce4-4d6d-8e64-125e78850d83</guid><dc:creator>Former Member</dc:creator><comments>https://community.telligent.com/community/11/w/developer-training/65058/extending-the-contextual-management-ui#comments</comments><description>Current Revision posted to Developer Training by Former Member on 08/05/2020 15:08:29&lt;br /&gt;
&lt;p&gt;Depending on the functionality that you are implementing, it may be necessary to expose contextual management options within the front UI of Verint Community. The contextual management UI is completely defined by plugins, so its easy to add to.&lt;/p&gt;
&lt;p&gt;[toc]&lt;/p&gt;
&lt;h2&gt;&lt;a id="Types_of_contextual_management_UI_extensions" name="Types_of_contextual_management_UI_extensions"&gt;&lt;/a&gt;Types of contextual management UI extensions&lt;/h2&gt;
&lt;p&gt;The contextual management UI is available throughout the front UI via the pencil icon in the upper left corner of the page (visible when there are contextual management panels available). The contextual management UI reviews the contextual data relative to the page via the&amp;nbsp;data supplied by the currently active [[Page Definition and URL Routing|URL route&amp;#39;s]] page context definition. The contextual management UI will identify panels related to [[The Content Model|containers, applications]], and [[Themes|themes]]. Additionally, panels can be used for ad-hoc contexts (for example, managerial or moderation actions on content that could exist on any page).&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/27.04-PM.png"&gt;&lt;img alt=" " src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/27.04-PM.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The following panel types are supported by the contextual management UI:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="#containerpanel"&gt;Container Panels&lt;/a&gt;. Container panels are exposed when the matching container type exists in the current context. See the [[The Content Model|content model]] for more information about containers.&lt;/li&gt;
&lt;li&gt;&lt;a href="#applicationpanel"&gt;Application Panels&lt;/a&gt;. Application panels are exposed when the matching application type exists in the current context. See [[The Content Model|content model]] for more information about applications.&lt;/li&gt;
&lt;li&gt;&lt;a href="#themepanel"&gt;Theme Panels&lt;/a&gt;. Theme panels are exposed for the current contextual theme context/type. See [[Themes|themes]] for more information about themes.&lt;/li&gt;
&lt;li&gt;&lt;a href="#explicitpanel"&gt;Explicit Panels&lt;/a&gt;. Explicit panels are not included within the browseable navigation of the contextual panel UI and, instead, represent managerial functionality that could be accessed from any context. Explicit panels are opened by their URL directly.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;a id="containerpanel"&gt;&lt;/a&gt;Container panels&lt;/h2&gt;
&lt;p&gt;To add a contextual management panel for one or more container types, a plugin implementing the &lt;a href="/developers/w/developer90/51064/icontainerpanel-plugin-type"&gt;IContainerPanel&lt;/a&gt;&amp;nbsp;interface must be defined and enabled. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;IContainerPanel&lt;/span&gt; interface is defined in the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Telligent.Evolution.Extensibility.Administration.Version1&lt;/span&gt; namespace of Telligent.Evolution.Core.dll. The following sample creates a container panel named &amp;quot;Sample Container Panel&amp;quot;:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;using System
using Telligent.Evolution.Extensibility;
using Telligent.Evolution.Extensibility.Administration.Version1;

namespace Samples
{
	public class SampleContainerPanel : IContainerPanel
	{
		private readonly Guid _id = new Guid(&amp;quot;5edcdc07-411d-406c-ab2f-b456c617beb1&amp;quot;);

		#region IPlugin

		// ...

		#endregion

		#region IContainerPanel

		public Guid[] ContainerTypes
		{
			get
			{
				var groupsApi = Apis.Get&amp;lt;Telligent.Evolution.Extensibility.Api.Version1.IGroups&amp;gt;();
				if (groupsApi != null)
					return new Guid[] { groupsApi.ContainerTypeId };
				else
					return new Guid[0];
			}
		}

		public string CssClass {  get { return string.Empty; } }

		public int? DisplayOrder {  get { return null; } }

		public bool IsCacheable {  get { return true; } }

		public Guid PanelId {  get { return _id; } }

		public bool VaryCacheByUser {  get { return false; } }

		public bool HasAccess(int userId, Guid containerType, Guid containerId)
		{
			return true;
		}

		public string GetPanelName(Guid containerType, Guid containerId)
		{
			return &amp;quot;Sample Container Panel&amp;quot;;
		}

		public string GetPanelDescription(Guid containerType, Guid containerId)
		{
			return &amp;quot;A sample container panel.&amp;quot;;
		}

		public string GetViewHtml(Guid containerType, Guid containerId)
		{
			return &amp;quot;This is the content of the sample container panel.&amp;quot;;
		}

		#endregion
	}
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;ContainerTypes&lt;/span&gt; property identifies the types of [[The Content Model|containers]] this contextual management panel applies to. In the sample, we reference the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;ContainerTypeId&lt;/span&gt; of groups. This will cause this panel to be exposed to users viewing pages related to a group. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;HasAccess()&lt;/span&gt; method can be customized to limit access to the panel to only users with specific permissions or only containers with specific configuration. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelName()&lt;/span&gt; returns&amp;nbsp;the name of the panel as shown in the UI. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelDescription()&lt;/span&gt; returns the description of the panel as shown in listing of panels in the UI. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetViewHtml()&lt;/span&gt; returns the content of the panel. Generally, &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelName()&lt;/span&gt;, &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelDescription()&lt;/span&gt;, and &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetViewHtml()&lt;/span&gt; would be rendered from [[Using Widgets to Render Content From Plugins|widgets defined by the plugin]] but can also be directly code-generated as in this sample.&lt;/p&gt;
&lt;p&gt;When deployed and enabled, the sample is shown within the &amp;quot;Manage Group&amp;quot; menu of the contextual management UI:&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/06.25-PM.png"&gt;&lt;img alt=" " src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/06.25-PM.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And selecting the sample container panel from the &amp;quot;Manage Group&amp;quot; menu renders the panel as below:&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/06.45-PM.png"&gt;&lt;img alt=" " src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/06.45-PM.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a id="applicationpanel"&gt;&lt;/a&gt;Application panels&lt;/h2&gt;
&lt;p&gt;To add a contextual management panel for one or more application&amp;nbsp;types, a plugin implementing the &lt;a href="/developers/w/developer90/51058/iapplicationpanel-plugin-type"&gt;IApplicationPanel&lt;/a&gt;&amp;nbsp;interface must be defined and enabled. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;IApplicationPanel&lt;/span&gt; interface is defined in the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Telligent.Evolution.Extensibility.Administration.Version1&lt;/span&gt; namespace of Telligent.Evolution.Core.dll. The following sample creates an application panel named &amp;quot;Sample Application&amp;nbsp;Panel&amp;quot;:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;using System
using Telligent.Evolution.Extensibility;
using Telligent.Evolution.Extensibility.Administration.Version1;

namespace Samples
{
	public class SampleApplicationPanel : IApplicationPanel
	{
		private readonly Guid _id = new Guid(&amp;quot;975fb78f-fb81-47e5-9046-f3f73835b100&amp;quot;);

		#region IPlugin

		// ...

		#endregion

		#region IApplicationPanel

		public Guid[] ApplicationTypes
		{
			get
			{
				var forumsApi = Apis.Get&amp;lt;Telligent.Evolution.Extensibility.Api.Version1.IForums&amp;gt;();
				if (forumsApi != null)
					return new Guid[] { forumsApi.ApplicationTypeId };
				else
					return new Guid[0];
			}
		}

		public string CssClass { get { return string.Empty; } }

		public int? DisplayOrder { get { return null; } }

		public bool IsCacheable { get { return true; } }

		public Guid PanelId { get { return _id; } }

		public bool VaryCacheByUser { get { return false; } }

		public bool HasAccess(int userId, Guid containerType, Guid containerId)
		{
			return true;
		}

		public string GetPanelName(Guid applicationType, Guid applicationId)
		{
			return &amp;quot;Sample Application Panel&amp;quot;;
		}

		public string GetPanelDescription(Guid applicationType, Guid applicationId)
		{
			return &amp;quot;A sample application panel.&amp;quot;;
		}

		public string GetViewHtml(Guid applicationType, Guid applicationId)
		{
			return &amp;quot;This is the content of the sample application panel.&amp;quot;;
		}

		#endregion
	}
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;ApplicationTypes&lt;/span&gt; property identifies the types of [[The Content Model|applications]] this contextual management panel applies to. In the sample, we reference the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;ApplicationTypeId&lt;/span&gt; of forums. This will cause this panel to be exposed to users viewing pages related to a forum. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;HasAccess()&lt;/span&gt; method can be customized to limit access to the panel to only users with specific permissions or only applications&amp;nbsp;with specific configuration. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelName()&lt;/span&gt; returns&amp;nbsp;the name of the panel as shown in the UI. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelDescription()&lt;/span&gt; returns the description of the panel as shown in listing of panels in the UI. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetViewHtml()&lt;/span&gt; returns the content of the panel. Generally, &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelName()&lt;/span&gt;, &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelDescription()&lt;/span&gt;, and &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetViewHtml()&lt;/span&gt; would be rendered from [[Using Widgets to Render Content From Plugins|widgets defined by the plugin]] but can also be directly code-generated as in this sample.&lt;/p&gt;
&lt;p&gt;When deployed and enabled, the sample is shown within the &amp;quot;Manage Forum&amp;quot; menu of the contextual management UI:&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/06.58-PM.png"&gt;&lt;img alt=" " src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/06.58-PM.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And selecting the sample application&amp;nbsp;panel from the &amp;quot;Manage Forum&amp;quot; menu renders the panel as below:&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/07.08-PM.png"&gt;&lt;img alt=" " src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/07.08-PM.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a id="themepanel"&gt;&lt;/a&gt;Theme panels&lt;/h2&gt;
&lt;p&gt;To add a contextual management panel for a theme, a plugin implementing the &lt;a href="/developers/w/developer90/51078/ithemepanel-plugin-type"&gt;IThemePanel&lt;/a&gt;&amp;nbsp;interface must be defined and enabled. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;IThemePanel&lt;/span&gt; interface is defined in the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Telligent.Evolution.Extensibility.Administration.Version1&lt;/span&gt; namespace of Telligent.Evolution.Core.dll. The following sample creates a theme panel named &amp;quot;Sample Theme Panel&amp;quot;:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;using System
using Telligent.Evolution.Extensibility;
using Telligent.Evolution.Extensibility.Administration.Version1;

namespace Samples
{
	public class SampleThemePanel : IThemePanel
	{
		private readonly Guid _id = new Guid(&amp;quot;4bc58386-44e9-4a4d-933f-53a1031af339&amp;quot;);

		#region IPlugin

		// ...

		#endregion

		#region IThemePanel

		public string CssClass { get { return string.Empty; } }

		public int? DisplayOrder {  get { return null; } }

		public bool IsCacheable {  get { return true; } }

		public Guid PanelId {  get { return _id; } }

		public bool VaryCacheByUser {  get { return false; } }

		public bool HasAccess(int userId, Guid themeType, Guid themeApplicationId, bool forceDefault)
		{
			return true;
		}

		public string GetPanelName(Guid themeType, Guid themeApplicationId, bool forceDefault)
		{
			return &amp;quot;Sample Theme Panel&amp;quot;;
		}

		public string GetPanelDescription(Guid themeType, Guid themeApplicationId, bool forceDefault)
		{
			return &amp;quot;A sample theme panel.&amp;quot;;
		}

		public string GetViewHtml(Guid themeType, Guid themeApplicationId, bool forceDefault)
		{
			return &amp;quot;This is the content of the sample theme panel.&amp;quot;;
		}

		#endregion
	}
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;This panel will be available whenever a user is within the context of a theme they can manage. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;HasAccess()&lt;/span&gt; method can be customized to limit access to the panel to only users with specific permissions or only themes&amp;nbsp;with specific configuration. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelName()&lt;/span&gt; returns&amp;nbsp;the name of the panel as shown in the UI. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelDescription()&lt;/span&gt; returns the description of the panel as shown in listing of panels in the UI. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetViewHtml()&lt;/span&gt; returns the content of the panel. Generally, &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelName()&lt;/span&gt;, &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelDescription()&lt;/span&gt;, and &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetViewHtml()&lt;/span&gt; would be rendered from [[Using Widgets to Render Content From Plugins|widgets defined by the plugin]] but can also be directly code-generated as in this sample.&lt;/p&gt;
&lt;p&gt;When deployed and enabled, the sample is shown within the &amp;quot;Manage [Theme-Type] Theme&amp;quot; menu of the contextual management UI, for example, &amp;quot;Manage Group Theme&amp;quot;:&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/07.21-PM.png"&gt;&lt;img alt=" " src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/07.21-PM.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And selecting the sample theme&amp;nbsp;panel from the &amp;quot;Manage Forum&amp;quot; menu renders the panel as below:&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/07.29-PM.png"&gt;&lt;img alt=" " src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/07.29-PM.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a id="explicitpanel"&gt;&lt;/a&gt;Explicit panels&lt;/h2&gt;
&lt;p&gt;To create a contextual management panel that can be used in any context or reused by other contextual management panels, an explicit panel can be defined. Explicit management panels don&amp;#39;t exist in the browseable hierarchy of the contextual management UI, but can be opened directly from front UI widgets or other contextual management panels by URL. To add an explicit panel, a plugin implementing the &lt;a href="/developers/w/developer90/51072/iexplicitpanel-plugin-type"&gt;IExplicitPanel&lt;/a&gt;&amp;nbsp;interface can be defined and enabled. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;IExplicitPanel&lt;/span&gt; interface is defined in the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Telligent.Evolution.Extensibility.Administration.Version1&lt;/span&gt; namespace of Telligent.Evolution.Core.dll. A sample implementation is below:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;using System
using Telligent.Evolution.Extensibility;
using Telligent.Evolution.Extensibility.Administration.Version1;
using System.Collections.Specialized;

namespace Samples
{
	public class SampleExplicitPanel : IExplicitPanel
	{
		private readonly Guid _id = new Guid(&amp;quot;ab05b86b-979e-4ccf-ab68-f90f953279a6&amp;quot;);

		private IExplicitPanelController _explictPanelController;

		#region IPlugin

		// ...

		#endregion

		#region IExplicitPanel

		public void SetController(IExplicitPanelController controller)
		{
			_explictPanelController = controller;
		}

		public string CssClass {  get { return string.Empty; } }

		public int? DisplayOrder {  get { return null; } }

		public bool IsCacheable {  get { return true; } }

		public Guid PanelId {  get { return _id; } }

		public bool VaryCacheByUser {  get { return false; } }

		public bool HasAccess(int userId, NameValueCollection parameters)
		{
			return true;
		}

		public string GetPanelName(NameValueCollection parameters)
		{
			return &amp;quot;Sample Explicit Panel&amp;quot;;
		}

		public string GetPanelDescription(NameValueCollection parameters)
		{
			return &amp;quot;A sample explicit panel.&amp;quot;;
		}

		public string GetViewHtml(NameValueCollection parameters)
		{
			return &amp;quot;The content of the sample explicit panel.&amp;quot;;
		}		

		#endregion
	}
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Explicit panels are provided with a controller via the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;SetController()&lt;/span&gt; method. This controller provides a method to generate a URL to this panel (with or without parameters). This URL can then be provided to other panels to enable them to generate links to this explicit panel and share its functionality. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;HasAccess()&lt;/span&gt; method can be used to block access to an explicit panel for a specific user. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelName()&lt;/span&gt;, &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelDescription()&lt;/span&gt;, and &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetViewHtml()&lt;/span&gt; work like other contextual panels (see above) but are passed the optional parameters (if defined) from the original URL loading the panel. This sample panel, when deployed and its URL is accessed, is rendered as:&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/10.30-PM.png"&gt;&lt;img alt=" " src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/10.30-PM.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Note that the &amp;quot;Back&amp;quot; link is always shown. If opened from a contextual management panel, the &amp;quot;Back&amp;quot; button will return to the previous panel. If opened directly from the front UI or a direct link, the &amp;quot;Back&amp;quot; button will close the contextual management UI and return to the full view of the page.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>Extending the Contextual Management UI</title><link>https://community.telligent.com/community/11/w/developer-training/65058/extending-the-contextual-management-ui/revision/1</link><pubDate>Thu, 13 Jun 2019 19:23:53 GMT</pubDate><guid isPermaLink="false">a5fab4f2-6ce4-4d6d-8e64-125e78850d83</guid><dc:creator>Ben Tiedt</dc:creator><comments>https://community.telligent.com/community/11/w/developer-training/65058/extending-the-contextual-management-ui#comments</comments><description>Revision 1 posted to Developer Training by Ben Tiedt on 06/13/2019 19:23:53&lt;br /&gt;
&lt;p&gt;Depending on the functionality that you are implementing, it may be necessary to expose contextual management options within the front UI of Telligent Community. The contextual management UI is completely defined by plugins, so its easy to add to.&lt;/p&gt;
&lt;p&gt;[toc]&lt;/p&gt;
&lt;h2&gt;&lt;a id="Types_of_contextual_management_UI_extensions" name="Types_of_contextual_management_UI_extensions"&gt;&lt;/a&gt;Types of contextual management UI extensions&lt;/h2&gt;
&lt;p&gt;The contextual management UI is available throughout the front UI via the pencil icon in the upper left corner of the page (visible when there are contextual management panels available). The contextual management UI reviews the contextual data relative to the page via the&amp;nbsp;data supplied by the currently active [[Page Definition and URL Routing|URL route&amp;#39;s]] page context definition. The contextual management UI will identify panels related to [[The Content Model|containers, applications]], and [[Themes|themes]]. Additionally, panels can be used for ad-hoc contexts (for example, managerial or moderation actions on content that could exist on any page).&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/27.04-PM.png"&gt;&lt;img src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/27.04-PM.png" alt=" " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The following panel types are supported by the contextual management UI:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="#containerpanel"&gt;Container Panels&lt;/a&gt;. Container panels are exposed when the matching container type exists in the current context. See the [[The Content Model|content model]] for more information about containers.&lt;/li&gt;
&lt;li&gt;&lt;a href="#applicationpanel"&gt;Application Panels&lt;/a&gt;. Application panels are exposed when the matching application type exists in the current context. See [[The Content Model|content model]] for more information about applications.&lt;/li&gt;
&lt;li&gt;&lt;a href="#themepanel"&gt;Theme Panels&lt;/a&gt;. Theme panels are exposed for the current contextual theme context/type. See [[Themes|themes]] for more information about themes.&lt;/li&gt;
&lt;li&gt;&lt;a href="#explicitpanel"&gt;Explicit Panels&lt;/a&gt;. Explicit panels are not included within the browseable navigation of the contextual panel UI and, instead, represent managerial functionality that could be accessed from any context. Explicit panels are opened by their URL directly.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;a id="containerpanel"&gt;&lt;/a&gt;Container panels&lt;/h2&gt;
&lt;p&gt;To add a contextual management panel for one or more container types, a plugin implementing the &lt;a href="/developers/w/developer90/51064/icontainerpanel-plugin-type"&gt;IContainerPanel&lt;/a&gt;&amp;nbsp;interface must be defined and enabled. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;IContainerPanel&lt;/span&gt; interface is defined in the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Telligent.Evolution.Extensibility.Administration.Version1&lt;/span&gt; namespace of Telligent.Evolution.Core.dll. The following sample creates a container panel named &amp;quot;Sample Container Panel&amp;quot;:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;using System
using Telligent.Evolution.Extensibility;
using Telligent.Evolution.Extensibility.Administration.Version1;

namespace Samples
{
	public class SampleContainerPanel : IContainerPanel
	{
		private readonly Guid _id = new Guid(&amp;quot;5edcdc07-411d-406c-ab2f-b456c617beb1&amp;quot;);

		#region IPlugin

		// ...

		#endregion

		#region IContainerPanel

		public Guid[] ContainerTypes
		{
			get
			{
				var groupsApi = Apis.Get&amp;lt;Telligent.Evolution.Extensibility.Api.Version1.IGroups&amp;gt;();
				if (groupsApi != null)
					return new Guid[] { groupsApi.ContainerTypeId };
				else
					return new Guid[0];
			}
		}

		public string CssClass {  get { return string.Empty; } }

		public int? DisplayOrder {  get { return null; } }

		public bool IsCacheable {  get { return true; } }

		public Guid PanelId {  get { return _id; } }

		public bool VaryCacheByUser {  get { return false; } }

		public bool HasAccess(int userId, Guid containerType, Guid containerId)
		{
			return true;
		}

		public string GetPanelName(Guid containerType, Guid containerId)
		{
			return &amp;quot;Sample Container Panel&amp;quot;;
		}

		public string GetPanelDescription(Guid containerType, Guid containerId)
		{
			return &amp;quot;A sample container panel.&amp;quot;;
		}

		public string GetViewHtml(Guid containerType, Guid containerId)
		{
			return &amp;quot;This is the content of the sample container panel.&amp;quot;;
		}

		#endregion
	}
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;ContainerTypes&lt;/span&gt; property identifies the types of [[The Content Model|containers]] this contextual management panel applies to. In the sample, we reference the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;ContainerTypeId&lt;/span&gt; of groups. This will cause this panel to be exposed to users viewing pages related to a group. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;HasAccess()&lt;/span&gt; method can be customized to limit access to the panel to only users with specific permissions or only containers with specific configuration. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelName()&lt;/span&gt; returns&amp;nbsp;the name of the panel as shown in the UI. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelDescription()&lt;/span&gt; returns the description of the panel as shown in listing of panels in the UI. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetViewHtml()&lt;/span&gt; returns the content of the panel. Generally, &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelName()&lt;/span&gt;, &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelDescription()&lt;/span&gt;, and &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetViewHtml()&lt;/span&gt; would be rendered from [[Using Widgets to Render Content From Plugins|widgets defined by the plugin]] but can also be directly code-generated as in this sample.&lt;/p&gt;
&lt;p&gt;When deployed and enabled, the sample is shown within the &amp;quot;Manage Group&amp;quot; menu of the contextual management UI:&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/06.25-PM.png"&gt;&lt;img src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/06.25-PM.png" alt=" " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And selecting the sample container panel from the &amp;quot;Manage Group&amp;quot; menu renders the panel as below:&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/06.45-PM.png"&gt;&lt;img src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/06.45-PM.png" alt=" " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a id="applicationpanel"&gt;&lt;/a&gt;Application panels&lt;/h2&gt;
&lt;p&gt;To add a contextual management panel for one or more application&amp;nbsp;types, a plugin implementing the &lt;a href="/developers/w/developer90/51058/iapplicationpanel-plugin-type"&gt;IApplicationPanel&lt;/a&gt;&amp;nbsp;interface must be defined and enabled. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;IApplicationPanel&lt;/span&gt; interface is defined in the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Telligent.Evolution.Extensibility.Administration.Version1&lt;/span&gt; namespace of Telligent.Evolution.Core.dll. The following sample creates an application panel named &amp;quot;Sample Application&amp;nbsp;Panel&amp;quot;:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;using System
using Telligent.Evolution.Extensibility;
using Telligent.Evolution.Extensibility.Administration.Version1;

namespace Samples
{
	public class SampleApplicationPanel : IApplicationPanel
	{
		private readonly Guid _id = new Guid(&amp;quot;975fb78f-fb81-47e5-9046-f3f73835b100&amp;quot;);

		#region IPlugin

		// ...

		#endregion

		#region IApplicationPanel

		public Guid[] ApplicationTypes
		{
			get
			{
				var forumsApi = Apis.Get&amp;lt;Telligent.Evolution.Extensibility.Api.Version1.IForums&amp;gt;();
				if (forumsApi != null)
					return new Guid[] { forumsApi.ApplicationTypeId };
				else
					return new Guid[0];
			}
		}

		public string CssClass { get { return string.Empty; } }

		public int? DisplayOrder { get { return null; } }

		public bool IsCacheable { get { return true; } }

		public Guid PanelId { get { return _id; } }

		public bool VaryCacheByUser { get { return false; } }

		public bool HasAccess(int userId, Guid containerType, Guid containerId)
		{
			return true;
		}

		public string GetPanelName(Guid applicationType, Guid applicationId)
		{
			return &amp;quot;Sample Application Panel&amp;quot;;
		}

		public string GetPanelDescription(Guid applicationType, Guid applicationId)
		{
			return &amp;quot;A sample application panel.&amp;quot;;
		}

		public string GetViewHtml(Guid applicationType, Guid applicationId)
		{
			return &amp;quot;This is the content of the sample application panel.&amp;quot;;
		}

		#endregion
	}
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;ApplicationTypes&lt;/span&gt; property identifies the types of [[The Content Model|applications]] this contextual management panel applies to. In the sample, we reference the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;ApplicationTypeId&lt;/span&gt; of forums. This will cause this panel to be exposed to users viewing pages related to a forum. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;HasAccess()&lt;/span&gt; method can be customized to limit access to the panel to only users with specific permissions or only applications&amp;nbsp;with specific configuration. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelName()&lt;/span&gt; returns&amp;nbsp;the name of the panel as shown in the UI. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelDescription()&lt;/span&gt; returns the description of the panel as shown in listing of panels in the UI. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetViewHtml()&lt;/span&gt; returns the content of the panel. Generally, &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelName()&lt;/span&gt;, &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelDescription()&lt;/span&gt;, and &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetViewHtml()&lt;/span&gt; would be rendered from [[Using Widgets to Render Content From Plugins|widgets defined by the plugin]] but can also be directly code-generated as in this sample.&lt;/p&gt;
&lt;p&gt;When deployed and enabled, the sample is shown within the &amp;quot;Manage Forum&amp;quot; menu of the contextual management UI:&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/06.58-PM.png"&gt;&lt;img src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/06.58-PM.png" alt=" " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And selecting the sample application&amp;nbsp;panel from the &amp;quot;Manage Forum&amp;quot; menu renders the panel as below:&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/07.08-PM.png"&gt;&lt;img src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/07.08-PM.png" alt=" " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a id="themepanel"&gt;&lt;/a&gt;Theme panels&lt;/h2&gt;
&lt;p&gt;To add a contextual management panel for a theme, a plugin implementing the &lt;a href="/developers/w/developer90/51078/ithemepanel-plugin-type"&gt;IThemePanel&lt;/a&gt;&amp;nbsp;interface must be defined and enabled. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;IThemePanel&lt;/span&gt; interface is defined in the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Telligent.Evolution.Extensibility.Administration.Version1&lt;/span&gt; namespace of Telligent.Evolution.Core.dll. The following sample creates a theme panel named &amp;quot;Sample Theme Panel&amp;quot;:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;using System
using Telligent.Evolution.Extensibility;
using Telligent.Evolution.Extensibility.Administration.Version1;

namespace Samples
{
	public class SampleThemePanel : IThemePanel
	{
		private readonly Guid _id = new Guid(&amp;quot;4bc58386-44e9-4a4d-933f-53a1031af339&amp;quot;);

		#region IPlugin

		// ...

		#endregion

		#region IThemePanel

		public string CssClass { get { return string.Empty; } }

		public int? DisplayOrder {  get { return null; } }

		public bool IsCacheable {  get { return true; } }

		public Guid PanelId {  get { return _id; } }

		public bool VaryCacheByUser {  get { return false; } }

		public bool HasAccess(int userId, Guid themeType, Guid themeApplicationId, bool forceDefault)
		{
			return true;
		}

		public string GetPanelName(Guid themeType, Guid themeApplicationId, bool forceDefault)
		{
			return &amp;quot;Sample Theme Panel&amp;quot;;
		}

		public string GetPanelDescription(Guid themeType, Guid themeApplicationId, bool forceDefault)
		{
			return &amp;quot;A sample theme panel.&amp;quot;;
		}

		public string GetViewHtml(Guid themeType, Guid themeApplicationId, bool forceDefault)
		{
			return &amp;quot;This is the content of the sample theme panel.&amp;quot;;
		}

		#endregion
	}
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;This panel will be available whenever a user is within the context of a theme they can manage. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;HasAccess()&lt;/span&gt; method can be customized to limit access to the panel to only users with specific permissions or only themes&amp;nbsp;with specific configuration. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelName()&lt;/span&gt; returns&amp;nbsp;the name of the panel as shown in the UI. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelDescription()&lt;/span&gt; returns the description of the panel as shown in listing of panels in the UI. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetViewHtml()&lt;/span&gt; returns the content of the panel. Generally, &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelName()&lt;/span&gt;, &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelDescription()&lt;/span&gt;, and &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetViewHtml()&lt;/span&gt; would be rendered from [[Using Widgets to Render Content From Plugins|widgets defined by the plugin]] but can also be directly code-generated as in this sample.&lt;/p&gt;
&lt;p&gt;When deployed and enabled, the sample is shown within the &amp;quot;Manage [Theme-Type] Theme&amp;quot; menu of the contextual management UI, for example, &amp;quot;Manage Group Theme&amp;quot;:&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/07.21-PM.png"&gt;&lt;img src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/07.21-PM.png" alt=" " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And selecting the sample theme&amp;nbsp;panel from the &amp;quot;Manage Forum&amp;quot; menu renders the panel as below:&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/07.29-PM.png"&gt;&lt;img src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/07.29-PM.png" alt=" " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a id="explicitpanel"&gt;&lt;/a&gt;Explicit panels&lt;/h2&gt;
&lt;p&gt;To create a contextual management panel that can be used in any context or reused by other contextual management panels, an explicit panel can be defined. Explicit management panels don&amp;#39;t exist in the browseable hierarchy of the contextual management UI, but can be opened directly from front UI widgets or other contextual management panels by URL. To add an explicit panel, a plugin implementing the &lt;a href="/developers/w/developer90/51072/iexplicitpanel-plugin-type"&gt;IExplicitPanel&lt;/a&gt;&amp;nbsp;interface can be defined and enabled. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;IExplicitPanel&lt;/span&gt; interface is defined in the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Telligent.Evolution.Extensibility.Administration.Version1&lt;/span&gt; namespace of Telligent.Evolution.Core.dll. A sample implementation is below:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;using System
using Telligent.Evolution.Extensibility;
using Telligent.Evolution.Extensibility.Administration.Version1;
using System.Collections.Specialized;

namespace Samples
{
	public class SampleExplicitPanel : IExplicitPanel
	{
		private readonly Guid _id = new Guid(&amp;quot;ab05b86b-979e-4ccf-ab68-f90f953279a6&amp;quot;);

		private IExplicitPanelController _explictPanelController;

		#region IPlugin

		// ...

		#endregion

		#region IExplicitPanel

		public void SetController(IExplicitPanelController controller)
		{
			_explictPanelController = controller;
		}

		public string CssClass {  get { return string.Empty; } }

		public int? DisplayOrder {  get { return null; } }

		public bool IsCacheable {  get { return true; } }

		public Guid PanelId {  get { return _id; } }

		public bool VaryCacheByUser {  get { return false; } }

		public bool HasAccess(int userId, NameValueCollection parameters)
		{
			return true;
		}

		public string GetPanelName(NameValueCollection parameters)
		{
			return &amp;quot;Sample Explicit Panel&amp;quot;;
		}

		public string GetPanelDescription(NameValueCollection parameters)
		{
			return &amp;quot;A sample explicit panel.&amp;quot;;
		}

		public string GetViewHtml(NameValueCollection parameters)
		{
			return &amp;quot;The content of the sample explicit panel.&amp;quot;;
		}		

		#endregion
	}
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Explicit panels are provided with a controller via the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;SetController()&lt;/span&gt; method. This controller provides a method to generate a URL to this panel (with or without parameters). This URL can then be provided to other panels to enable them to generate links to this explicit panel and share its functionality. The &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;HasAccess()&lt;/span&gt; method can be used to block access to an explicit panel for a specific user. &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelName()&lt;/span&gt;, &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetPanelDescription()&lt;/span&gt;, and &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;GetViewHtml()&lt;/span&gt; work like other contextual panels (see above) but are passed the optional parameters (if defined) from the original URL loading the panel. This sample panel, when deployed and its URL is accessed, is rendered as:&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/10.30-PM.png"&gt;&lt;img src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/10.30-PM.png" alt=" " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Note that the &amp;quot;Back&amp;quot; link is always shown. If opened from a contextual management panel, the &amp;quot;Back&amp;quot; button will return to the previous panel. If opened directly from the front UI or a direct link, the &amp;quot;Back&amp;quot; button will close the contextual management UI and return to the full view of the page.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item></channel></rss>