Component Builder (v.4.1.3)
+ Component Builder (v.4.1.4)
The Component Builder for [Joomla](https://extensions.joomla.org/extension/component-builder/) is highly advanced tool that is truly able to build extremely complex components in a fraction of the time.
diff --git a/componentbuilder_update_server.xml b/componentbuilder_update_server.xml
index a74afcb4f..206c94f33 100644
--- a/componentbuilder_update_server.xml
+++ b/componentbuilder_update_server.xml
@@ -17,7 +17,6 @@
Llewellyn van der Merwe
https://dev.vdm.io
- f592b05f2c569d9b403a46c82c8e7a09cd4e2772f471f9a4eba56b2c69a6baf13244f2e4c4da5c4989d2393cfce4074696266820811c4b08b22b26373ac29deb
Component Builder
@@ -36,7 +35,6 @@
Llewellyn van der Merwe
https://dev.vdm.io
- 8e84a31564ffbd15913a22b035054b9a30db77413b944336e623648c5685e12e93a264ed29512102d1f3d9c2bc3e194d99f3786db56a72e01c4734536f7e668a
Component Builder
@@ -55,7 +53,6 @@
Llewellyn van der Merwe
https://dev.vdm.io
- f3781cbb4e9e190df38c3fe7fa80ba69bf6f9dbafb158e0426dd4604f2f1ba794450679005a38d0f9f1dad0696e2f22b8b086b2d7d08a0f99bb4fd3b0f7ed5d8
Component Builder
@@ -74,7 +71,6 @@
Llewellyn van der Merwe
https://dev.vdm.io
- 3fdaac224c16cb3be6a5d702ee2d3d1a8491915ff2520d36bcd15ababd387f48c72ccfa3b0db1c36bcdca75477e018bd3b1db68fd6ea06054e248733c2b97478
Component Builder
@@ -93,7 +89,6 @@
Llewellyn van der Merwe
https://dev.vdm.io
- 71827b08ee6b634848373e5470b25251dd2520603ec788d43910bb8172344fb086dfd9e6f1c6b145643fd00b71ce84661bd5f32e89281749e64c02a2eb1f5a0c
Component Builder
@@ -112,7 +107,6 @@
Llewellyn van der Merwe
https://dev.vdm.io
- a1b8aa72353cdd8d6a1eb75c1c7e0de5a1ed13b605cfc31dd577ab18c6c841201e3a62f0d6eb2d1facf3f6b807d32bae5ddf76ed4cc77676acde72599271271b
Component Builder
@@ -131,7 +125,6 @@
Llewellyn van der Merwe
https://dev.vdm.io
- 0c75f70c654deda8c17fdadf5ac4727bb39dc445deddb950ac3cc8e5449cce0061903889c22a678f17644adc00465aa817156d52c6222247223412f3e9271a32
Component Builder
@@ -150,7 +143,6 @@
Llewellyn van der Merwe
https://dev.vdm.io
- bfc21e2f63efdff8280959d30a20b4b26448aa8cfb39e02201aee2644fd38b6834271d5eade8a1e2bcfc6fafccf98005d89148078b82cceef0657af71cbf968d
Component Builder
@@ -169,7 +161,6 @@
Llewellyn van der Merwe
https://dev.vdm.io
- 40cae9c936d713875e84f102df379f8dce3bc89a46fe6b8af04234837887984917e3ccfcb53503543c0b461f50aa5ee6eb51a5db530c395d38df62a64bb7c78a
Component Builder
@@ -188,6 +179,23 @@
Llewellyn van der Merwe
https://dev.vdm.io
- 37aaab28b87d958584cd225de9a1b4de2c20b1f99d3e5856c9f9658c027a6e97a18d2a4016a2d04850cf29e0f64f30e7ab6dee6d09496448cadecddc40589dad
-
+
+ Component Builder
+ Builds Complex Joomla Components
+ pkg_component_builder
+ package
+ admininstrator
+ 4.1.4
+ https://dev.vdm.io
+
+ https://github.com/joomengine/pkg-component-builder/archive/refs/tags/v4.1.4.zip
+
+
+ stable
+
+ Llewellyn van der Merwe
+ https://dev.vdm.io
+
+
+
\ No newline at end of file
diff --git a/libraries/vendor_jcb/VDM.Joomla.Git/src/Repository/Contents.php b/libraries/vendor_jcb/VDM.Joomla.Git/src/Repository/Contents.php
index 2a46e23fa..32b676e36 100644
--- a/libraries/vendor_jcb/VDM.Joomla.Git/src/Repository/Contents.php
+++ b/libraries/vendor_jcb/VDM.Joomla.Git/src/Repository/Contents.php
@@ -345,7 +345,7 @@ final class Contents implements ContentsInterface
* @return string|null
* @since 5.1.1
**/
- public function editor(string $owner, string $repo, string $filepath, string $ref = null): ?string
+ public function editor(string $owner, string $repo, string $filepath, ?string $ref = null): ?string
{
$target = $this->getTarget();
return $this->{$target}->editor($owner, $repo, $filepath, $ref);
diff --git a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Issue/Milestones.php b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Issue/Milestones.php
index 5178a7371..2f2a10300 100644
--- a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Issue/Milestones.php
+++ b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Issue/Milestones.php
@@ -187,10 +187,10 @@ class Milestones extends Api
string $owner,
string $repo,
string $milestoneId,
- string $title = null,
- string $description = null,
- string $dueOn = null,
- string $state = null
+ ?string $title = null,
+ ?string $description = null,
+ ?string $dueOn = null,
+ ?string $state = null
): ?object
{
// Set the lines data
diff --git a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Issue/Times.php b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Issue/Times.php
index 7c33c2ab6..56c407c71 100644
--- a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Issue/Times.php
+++ b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Issue/Times.php
@@ -41,11 +41,11 @@ class Times extends Api
string $owner,
string $repo,
int $index,
- string $user = null,
- string $since = null,
- string $before = null,
- int $page = null,
- int $limit = null
+ ?string $user = null,
+ ?string $since = null,
+ ?string $before = null,
+ ?int $page = null,
+ ?int $limit = null
): ?array
{
// Build the request path.
@@ -98,8 +98,8 @@ class Times extends Api
string $repo,
int $index,
int $time,
- string $created = null,
- string $userName = null
+ ?string $created = null,
+ ?string $userName = null
): ?object
{
// Set the lines data
diff --git a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Organization/Teams.php b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Organization/Teams.php
index 46a27b078..14aae42e5 100644
--- a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Organization/Teams.php
+++ b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Organization/Teams.php
@@ -99,8 +99,8 @@ class Teams extends Api
string $permission = 'read',
array $units = [],
array $unitsMap = [],
- bool $canCreateOrgRepo = null,
- bool $includesAllRepositories = null
+ ?bool $canCreateOrgRepo = null,
+ ?bool $includesAllRepositories = null
): ?object
{
// Build the request path.
diff --git a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Collaborator.php b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Collaborator.php
index 38ee5127f..eec87f6cc 100644
--- a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Collaborator.php
+++ b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Collaborator.php
@@ -94,7 +94,7 @@ class Collaborator extends Api
string $owner,
string $repo,
string $collaborator,
- string $permission = null
+ ?string $permission = null
): string
{
// Build the request path.
diff --git a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Commits.php b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Commits.php
index d8142c230..cfafb6702 100644
--- a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Commits.php
+++ b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Commits.php
@@ -158,8 +158,8 @@ class Commits extends Api
string $owner,
string $repo,
string $ref,
- string $sort = null,
- string $state = null,
+ ?string $sort = null,
+ ?string $state = null,
int $page = 1,
int $limit = 10
): ?array
diff --git a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Contents.php b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Contents.php
index f16c8499e..16f0210fe 100644
--- a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Contents.php
+++ b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Contents.php
@@ -467,7 +467,7 @@ class Contents extends Api implements ContentsInterface
* @return string|null
* @since 3.2.0
**/
- public function editor(string $owner, string $repo, string $filepath, string $ref = null): ?string
+ public function editor(string $owner, string $repo, string $filepath, ?string $ref = null): ?string
{
// Build the request path.
$path = "/repos/{$owner}/{$repo}/editorconfig/{$filepath}";
diff --git a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Hooks.php b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Hooks.php
index eadb2e61d..292a8b846 100644
--- a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Hooks.php
+++ b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Hooks.php
@@ -73,8 +73,6 @@ class Hooks extends Api
string $repo,
string $type,
array $config,
- string $type,
- array $config,
bool $active = false,
?array $events = null,
string $branchFilter = ''
diff --git a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Pulls.php b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Pulls.php
index a979e797e..ca571b763 100644
--- a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Pulls.php
+++ b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Pulls.php
@@ -517,7 +517,7 @@ class Pulls extends Api
* @return string
* @since 3.2.0
*/
- public function update(
+ public function mergeUpdate(
string $owner,
string $repo,
int $index,
diff --git a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Times.php b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Times.php
index bae141607..d0b96b31a 100644
--- a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Times.php
+++ b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Times.php
@@ -39,9 +39,9 @@ class Times extends Api
public function list(
string $ownerName,
string $repoName,
- string $user = null,
- string $since = null,
- string $before = null,
+ ?string $user = null,
+ ?string $since = null,
+ ?string $before = null,
int $page = 1,
int $limit = 10
): ?array
diff --git a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Wiki.php b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Wiki.php
index 1a80320a4..6aeaeecd5 100644
--- a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Wiki.php
+++ b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/Repository/Wiki.php
@@ -172,7 +172,7 @@ class Wiki extends Api implements WikiInterface
string $pageName,
string $title,
string $content,
- string $message = null
+ ?string $message = null
): ?object
{
// Build the request path.
diff --git a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/User.php b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/User.php
index bb9c82e7a..693cbeaad 100644
--- a/libraries/vendor_jcb/VDM.Joomla.Gitea/src/User.php
+++ b/libraries/vendor_jcb/VDM.Joomla.Gitea/src/User.php
@@ -88,7 +88,7 @@ class User extends Api
* @return object|null
* @since 3.2.0
**/
- public function get(string $username): o?bject
+ public function get(string $username): ?object
{
// Build the request path.
$path = "/users/{$username}";
diff --git a/libraries/vendor_jcb/VDM.Joomla.Github/src/Repository/Contents.php b/libraries/vendor_jcb/VDM.Joomla.Github/src/Repository/Contents.php
index ec86007a9..7f23aa61e 100644
--- a/libraries/vendor_jcb/VDM.Joomla.Github/src/Repository/Contents.php
+++ b/libraries/vendor_jcb/VDM.Joomla.Github/src/Repository/Contents.php
@@ -450,7 +450,7 @@ final class Contents extends Api implements ContentsInterface
* @return string|null
* @since 5.1.1
**/
- public function editor(string $owner, string $repo, string $filepath, string $ref = null): ?string
+ public function editor(string $owner, string $repo, string $filepath, ?string $ref = null): ?string
{
// Not supported in GitHub
return null;
diff --git a/libraries/vendor_jcb/VDM.Joomla.Github/src/Repository/Wiki.php b/libraries/vendor_jcb/VDM.Joomla.Github/src/Repository/Wiki.php
index ba6e9c345..eae0485c2 100644
--- a/libraries/vendor_jcb/VDM.Joomla.Github/src/Repository/Wiki.php
+++ b/libraries/vendor_jcb/VDM.Joomla.Github/src/Repository/Wiki.php
@@ -136,7 +136,7 @@ class Wiki extends Api implements WikiInterface
string $pageName,
string $title,
string $content,
- string $message = null
+ ?string $message = null
): ?object
{
return null; // github does not support wiki over API
diff --git a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem.php b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem.php
new file mode 100644
index 000000000..546c8ec01
--- /dev/null
+++ b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem.php
@@ -0,0 +1,261 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Architecture\AdminViews;
+
+
+use VDM\Joomla\Componentbuilder\Compiler\Architecture\AdminViews\ListItem\ItemCode;
+use VDM\Joomla\Componentbuilder\Compiler\Architecture\AdminViews\ListItem\Link;
+use VDM\Joomla\Componentbuilder\Compiler\Architecture\AdminViews\ListItem\LinkAuthority;
+use VDM\Joomla\Componentbuilder\Compiler\Architecture\AdminViews\ListItem\LinkLogic;
+use VDM\Joomla\Utilities\StringHelper;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Indent;
+
+
+/**
+ * List Item Class
+ *
+ * @since 5.1.5
+ */
+final class ListItem
+{
+ /**
+ * The ItemCode Class.
+ *
+ * @var ItemCode
+ * @since 5.1.5
+ */
+ protected ItemCode $itemcode;
+
+ /**
+ * The Link Class.
+ *
+ * @var Link
+ * @since 5.1.5
+ */
+ protected Link $link;
+
+ /**
+ * The LinkAuthority Class.
+ *
+ * @var LinkAuthority
+ * @since 5.1.5
+ */
+ protected LinkAuthority $linkauthority;
+
+ /**
+ * The LinkLogic Class.
+ *
+ * @var LinkLogic
+ * @since 5.1.5
+ */
+ protected LinkLogic $linklogic;
+
+ /**
+ * Constructor.
+ *
+ * @param ItemCode $itemcode The ItemCode Class.
+ * @param Link $link The Link Class.
+ * @param LinkAuthority $linkauthority The LinkAuthority Class.
+ * @param LinkLogic $linklogic The LinkLogic Class.
+ *
+ * @since 5.1.5
+ */
+ public function __construct(
+ ItemCode $itemcode,
+ Link $link,
+ LinkAuthority $linkauthority,
+ LinkLogic $linklogic
+ ) {
+ $this->itemcode = $itemcode;
+ $this->link = $link;
+ $this->linkauthority = $linkauthority;
+ $this->linklogic = $linklogic;
+ }
+
+ /**
+ * Get the list item row value.
+ *
+ * @param array $item The item array.
+ * @param string $nameSingleCode The single view code name.
+ * @param string $nameListCode The list view code name.
+ * @param string &$itemClass The table row default class.
+ * @param bool $doNotEscape The do not escape global switch.
+ * @param bool $class The div class adding switch.
+ * @param string|null $ref The link referral string.
+ * @param string $classPointer The class pointer.
+ * @param string $user The user code name.
+ * @param string|null $refview The override of the referral view code name.
+ *
+ * @return string The single item value for the table row.
+ * @since 5.1.5
+ */
+ public function get(
+ array $item,
+ string $nameSingleCode,
+ string $nameListCode,
+ string &$itemClass,
+ bool $doNotEscape,
+ bool $class = true,
+ ?string $ref = null,
+ string $classPointer = '$this->',
+ string $user = '$this->user',
+ ?string $refview = null
+ ): string {
+ $itemCode = $this->itemcode->get(
+ $item,
+ $nameListCode,
+ $doNotEscape,
+ $classPointer
+ );
+
+ if (!$this->shouldRenderLinkedItem($item, $refview))
+ {
+ return $this->getPlainListItemOutput($itemCode);
+ }
+
+ return $this->getLinkedListItemOutput(
+ $item,
+ $itemCode,
+ $nameSingleCode,
+ $nameListCode,
+ $itemClass,
+ $class,
+ $ref,
+ $classPointer,
+ $user
+ );
+ }
+
+ /**
+ * Check whether the item should be rendered as a linked item.
+ *
+ * @param array $item The item array.
+ * @param string|null $refview The override of the referral view code name.
+ *
+ * @return bool True if the item should be rendered as a link.
+ * @since 5.1.5
+ */
+ protected function shouldRenderLinkedItem(array $item, ?string $refview = null): bool
+ {
+ if ($this->shouldNotUseDefaultLink($item, $refview))
+ {
+ return false;
+ }
+
+ $extendsField = $this->getCustomExtendsField($item);
+
+ return (!empty($item['link']) || $extendsField === 'user');
+ }
+
+ /**
+ * Check whether the default link should not be used.
+ *
+ * @param array $item The item array.
+ * @param string|null $refview The override of the referral view code name.
+ *
+ * @return bool True if the default link should not be used.
+ * @since 5.1.5
+ */
+ protected function shouldNotUseDefaultLink(array $item, ?string $refview = null): bool
+ {
+ return StringHelper::check($refview)
+ && isset($item['custom'])
+ && isset($item['custom']['view'])
+ && $refview === $item['custom']['view'];
+ }
+
+ /**
+ * Get the custom extends field value.
+ *
+ * @param array $item The item array.
+ *
+ * @return string The custom extends field value.
+ * @since 5.1.5
+ */
+ protected function getCustomExtendsField(array $item): string
+ {
+ return $item['custom']['extends'] ?? '';
+ }
+
+ /**
+ * Build the linked list item output.
+ *
+ * @param array $item The item array.
+ * @param string $itemCode The item code string.
+ * @param string $nameSingleCode The single view code name.
+ * @param string $nameListCode The list view code name.
+ * @param string &$itemClass The table row default class.
+ * @param bool $class The div class adding switch.
+ * @param string|null $ref The link referral string.
+ * @param string $classPointer The class pointer.
+ * @param string $user The user code name.
+ *
+ * @return string The linked list item output.
+ * @since 5.1.5
+ */
+ protected function getLinkedListItemOutput(
+ array $item,
+ string $itemCode,
+ string $nameSingleCode,
+ string $nameListCode,
+ string &$itemClass,
+ bool $class = true,
+ ?string $ref = null,
+ string $classPointer = '$this->',
+ string $user = '$this->user'
+ ): string {
+ $checkoutTriger = false;
+ $itemClass = 'nowrap';
+
+ $itemLink = $this->link->get(
+ $item,
+ $checkoutTriger,
+ $nameSingleCode,
+ $nameListCode,
+ $ref
+ );
+
+ $itemLinkAuthority = $this->linkauthority->get(
+ $item,
+ $nameSingleCode,
+ $nameListCode,
+ $classPointer,
+ $user
+ );
+
+ return $this->linklogic->get(
+ $item,
+ $itemCode,
+ $itemLink,
+ $itemLinkAuthority,
+ $nameSingleCode,
+ $nameListCode,
+ $classPointer,
+ $checkoutTriger,
+ $class
+ );
+ }
+
+ /**
+ * Build the plain list item output.
+ *
+ * @param string $itemCode The item code string.
+ *
+ * @return string The plain list item output.
+ * @since 5.1.5
+ */
+ protected function getPlainListItemOutput(string $itemCode): string
+ {
+ return PHP_EOL . Indent::_(3) . "";
+ }
+}
+
diff --git a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem/ItemCode.php b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem/ItemCode.php
new file mode 100644
index 000000000..a614ff4dc
--- /dev/null
+++ b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem/ItemCode.php
@@ -0,0 +1,324 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Architecture\AdminViews\ListItem;
+
+
+use VDM\Joomla\Componentbuilder\Compiler\Config;
+use VDM\Joomla\Componentbuilder\Compiler\Builder\SelectionTranslation;
+use VDM\Joomla\Componentbuilder\Compiler\Builder\DoNotEscape;
+use VDM\Joomla\Utilities\StringHelper;
+use VDM\Joomla\Utilities\ArrayHelper;
+
+
+/**
+ * List Item Item Code Class
+ *
+ * @since 5.1.5
+ */
+final class ItemCode
+{
+ /**
+ * The Config Class.
+ *
+ * @var Config
+ * @since 5.1.5
+ */
+ protected Config $config;
+
+ /**
+ * The SelectionTranslation Class.
+ *
+ * @var SelectionTranslation
+ * @since 5.1.5
+ */
+ protected SelectionTranslation $selectiontranslation;
+
+ /**
+ * The DoNotEscape Class.
+ *
+ * @var DoNotEscape
+ * @since 5.1.5
+ */
+ protected DoNotEscape $donotescape;
+
+ /**
+ * Constructor.
+ *
+ * @param Config $config The Config Class.
+ * @param SelectionTranslation $selectiontranslation The SelectionTranslation Class.
+ * @param DoNotEscape $donotescape The DoNotEscape Class.
+ *
+ * @since 5.1.5
+ */
+ public function __construct(
+ Config $config,
+ SelectionTranslation $selectiontranslation,
+ DoNotEscape $donotescape
+ ) {
+ $this->config = $config;
+ $this->selectiontranslation = $selectiontranslation;
+ $this->donotescape = $donotescape;
+ }
+
+ /**
+ * Get the list item code value.
+ *
+ * @param array $item The item array.
+ * @param string $nameListCode The list view code name.
+ * @param bool $doNotEscape The do not escape global switch.
+ * @param string $classPointer The class pointer.
+ *
+ * @return string The single item code string.
+ * @since 5.1.5
+ */
+ public function get(
+ array &$item,
+ string $nameListCode,
+ bool $doNotEscape,
+ string $classPointer = '$this->'
+ ): string {
+ $this->prepareCustomItemCode($item);
+
+ $extendsField = $item['custom']['extends'] ?? '';
+ $extendsText = $item['custom']['text'] ?? '';
+
+ if ($this->isCategoryWithoutTitle($item))
+ {
+ return $this->getCategoryTitleCode($classPointer);
+ }
+
+ if ($this->isDirectUserType($item))
+ {
+ return $this->getUserNameCode($item['code']);
+ }
+
+ if ($this->isCustomUserById($item, $extendsField))
+ {
+ return $this->getUserNameCode($item['id_code']);
+ }
+
+ if ($this->hasTranslatedSelection($nameListCode, $item['code']))
+ {
+ return $this->getTranslatedSelectionCode($item['code']);
+ }
+
+ if ($this->isCustomUserField($item, $extendsField, $extendsText))
+ {
+ return $this->getUserNameCode($item['code']);
+ }
+
+ if (
+ $doNotEscape
+ && $this->shouldNotEscapeField($nameListCode, $item['code'])
+ ) {
+ return $this->getRawItemCode($item['code']);
+ }
+
+ return $this->getEscapedItemCode($item['code'], $classPointer);
+ }
+
+ /**
+ * Prepare the item code for custom table values.
+ *
+ * @param array $item The item array.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function prepareCustomItemCode(array &$item): void
+ {
+ if (
+ isset($item['custom'])
+ && ArrayHelper::check($item['custom'])
+ && isset($item['custom']['table'])
+ && StringHelper::check($item['custom']['table'])
+ ) {
+ $item['id_code'] = $item['code'];
+
+ if (!(bool) $item['multiple'])
+ {
+ $item['code'] = $item['code'] . '_' . $item['custom']['text'];
+ }
+ }
+ }
+
+ /**
+ * Check if the item is a category without a title field.
+ *
+ * @param array $item The item array.
+ *
+ * @return bool
+ * @since 5.1.5
+ */
+ protected function isCategoryWithoutTitle(array $item): bool
+ {
+ return $item['type'] === 'category' && !$item['title'];
+ }
+
+ /**
+ * Check if the item is a direct user field type.
+ *
+ * @param array $item The item array.
+ *
+ * @return bool
+ * @since 5.1.5
+ */
+ protected function isDirectUserType(array $item): bool
+ {
+ return $item['type'] === 'user';
+ }
+
+ /**
+ * Check if the item is a custom user relation resolved by ID code.
+ *
+ * @param array $item The item array.
+ * @param string $extendsField The custom extends field value.
+ *
+ * @return bool
+ * @since 5.1.5
+ */
+ protected function isCustomUserById(array $item, string $extendsField): bool
+ {
+ return isset($item['custom'])
+ && ArrayHelper::check($item['custom'])
+ && $extendsField === 'user'
+ && isset($item['id_code']);
+ }
+
+ /**
+ * Check if the item uses a translated selection value.
+ *
+ * @param string $nameListCode The list view code name.
+ * @param string $code The field code.
+ *
+ * @return bool
+ * @since 5.1.5
+ */
+ protected function hasTranslatedSelection(string $nameListCode, string $code): bool
+ {
+ return $this->selectiontranslation->exists($nameListCode . '.' . $code);
+ }
+
+ /**
+ * Check if the item resolves to a custom user field.
+ *
+ * @param array $item The item array.
+ * @param string $extendsField The custom extends field value.
+ * @param string $extendsText The custom text value.
+ *
+ * @return bool
+ * @since 5.1.5
+ */
+ protected function isCustomUserField(
+ array $item,
+ string $extendsField,
+ string $extendsText
+ ): bool {
+ return isset($item['custom'])
+ && ArrayHelper::check($item['custom'])
+ && ($extendsText === 'user' || $extendsField === 'user');
+ }
+
+ /**
+ * Check if the field should not be escaped.
+ *
+ * @param string $nameListCode The list view code name.
+ * @param string $code The field code.
+ *
+ * @return bool
+ * @since 5.1.5
+ */
+ protected function shouldNotEscapeField(string $nameListCode, string $code): bool
+ {
+ return $this->donotescape->exists($nameListCode . '.' . $code);
+ }
+
+ /**
+ * Get the category title code string.
+ *
+ * @param string $classPointer The class pointer.
+ *
+ * @return string
+ * @since 5.1.5
+ */
+ protected function getCategoryTitleCode(string $classPointer): string
+ {
+ return $classPointer . 'escape($item->category_title)';
+ }
+
+ /**
+ * Get the translated selection code string.
+ *
+ * @param string $code The field code.
+ *
+ * @return string
+ * @since 5.1.5
+ */
+ protected function getTranslatedSelectionCode(string $code): string
+ {
+ return 'Joomla__'
+ . '_ba6326ef_cb79_4348_80f4_ab086082e3c5___Power::_($item->'
+ . $code . ')';
+ }
+
+ /**
+ * Get the raw item code string.
+ *
+ * @param string $code The field code.
+ *
+ * @return string
+ * @since 5.1.5
+ */
+ protected function getRawItemCode(string $code): string
+ {
+ return '$item->' . $code;
+ }
+
+ /**
+ * Get the escaped item code string.
+ *
+ * @param string $code The field code.
+ * @param string $classPointer The class pointer.
+ *
+ * @return string
+ * @since 5.1.5
+ */
+ protected function getEscapedItemCode(string $code, string $classPointer): string
+ {
+ return $classPointer . 'escape($item->' . $code . ')';
+ }
+
+ /**
+ * Get the user name lookup code string.
+ *
+ * @param string $code The field code.
+ *
+ * @return string
+ * @since 5.1.5
+ */
+ protected function getUserNameCode(string $code): string
+ {
+ if ((int) $this->config->get('joomla_version', 3) === 3)
+ {
+ return 'Joomla__'
+ . '_39403062_84fb_46e0_bac4_0023f766e827___Power::getUser((int)$item->'
+ . $code . ')->name';
+ }
+
+ return 'Joomla__'
+ . '_39403062_84fb_46e0_bac4_0023f766e827___Power::getContainer()->'
+ . 'get(Joomla__'
+ . '_c2980d12_c3ef_4e23_b4a2_e6af1f5900a9___Power::class)->'
+ . 'loadUserById((int) ($item->' . $code . ' ?? 0))->name';
+ }
+}
+
diff --git a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem/Link.php b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem/Link.php
new file mode 100644
index 000000000..531f38ac5
--- /dev/null
+++ b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem/Link.php
@@ -0,0 +1,259 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Architecture\AdminViews\ListItem;
+
+
+use VDM\Joomla\Componentbuilder\Compiler\Builder\Category;
+use VDM\Joomla\Utilities\ArrayHelper;
+
+
+/**
+ * List Item Link Class
+ *
+ * @since 5.1.5
+ */
+final class Link
+{
+ /**
+ * The Category Class.
+ *
+ * @var Category
+ * @since 5.1.5
+ */
+ protected Category $category;
+
+ /**
+ * Constructor.
+ *
+ * @param Category $category The Category Class.
+ *
+ * @since 5.1.5
+ */
+ public function __construct(Category $category)
+ {
+ $this->category = $category;
+ }
+
+ /**
+ * Get the list item link.
+ *
+ * @param array $item The item array.
+ * @param bool &$checkoutTriger The checkout trigger switch.
+ * @param string $nameSingleCode The single view code name.
+ * @param string $nameListCode The list view code name.
+ * @param string|null $ref The link referral string.
+ *
+ * @return string The single item link.
+ * @since 5.1.5
+ */
+ public function get(
+ array $item,
+ bool &$checkoutTriger,
+ string $nameSingleCode,
+ string $nameListCode,
+ ?string $ref = null
+ ): string
+ {
+ [$ref, $referal] = $this->resolveReferral($ref);
+
+ if ($this->isCategoryLink($item))
+ {
+ return $this->buildCategoryLink($item, $nameListCode);
+ }
+
+ if ($this->isDirectUserLink($item))
+ {
+ return $this->buildUserLink($item['code']);
+ }
+
+ if ($this->isCustomNonUserLink($item))
+ {
+ return $this->buildCustomLink($item, $ref);
+ }
+
+ if ($this->isCustomUserLink($item))
+ {
+ return $this->buildUserLink($item['id_code']);
+ }
+
+ $checkoutTriger = true;
+
+ return $this->buildDefaultItemLink($referal);
+ }
+
+ /**
+ * Resolve the referral values.
+ *
+ * @param string|null $ref The incoming referral string.
+ *
+ * @return array{0:string,1:string} The resolved ref and referal values.
+ * @since 5.1.5
+ */
+ protected function resolveReferral(?string $ref): array
+ {
+ $referal = '';
+
+ if (!$ref)
+ {
+ $ref = '&return=return_here; ?>';
+ }
+ else
+ {
+ $referal = $ref;
+ }
+
+ return [$ref, $referal];
+ }
+
+ /**
+ * Check if the item should link to a category edit page.
+ *
+ * @param array $item The item array.
+ *
+ * @return bool
+ * @since 5.1.5
+ */
+ protected function isCategoryLink(array $item): bool
+ {
+ return isset($item['type'], $item['title'], $item['code'])
+ && $item['type'] === 'category'
+ && !$item['title'];
+ }
+
+ /**
+ * Build the category edit link.
+ *
+ * @param array $item The item array.
+ * @param string $nameListCode The list view code name.
+ *
+ * @return string
+ * @since 5.1.5
+ */
+ protected function buildCategoryLink(array $item, string $nameListCode): string
+ {
+ return 'index.php?option=com_categories&task=category.edit&id='
+ . $item['code'] . '; ?>&extension='
+ . $this->category->get("{$nameListCode}.extension", 'error');
+ }
+
+ /**
+ * Check if the item should link directly to a user edit page.
+ *
+ * @param array $item The item array.
+ *
+ * @return bool
+ * @since 5.1.5
+ */
+ protected function isDirectUserLink(array $item): bool
+ {
+ return isset($item['type'], $item['title'], $item['code'])
+ && $item['type'] === 'user'
+ && !$item['title'];
+ }
+
+ /**
+ * Check if the item should link to a custom non-user target.
+ *
+ * @param array $item The item array.
+ *
+ * @return bool
+ * @since 5.1.5
+ */
+ protected function isCustomNonUserLink(array $item): bool
+ {
+ return isset($item['custom'], $item['title'], $item['id_code'])
+ && ArrayHelper::check($item['custom'])
+ && $item['custom']['extends'] != 'user'
+ && !$item['title'];
+ }
+
+ /**
+ * Check if the item should link to a custom user target.
+ *
+ * @param array $item The item array.
+ *
+ * @return bool
+ * @since 5.1.5
+ */
+ protected function isCustomUserLink(array $item): bool
+ {
+ return isset($item['custom'], $item['title'], $item['id_code'])
+ && ArrayHelper::check($item['custom'])
+ && $item['custom']['extends'] === 'user'
+ && !$item['title'];
+ }
+
+ /**
+ * Build the user edit link.
+ *
+ * @param string $code The item code field.
+ *
+ * @return string
+ * @since 5.1.5
+ */
+ protected function buildUserLink(string $code): string
+ {
+ return 'index.php?option=com_users&task=user.edit&id='
+ . $code . ' ?>';
+ }
+
+ /**
+ * Build the custom item edit link.
+ *
+ * @param array $item The item array.
+ * @param string $ref The resolved referral string.
+ *
+ * @return string
+ * @since 5.1.5
+ */
+ protected function buildCustomLink(array $item, string $ref): string
+ {
+ $idField = $this->getCustomLinkIdField($item);
+
+ return 'index.php?option=' . $item['custom']['component'] . '&view='
+ . $item['custom']['views'] . '&task=' . $item['custom']['view']
+ . '.edit&id=' . $idField . '; ?>'
+ . $ref;
+ }
+
+ /**
+ * Get the ID field to use for a custom link.
+ *
+ * @param array $item The item array.
+ *
+ * @return string
+ * @since 5.1.5
+ */
+ protected function getCustomLinkIdField(array $item): string
+ {
+ if (isset($item['custom']['id']) && $item['custom']['id'] !== 'id')
+ {
+ return $item['id_code'] . '_id';
+ }
+
+ return $item['id_code'];
+ }
+
+ /**
+ * Build the default item edit link.
+ *
+ * @param string $referal The referral string for linked tab/view handling.
+ *
+ * @return string
+ * @since 5.1.5
+ */
+ protected function buildDefaultItemLink(string $referal): string
+ {
+ return '&id=id; ?>' . $referal;
+ }
+}
+
diff --git a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem/LinkAuthority.php b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem/LinkAuthority.php
new file mode 100644
index 000000000..2ba6dd1a7
--- /dev/null
+++ b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem/LinkAuthority.php
@@ -0,0 +1,313 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Architecture\AdminViews\ListItem;
+
+
+use VDM\Joomla\Componentbuilder\Compiler\Config;
+use VDM\Joomla\Componentbuilder\Compiler\Builder\CategoryCode;
+use VDM\Joomla\Componentbuilder\Compiler\Creator\Permission;
+use VDM\Joomla\Utilities\ArrayHelper;
+
+
+/**
+ * List Item Link Authority Class
+ *
+ * @since 5.1.5
+ */
+final class LinkAuthority
+{
+ /**
+ * The Config Class.
+ *
+ * @var Config
+ * @since 5.1.5
+ */
+ protected Config $config;
+
+ /**
+ * The CategoryCode Class.
+ *
+ * @var CategoryCode
+ * @since 5.1.5
+ */
+ protected CategoryCode $categorycode;
+
+ /**
+ * The Permission Class.
+ *
+ * @var Permission
+ * @since 5.1.5
+ */
+ protected Permission $permission;
+
+ /**
+ * Constructor.
+ *
+ * @param Config $config The Config Class.
+ * @param CategoryCode $categorycode The CategoryCode Class.
+ * @param Permission $permission The Permission Class.
+ *
+ * @since 5.1.5
+ */
+ public function __construct(
+ Config $config,
+ CategoryCode $categorycode,
+ Permission $permission
+ ) {
+ $this->config = $config;
+ $this->categorycode = $categorycode;
+ $this->permission = $permission;
+ }
+
+ /**
+ * Get the list item link authority.
+ *
+ * @param array $item The item array.
+ * @param string $nameSingleCode The single view code name.
+ * @param string $nameListCode The list view code name.
+ * @param string $classPointer The class pointer.
+ * @param string $user The user code name.
+ *
+ * @return string The single item link authority string.
+ * @since 5.1.5
+ */
+ public function get(
+ array $item,
+ string $nameSingleCode,
+ string $nameListCode,
+ string $classPointer = '$this->',
+ string $user = '$this->user'
+ ): string {
+ $isModal = $this->getModalAuthorityPrefix($classPointer);
+
+ if ($this->isCategoryItemWithoutTitle($item))
+ {
+ return $this->getCategoryItemAuthority(
+ $item,
+ $nameSingleCode,
+ $isModal,
+ $user
+ );
+ }
+
+ if ($this->isUserItemWithoutTitle($item))
+ {
+ return $this->getUserItemAuthority($isModal, $user);
+ }
+
+ if ($this->isCustomNonUserItemWithoutTitle($item))
+ {
+ return $this->getCustomItemAuthority($item, $isModal, $user);
+ }
+
+ if ($this->isCustomUserItemWithoutTitle($item))
+ {
+ return $this->getUserItemAuthority($isModal, $user);
+ }
+
+ return $this->getDefaultItemAuthority($nameSingleCode, $isModal);
+ }
+
+ /**
+ * Get the modal authority prefix.
+ *
+ * @param string $classPointer The class pointer.
+ *
+ * @return string The modal authority prefix or an empty string.
+ * @since 5.1.5
+ */
+ protected function getModalAuthorityPrefix(string $classPointer): string
+ {
+ if ($this->config->get('joomla_version', 3) === 3)
+ {
+ return '';
+ }
+
+ return "!{$classPointer}isModal && ";
+ }
+
+ /**
+ * Check if the item is a category item without a title.
+ *
+ * @param array $item The item array.
+ *
+ * @return bool True if the item is a category item without a title.
+ * @since 5.1.5
+ */
+ protected function isCategoryItemWithoutTitle(array $item): bool
+ {
+ return isset($item['type'], $item['title'])
+ && $item['type'] === 'category'
+ && !$item['title'];
+ }
+
+ /**
+ * Check if the item is a user item without a title.
+ *
+ * @param array $item The item array.
+ *
+ * @return bool True if the item is a user item without a title.
+ * @since 5.1.5
+ */
+ protected function isUserItemWithoutTitle(array $item): bool
+ {
+ return isset($item['type'], $item['title'])
+ && $item['type'] === 'user'
+ && !$item['title'];
+ }
+
+ /**
+ * Check if the item is a custom non-user item without a title.
+ *
+ * @param array $item The item array.
+ *
+ * @return bool True if the item is a custom non-user item without a title.
+ * @since 5.1.5
+ */
+ protected function isCustomNonUserItemWithoutTitle(array $item): bool
+ {
+ return $this->hasValidCustomItem($item)
+ && $item['custom']['extends'] !== 'user';
+ }
+
+ /**
+ * Check if the item is a custom user item without a title.
+ *
+ * @param array $item The item array.
+ *
+ * @return bool True if the item is a custom user item without a title.
+ * @since 5.1.5
+ */
+ protected function isCustomUserItemWithoutTitle(array $item): bool
+ {
+ return $this->hasValidCustomItem($item)
+ && $item['custom']['extends'] === 'user';
+ }
+
+ /**
+ * Check if the item contains a valid custom definition.
+ *
+ * @param array $item The item array.
+ *
+ * @return bool True if the item contains a valid custom definition.
+ * @since 5.1.5
+ */
+ protected function hasValidCustomItem(array $item): bool
+ {
+ return isset($item['custom'], $item['title'], $item['id_code'])
+ && ArrayHelper::check($item['custom'])
+ && !$item['title'];
+ }
+
+ /**
+ * Get the category item authority string.
+ *
+ * @param array $item The item array.
+ * @param string $nameSingleCode The single view code name.
+ * @param string $isModal The modal authority prefix.
+ * @param string $user The user code name.
+ *
+ * @return string The category item authority string.
+ * @since 5.1.5
+ */
+ protected function getCategoryItemAuthority(
+ array $item,
+ string $nameSingleCode,
+ string $isModal,
+ string $user
+ ): string {
+ $otherView = $this->categorycode->getString(
+ "{$nameSingleCode}.view",
+ 'error'
+ );
+
+ return $isModal . $user . "->authorise('core.edit', 'com_"
+ . $this->config->component_code_name . "."
+ . $otherView
+ . ".category.' . (int) (\$item->" . $item['code'] . " ?? 0))";
+ }
+
+ /**
+ * Get the user item authority string.
+ *
+ * @param string $isModal The modal authority prefix.
+ * @param string $user The user code name.
+ *
+ * @return string The user item authority string.
+ * @since 5.1.5
+ */
+ protected function getUserItemAuthority(string $isModal, string $user): string
+ {
+ return $isModal . $user . "->authorise('core.edit', 'com_users')";
+ }
+
+ /**
+ * Get the custom item authority string.
+ *
+ * @param array $item The item array.
+ * @param string $isModal The modal authority prefix.
+ * @param string $user The user code name.
+ *
+ * @return string The custom item authority string.
+ * @since 5.1.5
+ */
+ protected function getCustomItemAuthority(
+ array $item,
+ string $isModal,
+ string $user
+ ): string {
+ $view = $item['custom']['view'];
+ $action = $this->permission->getAction($view, 'core.edit');
+ $idCode = $this->getCustomItemIdCode($item);
+
+ return $isModal . $user . "->authorise('"
+ . $action . "', 'com_" . $this->config->component_code_name . "."
+ . $view . ".' . (int) (\$item->" . $idCode . " ?? 0))";
+ }
+
+ /**
+ * Get the custom item ID code.
+ *
+ * @param array $item The item array.
+ *
+ * @return string The custom item ID code.
+ * @since 5.1.5
+ */
+ protected function getCustomItemIdCode(array $item): string
+ {
+ if (isset($item['custom']['id']) && $item['custom']['id'] !== 'id')
+ {
+ return $item['id_code'] . '_id';
+ }
+
+ return $item['id_code'];
+ }
+
+ /**
+ * Get the default item authority string.
+ *
+ * @param string $nameSingleCode The single view code name.
+ * @param string $isModal The modal authority prefix.
+ *
+ * @return string The default item authority string.
+ * @since 5.1.5
+ */
+ protected function getDefaultItemAuthority(
+ string $nameSingleCode,
+ string $isModal
+ ): string {
+ return $isModal . "\$canDo->get('"
+ . $this->permission->getGlobal($nameSingleCode, 'core.edit')
+ . "')";
+ }
+}
+
diff --git a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem/LinkLogic.php b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem/LinkLogic.php
new file mode 100644
index 000000000..572a32413
--- /dev/null
+++ b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem/LinkLogic.php
@@ -0,0 +1,345 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Architecture\AdminViews\ListItem;
+
+
+use VDM\Joomla\Componentbuilder\Compiler\Config;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Indent;
+
+
+/**
+ * List Item Link Logic Class
+ *
+ * @since 5.1.5
+ */
+final class LinkLogic
+{
+ /**
+ * The Config Class.
+ *
+ * @var Config
+ * @since 5.1.5
+ */
+ protected Config $config;
+
+ /**
+ * Constructor.
+ *
+ * @param Config $config The Config Class.
+ *
+ * @since 5.1.5
+ */
+ public function __construct(Config $config)
+ {
+ $this->config = $config;
+ }
+
+ /**
+ * Get the list item link logic.
+ *
+ * @param array $item The item.
+ * @param string $itemCode The item code string.
+ * @param string $itemLink The item link string.
+ * @param string $itemLinkAuthority The link authority string.
+ * @param string $nameSingleCode The single view code name.
+ * @param string $nameListCode The list view code name.
+ * @param string $classPointer The class pointer.
+ * @param bool $checkoutTriger The check out trigger.
+ * @param bool $class The div class adding switch.
+ *
+ * @return string The complete link logic of row item.
+ * @since 5.1.5
+ */
+ public function get(
+ array $item,
+ string $itemCode,
+ string $itemLink,
+ string $itemLinkAuthority,
+ string $nameSingleCode,
+ string $nameListCode,
+ string $classPointer,
+ bool $checkoutTriger,
+ bool $class = true
+ ): string
+ {
+ $code = (string) ($item['code'] ?? '');
+ $tab = $this->getWrapperTab($class);
+
+ $link = $this->openNameWrapper($class);
+ $link .= $this->buildAuthorizedLinkBlock(
+ $itemCode,
+ $itemLink,
+ $itemLinkAuthority,
+ $nameSingleCode,
+ $nameListCode,
+ $classPointer,
+ $checkoutTriger,
+ $code,
+ $tab
+ );
+ $link .= $this->closeNameWrapper($class);
+
+ return $link;
+ }
+
+ /**
+ * Open the name wrapper when enabled.
+ *
+ * @param bool $class The div class adding switch.
+ *
+ * @return string The opening wrapper markup or empty string.
+ * @since 5.1.5
+ */
+ protected function openNameWrapper(bool $class): string
+ {
+ if (!$class)
+ {
+ return '';
+ }
+
+ return PHP_EOL . Indent::_(3) . '';
+ }
+
+ /**
+ * Close the name wrapper when enabled.
+ *
+ * @param bool $class The div class adding switch.
+ *
+ * @return string The closing wrapper markup or empty string.
+ * @since 5.1.5
+ */
+ protected function closeNameWrapper(bool $class): string
+ {
+ if (!$class)
+ {
+ return '';
+ }
+
+ return PHP_EOL . Indent::_(3) . '
';
+ }
+
+ /**
+ * Get the wrapper indentation prefix.
+ *
+ * @param bool $class The div class adding switch.
+ *
+ * @return string The indentation prefix.
+ * @since 5.1.5
+ */
+ protected function getWrapperTab(bool $class): string
+ {
+ return $class ? Indent::_(1) : '';
+ }
+
+ /**
+ * Build the main authorized link block.
+ *
+ * @param string $itemCode The item code string.
+ * @param string $itemLink The item link string.
+ * @param string $itemLinkAuthority The link authority string.
+ * @param string $nameSingleCode The single view code name.
+ * @param string $nameListCode The list view code name.
+ * @param string $classPointer The class pointer.
+ * @param bool $checkoutTriger The check out trigger.
+ * @param string $code The item field code.
+ * @param string $tab The indentation prefix.
+ *
+ * @return string The built authorized link block.
+ * @since 5.1.5
+ */
+ protected function buildAuthorizedLinkBlock(
+ string $itemCode,
+ string $itemLink,
+ string $itemLinkAuthority,
+ string $nameSingleCode,
+ string $nameListCode,
+ string $classPointer,
+ bool $checkoutTriger,
+ string $code,
+ string $tab
+ ): string
+ {
+ $link = '';
+
+ $link .= PHP_EOL . $tab . Indent::_(3) . "";
+ $link .= PHP_EOL . $tab . Indent::_(4) . '';
+
+ if ($checkoutTriger)
+ {
+ $link .= $this->buildCheckedOutBlock($nameListCode, $tab);
+ }
+
+ $link .= PHP_EOL . $tab . Indent::_(3) . "";
+ $link .= $this->buildUnauthorizedOutput(
+ $itemCode,
+ $nameSingleCode,
+ $classPointer,
+ $code,
+ $tab,
+ $checkoutTriger
+ );
+ $link .= PHP_EOL . $tab . Indent::_(3) . "";
+
+ return $link;
+ }
+
+ /**
+ * Build the checked out block.
+ *
+ * @param string $nameListCode The list view code name.
+ * @param string $tab The indentation prefix.
+ *
+ * @return string The checked out block.
+ * @since 5.1.5
+ */
+ protected function buildCheckedOutBlock(string $nameListCode, string $tab): string
+ {
+ $link = '';
+
+ $link .= PHP_EOL . $tab . Indent::_(4) . "checked_out): ?>";
+ $link .= PHP_EOL . $tab . Indent::_(5)
+ . "name, \$item->checked_out_time, '"
+ . $nameListCode
+ . ".', \$canCheckin); ?>";
+ $link .= PHP_EOL . $tab . Indent::_(4) . "";
+
+ return $link;
+ }
+
+ /**
+ * Build the unauthorized output block.
+ *
+ * @param string $itemCode The item code string.
+ * @param string $nameSingleCode The single view code name.
+ * @param string $classPointer The class pointer.
+ * @param string $code The item field code.
+ * @param string $tab The indentation prefix.
+ * @param bool $checkoutTriger The check out trigger.
+ *
+ * @return string The unauthorized output block.
+ * @since 5.1.5
+ */
+ protected function buildUnauthorizedOutput(
+ string $itemCode,
+ string $nameSingleCode,
+ string $classPointer,
+ string $code,
+ string $tab,
+ bool $checkoutTriger
+ ): string
+ {
+ if ($this->shouldApplyModalFix($checkoutTriger))
+ {
+ return $this->buildModalAwareOutput(
+ $itemCode,
+ $nameSingleCode,
+ $classPointer,
+ $code,
+ $tab
+ );
+ }
+
+ return PHP_EOL . $tab . Indent::_(4) . "";
+ }
+
+ /**
+ * Determine whether the modal fix should be applied.
+ *
+ * @param bool $checkoutTriger The check out trigger.
+ *
+ * @return bool True if the modal fix should be applied.
+ * @since 5.1.5
+ */
+ protected function shouldApplyModalFix(bool $checkoutTriger): bool
+ {
+ return $checkoutTriger
+ && $this->config->get('joomla_version', 3) !== 3;
+ }
+
+ /**
+ * Build the modal aware unauthorized output.
+ *
+ * @param string $itemCode The item code string.
+ * @param string $nameSingleCode The single view code name.
+ * @param string $classPointer The class pointer.
+ * @param string $code The item field code.
+ * @param string $tab The indentation prefix.
+ *
+ * @return string The modal aware output block.
+ * @since 5.1.5
+ */
+ protected function buildModalAwareOutput(
+ string $itemCode,
+ string $nameSingleCode,
+ string $classPointer,
+ string $code,
+ string $tab
+ ): string
+ {
+ $link = '';
+
+ $link .= PHP_EOL . $tab . Indent::_(4) . "";
+ $link .= PHP_EOL . $tab . Indent::_(5) . "";
+ $link .= PHP_EOL . $tab . Indent::_(4) . "";
+ $link .= $this->buildModalSelectionBlock($nameSingleCode, $classPointer, $code, $tab, $itemCode);
+ $link .= PHP_EOL . $tab . Indent::_(4) . "";
+
+ return $link;
+ }
+
+ /**
+ * Build the modal selection block.
+ *
+ * @param string $nameSingleCode The single view code name.
+ * @param string $classPointer The class pointer.
+ * @param string $code The item field code.
+ * @param string $tab The indentation prefix.
+ * @param string $itemCode The item code string.
+ *
+ * @return string The modal selection block.
+ * @since 5.1.5
+ */
+ protected function buildModalSelectionBlock(
+ string $nameSingleCode,
+ string $classPointer,
+ string $code,
+ string $tab,
+ string $itemCode
+ ): string
+ {
+ $link = '';
+
+ $link .= PHP_EOL . $tab . Indent::_(5) . "id}\";";
+ $link .= PHP_EOL . $tab . Indent::_(6) . "\$dataId = \$item->{{$classPointer}getModalTitleKey()} ?? 0;";
+ $link .= PHP_EOL . $tab . Indent::_(6)
+ . "\$itemHtml = '' . {$classPointer}escape(\$item->{$code}, false) . '';";
+ $link .= PHP_EOL . $tab . Indent::_(6)
+ . "\$attribs = 'data-content-select data-content-type=\"com_"
+ . $this->config->component_code_name
+ . "."
+ . $nameSingleCode
+ . "\"'";
+ $link .= PHP_EOL . $tab . Indent::_(7) . ". ' data-id=\"' . \$dataId . '\"'";
+ $link .= PHP_EOL . $tab . Indent::_(7) . ". ' data-title=\"' . {$classPointer}escape(\$item->{$code}, false) . '\"'";
+ $link .= PHP_EOL . $tab . Indent::_(7) . ". ' data-uri=\"' . {$classPointer}escape(\$link, false) . '\"'";
+ $link .= PHP_EOL . $tab . Indent::_(7) . ". ' data-html=\"' . {$classPointer}escape(\$itemHtml, false) . '\"';";
+ $link .= PHP_EOL . $tab . Indent::_(5) . "?>";
+ $link .= PHP_EOL . $tab . Indent::_(5) . ">";
+ $link .= PHP_EOL . $tab . Indent::_(6) . "";
+ $link .= PHP_EOL . $tab . Indent::_(5) . "";
+
+ return $link;
+ }
+}
+
diff --git a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem/index.html b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem/index.html
new file mode 100644
index 000000000..fa6d84e80
--- /dev/null
+++ b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItem/index.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItemBuilder.php b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItemBuilder.php
new file mode 100644
index 000000000..df15a09a7
--- /dev/null
+++ b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/AdminViews/ListItemBuilder.php
@@ -0,0 +1,413 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Architecture\AdminViews;
+
+
+use VDM\Joomla\Componentbuilder\Compiler\Placeholder;
+use VDM\Joomla\Componentbuilder\Compiler\Architecture\AdminViews\ListItem;
+use VDM\Joomla\Componentbuilder\Compiler\Builder\FieldRelations;
+use VDM\Joomla\Componentbuilder\Compiler\Builder\ListJoin;
+use VDM\Joomla\Utilities\StringHelper;
+use VDM\Joomla\Utilities\ArrayHelper;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Indent;
+
+
+/**
+ * List Item Builder Class
+ *
+ * @since 5.1.5
+ */
+final class ListItemBuilder
+{
+ /**
+ * The Placeholder Class.
+ *
+ * @var Placeholder
+ * @since 5.1.5
+ */
+ protected Placeholder $placeholder;
+
+ /**
+ * The ListItem Class.
+ *
+ * @var ListItem
+ * @since 5.1.5
+ */
+ protected ListItem $listitem;
+
+ /**
+ * The FieldRelations Class.
+ *
+ * @var FieldRelations
+ * @since 5.1.5
+ */
+ protected FieldRelations $fieldrelations;
+
+ /**
+ * The ListJoin Class.
+ *
+ * @var ListJoin
+ * @since 5.1.5
+ */
+ protected ListJoin $listjoin;
+
+ /**
+ * Constructor.
+ *
+ * @param Placeholder $placeholder The Placeholder Class.
+ * @param ListItem $listitem The ListItem Class.
+ * @param FieldRelations $fieldrelations The FieldRelations Class.
+ * @param ListJoin $listjoin The ListJoin Class.
+ *
+ * @since 5.1.5
+ */
+ public function __construct(Placeholder $placeholder, ListItem $listitem,
+ FieldRelations $fieldrelations, ListJoin $listjoin)
+ {
+ $this->placeholder = $placeholder;
+ $this->listitem = $listitem;
+ $this->fieldrelations = $fieldrelations;
+ $this->listjoin = $listjoin;
+ }
+
+ /**
+ * Get the list item dynamic row.
+ *
+ * @param array $item The item array.
+ * @param string $nameSingleCode The single view code name.
+ * @param string $nameListCode The list view code name.
+ * @param string $itemClass The table row default class.
+ * @param bool $doNotEscape The do not escape global switch.
+ * @param bool $class The div class adding switch.
+ * @param ?string $ref The link referral string.
+ * @param string $classPointer The class pointer (this or displaydata).
+ * @param string $user The user code name.
+ * @param ?string $refview The override of the referral view code name.
+ *
+ * @return string The completed item value for the table row.
+ * @since 5.1.2
+ */
+ public function get(
+ array $item,
+ string $nameSingleCode,
+ string $nameListCode,
+ string &$itemClass,
+ bool $doNotEscape,
+ bool $class = true,
+ ?string $ref = null,
+ string $classPointer = '$this->',
+ string $user = '$this->user',
+ ?string $refview = null
+ ): string
+ {
+ $fieldRelations = $this->getListItemFieldRelations($nameListCode, $item);
+
+ if ($fieldRelations === null)
+ {
+ return $this->listitem->get(
+ $item,
+ $nameSingleCode,
+ $nameListCode,
+ $itemClass,
+ $doNotEscape,
+ $class,
+ $ref,
+ $classPointer,
+ $user,
+ $refview
+ );
+ }
+
+ $fieldListItem = $this->listitem->get(
+ $item,
+ $nameSingleCode,
+ $nameListCode,
+ $itemClass,
+ $doNotEscape,
+ false,
+ $ref,
+ $classPointer,
+ $user,
+ $refview
+ );
+
+ $fieldPlaceholders = [];
+ $fieldArray = [];
+
+ $id = (int) ($item['id'] ?? 0);
+ $guid = (string) ($item['guid'] ?? 'error');
+
+ $this->addFieldOutputPlaceholders(
+ $fieldPlaceholders,
+ $fieldArray,
+ $fieldListItem,
+ $id,
+ $guid
+ );
+
+ $this->addItemCodePlaceholders(
+ $item,
+ $id,
+ $guid,
+ $fieldPlaceholders
+ );
+
+ $this->addJoinListItemFieldData(
+ $fieldRelations,
+ $nameSingleCode,
+ $nameListCode,
+ $doNotEscape,
+ $ref,
+ $classPointer,
+ $user,
+ $refview,
+ $fieldPlaceholders,
+ $fieldArray
+ );
+
+ return $this->renderListItemBuilderOutput(
+ $fieldRelations,
+ $fieldPlaceholders,
+ $fieldArray
+ );
+ }
+
+ /**
+ * Get the field relation settings for a list item.
+ *
+ * @param string $nameListCode The list view code name.
+ * @param array $item The field item array.
+ *
+ * @return array|null The field relation settings or null.
+ * @since 5.1.2
+ */
+ protected function getListItemFieldRelations(string $nameListCode, array $item): ?array
+ {
+ $fieldRelations = $this->fieldrelations->get(
+ $nameListCode . '.' . (string) $item['guid'] . '.2'
+ );
+
+ return is_array($fieldRelations) ? $fieldRelations : null;
+ }
+
+ /**
+ * Add rendered field output placeholders.
+ *
+ * @param array $fieldPlaceholders The field placeholders.
+ * @param array $fieldArray The rendered field array.
+ * @param string $fieldOutput The rendered field output.
+ * @param int $fieldId The field ID.
+ * @param string $fieldGuid The field GUID.
+ *
+ * @return void
+ * @since 5.1.2
+ */
+ protected function addFieldOutputPlaceholders(
+ array &$fieldPlaceholders,
+ array &$fieldArray,
+ string $fieldOutput,
+ int $fieldId,
+ string $fieldGuid
+ ): void
+ {
+ $fieldPlaceholders['[field=' . $fieldId . ']'] = $fieldOutput;
+ $fieldPlaceholders['[field=' . $fieldGuid . ']'] = $fieldOutput;
+ $fieldArray[] = trim($fieldOutput);
+ }
+
+ /**
+ * Add code name placeholders for an item.
+ *
+ * @param array $item The field item array.
+ * @param int $fieldId The field ID.
+ * @param string $fieldGuid The field GUID.
+ * @param array $fieldPlaceholders The field placeholders.
+ *
+ * @return void
+ * @since 5.1.2
+ */
+ protected function addItemCodePlaceholders(
+ array $item,
+ int $fieldId,
+ string $fieldGuid,
+ array &$fieldPlaceholders
+ ): void
+ {
+ if (
+ !isset($item['code'])
+ || !StringHelper::check((string) $item['code'])
+ )
+ {
+ return;
+ }
+
+ $codeReference = '$item->' . $item['code'];
+
+ $fieldPlaceholders['$item->{' . $fieldId . '}'] = $codeReference;
+ $fieldPlaceholders['$item->{' . $fieldGuid . '}'] = $codeReference;
+ }
+
+ /**
+ * Add joined list item field data.
+ *
+ * @param array $fieldRelations The field relation settings.
+ * @param string $nameSingleCode The single view code name.
+ * @param string $nameListCode The list view code name.
+ * @param bool $doNotEscape The do not escape global switch.
+ * @param ?string $ref The link referral string.
+ * @param string $classPointer The class pointer.
+ * @param string $user The user code name.
+ * @param ?string $refview The referral view code name override.
+ * @param array $fieldPlaceholders The field placeholders.
+ * @param array $fieldArray The rendered field array.
+ *
+ * @return void
+ * @since 5.1.2
+ */
+ protected function addJoinListItemFieldData(
+ array $fieldRelations,
+ string $nameSingleCode,
+ string $nameListCode,
+ bool $doNotEscape,
+ ?string $ref,
+ string $classPointer,
+ string $user,
+ ?string $refview,
+ array &$fieldPlaceholders,
+ array &$fieldArray
+ ): void
+ {
+ if (
+ !isset($fieldRelations['joinfields'])
+ || !ArrayHelper::check($fieldRelations['joinfields'])
+ )
+ {
+ return;
+ }
+
+ foreach ($fieldRelations['joinfields'] as $join)
+ {
+ $joinKey = $nameListCode . '.' . (string) $join;
+ $joinItem = $this->listjoin->get($joinKey);
+
+ if (!is_array($joinItem))
+ {
+ continue;
+ }
+
+ $blankClass = '';
+ $joinId = (int) $this->listjoin->get($joinKey . '.id', 0);
+
+ $joinFieldListItem = $this->listitem->get(
+ $joinItem,
+ $nameSingleCode,
+ $nameListCode,
+ $blankClass,
+ $doNotEscape,
+ false,
+ $ref,
+ $classPointer,
+ $user,
+ $refview
+ );
+
+ $this->addFieldOutputPlaceholders(
+ $fieldPlaceholders,
+ $fieldArray,
+ $joinFieldListItem,
+ $joinId,
+ (string) $join
+ );
+
+ $this->addItemCodePlaceholders(
+ $joinItem,
+ $joinId,
+ (string) $join,
+ $fieldPlaceholders
+ );
+ }
+ }
+
+ /**
+ * Render the final list item builder output.
+ *
+ * @param array $fieldRelations The field relation settings.
+ * @param array $fieldPlaceholders The field placeholders.
+ * @param array $fieldArray The rendered field array.
+ *
+ * @return string The rendered output.
+ * @since 5.1.2
+ */
+ protected function renderListItemBuilderOutput(
+ array $fieldRelations,
+ array $fieldPlaceholders,
+ array $fieldArray
+ ): string
+ {
+ if ($this->shouldUseCustomRelationCode($fieldRelations))
+ {
+ $output = str_replace(
+ array_keys($fieldPlaceholders),
+ array_values($fieldPlaceholders),
+ (string) $fieldRelations['set']
+ );
+
+ return $this->wrapListItemBuilderOutput(
+ $this->placeholder->update_($output)
+ );
+ }
+
+ if (
+ isset($fieldRelations['set'])
+ && StringHelper::check((string) $fieldRelations['set'])
+ )
+ {
+ return $this->wrapListItemBuilderOutput(
+ implode((string) $fieldRelations['set'], $fieldArray)
+ );
+ }
+
+ return $this->wrapListItemBuilderOutput(
+ implode('', $fieldArray)
+ );
+ }
+
+ /**
+ * Check if the relation should use custom code.
+ *
+ * @param array $fieldRelations The field relation settings.
+ *
+ * @return bool True if custom relation code should be used.
+ * @since 5.1.2
+ */
+ protected function shouldUseCustomRelationCode(array $fieldRelations): bool
+ {
+ return isset($fieldRelations['join_type'], $fieldRelations['set'])
+ && (int) $fieldRelations['join_type'] === 2
+ && StringHelper::check((string) $fieldRelations['set']);
+ }
+
+ /**
+ * Wrap the output in the standard list item builder div.
+ *
+ * @param string $output The output string.
+ *
+ * @return string The wrapped output.
+ * @since 5.1.2
+ */
+ protected function wrapListItemBuilderOutput(string $output): string
+ {
+ return PHP_EOL . Indent::_(3) . ''
+ . $output . PHP_EOL . Indent::_(3) . '
';
+ }
+}
+
diff --git a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/JoomlaFive/Dashboard/View.php b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/JoomlaFive/Dashboard/View.php
new file mode 100644
index 000000000..5de5d2a2d
--- /dev/null
+++ b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/JoomlaFive/Dashboard/View.php
@@ -0,0 +1,626 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Architecture\JoomlaFive\Dashboard;
+
+
+use VDM\Joomla\Componentbuilder\Compiler\Config;
+use VDM\Joomla\Componentbuilder\Compiler\Component;
+use VDM\Joomla\Componentbuilder\Compiler\Placeholder;
+use VDM\Joomla\Componentbuilder\Compiler\Builder\ContentMulti;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Structure;
+use VDM\Joomla\Utilities\StringHelper;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Indent;
+use VDM\Joomla\Componentbuilder\Compiler\Interfaces\Architecture\Dashboard\ViewInterface;
+
+
+/**
+ * Dashboard View Class
+ *
+ * @since 5.1.5
+ */
+final class View implements ViewInterface
+{
+ /**
+ * The Config Class.
+ *
+ * @var Config
+ * @since 5.1.5
+ */
+ protected Config $config;
+
+ /**
+ * The Component Class.
+ *
+ * @var Component
+ * @since 5.1.5
+ */
+ protected Component $component;
+
+ /**
+ * The Placeholder Class.
+ *
+ * @var Placeholder
+ * @since 5.1.5
+ */
+ protected Placeholder $placeholder;
+
+ /**
+ * The ContentMulti Class.
+ *
+ * @var ContentMulti
+ * @since 5.1.5
+ */
+ protected ContentMulti $contentmulti;
+
+ /**
+ * The Structure Class.
+ *
+ * @var Structure
+ * @since 5.1.5
+ */
+ protected Structure $structure;
+
+ /**
+ * Constructor.
+ *
+ * @param Config $config The Config Class.
+ * @param Component $component The Component Class.
+ * @param Placeholder $placeholder The Placeholder Class.
+ * @param ContentMulti $contentmulti The ContentMulti Class.
+ * @param Structure $structure The Structure Class.
+ *
+ * @since 5.1.5
+ */
+ public function __construct(
+ Config $config,
+ Component $component,
+ Placeholder $placeholder,
+ ContentMulti $contentmulti,
+ Structure $structure
+ ) {
+ $this->config = $config;
+ $this->component = $component;
+ $this->placeholder = $placeholder;
+ $this->contentmulti = $contentmulti;
+ $this->structure = $structure;
+ }
+
+ /**
+ * Build the admin dashboard display markup for Joomla 5.
+ *
+ * @return string The compiled dashboard display markup.
+ * @since 5.1.5
+ */
+ public function get(): string
+ {
+ $state = $this->getDashboardDisplayState();
+
+ $this->initializeDashboardDisplay($state);
+ $this->appendMainDashboardColumns($state);
+
+ if ($state['loadTabs'])
+ {
+ $this->appendCustomTabs($state);
+ $this->appendTabSetEnd($state);
+ }
+ else
+ {
+ $this->appendMainRowEnd($state);
+ }
+
+ $this->appendDashboardContainerEnd($state);
+
+ return PHP_EOL . implode(PHP_EOL, $state['display']);
+ }
+
+ /**
+ * Get the initial dashboard display state.
+ *
+ * @return array The dashboard display state.
+ * @since 5.1.5
+ */
+ protected function getDashboardDisplayState(): array
+ {
+ return [
+ 'display' => [],
+ 'builder' => [],
+ 'tab' => Indent::_(3),
+ 'loadTabs' => false,
+ 'containerId' => 'j-main-container',
+ 'wrapperTabsClass' => 'main-card',
+ 'wrapperClass' => 'main-card p-3 p-lg-4',
+ 'rowClass' => 'row g-4',
+ 'mainColumnClass' => 'col-12 col-xl-9',
+ 'sideColumnClass' => 'col-12 col-xl-3',
+ 'fullColumnClass' => 'col-12',
+ 'uiTab' => 'uitab',
+ 'tabSet' => 'cpanel_tab',
+ 'mainTabAlias' => 'cpanel',
+ ];
+ }
+
+ /**
+ * Initialize the dashboard display structure.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function initializeDashboardDisplay(array &$state): void
+ {
+ if ($this->hasCustomDashboardTabs())
+ {
+ $this->buildCustomDashboardTabTemplates($state['builder']);
+ $this->appendDashboardWithTabsStart($state);
+ $state['loadTabs'] = true;
+
+ return;
+ }
+
+ $this->appendStandardDashboardStart($state);
+ }
+
+ /**
+ * Check whether custom dashboard tabs exist.
+ *
+ * @return bool True if custom dashboard tabs exist.
+ * @since 5.1.5
+ */
+ protected function hasCustomDashboardTabs(): bool
+ {
+ return $this->component->isArray('dashboard_tab');
+ }
+
+ /**
+ * Build the custom dashboard tab template map.
+ *
+ * @param array &$builder The custom tab builder map.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function buildCustomDashboardTabTemplates(array &$builder): void
+ {
+ foreach ($this->component->get('dashboard_tab') as $data)
+ {
+ $builder[$data['name']][$data['header']]
+ = $this->placeholder->update_($data['html']);
+ }
+ }
+
+ /**
+ * Append the dashboard start markup when custom tabs are enabled.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendDashboardWithTabsStart(array &$state): void
+ {
+ $state['display'][] = $this->getOpenContainer($state['containerId']);
+ $state['display'][] = Indent::_(1) . $this->getOpenDiv($state['wrapperTabsClass']);
+ $state['display'][] = Indent::_(1)
+ . $this->getUiTabStartSetCode($state['tabSet'], $state['mainTabAlias']);
+ $state['display'][] = PHP_EOL . Indent::_(2)
+ . $this->getUiTabAddTabCode(
+ $state['tabSet'],
+ $state['mainTabAlias'],
+ "Text:" . ":_('cPanel', true)"
+ );
+ $state['display'][] = Indent::_(2) . $this->getOpenDiv($state['rowClass']);
+ }
+
+ /**
+ * Append the standard dashboard start markup.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendStandardDashboardStart(array &$state): void
+ {
+ $state['display'][] = $this->getOpenContainer($state['containerId']);
+ $state['display'][] = Indent::_(1) . $this->getOpenDiv($state['wrapperClass']);
+ $state['display'][] = Indent::_(2) . $this->getOpenDiv($state['rowClass']);
+ }
+
+ /**
+ * Append the main dashboard columns.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendMainDashboardColumns(array &$state): void
+ {
+ $this->appendLeftDashboardColumn($state);
+ $this->appendRightDashboardColumn($state);
+ }
+
+ /**
+ * Append the left dashboard column.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendLeftDashboardColumn(array &$state): void
+ {
+ $state['display'][] = $state['tab'] . $this->getOpenDiv($state['mainColumnClass']);
+ $state['display'][] = $state['tab'] . Indent::_(1)
+ . $this->getLoadTemplateCode('main');
+ $state['display'][] = $state['tab'] . '';
+ }
+
+ /**
+ * Append the right dashboard column.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendRightDashboardColumn(array &$state): void
+ {
+ $state['display'][] = $state['tab'] . $this->getOpenDiv($state['sideColumnClass']);
+ $state['display'][] = $state['tab'] . Indent::_(1)
+ . $this->getLoadTemplateCode('vdm');
+ $state['display'][] = $state['tab'] . '';
+ }
+
+ /**
+ * Append all custom dashboard tabs.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendCustomTabs(array &$state): void
+ {
+ $state['display'][] = Indent::_(2) . '';
+ $state['display'][] = Indent::_(2) . $this->getUiTabEndTabCode();
+
+ foreach ($state['builder'] as $tabName => $templates)
+ {
+ $this->appendCustomTab($state, $tabName, $templates);
+ }
+ }
+
+ /**
+ * Append a single custom dashboard tab.
+ *
+ * @param array &$state The dashboard display state.
+ * @param string $tabName The tab name.
+ * @param array $templates The template content definitions.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendCustomTab(array &$state, string $tabName, array $templates): void
+ {
+ $alias = StringHelper::safe($tabName);
+
+ $state['display'][] = PHP_EOL . Indent::_(2)
+ . $this->getUiTabAddTabCode(
+ $state['tabSet'],
+ $alias,
+ "Joomla__" . "_ba6326ef_cb79_4348_80f4_ab086082e3c5___Power::_('"
+ . $tabName . "', true)"
+ );
+ $state['display'][] = Indent::_(2) . $this->getOpenDiv($state['rowClass']);
+ $state['display'][] = $state['tab'] . $this->getOpenDiv($state['fullColumnClass']);
+
+ $this->appendCustomTabTemplates($state, $alias, $templates);
+
+ $state['display'][] = $state['tab'] . '';
+ $state['display'][] = Indent::_(2) . '';
+ $state['display'][] = Indent::_(2) . $this->getUiTabEndTabCode();
+ }
+
+ /**
+ * Append all template loads for a custom dashboard tab.
+ *
+ * @param array &$state The dashboard display state.
+ * @param string $alias The safe tab alias.
+ * @param array $templates The template content definitions.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendCustomTabTemplates(array &$state, string $alias, array $templates): void
+ {
+ foreach ($templates as $templateName => $html)
+ {
+ $this->appendCustomTabTemplate($state, $alias, $templateName, $html);
+ }
+ }
+
+ /**
+ * Append a single custom dashboard template load and register its content.
+ *
+ * @param array &$state The dashboard display state.
+ * @param string $alias The safe tab alias.
+ * @param string $templateName The template name.
+ * @param string $html The HTML content.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendCustomTabTemplate(
+ array &$state,
+ string $alias,
+ string $templateName,
+ string $html
+ ): void
+ {
+ $safeTemplateName = $alias . '_' . StringHelper::safe($templateName);
+
+ $state['display'][] = $state['tab'] . Indent::_(1)
+ . $this->getLoadTemplateCode($safeTemplateName);
+
+ $this->buildCustomDashboardTemplate($safeTemplateName, $html);
+ }
+
+ /**
+ * Build a custom dashboard template file and register its content.
+ *
+ * @param string $templateName The template name.
+ * @param string $html The template body HTML.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function buildCustomDashboardTemplate(string $templateName, string $html): void
+ {
+ $this->buildCustomDashboardTemplateStructure($templateName);
+ $this->storeCustomDashboardTemplateBody($templateName, $html);
+ $this->storeCustomDashboardTemplateCodeBody($templateName);
+ }
+
+ /**
+ * Build the custom dashboard template structure.
+ *
+ * @param string $templateName The template name.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function buildCustomDashboardTemplateStructure(string $templateName): void
+ {
+ $this->structure->build(
+ ['custom_admin' => $this->config->component_code_name],
+ 'template',
+ $templateName
+ );
+ }
+
+ /**
+ * Store the custom dashboard template body.
+ *
+ * @param string $templateName The template name.
+ * @param string $html The template body HTML.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function storeCustomDashboardTemplateBody(string $templateName, string $html): void
+ {
+ $this->contentmulti->set(
+ $this->getCustomDashboardTemplateKey(
+ $templateName,
+ 'CUSTOM_ADMIN_TEMPLATE_BODY'
+ ),
+ PHP_EOL . $html
+ );
+ }
+
+ /**
+ * Store the custom dashboard template code body.
+ *
+ * @param string $templateName The template name.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function storeCustomDashboardTemplateCodeBody(string $templateName): void
+ {
+ $this->contentmulti->set(
+ $this->getCustomDashboardTemplateKey(
+ $templateName,
+ 'CUSTOM_ADMIN_TEMPLATE_CODE_BODY'
+ ),
+ ''
+ );
+ }
+
+ /**
+ * Get the custom dashboard template storage key.
+ *
+ * @param string $templateName The template name.
+ * @param string $suffix The key suffix.
+ *
+ * @return string The storage key.
+ * @since 5.1.5
+ */
+ protected function getCustomDashboardTemplateKey(
+ string $templateName,
+ string $suffix
+ ): string
+ {
+ return $this->config->component_code_name . '_'
+ . $templateName . '|' . $suffix;
+ }
+
+ /**
+ * Append the end of the tab set.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendTabSetEnd(array &$state): void
+ {
+ $state['display'][] = PHP_EOL . Indent::_(1)
+ . $this->getUiTabEndTabSetCode();
+ }
+
+ /**
+ * Append the end of the main row layout.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendMainRowEnd(array &$state): void
+ {
+ $state['display'][] = Indent::_(2) . '';
+ }
+
+ /**
+ * Append the closing dashboard container markup.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendDashboardContainerEnd(array &$state): void
+ {
+ $state['display'][] = Indent::_(1) . '';
+ $state['display'][] = '';
+ }
+
+ /**
+ * Get the PHP code for starting a UI tab set.
+ *
+ * @param string $tabSet The tab set name.
+ * @param string $activeTab The active tab alias.
+ *
+ * @return string The generated PHP code.
+ * @since 5.1.5
+ */
+ protected function getUiTabStartSetCode(
+ string $tabSet,
+ string $activeTab
+ ): string
+ {
+ return "getUiTabHelperName('startTabSet') . "', '" . $tabSet
+ . "', array('active' => '" . $activeTab . "')); ?>";
+ }
+
+ /**
+ * Get the PHP code for adding a UI tab.
+ *
+ * @param string $tabSet The tab set name.
+ * @param string $alias The tab alias.
+ * @param string $title The tab title PHP expression.
+ *
+ * @return string The generated PHP code.
+ * @since 5.1.5
+ */
+ protected function getUiTabAddTabCode(
+ string $tabSet,
+ string $alias,
+ string $title
+ ): string
+ {
+ return "getUiTabHelperName('addTab') . "', '" . $tabSet
+ . "', '" . $alias . "', " . $title . "); ?>";
+ }
+
+ /**
+ * Get the PHP code for ending a UI tab.
+ *
+ * @return string The generated PHP code.
+ * @since 5.1.5
+ */
+ protected function getUiTabEndTabCode(): string
+ {
+ return "getUiTabHelperName('endTab') . "'); ?>";
+ }
+
+ /**
+ * Get the PHP code for ending a UI tab set.
+ *
+ * @return string The generated PHP code.
+ * @since 5.1.5
+ */
+ protected function getUiTabEndTabSetCode(): string
+ {
+ return "getUiTabHelperName('endTabSet') . "'); ?>";
+ }
+
+ /**
+ * Get the UI tab helper name.
+ *
+ * @param string $method The helper method name.
+ *
+ * @return string The full helper name.
+ * @since 5.1.5
+ */
+ protected function getUiTabHelperName(string $method): string
+ {
+ return 'uitab.' . $method;
+ }
+
+ /**
+ * Get the PHP code for loading a layout template.
+ *
+ * @param string $templateName The template name.
+ *
+ * @return string The generated PHP code.
+ * @since 5.1.5
+ */
+ protected function getLoadTemplateCode(string $templateName): string
+ {
+ return "loadTemplate('" . $templateName . "');?>";
+ }
+
+ /**
+ * Get the opening container markup.
+ *
+ * @param string $id The container ID.
+ *
+ * @return string The container opening markup.
+ * @since 5.1.5
+ */
+ protected function getOpenContainer(string $id): string
+ {
+ return '';
+ }
+
+ /**
+ * Get the opening div markup.
+ *
+ * @param string $class The div class.
+ *
+ * @return string The div opening markup.
+ * @since 5.1.5
+ */
+ protected function getOpenDiv(string $class): string
+ {
+ return '
';
+ }
+}
+
diff --git a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/JoomlaFive/Dashboard/index.html b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/JoomlaFive/Dashboard/index.html
new file mode 100644
index 000000000..fa6d84e80
--- /dev/null
+++ b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/JoomlaFive/Dashboard/index.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/JoomlaFour/Dashboard/View.php b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/JoomlaFour/Dashboard/View.php
new file mode 100644
index 000000000..fda93fb8d
--- /dev/null
+++ b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/JoomlaFour/Dashboard/View.php
@@ -0,0 +1,454 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Architecture\JoomlaFour\Dashboard;
+
+
+use VDM\Joomla\Componentbuilder\Compiler\Config;
+use VDM\Joomla\Componentbuilder\Compiler\Component;
+use VDM\Joomla\Componentbuilder\Compiler\Placeholder;
+use VDM\Joomla\Componentbuilder\Compiler\Builder\ContentMulti;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Structure;
+use VDM\Joomla\Utilities\StringHelper;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Indent;
+use VDM\Joomla\Componentbuilder\Compiler\Interfaces\Architecture\Dashboard\ViewInterface;
+
+
+/**
+ * Dashboard View Class
+ *
+ * @since 5.1.5
+ */
+final class View implements ViewInterface
+{
+ /**
+ * The Config Class.
+ *
+ * @var Config
+ * @since 5.1.5
+ */
+ protected Config $config;
+
+ /**
+ * The Component Class.
+ *
+ * @var Component
+ * @since 5.1.5
+ */
+ protected Component $component;
+
+ /**
+ * The Placeholder Class.
+ *
+ * @var Placeholder
+ * @since 5.1.5
+ */
+ protected Placeholder $placeholder;
+
+ /**
+ * The ContentMulti Class.
+ *
+ * @var ContentMulti
+ * @since 5.1.5
+ */
+ protected ContentMulti $contentmulti;
+
+ /**
+ * The Structure Class.
+ *
+ * @var Structure
+ * @since 5.1.5
+ */
+ protected Structure $structure;
+
+ /**
+ * Constructor.
+ *
+ * @param Config $config The Config Class.
+ * @param Component $component The Component Class.
+ * @param Placeholder $placeholder The Placeholder Class.
+ * @param ContentMulti $contentmulti The ContentMulti Class.
+ * @param Structure $structure The Structure Class.
+ *
+ * @since 5.1.5
+ */
+ public function __construct(Config $config, Component $component,
+ Placeholder $placeholder, ContentMulti $contentmulti, Structure $structure)
+ {
+ $this->config = $config;
+ $this->component = $component;
+ $this->placeholder = $placeholder;
+ $this->contentmulti = $contentmulti;
+ $this->structure = $structure;
+ }
+
+ /**
+ * Build the admin dashboard display markup for Joomla 4 and above.
+ *
+ * @return string The compiled dashboard display markup.
+ *
+ * @since 5.1.5
+ */
+ public function get(): string
+ {
+ $state = $this->getDashboardDisplayState();
+
+ $this->initializeDashboardDisplay($state);
+ $this->appendMainDashboardColumns($state);
+
+ if ($state['loadTabs'])
+ {
+ $this->appendCustomTabs($state);
+ $this->appendTabSetEnd($state);
+ }
+ else
+ {
+ $this->appendStandardRowEnd($state);
+ }
+
+ $this->appendDashboardContainerEnd($state);
+
+ return PHP_EOL . implode(PHP_EOL, $state['display']);
+ }
+
+ /**
+ * Get the initial dashboard display state.
+ *
+ * @return array The dashboard display state.
+ *
+ * @since 5.1.5
+ */
+ protected function getDashboardDisplayState(): array
+ {
+ return [
+ 'display' => [],
+ 'mainAccordionName' => 'cPanel',
+ 'builder' => [],
+ 'tab' => Indent::_(3),
+ 'loadTabs' => false,
+ 'widthClass' => 'col-md-',
+ 'rowClass' => 'row',
+ 'formClass' => 'main-card',
+ 'uiTab' => 'uitab',
+ ];
+ }
+
+ /**
+ * Initialize the dashboard display structure.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ *
+ * @since 5.1.5
+ */
+ protected function initializeDashboardDisplay(array &$state): void
+ {
+ if ($this->hasCustomDashboardTabs())
+ {
+ $this->buildCustomDashboardTabTemplates($state['builder']);
+ $this->appendDashboardWithTabsStart($state);
+
+ $state['mainAccordionName'] = 'Control Panel';
+ $state['loadTabs'] = true;
+
+ return;
+ }
+
+ $this->appendStandardDashboardStart($state);
+ }
+
+ /**
+ * Check whether custom dashboard tabs exist.
+ *
+ * @return bool True if custom dashboard tabs exist.
+ *
+ * @since 5.1.5
+ */
+ protected function hasCustomDashboardTabs(): bool
+ {
+ return $this->component->isArray('dashboard_tab');
+ }
+
+ /**
+ * Build the custom dashboard tab template map.
+ *
+ * @param array &$builder The custom tab builder map.
+ *
+ * @return void
+ *
+ * @since 5.1.5
+ */
+ protected function buildCustomDashboardTabTemplates(array &$builder): void
+ {
+ foreach ($this->component->get('dashboard_tab') as $data)
+ {
+ $builder[$data['name']][$data['header']]
+ = $this->placeholder->update_($data['html']);
+ }
+ }
+
+ /**
+ * Append the dashboard start markup when custom tabs are enabled.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ *
+ * @since 5.1.5
+ */
+ protected function appendDashboardWithTabsStart(array &$state): void
+ {
+ $state['display'][] = '';
+ $state['display'][] = Indent::_(1) . '
';
+ $state['display'][] = $state['tab'] . '
';
+ }
+
+ /**
+ * Append the right dashboard column.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendRightDashboardColumn(array &$state): void
+ {
+ $state['display'][] = $state['tab']
+ . $this->getOpenDiv($state['sideColumnClass']);
+ $state['display'][] = $state['tab'] . Indent::_(1)
+ . $this->getOpenDiv($state['sideInnerClass']);
+ $state['display'][] = $state['tab'] . Indent::_(2)
+ . $this->getLoadTemplateCode('vdm');
+ $state['display'][] = $state['tab'] . Indent::_(1) . '';
+ $state['display'][] = $state['tab'] . '
';
+ }
+
+ /**
+ * Append all custom dashboard tabs.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendCustomTabs(array &$state): void
+ {
+ $state['display'][] = Indent::_(3) . '';
+ $state['display'][] = Indent::_(3) . $this->getUiTabEndTabCode();
+
+ foreach ($state['builder'] as $tabName => $templates)
+ {
+ $this->appendCustomTab($state, $tabName, $templates);
+ }
+ }
+
+ /**
+ * Append a single custom dashboard tab.
+ *
+ * @param array &$state The dashboard display state.
+ * @param string $tabName The tab name.
+ * @param array $templates The template content definitions.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendCustomTab(array &$state, string $tabName, array $templates): void
+ {
+ $alias = StringHelper::safe($tabName);
+
+ $state['display'][] = PHP_EOL . Indent::_(3)
+ . $this->getUiTabAddTabCode(
+ $state['tabSet'],
+ $alias,
+ "Joomla__" . "_ba6326ef_cb79_4348_80f4_ab086082e3c5___Power::_('"
+ . $tabName . "', true)"
+ );
+ $state['display'][] = Indent::_(3) . $this->getOpenDiv($state['rowClass']);
+ $state['display'][] = $state['tab'] . $this->getOpenDiv($state['fullColumnClass']);
+ $state['display'][] = $state['tab'] . Indent::_(1)
+ . $this->getOpenDiv($state['fullInnerClass']);
+
+ $this->appendCustomTabTemplates($state, $alias, $templates);
+
+ $state['display'][] = $state['tab'] . Indent::_(1) . '';
+ $state['display'][] = $state['tab'] . '';
+ $state['display'][] = Indent::_(3) . '';
+ $state['display'][] = Indent::_(3) . $this->getUiTabEndTabCode();
+ }
+
+ /**
+ * Append all template loads for a custom dashboard tab.
+ *
+ * @param array &$state The dashboard display state.
+ * @param string $alias The safe tab alias.
+ * @param array $templates The template content definitions.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendCustomTabTemplates(array &$state, string $alias, array $templates): void
+ {
+ foreach ($templates as $templateName => $html)
+ {
+ $this->appendCustomTabTemplate($state, $alias, $templateName, $html);
+ }
+ }
+
+ /**
+ * Append a single custom dashboard template load and register its content.
+ *
+ * @param array &$state The dashboard display state.
+ * @param string $alias The safe tab alias.
+ * @param string $templateName The template name.
+ * @param string $html The HTML content.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendCustomTabTemplate(
+ array &$state,
+ string $alias,
+ string $templateName,
+ string $html
+ ): void
+ {
+ $safeTemplateName = $alias . '_' . StringHelper::safe($templateName);
+
+ $state['display'][] = $state['tab'] . Indent::_(2)
+ . $this->getLoadTemplateCode($safeTemplateName);
+
+ $this->buildCustomDashboardTemplate($safeTemplateName, $html);
+ }
+
+ /**
+ * Build a custom dashboard template file and register its content.
+ *
+ * @param string $templateName The template name.
+ * @param string $html The template body HTML.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function buildCustomDashboardTemplate(string $templateName, string $html): void
+ {
+ $this->buildCustomDashboardTemplateStructure($templateName);
+ $this->storeCustomDashboardTemplateBody($templateName, $html);
+ $this->storeCustomDashboardTemplateCodeBody($templateName);
+ }
+
+ /**
+ * Build the custom dashboard template structure.
+ *
+ * @param string $templateName The template name.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function buildCustomDashboardTemplateStructure(string $templateName): void
+ {
+ $this->structure->build(
+ ['custom_admin' => $this->config->component_code_name],
+ 'template',
+ $templateName
+ );
+ }
+
+ /**
+ * Store the custom dashboard template body.
+ *
+ * @param string $templateName The template name.
+ * @param string $html The template body HTML.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function storeCustomDashboardTemplateBody(string $templateName, string $html): void
+ {
+ $this->contentmulti->set(
+ $this->getCustomDashboardTemplateKey(
+ $templateName,
+ 'CUSTOM_ADMIN_TEMPLATE_BODY'
+ ),
+ PHP_EOL . $html
+ );
+ }
+
+ /**
+ * Store the custom dashboard template code body.
+ *
+ * @param string $templateName The template name.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function storeCustomDashboardTemplateCodeBody(string $templateName): void
+ {
+ $this->contentmulti->set(
+ $this->getCustomDashboardTemplateKey(
+ $templateName,
+ 'CUSTOM_ADMIN_TEMPLATE_CODE_BODY'
+ ),
+ ''
+ );
+ }
+
+ /**
+ * Get the custom dashboard template storage key.
+ *
+ * @param string $templateName The template name.
+ * @param string $suffix The key suffix.
+ *
+ * @return string The storage key.
+ * @since 5.1.5
+ */
+ protected function getCustomDashboardTemplateKey(
+ string $templateName,
+ string $suffix
+ ): string
+ {
+ return $this->config->component_code_name . '_'
+ . $templateName . '|' . $suffix;
+ }
+
+ /**
+ * Append the end of the tab set.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendTabSetEnd(array &$state): void
+ {
+ $state['display'][] = PHP_EOL . Indent::_(2)
+ . $this->getUiTabEndTabSetCode();
+ }
+
+ /**
+ * Append the end of the main row layout.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendMainRowEnd(array &$state): void
+ {
+ $state['display'][] = Indent::_(3) . '';
+ }
+
+ /**
+ * Append the closing dashboard container markup.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ * @since 5.1.5
+ */
+ protected function appendDashboardContainerEnd(array &$state): void
+ {
+ $state['display'][] = Indent::_(2) . '';
+ $state['display'][] = Indent::_(1) . '';
+ $state['display'][] = '';
+ }
+
+ /**
+ * Get the PHP code for starting a UI tab set.
+ *
+ * @param string $tabSet The tab set name.
+ * @param string $activeTab The active tab alias.
+ *
+ * @return string The generated PHP code.
+ * @since 5.1.5
+ */
+ protected function getUiTabStartSetCode(
+ string $tabSet,
+ string $activeTab
+ ): string
+ {
+ return "getUiTabHelperName('startTabSet') . "', '" . $tabSet
+ . "', array('active' => '" . $activeTab . "')); ?>";
+ }
+
+ /**
+ * Get the PHP code for adding a UI tab.
+ *
+ * @param string $tabSet The tab set name.
+ * @param string $alias The tab alias.
+ * @param string $title The tab title PHP expression.
+ *
+ * @return string The generated PHP code.
+ * @since 5.1.5
+ */
+ protected function getUiTabAddTabCode(
+ string $tabSet,
+ string $alias,
+ string $title
+ ): string
+ {
+ return "getUiTabHelperName('addTab') . "', '" . $tabSet
+ . "', '" . $alias . "', " . $title . "); ?>";
+ }
+
+ /**
+ * Get the PHP code for ending a UI tab.
+ *
+ * @return string The generated PHP code.
+ * @since 5.1.5
+ */
+ protected function getUiTabEndTabCode(): string
+ {
+ return "getUiTabHelperName('endTab') . "'); ?>";
+ }
+
+ /**
+ * Get the PHP code for ending a UI tab set.
+ *
+ * @return string The generated PHP code.
+ * @since 5.1.5
+ */
+ protected function getUiTabEndTabSetCode(): string
+ {
+ return "getUiTabHelperName('endTabSet') . "'); ?>";
+ }
+
+ /**
+ * Get the UI tab helper name.
+ *
+ * @param string $method The helper method name.
+ *
+ * @return string The full helper name.
+ * @since 5.1.5
+ */
+ protected function getUiTabHelperName(string $method): string
+ {
+ return 'uitab.' . $method;
+ }
+
+ /**
+ * Get the PHP code for loading a layout template.
+ *
+ * @param string $templateName The template name.
+ *
+ * @return string The generated PHP code.
+ * @since 5.1.5
+ */
+ protected function getLoadTemplateCode(string $templateName): string
+ {
+ return "loadTemplate('" . $templateName . "');?>";
+ }
+
+ /**
+ * Get the opening container markup.
+ *
+ * @param string $id The container ID.
+ * @param string|null $class The container class.
+ *
+ * @return string The container opening markup.
+ * @since 5.1.5
+ */
+ protected function getOpenContainer(string $id, ?string $class = null): string
+ {
+ if ($class !== null && $class !== '')
+ {
+ return '';
+ }
+
+ return '
';
+ }
+
+ /**
+ * Get the opening div markup.
+ *
+ * @param string $class The div class.
+ *
+ * @return string The div opening markup.
+ * @since 5.1.5
+ */
+ protected function getOpenDiv(string $class): string
+ {
+ return '
';
+ }
+}
+
diff --git a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/JoomlaSix/Dashboard/index.html b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/JoomlaSix/Dashboard/index.html
new file mode 100644
index 000000000..fa6d84e80
--- /dev/null
+++ b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/JoomlaSix/Dashboard/index.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/JoomlaThree/Dashboard/View.php b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/JoomlaThree/Dashboard/View.php
new file mode 100644
index 000000000..c9b21ffb7
--- /dev/null
+++ b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Architecture/JoomlaThree/Dashboard/View.php
@@ -0,0 +1,514 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Architecture\JoomlaThree\Dashboard;
+
+
+use VDM\Joomla\Componentbuilder\Compiler\Config;
+use VDM\Joomla\Componentbuilder\Compiler\Component;
+use VDM\Joomla\Componentbuilder\Compiler\Placeholder;
+use VDM\Joomla\Componentbuilder\Compiler\Builder\ContentOne;
+use VDM\Joomla\Componentbuilder\Compiler\Builder\ContentMulti;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Structure;
+use VDM\Joomla\Utilities\StringHelper;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Indent;
+use VDM\Joomla\Componentbuilder\Compiler\Interfaces\Architecture\Dashboard\ViewInterface;
+
+
+/**
+ * Dashboard View Class
+ *
+ * @since 5.1.5
+ */
+final class View implements ViewInterface
+{
+ /**
+ * The Config Class.
+ *
+ * @var Config
+ * @since 5.1.5
+ */
+ protected Config $config;
+
+ /**
+ * The Component Class.
+ *
+ * @var Component
+ * @since 5.1.5
+ */
+ protected Component $component;
+
+ /**
+ * The Placeholder Class.
+ *
+ * @var Placeholder
+ * @since 5.1.5
+ */
+ protected Placeholder $placeholder;
+
+ /**
+ * The ContentOne Class.
+ *
+ * @var ContentOne
+ * @since 5.1.5
+ */
+ protected ContentOne $contentone;
+
+ /**
+ * The ContentMulti Class.
+ *
+ * @var ContentMulti
+ * @since 5.1.5
+ */
+ protected ContentMulti $contentmulti;
+
+ /**
+ * The Structure Class.
+ *
+ * @var Structure
+ * @since 5.1.5
+ */
+ protected Structure $structure;
+
+ /**
+ * Constructor.
+ *
+ * @param Config $config The Config Class.
+ * @param Component $component The Component Class.
+ * @param Placeholder $placeholder The Placeholder Class.
+ * @param ContentOne $contentone The ContentOne Class.
+ * @param ContentMulti $contentmulti The ContentMulti Class.
+ * @param Structure $structure The Structure Class.
+ *
+ * @since 5.1.5
+ */
+ public function __construct(Config $config, Component $component,
+ Placeholder $placeholder, ContentOne $contentone,
+ ContentMulti $contentmulti, Structure $structure)
+ {
+ $this->config = $config;
+ $this->component = $component;
+ $this->placeholder = $placeholder;
+ $this->contentone = $contentone;
+ $this->contentmulti = $contentmulti;
+ $this->structure = $structure;
+ }
+
+ /**
+ * Build the admin dashboard display markup.
+ *
+ * @return string The compiled dashboard display markup.
+ *
+ * @since 5.1.5
+ */
+ public function get(): string
+ {
+ $state = $this->getDashboardDisplayState();
+
+ $this->initializeDashboardDisplay($state);
+ $this->appendMainDashboardColumns($state);
+
+ if ($state['loadTabs'])
+ {
+ $this->appendCustomTabs($state);
+ $this->appendTabSetEnd($state);
+ }
+ else
+ {
+ $this->appendStandardRowEnd($state);
+ }
+
+ $this->appendDashboardContainerEnd($state);
+
+ return PHP_EOL . implode(PHP_EOL, $state['display']);
+ }
+
+ /**
+ * Get the initial dashboard display state.
+ *
+ * @return array The dashboard display state.
+ *
+ * @since 5.1.5
+ */
+ protected function getDashboardDisplayState(): array
+ {
+ return [
+ 'display' => [],
+ 'mainAccordianName' => 'cPanel',
+ 'builder' => [],
+ 'tab' => Indent::_(3),
+ 'loadTabs' => false,
+ 'widthClass' => 'span',
+ 'rowClass' => 'row-fluid',
+ 'formClass' => 'form-horizontal',
+ 'uiTab' => 'bootstrap',
+ ];
+ }
+
+ /**
+ * Initialize the dashboard display structure.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ *
+ * @since 5.1.5
+ */
+ protected function initializeDashboardDisplay(array &$state): void
+ {
+ if ($this->hasCustomDashboardTabs())
+ {
+ $this->buildCustomDashboardTabTemplates($state['builder']);
+ $this->appendDashboardWithTabsStart($state);
+
+ $state['mainAccordionName'] = 'Control Panel';
+ $state['loadTabs'] = true;
+
+ return;
+ }
+
+ $this->appendStandardDashboardStart($state);
+ }
+
+ /**
+ * Check whether custom dashboard tabs exist.
+ *
+ * @return bool True if custom dashboard tabs exist.
+ *
+ * @since 5.1.5
+ */
+ protected function hasCustomDashboardTabs(): bool
+ {
+ return $this->component->isArray('dashboard_tab');
+ }
+
+ /**
+ * Build the custom dashboard tab template map.
+ *
+ * @param array &$builder The builder map.
+ *
+ * @return void
+ *
+ * @since 5.1.5
+ */
+ protected function buildCustomDashboardTabTemplates(array &$builder): void
+ {
+ foreach ($this->component->get('dashboard_tab') as $data)
+ {
+ $builder[$data['name']][$data['header']]
+ = $this->placeholder->update_($data['html']);
+ }
+ }
+
+ /**
+ * Append the dashboard start markup when custom tabs are enabled.
+ *
+ * @param array &$state The dashboard display state.
+ *
+ * @return void
+ *
+ * @since 5.1.5
+ */
+ protected function appendDashboardWithTabsStart(array &$state): void
+ {
+ $state['display'][] = '';
+ $state['display'][] = Indent::_(1) . '