<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>UI extensions on CloudBolt Documentation</title>
		<link>https://docs.cloudbolt.io/docs/cmp/developer-resources/ui-extensions/</link>
		<description>Recent content in UI extensions on CloudBolt Documentation</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<atom:link href="https://docs.cloudbolt.io/docs/cmp/developer-resources/ui-extensions/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>UI elements that support extensions</title>
				<link>https://docs.cloudbolt.io/docs/cmp/developer-resources/ui-extensions/supported-elements/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://docs.cloudbolt.io/docs/cmp/developer-resources/ui-extensions/supported-elements/</guid>
				<description>&lt;p&gt;Every decorator takes a &lt;code&gt;title&lt;/code&gt; and a &lt;code&gt;description&lt;/code&gt;. The title is displayed on the element and defaults to the view function&amp;rsquo;s name. The description appears on the Extensions Management page, and defaults to the view&amp;rsquo;s docstring. Import the decorators from &lt;code&gt;extensions.views&lt;/code&gt;, and give each view a template path that starts with the package folder name.&lt;/p&gt;&#xA;&lt;h2 id=&#34;dashboard-cards&#34;&gt;Dashboard cards&lt;/h2&gt;&#xA;&lt;p&gt;The Dashboard is built from cards. Use &lt;code&gt;dashboard_extension&lt;/code&gt; to add your own.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; django.shortcuts &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; render&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; extensions.views &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; dashboard_extension&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@dashboard_extension&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    title&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Network Topology&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    description&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Current status of the network topology&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;network_topology_card&lt;/span&gt;(request):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; render(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        request,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;network_topology/templates/dashboard_card.html&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;: get_network_topology_data()},&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;reports&#34;&gt;Reports&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;report_extension&lt;/code&gt; adds a custom report. Reports can include tables and charts using the built-in Highcharts library.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Package structure</title>
				<link>https://docs.cloudbolt.io/docs/cmp/developer-resources/ui-extensions/package-structure/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://docs.cloudbolt.io/docs/cmp/developer-resources/ui-extensions/package-structure/</guid>
				<description>&lt;p&gt;The package layout tells Cloud Management Platform (CMP) where to find your views, templates, and static files.&lt;/p&gt;&#xA;&lt;p&gt;Packages live in &lt;code&gt;/var/opt/cloudbolt/proserv/xui/&lt;/code&gt;, one folder per extension, named after the extension&amp;rsquo;s &lt;strong&gt;Name&lt;/strong&gt;. A single package can register several extensions at different points in the UI: a dashboard card, a report, and a detail view tab can all come from the same folder.&lt;/p&gt;&#xA;&lt;h2 id=&#34;files-in-a-package&#34;&gt;Files in a package&lt;/h2&gt;&#xA;&lt;div class=&#34;table-scroll&#34;&gt;&#xA;&lt;div class=&#34;table-responsive&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Path&lt;/th&gt;&#xA;          &lt;th&gt;What it holds&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;__init__.py&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Required by Python, and where you set &lt;code&gt;ALLOWED_XUI_EXTENSIONS&lt;/code&gt; to change which file types the package exports.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;views.py&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Django views. Each is registered as an extension by the decorator above it.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;urls.py&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Optional URLs for buttons, links, and dialogs that call back into your views.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;templates/&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Django templates your views render. Template paths start with the package folder name.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;static/&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;CSS, JavaScript, and images that ship with the extension.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Creating a package from &lt;strong&gt;Admin&lt;/strong&gt; &amp;gt; &lt;strong&gt;Manage UI Extensions&lt;/strong&gt; writes &lt;code&gt;__init__.py&lt;/code&gt;, &lt;code&gt;views.py&lt;/code&gt;, and a stub function for each selected extension type. Add the rest as needed.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Front-end assets and tools</title>
				<link>https://docs.cloudbolt.io/docs/cmp/developer-resources/ui-extensions/front-end-assets-and-tools/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://docs.cloudbolt.io/docs/cmp/developer-resources/ui-extensions/front-end-assets-and-tools/</guid>
				<description>&lt;h2 id=&#34;libraries-you-can-use&#34;&gt;Libraries you can use&lt;/h2&gt;&#xA;&lt;p&gt;These are loaded by default, so any template can call them:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://getbootstrap.com/docs/5.3/&#34;&gt;Bootstrap&lt;/a&gt;, a CSS framework with &lt;a href=&#34;https://icons.getbootstrap.com/&#34;&gt;Bootstrap Icons&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://jquery.com/&#34;&gt;jQuery&lt;/a&gt;, for general-purpose scripting.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.highcharts.com/&#34;&gt;Highcharts&lt;/a&gt;, for charts.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://d3js.org/&#34;&gt;D3&lt;/a&gt;, for data visualization beyond charting.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://datatables.net/&#34;&gt;DataTables&lt;/a&gt;, for sortable, searchable, paginated tables.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://selectize.dev/&#34;&gt;Selectize.js&lt;/a&gt;, for type-ahead and multi-select fields.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lodash.com/&#34;&gt;Lodash&lt;/a&gt;, for collection and object helpers.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Extensions written for Bootstrap 3 need migrating. See &lt;a href=&#34;https://docs.cloudbolt.io/docs/cmp/configure/administration/maintain/upgrade/release-2026-3/&#34;&gt;Upgrading to Release 2026.3&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;ship-your-own-css-javascript-and-images&#34;&gt;Ship your own CSS, JavaScript, and images&lt;/h2&gt;&#xA;&lt;p&gt;Keep an extension&amp;rsquo;s own files inside its package, so they travel with it when exported and imported. Place them in a &lt;code&gt;static&lt;/code&gt; folder in the package directory, for example:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Access control</title>
				<link>https://docs.cloudbolt.io/docs/cmp/developer-resources/ui-extensions/access-control/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://docs.cloudbolt.io/docs/cmp/developer-resources/ui-extensions/access-control/</guid>
				<description>&lt;p&gt;Pass a delegate class to the extension&amp;rsquo;s decorator using the &lt;code&gt;delegate&lt;/code&gt; argument. Its &lt;code&gt;should_display&lt;/code&gt; method runs each time the page is built, returning &lt;code&gt;True&lt;/code&gt; to show the extension and &lt;code&gt;False&lt;/code&gt; to hide it. An extension with no delegate is displayed.&lt;/p&gt;&#xA;&lt;h2 id=&#34;extension-types-that-accept-a-delegate&#34;&gt;Extension types that accept a delegate&lt;/h2&gt;&#xA;&lt;p&gt;Subclass the delegate class that matches the extension type, and import it from &lt;code&gt;extensions.views&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;table-scroll&#34;&gt;&#xA;&lt;div class=&#34;table-responsive&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Extension type&lt;/th&gt;&#xA;          &lt;th&gt;Decorator&lt;/th&gt;&#xA;          &lt;th&gt;Delegate class to subclass&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Report&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;report_extension&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;ReportExtensionDelegate&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Detail view tab&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;tab_extension&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;TabExtensionDelegate&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Custom order form&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;custom_form_extension&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;CustomFormExtensionDelegate&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;&lt;code&gt;dashboard_extension&lt;/code&gt; also accepts a &lt;code&gt;delegate&lt;/code&gt; argument, but Cloud Management Platform does not check it, so a dashboard card is shown to every user. Admin pages and the microfrontend types do not accept a delegate. An admin page needs none, since only CloudBolt admins and global viewers can view one.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Override or hide built-in tabs</title>
				<link>https://docs.cloudbolt.io/docs/cmp/developer-resources/ui-extensions/override-tabs/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://docs.cloudbolt.io/docs/cmp/developer-resources/ui-extensions/override-tabs/</guid>
				<description>&lt;p&gt;By default, tab extensions are appended to the end of the tab list on a detail view. With the &lt;code&gt;replaces&lt;/code&gt; parameter, you can instead target a specific built-in tab by its slug, and either replace it with your extension tab or hide it entirely.&lt;/p&gt;&#xA;&lt;p&gt;This feature applies to the following detail views:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;User profiles&lt;/li&gt;&#xA;&lt;li&gt;Groups&lt;/li&gt;&#xA;&lt;li&gt;Environments&lt;/li&gt;&#xA;&lt;li&gt;Servers&lt;/li&gt;&#xA;&lt;li&gt;Resource handlers&lt;/li&gt;&#xA;&lt;li&gt;Resources&lt;/li&gt;&#xA;&lt;li&gt;Blueprints&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;&#xA;&lt;p&gt;The examples on this page are using the Scheduled Snapshots UI extension.&lt;/p&gt;&#xA;&lt;/div&gt;</description>
			</item>
	</channel>
</rss>
