h1. Extending Webconsole

Webconsole extensions may be done by different ways. In this section we going to cover followin topic - new pages, new navigation elements and new widgets.

h2. New pages

Webconsole ships four different types of pages which should be used in different cases.
* BasePage
* SecuredPage
* SinglePage
* SidebarPage

h3. BasePage

BasePage is used to load shared resources and keep same look and feel on all webconsole pages. You should use this page for non-secured operations for example to build your own LoginPage and so on.

h3. SecuredPage

SecuredPage will be rendered to users which have 'admin' role assigned. Others will see error page. By default this page renders navigation bar and adds logout link.

h3. SinglePage

SinglePage is secured. If you have no additional navigation or your content requires full screen width then use this page. You will have all screen to display data.

h3. SidebarPage

SidebarPage is secured. If you have additional navigation then Sidebar is what you need. In your extension you have to call *setSidebarProvider* method othervise your sidebar won't be displayed.

h2. New navigation elements

When you implement own modules you honestly want to add new tab or new link somewhere to let user navigate directly to your logic without address bar usage.

To do this we shipped a *ConsoleTabProvider* interface. Just register an implementation of it under OSGi as a service and when webconsole will be ready to serve content it will ask your service for module home link and sub items.

h2. Widgets

Every management tool requires widgets. ;) We know about this and we provided also a *WidgetProvider* interface. It works in same way as a ConsoleTabProvider but it doesn't return links - it returns panels. Please remember following rule - because widgets may be used in different places you need to directly specify your widget provider 'intention'. Webconsole uses 'intention' service property to group providers. Please take a look for example below:
{code:xml}
<?xml version="1.0" encoding="utf-8" ?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
    <service ref="widgetProvider" interface="org.apache.karaf.webconsole.core.widget.WidgetProvider">
        <service-properties>
            <entry key="intention" value="dashboard" />
        </service-properties>
    </service>

    <bean id="widgetProvider" class="com.example.extension.MyWidgetProvider" />
</blueprint>
{code}

Widgets created by MyWidgetProvider will be used in dashboard.