diff --git a/CHANGELOG.md b/CHANGELOG.md index b2274978a..85dc093c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ -# v5.0.4-beta2 +# v5.0.4-beta3 +- Fix the noticeboard to display Llewellyn's Joomla Social feed +- Started compiling JCB5 on Joomla 5 with PHP 8.2 + +# v5.0.4-beta + +- Add first classes for the new import engine. - Improve the [VDM Registry] to be Joomla Registry Compatible - Move all registries to the [VDM Registry] class - Fix Checked Out to be null and not 0. (#1194) @@ -8,10 +14,6 @@ - Update created_by, modified_by, checked_out fields in table class. - Implementation of the decentralized Super-Power CORE repository network. (#1190) -# v5.0.4-beta - -- Add first classes for the new import engine. - # v5.0.4-alpha - Add [AllowDynamicProperties] in the base view class for J5 diff --git a/ComponentbuilderInstallerScript.php b/ComponentbuilderInstallerScript.php index 125359943..993656dfb 100644 --- a/ComponentbuilderInstallerScript.php +++ b/ComponentbuilderInstallerScript.php @@ -3270,7 +3270,7 @@ class Com_ComponentbuilderInstallerScript implements InstallerScriptInterface echo '
-

Upgrade to Version 5.0.4-beta2 Was Successful! Let us know if anything is not working as expected.

'; +

Upgrade to Version 5.0.4-beta3 Was Successful! Let us know if anything is not working as expected.

'; // Add/Update component in the action logs extensions table. $this->setActionLogsExtensions(); diff --git a/README.md b/README.md index 14712566c..63bdd11c2 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ The Component Builder for [Joomla](https://extensions.joomla.org/extension/compo Whether you're a seasoned [Joomla](https://extensions.joomla.org/extension/component-builder/) developer, or have just started, Component Builder will save you lots of time and money. A real must have! -You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (5.0.4-beta2) with **ALL** its features and **ALL** concepts totally open-source and free! +You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (5.0.4-beta3) with **ALL** its features and **ALL** concepts totally open-source and free! > Watch Quick Build of a Hello World component in [JCB on Youtube](https://www.youtube.com/watch?v=IQfsLYIeblk&list=PLQRGFI8XZ_wtGvPQZWBfDzzlERLQgpMRE&index=45) @@ -144,13 +144,13 @@ TODO + *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io) + *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder) + *First Build*: 30th April, 2015 -+ *Last Build*: 16th December, 2024 -+ *Version*: 5.0.4-beta2 ++ *Last Build*: 28th December, 2024 ++ *Version*: 5.0.4-beta3 + *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved. + *License*: GNU General Public License version 2 or later; see LICENSE.txt -+ *Line count*: **910278** ++ *Line count*: **910513** + *Field count*: **2104** -+ *File count*: **6346** ++ *File count*: **6347** + *Folder count*: **638** > This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](https://www.joomlacomponentbuilder.com). diff --git a/admin/README.txt b/admin/README.txt index 14712566c..63bdd11c2 100644 --- a/admin/README.txt +++ b/admin/README.txt @@ -9,7 +9,7 @@ The Component Builder for [Joomla](https://extensions.joomla.org/extension/compo Whether you're a seasoned [Joomla](https://extensions.joomla.org/extension/component-builder/) developer, or have just started, Component Builder will save you lots of time and money. A real must have! -You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (5.0.4-beta2) with **ALL** its features and **ALL** concepts totally open-source and free! +You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (5.0.4-beta3) with **ALL** its features and **ALL** concepts totally open-source and free! > Watch Quick Build of a Hello World component in [JCB on Youtube](https://www.youtube.com/watch?v=IQfsLYIeblk&list=PLQRGFI8XZ_wtGvPQZWBfDzzlERLQgpMRE&index=45) @@ -144,13 +144,13 @@ TODO + *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io) + *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder) + *First Build*: 30th April, 2015 -+ *Last Build*: 16th December, 2024 -+ *Version*: 5.0.4-beta2 ++ *Last Build*: 28th December, 2024 ++ *Version*: 5.0.4-beta3 + *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved. + *License*: GNU General Public License version 2 or later; see LICENSE.txt -+ *Line count*: **910278** ++ *Line count*: **910513** + *Field count*: **2104** -+ *File count*: **6346** ++ *File count*: **6347** + *Folder count*: **638** > This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](https://www.joomlacomponentbuilder.com). diff --git a/admin/assets/css/compiler.css b/admin/assets/css/compiler.css index 2e970cd50..276605f7d 100644 --- a/admin/assets/css/compiler.css +++ b/admin/assets/css/compiler.css @@ -10,10 +10,105 @@ /* CSS Document */ -html, body { - background-color: #fefcfe !important; +html[data-bs-theme="light"] .main-card { + background-color: #fefcfe; } + .jcb-sponsor-banner { -webkit-box-shadow: 0 0 7px 1px #f0f0f0; box-shadow: 0 0 7px 1px #f0f0f0; -} +} + +/* Spinning effect within the mastadon-display-block */ +.mastadon-display-block .spinning i { + animation: spin 1s linear infinite; +} + +.mastadon-display-block .enlarge-and-disappear { + animation: enlarge-fade-out 1s forwards; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@keyframes enlarge-fade-out { + 0% { + transform: scale(1); + opacity: 1; + } + 100% { + transform: scale(2); + opacity: 0; + } +} + +/* Placeholder container scoped to mastadon-display-block */ +.mastadon-display-block .placeholder { + display: flex; + flex-direction: column; + gap: 10px; + margin-bottom: 16px; + padding: 16px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; +} + +.mastadon-display-block .placeholder-line { + height: 12px; + background-color: #f0f0f0; + border-radius: 4px; + animation: pulse 1.5s infinite; +} + +.mastadon-display-block .placeholder-line:nth-child(1) { + width: 80%; +} +.mastadon-display-block .placeholder-line:nth-child(2) { + width: 60%; +} +.mastadon-display-block .placeholder-line:nth-child(3) { + width: 40%; +} + +.mastadon-display-block .placeholder-circle { + width: 50px; + height: 50px; + background-color: #f0f0f0; + border-radius: 50%; + animation: pulse 1.5s infinite; + margin-top: 10px; +} + +@keyframes pulse { + 0% { + opacity: 1; + } + 50% { + opacity: 0.5; + } + 100% { + opacity: 1; + } +} + +.mastadon-display-block .loading { + visibility: visible; + position: relative; +} + +.social-icon-details { + min-height: 50px; + width: 100%; + padding: 5px; + box-sizing: border-box; + font-size: 10px; + text-align: right; +} + diff --git a/admin/assets/js/compiler.js b/admin/assets/js/compiler.js new file mode 100644 index 000000000..dd269e979 --- /dev/null +++ b/admin/assets/js/compiler.js @@ -0,0 +1,326 @@ +/** + * @package Joomla.Component.Builder + * + * @created 30th April, 2015 + * @author Llewellyn van der Merwe + * @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 + */ + +/* JS Document */ +class MastodonFeed { + constructor(containerId, refreshButtonId) { + this.container = document.getElementById(containerId); + this.refreshButton = document.getElementById(refreshButtonId); + + // Get settings from data attributes + this.mastodonInstance = this.container.dataset.instance; + this.accountId = this.container.dataset.accountId; + this.postCount = parseInt(this.container.dataset.postCount) || 5; + + this.cacheKey = "mastodon-feed-cache"; + this.cacheExpiration = 24 * 60 * 60 * 1000; // 24 hours in milliseconds + + // Initialize the feed + this.initFeed(); + + // Attach event listener for the refresh button + this.refreshButton.addEventListener("click", () => this.clearCacheAndReload()); + } + + async initFeed() { + const cachedData = this.getCachedData(); + + if (cachedData) { + this.renderFeed(cachedData); + } else { + await this.loadFeed(); + } + } + + getCachedData() { + const cache = localStorage.getItem(this.cacheKey); + if (!cache) return null; + + const parsedCache = JSON.parse(cache); + const now = new Date().getTime(); + + if (now - parsedCache.timestamp > this.cacheExpiration) { + // Cache is expired + this.clearCache(); + return null; + } + + return parsedCache.data; + } + + setCachedData(data) { + const cache = { + timestamp: new Date().getTime(), + data: data, + }; + localStorage.setItem(this.cacheKey, JSON.stringify(cache)); + } + + clearCache() { + localStorage.removeItem(this.cacheKey); + } + + async loadFeed() { + try { + const response = await fetch(`${this.mastodonInstance}/api/v1/accounts/${this.accountId}/statuses?limit=${this.postCount}`); + + if (!response.ok) { + throw new Error(`Failed to fetch Mastodon feed: ${response.statusText}`); + } + + const posts = await response.json(); + this.setCachedData(posts); // Cache the data + this.renderFeed(posts); + } catch (error) { + console.error("Error loading Mastodon feed:", error); + this.container.innerHTML = `
Error loading feed. Please try again later.
`; + } + } + + renderFeed(posts) { + // Clear existing content + this.container.innerHTML = ""; + + posts.forEach(post => { + if (!post.content) return; // Ignore posts with no content + + // Create post element + const listItem = document.createElement("div"); + listItem.className = "card mb-3"; + + const postContent = document.createElement("div"); + postContent.className = "card-body"; + + const user = post.account; + const avatar = user.avatar_static; + const displayName = user.display_name || user.username; + + // User header + const header = document.createElement("div"); + header.className = "d-flex align-items-center mb-2"; + + const avatarLink = document.createElement("a"); + avatarLink.href = user.url; + // avatarLink.target = "_blank"; + + const avatarImg = document.createElement("img"); + avatarImg.src = avatar; + avatarImg.alt = displayName; + avatarImg.className = "rounded-circle me-2"; + avatarImg.style.width = "40px"; + + avatarLink.appendChild(avatarImg); + + const userInfo = document.createElement("div"); + const nameLink = document.createElement("a"); + nameLink.href = user.url; + // nameLink.target = "_blank"; + nameLink.className = "text-decoration-none fw-bold"; + nameLink.textContent = displayName; + + const username = document.createElement("div"); + username.className = "text-muted small"; + username.textContent = `@${user.username}`; + + userInfo.appendChild(nameLink); + userInfo.appendChild(username); + + header.appendChild(avatarLink); + header.appendChild(userInfo); + + // Post content + const content = document.createElement("div"); + content.innerHTML = post.content; + + // Interactions + const interactions = document.createElement("div"); + interactions.className = "btn-group btn-sm"; + + // View Post link + const viewPost = document.createElement("a"); + viewPost.href = post.url; + // viewPost.target = "_blank"; + viewPost.className = "btn btn-primary btn-sm"; + viewPost.innerHTML = `View Post   +    ${post.replies_count}  +    ${post.favourites_count}  +    ${post.reblogs_count}`; + interactions.appendChild(viewPost); + + // Join Me link + const joinLink = document.createElement("a"); + joinLink.href = "https://joomla.social/invite/gzAvC48K"; + // joinLink.target = "_blank"; + joinLink.className = "btn btn-success btn-sm"; + joinLink.textContent = "Join Me"; + interactions.appendChild(joinLink); + + // Assemble post + postContent.appendChild(header); + postContent.appendChild(content); + postContent.appendChild(interactions); + + listItem.appendChild(postContent); + this.container.appendChild(listItem); + this.container.classList.remove('loading'); + }); + } + + clearCacheAndReload() { + // Add spinning effect to the refresh button + this.refreshButton.classList.add('spinning'); + + // Show placeholder content + this.container.classList.add('loading'); + this.container.innerHTML = this.generatePlaceholder(); + + // Clear cache and reload feed + this.clearCache(); + + // Wait for 3 seconds + setTimeout(() => { + // Enlarge and fade out the refresh button + this.refreshButton.classList.add('enlarge-and-disappear'); + + // After the animation, reset the button and content + setTimeout(() => { + this.refreshButton.classList.remove('spinning', 'enlarge-and-disappear'); + this.refreshButton.style.display = ''; + + // Remove placeholder and restore actual content + this.loadFeed(); + }, 1000); // Animation time for fade-out + }, 3000); // Spinning duration + } + + generatePlaceholder() { + let placeholders = ''; + for (let i = 0; i < this.postCount; i++) { + placeholders += ` +
+
+
+
+
+
+
+ `; + } + return placeholders; + } + + intelligentDateFormat(isoDateString) { + const date = new Date(isoDateString); + const now = new Date(); + const diffTime = Math.abs(now - date); + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + + if (diffDays < 7) { + // If it's within the last week, show days ago + return `${diffDays}d`; + } else if (date.getFullYear() === now.getFullYear()) { + // If it's this year, show just month and day + return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' }); + } else { + // For older dates, show month, day, year, and time + const options = { month: 'short', day: 'numeric', year: 'numeric', hour: '2-digit', minute: '2-digit', hour12: true }; + return date.toLocaleString(undefined, options).replace(',', '').replace(' at', ''); + } + } + + fixedFormatDate(isoDateString) { + const date = new Date(isoDateString); + const options = { month: 'short', day: 'numeric', year: 'numeric', hour: '2-digit', minute: '2-digit', hour12: true }; + return date.toLocaleString(undefined, options).replace(',', '').replace(' at', ''); + } +} + +class IconWaveAnimator { + constructor(containerId, detailsId) { + this.details = document.getElementById(detailsId); + this.container = document.getElementById(containerId); + this.icons = this.container.querySelectorAll("i"); + this.links = this.container.querySelectorAll("a"); + this.init(); + } + + init() { + // set the icon hover events + this.setupHoverEvents(); + + // Random chance to do nothing (1 out of 10) + if (Math.random() < 0.1) return; + + // Randomize the initial delay before starting + const initialDelay = Math.random() * 2000 + 2000; // 2–4 seconds + setTimeout(() => { + this.randomBehavior(); + }, initialDelay); + + // Occasionally trigger a second wave after 10 seconds + if (Math.random() > 0.5) { + setTimeout(() => { + this.mexicanWave(false); // Reverse wave + }, 10000); + } + } + + mexicanWave(forward = true) { + let delay = 0; + const iconsArray = Array.from(this.icons); + + (forward ? iconsArray : iconsArray.reverse()).forEach((icon) => { + setTimeout(() => { + icon.style.transition = "transform 0.3s ease-in-out"; + icon.style.transform = "scale(1.3)"; + setTimeout(() => { + icon.style.transform = "scale(1)"; + }, 300); + }, delay); + delay += 150; // Stagger the effect for the wave + }); + } + + randomBehavior() { + const waveDirection = Math.random() > 0.5 ? "forward" : "backward"; + const waveCount = Math.floor(Math.random() * 10) + 1; // 1 to 5 waves + const interval = Math.random() * 2000 + 3000; // 3 to 5 seconds + + let executedCount = 0; + const intervalId = setInterval(() => { + if (executedCount >= waveCount) { + clearInterval(intervalId); + return; + } + this.mexicanWave(waveDirection === "forward"); + executedCount++; + }, interval); + } + + setupHoverEvents() { + this.links.forEach((link) => { + link.addEventListener("mouseenter", () => this.showDetails(link)); + link.addEventListener("mouseleave", () => this.clearDetails()); + }); + } + + showDetails(link) { + const description = link.dataset.description; + if (this.details && description) { + this.details.textContent = description; + } + } + + clearDetails() { + if (this.details) { + this.details.textContent = ""; + } + } +} \ No newline at end of file diff --git a/admin/compiler/joomla_4/DASH_VIEW_HTML.php b/admin/compiler/joomla_4/DASH_VIEW_HTML.php index ec7c59f52..464b34941 100644 --- a/admin/compiler/joomla_4/DASH_VIEW_HTML.php +++ b/admin/compiler/joomla_4/DASH_VIEW_HTML.php @@ -97,7 +97,7 @@ class HtmlView extends BaseHtmlView // set page title $this->getDocument()->setTitle(Text::_('COM_###COMPONENT###_DASHBOARD')); // add manifest to page JavaScript - $this->getDocument()->addScriptDeclaration("var manifest = JSON.parse('" . json_encode($this->manifest) . "');", "text/javascript"); + $this->getDocument()->addScriptDeclaration("var manifest = JSON.parse(" . json_encode($this->manifest) . ");", "text/javascript"); // add styles foreach ($this->styles as $style) { diff --git a/admin/language/en-GB/en-GB.com_componentbuilder.ini b/admin/language/en-GB/en-GB.com_componentbuilder.ini index 2e5b57b84..5ed66a75e 100644 --- a/admin/language/en-GB/en-GB.com_componentbuilder.ini +++ b/admin/language/en-GB/en-GB.com_componentbuilder.ini @@ -1298,7 +1298,6 @@ COM_COMPONENTBUILDER_ALIGNMENT="Alignment" COM_COMPONENTBUILDER_ALL="All" COM_COMPONENTBUILDER_ALLOWS_YOU_TO_OVERRIDE_THE_BUILD_DATE_BY_SELECTING_A_DATE_MANUALLY_FROM_THE_CALENDER="Allows you to override the build date by selecting a date manually from the calender." COM_COMPONENTBUILDER_ALL_FOUND_INSTANCES_IN_S_WHERE_REPLACED="All found instances in %s where replaced" -COM_COMPONENTBUILDER_ALL_IS_GOOD_PLEASE_CHECK_AGAIN_LATER="All is good, please check again later" COM_COMPONENTBUILDER_ALL_IS_GOOD_THERE_IS_NO_NOTICE_AT_THIS_TIME="All is good, there is no notice at this time." COM_COMPONENTBUILDER_ALL_OF_THESE_PACKAGES_ARE_A_FULLY_DEVELOPEDMAPPED_COMPONENTS_FOR_JCB_THEY_CAN_BE_SEEN_AS_DEMO_CONTENT_OR_BASE_IMAGES_FROM_WHICH_TO_START_YOUR_PROJECTBR_ALWAYS_MAKE_SURE_YOU_ARE_ON_THE_LATEST_VERSION_OF_JCB_BEFORE_IMPORTING_ANY_OF_THESE_PACKAGES_SHOULD_ANY_OF_THEM_FAIL_TO_IMPORT_A_S_PLEASE_LET_US_KNOWA="All of these packages are a fully developed/mapped components for JCB. They can be seen as demo content, or base images from which to start your project.
Always make sure you are on the latest version of JCB before importing any of these packages, should any of them fail to import please let us know." COM_COMPONENTBUILDER_ALL_THE_FIELDS_AND_VIEWS_FROM_YOUR_SQL_DUMP_HAS_BEEN_CREATED_AND_LINKED_TO_THIS_COMPONENT="All the fields and views from your sql dump has been created and linked to this component." @@ -1361,6 +1360,7 @@ COM_COMPONENTBUILDER_BTHE_TMP_FOLDER_HAS_BEEN_CLEARED_SUCCESSFULLYB="The tmp COM_COMPONENTBUILDER_BUILD="Build" COM_COMPONENTBUILDER_BUILDIN="Build-in" COM_COMPONENTBUILDER_BUILD_DATE="Build Date" +COM_COMPONENTBUILDER_BUILD_INNOVATE_AND_THRIVE_WITH_LLEWELLYN_ON_GITHUB_TURNING_IDEAS_INTO_IMPACT="Build, Innovate, and Thrive with Llewellyn on GitHub: Turning Ideas into Impact!" COM_COMPONENTBUILDER_BULK="Bulk" COM_COMPONENTBUILDER_BULK_GET_ALL_NEW_SNIPPETS="Bulk Get All New Snippets" COM_COMPONENTBUILDER_BULK_TOOLS="Bulk Tools" @@ -1657,6 +1657,7 @@ COM_COMPONENTBUILDER_CLONE_FAILED="Clone failed!" COM_COMPONENTBUILDER_CLOSE_NEW="Close & New" COM_COMPONENTBUILDER_CODE="Code" COM_COMPONENTBUILDER_CODESTRINGS="code/strings" +COM_COMPONENTBUILDER_COLLABORATE_AND_INNOVATE_WITH_LLEWELLYN_ON_GIT_BUILDING_A_BETTER_CODE_FUTURE="Collaborate and Innovate with Llewellyn on Git: Building a Better Code Future!" COM_COMPONENTBUILDER_COMMUNITY_PACKAGES="Community Packages" COM_COMPONENTBUILDER_COMPANY="Company" COM_COMPONENTBUILDER_COMPANY_NAME="Company Name" @@ -3010,7 +3011,6 @@ COM_COMPONENTBUILDER_COMPONENT_FILES_FOLDERS_SAVE_WARNING="Alias already existed COM_COMPONENTBUILDER_COMPONENT_FILES_FOLDERS_STATUS="Status" COM_COMPONENTBUILDER_COMPONENT_FILES_FOLDERS_VERSION_DESC="A count of the number of times this Component Files & Folders has been revised." COM_COMPONENTBUILDER_COMPONENT_FILES_FOLDERS_VERSION_LABEL="Version" -COM_COMPONENTBUILDER_COMPONENT_GLOBAL_SETTINGS="Component Global Settings" COM_COMPONENTBUILDER_COMPONENT_MODULES="Component Modules" COM_COMPONENTBUILDER_COMPONENT_MODULES_ADDJOOMLA_MODULES_DESCRIPTION="Setup the Joomla modules for this component." COM_COMPONENTBUILDER_COMPONENT_MODULES_ADDJOOMLA_MODULES_LABEL="Joomla Modules" @@ -3226,6 +3226,7 @@ COM_COMPONENTBUILDER_COMPONENT_ROUTER_SITEVIEW_LABEL="View" COM_COMPONENTBUILDER_COMPONENT_ROUTER_STATUS="Status" COM_COMPONENTBUILDER_COMPONENT_ROUTER_VERSION_DESC="A count of the number of times this Component Router has been revised." COM_COMPONENTBUILDER_COMPONENT_ROUTER_VERSION_LABEL="Version" +COM_COMPONENTBUILDER_COMPONENT_SETTINGS="Component Settings" COM_COMPONENTBUILDER_COMPONENT_SITE_VIEWS="Component Site Views" COM_COMPONENTBUILDER_COMPONENT_SITE_VIEWS_ACCESS_DESCRIPTION="Select if this view
should use access." COM_COMPONENTBUILDER_COMPONENT_SITE_VIEWS_ACCESS_LABEL="Add Access" @@ -3659,6 +3660,7 @@ COM_COMPONENTBUILDER_CONFIG_VDM_PACKAGES="VDM Packages" COM_COMPONENTBUILDER_CONFIG_VIEW_FIELD_LABEL="View & Field" COM_COMPONENTBUILDER_CONFIG_YES="Yes" COM_COMPONENTBUILDER_CONFIRMATION_STEP_BEFORE_IMPORTING="Confirmation Step Before Importing!" +COM_COMPONENTBUILDER_CONNECT_AND_ENGAGE_WITH_LLEWELLYN_ON_JOOMLA_SOCIAL_EMPOWERING_COMMUNITIES_ONE_POST_AT_A_TIME="Connect and Engage with Llewellyn on Joomla Social: Empowering Communities, One Post at a Time!" COM_COMPONENTBUILDER_CONTEXT="Context" COM_COMPONENTBUILDER_CONTRIBUTE_TO_JCB="Contribute to JCB" COM_COMPONENTBUILDER_CONTRIBUTOR="Contributor" @@ -4265,6 +4267,7 @@ COM_COMPONENTBUILDER_DISPLAY_SWITCH_FOR_DYNAMIC_PLACEMENT_IN_RELATION_TO_THE_USE COM_COMPONENTBUILDER_DIVERGED="Diverged" COM_COMPONENTBUILDER_DIVERGED_MEANS_YOUR_BLOCAL_SNIPPETB_WITH_THE_SAME_NAME_LIBRARY_AND_TYPE_HAS_A_BDIVERGEDB_FROM_THE_COMMUNITY_SNIPPET_WITH_THE_SAME_NAME_LIBRARY_AND_TYPE_IN_THAT_IT_DOES_NOT_HAVE_THE_SAME_BCREATIONB_OR_BMODIFIED_DATEB="Diverged means your local snippet (with the same name, library and type) has a diverged from the community snippet (with the same name, library and type) in that it does not have the same creation or modified date." COM_COMPONENTBUILDER_DOES_THIS_PACKAGE_REQUIRE_A_KEY_TO_INSTALL="Does this package require a key to install." +COM_COMPONENTBUILDER_DONATE_TOWARDS_JCB_HELP_LLEWELLYN_FINANCIALLY_SO_HE_CAN_CONTINUE_DEVELOPING_THIS_GREAT_TOOL="Donate towards JCB: Help Llewellyn financially so he can continue developing this great tool!" COM_COMPONENTBUILDER_DONATE_TO_JCB="Donate to JCB" COM_COMPONENTBUILDER_DONATIONS="Donations!" COM_COMPONENTBUILDER_DOWNLOAD_UPDATE="Download Update" @@ -4611,6 +4614,7 @@ COM_COMPONENTBUILDER_EVERY_LANGUAGE="Every language" COM_COMPONENTBUILDER_EXACT_LENGTH_ONLY_FOUR_TEXT_FIELD="Exact Length (only 4 text_field)" COM_COMPONENTBUILDER_EXAMPLE="Example" COM_COMPONENTBUILDER_EXIT_TRASH="Exit trash" +COM_COMPONENTBUILDER_EXPLORE_LEARN_AND_CREATE_WITH_LLEWELLYN_ON_YOUTUBE_YOUR_GATEWAY_TO_INSPIRATION="Explore, Learn, and Create with Llewellyn on YouTube: Your Gateway to Inspiration!" COM_COMPONENTBUILDER_EXPORTIMPORT_DATA="Export/Import Data" COM_COMPONENTBUILDER_EXPORT_COMPLETED="Export Completed!" COM_COMPONENTBUILDER_EXPORT_FAILED_PLEASE_TRY_AGAIN_LATTER="Export failed, please try again latter!" @@ -5497,8 +5501,6 @@ COM_COMPONENTBUILDER_JCB_PACKAGE_INFO_PATH_DOES_NOT_WORK_WE_ADVICE_YOU_BNOT_TO_C COM_COMPONENTBUILDER_JCB_PROMOTES_EFFICIENCY="JCB Promotes Efficiency" COM_COMPONENTBUILDER_JCB_PROMOTES_GOODWILL="JCB Promotes Goodwill" COM_COMPONENTBUILDER_JCB_PROVIDES_A_BETTER_EXPERIENCE="JCB Provides a Better Experience" -COM_COMPONENTBUILDER_JCB_PRO_BOARD="JCB Pro board" -COM_COMPONENTBUILDER_JCB_PRO_NOTICE_BOARD="JCB Pro Notice Board" COM_COMPONENTBUILDER_JCB_REDUCES_DEVELOPMENT_COSTS="JCB Reduces Development Costs" COM_COMPONENTBUILDER_JCB_SAVES_TIME="JCB Saves Time" COM_COMPONENTBUILDER_JCB_STREAMLINES_DEVELOPMENT="JCB Streamlines Development" @@ -5516,9 +5518,12 @@ COM_COMPONENTBUILDER_JCB_YOUR_SUPPORT_MATTERS_MOST="JCB: Your Support Matters Mo COM_COMPONENTBUILDER_JOIN_FIELDS="Join Fields" COM_COMPONENTBUILDER_JOIN_JCBS_COMMUNITY="Join JCB's Community" COM_COMPONENTBUILDER_JOIN_JCBS_JOURNEY="Join JCB's Journey" +COM_COMPONENTBUILDER_JOIN_JCBS_LEAD_DEVELOPER_ON_JOOMLA_SOCIAL_A_MASTODON_INSTANCE="Join JCB's lead developer on Joomla! social a Mastodon instance." COM_COMPONENTBUILDER_JOIN_JCBS_MISSION="Join JCB's Mission" COM_COMPONENTBUILDER_JOIN_JCBS_SUCCESS="Join JCB's Success" COM_COMPONENTBUILDER_JOIN_JCBS_VISION="Join JCB's Vision" +COM_COMPONENTBUILDER_JOIN_LLEWELLYN_ON_THE_JOOMLA_VOLUNTEER_PORTAL_SHAPING_THE_FUTURE_TOGETHER="Join Llewellyn on the Joomla Volunteer Portal: Shaping the Future Together!" +COM_COMPONENTBUILDER_JOIN_THE_CONVERSATION_WITH_LLEWELLYN_ON_X_WHERE_IDEAS_TAKE_FLIGHT="Join the Conversation with Llewellyn on X: Where Ideas Take Flight!" COM_COMPONENTBUILDER_JOIN_TYPE="Join Type" COM_COMPONENTBUILDER_JOOMLA_COMPONENT="Joomla Component" COM_COMPONENTBUILDER_JOOMLA_COMPONENTS="Joomla Components" @@ -5722,6 +5727,7 @@ COM_COMPONENTBUILDER_JOOMLA_COMPONENT_GUID_DESCRIPTION="Globally Unique Identifi COM_COMPONENTBUILDER_JOOMLA_COMPONENT_GUID_HINT="Auto Generated" COM_COMPONENTBUILDER_JOOMLA_COMPONENT_GUID_LABEL="GUID" COM_COMPONENTBUILDER_JOOMLA_COMPONENT_ID="Id" +COM_COMPONENTBUILDER_JOOMLA_COMPONENT_IMAGE="Joomla Component Image" COM_COMPONENTBUILDER_JOOMLA_COMPONENT_IMAGE_DESCRIPTION="The component image (product box) for the dashboard and install page, must be 300px X 300px." COM_COMPONENTBUILDER_JOOMLA_COMPONENT_IMAGE_LABEL="Component Image" COM_COMPONENTBUILDER_JOOMLA_COMPONENT_INTELLIGENT_ADDREMOVEIF="Intelligent (add&remove+if)" @@ -7533,6 +7539,8 @@ COM_COMPONENTBUILDER_LINK_LOCAL_DYNAMIC="Link & Local (dynamic)" COM_COMPONENTBUILDER_LINK_TO_THE_CONTRIBUTOR="Link to the contributor" COM_COMPONENTBUILDER_LIST_FIELD="List Field" COM_COMPONENTBUILDER_LIST_VIEW="List View" +COM_COMPONENTBUILDER_LLEWELLYNS_JOOMLA_SOCIAL_FEED="Llewellyn's Joomla! Social Feed" +COM_COMPONENTBUILDER_LLEWELLYN_ON_DOCKER_CONTAINERIZE_YOUR_CREATIVITY="Llewellyn on Docker: Containerize Your Creativity!" COM_COMPONENTBUILDER_LOADING="loading" COM_COMPONENTBUILDER_LOADING_THE_PRIVATE_KEY_FILE_FAILED="Loading the private key file failed" COM_COMPONENTBUILDER_LOADING_THE_PRIVATE_KEY_TEXT_FAILED="Loading the private key text failed" @@ -7929,6 +7937,7 @@ COM_COMPONENTBUILDER_PUSH="Push" COM_COMPONENTBUILDER_PUSH_FAILED="Push Failed!" COM_COMPONENTBUILDER_READY_TO_COMPILE_A_COMPONENT="Ready to compile a component" COM_COMPONENTBUILDER_REFRESH="Refresh" +COM_COMPONENTBUILDER_REFRESH_FEED="Refresh Feed" COM_COMPONENTBUILDER_REGEX_SEARCH="Regex Search" COM_COMPONENTBUILDER_REMOVE="Remove" COM_COMPONENTBUILDER_REMOVING_ALL_ZIP_PACKAGES_FROM_THE_TEMPORARY_FOLDER_OF_THE_JOOMLA_INSTALL="Removing all zip packages from the temporary folder of the Joomla install" @@ -9145,7 +9154,6 @@ COM_COMPONENTBUILDER_THE_POWER_HAS_SUCCESSFULLY_BEEN_PUSHED="The power has succe COM_COMPONENTBUILDER_THE_POWER_HAS_SUCCESSFULLY_BEEN_RESET="The power has successfully been reset." COM_COMPONENTBUILDER_THE_PRIVATE_KEY_FIELD_COULD_NOT_BE_LOADED_FOR_BSB_SERVER="The private key field could not be loaded for %s server!" COM_COMPONENTBUILDER_THE_PRIVATE_KEY_FILE_COULD_NOT_BE_LOADEDFOUND_FOR_BSB_SERVER="The private key file could not be loaded/found for %s server!" -COM_COMPONENTBUILDER_THE_PRO_BOARD_IS_LOADING="The pro board is loading" COM_COMPONENTBUILDER_THE_PUSH_OF_THESE_JOOMLA_FIELD_TYPES_HAS_FAILED="The push of these Joomla Field Types has failed." COM_COMPONENTBUILDER_THE_PUSH_OF_THESE_JOOMLA_POWERS_HAS_FAILED="The push of these Joomla Powers has failed." COM_COMPONENTBUILDER_THE_PUSH_OF_THESE_POWERS_HAS_FAILED="The push of these Powers has failed." @@ -9252,6 +9260,7 @@ COM_COMPONENTBUILDER_TYPE_TEMPLATE="Template" COM_COMPONENTBUILDER_TYPE_VALIDATION_RULE="Validation Rule" COM_COMPONENTBUILDER_UNACTIVE_ONLY_FOUR_TEXT_FIELD="Unactive (only 4 text_field)" COM_COMPONENTBUILDER_UNDERNEATH_TABS="Underneath Tabs" +COM_COMPONENTBUILDER_UNLOCK_TRUST_AND_SECURITY_WITH_LLEWELLYNS_GPG_KEY_YOUR_GATEWAY_TO_VERIFIED_CONNECTIONS="Unlock Trust and Security with Llewellyn's GPG Key: Your Gateway to Verified Connections!" COM_COMPONENTBUILDER_UPDATE="Update" COM_COMPONENTBUILDER_UPDATE_ALL="Update All" COM_COMPONENTBUILDER_UPDATE_ALL_DIVERGED_SNIPPETS="Update All Diverged Snippets" @@ -9350,7 +9359,6 @@ COM_COMPONENTBUILDER_VALIDATION_RULE_STATUS="Status" COM_COMPONENTBUILDER_VALIDATION_RULE_VERSION_DESC="A count of the number of times this Validation Rule has been revised." COM_COMPONENTBUILDER_VALIDATION_RULE_VERSION_LABEL="Version" COM_COMPONENTBUILDER_VALUE="Value" -COM_COMPONENTBUILDER_VDM_BOARD="VDM board" COM_COMPONENTBUILDER_VDM_NOTICE_BOARD="VDM Notice Board" COM_COMPONENTBUILDER_VDM_PACKAGES="VDM Packages" COM_COMPONENTBUILDER_VERSION="Version" @@ -9396,9 +9404,6 @@ COM_COMPONENTBUILDER_YES="Yes" COM_COMPONENTBUILDER_YES_UPDATE_ALL="Yes! Update ALL" COM_COMPONENTBUILDER_YOUR_ARE_ABOUT_TO_UPDATE_BALLB_VALUES_THAT_CAN_BE_FOUND_IN_THE_DATABASE="Your are about to update ALL values that can be found in the database." COM_COMPONENTBUILDER_YOUR_ARE_ABOUT_TO_UPDATE_ROW="Your are about to update row" -COM_COMPONENTBUILDER_YOUR_COMPONENT_WILL_BE_COMPILED_TO_WORK_IN_JOOMLA_FIVE="Your component will be compiled to work in Joomla 5" -COM_COMPONENTBUILDER_YOUR_COMPONENT_WILL_BE_COMPILED_TO_WORK_IN_JOOMLA_FOUR="Your component will be compiled to work in Joomla 4" -COM_COMPONENTBUILDER_YOUR_COMPONENT_WILL_BE_COMPILED_TO_WORK_IN_JOOMLA_THREE="Your component will be compiled to work in Joomla 3" COM_COMPONENTBUILDER_YOUR_DATA_IS_ENCRYPTED_WITH_A_AES_TWO_HUNDRED_AND_FIFTY_SIX_BIT_ENCRYPTION_USING_THE_ABOVE_THIRTY_TWO_CHARACTER_KEY="Your data is encrypted with a AES 256 bit encryption using the above 32 character key." COM_COMPONENTBUILDER_YOUR_FILE_WAS_IS_LARGER_THAN_THE_ALLOWED_SIZE="Your file was is larger than the allowed size." COM_COMPONENTBUILDER_YOU_ARE_CURRENTLY_VIEWING_THE_TRASHED_ITEMS="You are currently viewing the trashed items." diff --git a/admin/layouts/jcbnoticeboardpro.php b/admin/layouts/jcbnoticeboard.php similarity index 61% rename from admin/layouts/jcbnoticeboardpro.php rename to admin/layouts/jcbnoticeboard.php index 31cdf40de..b72db286d 100644 --- a/admin/layouts/jcbnoticeboardpro.php +++ b/admin/layouts/jcbnoticeboard.php @@ -23,8 +23,8 @@ defined('JPATH_BASE') or die; ?> -
- -
.
-
JCB PRO
-
+
+ +
+ +
diff --git a/admin/layouts/jcbnoticeboardtabs.php b/admin/layouts/jcbnoticeboardtabs.php deleted file mode 100644 index 0e27e6030..000000000 --- a/admin/layouts/jcbnoticeboardtabs.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @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 - */ - - - -use Joomla\CMS\Factory; -use Joomla\CMS\Language\Text; -use Joomla\CMS\HTML\HTMLHelper as Html; -use Joomla\CMS\Layout\LayoutHelper; -use VDM\Component\Componentbuilder\Administrator\Helper\ComponentbuilderHelper; - -// No direct access to this file -defined('JPATH_BASE') or die; - - - -?> -
- $displayData['active'] . '-noticeboard')); ?> - - -
- - - -
- - -
diff --git a/admin/layouts/jcbnoticeboardvdm.php b/admin/layouts/jcbnoticeboardvdm.php deleted file mode 100644 index b7d86e150..000000000 --- a/admin/layouts/jcbnoticeboardvdm.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @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 - */ - - - -use Joomla\CMS\Factory; -use Joomla\CMS\Language\Text; -use Joomla\CMS\HTML\HTMLHelper as Html; -use Joomla\CMS\Layout\LayoutHelper; -use VDM\Component\Componentbuilder\Administrator\Helper\ComponentbuilderHelper; - -// No direct access to this file -defined('JPATH_BASE') or die; - - - -?> -
- -
.
- -
diff --git a/admin/layouts/jcbsupportmessage.php b/admin/layouts/jcbsupportmessage.php index 52a97477b..c7f59d4ec 100644 --- a/admin/layouts/jcbsupportmessage.php +++ b/admin/layouts/jcbsupportmessage.php @@ -116,9 +116,25 @@ $support_button = $button_names[random_int(0, 32)]; ?>

- +

- +
diff --git a/admin/layouts/mastodon.php b/admin/layouts/mastodon.php new file mode 100644 index 000000000..214ad047b --- /dev/null +++ b/admin/layouts/mastodon.php @@ -0,0 +1,74 @@ + + * @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 + */ + + + +use Joomla\CMS\Factory; +use Joomla\CMS\Language\Text; +use Joomla\CMS\HTML\HTMLHelper as Html; +use Joomla\CMS\Layout\LayoutHelper; +use VDM\Component\Componentbuilder\Administrator\Helper\ComponentbuilderHelper; + +// No direct access to this file +defined('JPATH_BASE') or die; + +// Extract all keys from $displayData as individual variables. +extract($displayData ?? []); + +// The 'id' parameter, defaulting to mastodon-feed. +$id ??= 'mastodon-feed'; + +// The button 'id' parameter, defaulting to refresh-feed. +$button_id ??= 'refresh-feed'; + +// The mastodon instance URL +$instance ??= 'https://joomla.social'; + +// The user account ID +$account ??= '112766899254600077'; + +// The number of post to load +$posts ??= 5; + +// The 'invite_url' parameter, defaulting to https://joomla.social/invite/gzAvC48K. +$invite_url ??= 'https://joomla.social/invite/gzAvC48K'; + +// The 'invite_heading' parameter. +$invite_heading ??= Text::_("COM_COMPONENTBUILDER_LLEWELLYNS_JOOMLA_SOCIAL_FEED"); + +// The 'invite_title' parameter. +$invite_title ??= Text::_("COM_COMPONENTBUILDER_JOIN_JCBS_LEAD_DEVELOPER_ON_JOOMLA_SOCIAL_A_MASTODON_INSTANCE"); + +?> +
+

+ + +    + + + +

+
+
+ +
diff --git a/admin/layouts/socialnetworking.php b/admin/layouts/socialnetworking.php new file mode 100644 index 000000000..b26dd4aaf --- /dev/null +++ b/admin/layouts/socialnetworking.php @@ -0,0 +1,64 @@ + + * @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 + */ + + + +use Joomla\CMS\Factory; +use Joomla\CMS\Language\Text; +use Joomla\CMS\HTML\HTMLHelper as Html; +use Joomla\CMS\Layout\LayoutHelper; +use VDM\Component\Componentbuilder\Administrator\Helper\ComponentbuilderHelper; + +// No direct access to this file +defined('JPATH_BASE') or die; + + + +?> + +
+ + diff --git a/admin/sql/install.mysql.utf8.sql b/admin/sql/install.mysql.utf8.sql index 391b1ab87..ee93d661f 100644 --- a/admin/sql/install.mysql.utf8.sql +++ b/admin/sql/install.mysql.utf8.sql @@ -2108,7 +2108,7 @@ INSERT INTO `#__componentbuilder_joomla_plugin` (`id`, `add_head`, `add_php_meth (21, '', '', '', '', 1, '', '', '', '', '', '', '', '', 1, 'Plugin to autoload the powers of componentbuilder', '{}', '86dd28b5-18d4-437e-8a53-7eaf23478fc8', '', 8, '{}', 'CS8qKg0KCSAqIEFwcGxpY2F0aW9uIG9iamVjdA0KCSAqDQoJICogQHZhciAgICBDTVNBcHBsaWNhdGlvbg0KCSAqIEBzaW5jZSAgMS4wLjANCgkgKi8NCglwcm90ZWN0ZWQgICRhcHA7DQoNCgkvKioNCgkgKiBBZmZlY3RzIGNvbnN0cnVjdG9yIGJlaGF2aW9yLiBJZiB0cnVlLCBsYW5ndWFnZSBmaWxlcyB3aWxsIGJlIGxvYWRlZCBhdXRvbWF0aWNhbGx5Lg0KCSAqDQoJICogQHZhciAgICBib29sZWFuDQoJICogQHNpbmNlICAxLjAuMA0KCSAqLw0KCXByb3RlY3RlZCAgJGF1dG9sb2FkTGFuZ3VhZ2UgPSBmYWxzZTsNCg0KCS8qKg0KCSAqIENvbnN0cnVjdG9yLg0KCSAqDQoJICogQHBhcmFtICAgb2JqZWN0ICAmJHN1YmplY3QgIFRoZSBvYmplY3QgdG8gb2JzZXJ2ZSAtLSBldmVudCBkaXNwYXRjaGVyLg0KCSAqIEBwYXJhbSAgIG9iamVjdCAgJGNvbmZpZyAgICBBbiBvcHRpb25hbCBhc3NvY2lhdGl2ZSBhcnJheSBvZiBjb25maWd1cmF0aW9uIHNldHRpbmdzLg0KCSAqDQoJICogQHNpbmNlICAgMS42DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzdWJqZWN0LCAkY29uZmlnKQ0KCXsNCgkJcGFyZW50OjpfX2NvbnN0cnVjdCgkc3ViamVjdCwgJGNvbmZpZyk7IyMjUExVR0lOX1BPV0VSX0FVVE9MT0FERVIjIyMNCgl9', '[[[Component]]] Powers Autoloader', '', '', '', 'Ly8gV0hBVD8=', '', '', '', '1.0.1', '{\"property_selection0\":{\"property\":\"25\"},\"property_selection1\":{\"property\":\"27\"}}', 'WW91IGNhbiB1c2UgYWxsIHRoZSBub3JtYWwgbWFya2Rvd24sIGluY2x1ZGluZyB0aGUgcGxhY2UtaG9sZGVycy4=', '', '', '', 'Powers Autoloader', '', 1, '', '', 1, '2021-11-11 02:22:02', '2024-03-01 21:18:38', 16, '', 8), (24, '', '', '', '', 1, '', '', '', '', '', '', '', '', 1, 'Add Access Token to easy update [[[Component]]]', '{}', '29ac30d2-1c1a-4b9e-9cfa-c5fcb08caa01', 'dXNlIEpvb21sYVxDTVNcQXBwbGljYXRpb25cQ01TQXBwbGljYXRpb247DQp1c2UgSm9vbWxhXENNU1xQbHVnaW5cQ01TUGx1Z2luOw==', 12, '{\"method_selection0\":{\"method\":\"103\"}}', 'CS8qKg0KCSAqIEFwcGxpY2F0aW9uIG9iamVjdA0KCSAqDQoJICogQHZhciAgICBDTVNBcHBsaWNhdGlvbg0KCSAqIEBzaW5jZSAgMS4wLjANCgkgKi8NCglwcm90ZWN0ZWQgICRhcHA7DQoNCgkvKioNCgkgKiBBZmZlY3RzIGNvbnN0cnVjdG9yIGJlaGF2aW9yLiBJZiB0cnVlLCBsYW5ndWFnZSBmaWxlcyB3aWxsIGJlIGxvYWRlZCBhdXRvbWF0aWNhbGx5Lg0KCSAqDQoJICogQHZhciAgICBib29sZWFuDQoJICogQHNpbmNlICAxLjAuMA0KCSAqLw0KCXByb3RlY3RlZCAgJGF1dG9sb2FkTGFuZ3VhZ2UgPSB0cnVlOw0KDQoJLyoqDQoJICogb25JbnN0YWxsZXJCZWZvcmVQYWNrYWdlRG93bmxvYWQuDQoJICoNCgkgKiBGb3IgbW9kaWZpY2F0aW9uIG9mIFVSTCBhbmQgaGVhZGVycyBiZWZvcmUgcGFja2FnZSBkb3dubG9hZA0KCSAqDQoJICogQHJldHVybiAgdm9pZA0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIG9uSW5zdGFsbGVyQmVmb3JlUGFja2FnZURvd25sb2FkKCYkdXJsLCAmJGhlYWRlcnMpDQoJew0KCQkvLyBzZXQgdGhlIFVSSSBvYmplY3QNCgkJJHVyaSA9IEpvb21sYV9fX2VlY2MxNDNlX2I1Y2ZfNGMzM19iYTRkXzk3ZGExZGY2MTQyMl9fX1Bvd2VyOjpnZXRJbnN0YW5jZSgkdXJsKTsNCgkJJHBhcnRzID0gZXhwbG9kZSgnLycsICR1cmktPmdldFBhdGgoKSk7DQoNCgkJLy8gY2hlY2sgdGhhdCB0aGlzIGlzIG91ciBBUEkNCgkJaWYgKCR1cmktPmdldEhvc3QoKSA9PSAnW1tbZ2l0ZWFfdXJsXV1dJyAmJiBpbl9hcnJheSgnW1tbZ2l0ZWFfcGFja2FnZV9uYW1lXV1dJywgJHBhcnRzKSkNCgkJew0KCQkJLy8gZ2V0IHRoZSB0b2tlbiBpZiBzZXQNCgkJCSR0b2tlbiA9IEpvb21sYV9fX2FlYjhlNDYzXzI5MWZfNDQ0NV85YWM0XzM0YjYzN2MxMmRiZF9fX1Bvd2VyOjpnZXRQYXJhbXMoJ2NvbV9bW1tjb21wb25lbnRdXV0nKS0+Z2V0KCdnaXRlYV90b2tlbicsIGZhbHNlKTsNCgkJCS8vIG9ubHkgYWRkIGlmIHRva2VuIGlzIHNldA0KCQkJaWYgKCR0b2tlbikNCgkJCXsNCgkJCQkvLyBhZGQgdGhlIHRva2VuDQoJCQkJJHVyaS0+c2V0VmFyKCdhY2Nlc3NfdG9rZW4nLCAkdG9rZW4pOw0KCQkJCS8vIHVwZGF0ZSB0aGUgVVJMDQoJCQkJJHVybCA9ICR1cmktPnRvU3RyaW5nKCk7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJLy8gc2V0IHRoZSByZXR1cm4gVVJMDQoJCQkJJHJldHVybiA9IHVybGVuY29kZShiYXNlNjRfZW5jb2RlKChzdHJpbmcpIEpvb21sYV9fX2VlY2MxNDNlX2I1Y2ZfNGMzM19iYTRkXzk3ZGExZGY2MTQyMl9fX1Bvd2VyOjpnZXRJbnN0YW5jZSgpKSk7DQoJCQkJLy8gc2V0IHRoZSB1cmxzDQoJCQkJJGdldF9hY2Nlc3NfdG9rZW5fdXJsID0gJyJodHRwczovL1tbW2dpdGVhX3VybF1dXS91c2VyL3NldHRpbmdzL2FwcGxpY2F0aW9ucyIgdGFyZ2V0PSJfYmxhbmsiIHRpdGxlPSInIC4gVGV4dDo6XygnR2V0IEFjY2VzcyBUb2tlbicpIC4gJyInOw0KCQkJCSRzZXRfYWNjZXNzX3Rva2VuX3VybCA9ICciJyAuIEpvb21sYV9fX2VlY2MxNDNlX2I1Y2ZfNGMzM19iYTRkXzk3ZGExZGY2MTQyMl9fX1Bvd2VyOjpyb290KCkgLiAnYWRtaW5pc3RyYXRvci9pbmRleC5waHA/b3B0aW9uPWNvbV9jb25maWcmdmlldz1jb21wb25lbnQmY29tcG9uZW50PWNvbV9bW1tjb21wb25lbnRdXV0mcGF0aD0mcmV0dXJuPScgLiAkcmV0dXJuIC4gJyIgdGl0bGU9IicgLiBUZXh0OjpfKCdTZXQgQWNjZXNzIFRva2VuJykgLiAnIic7DQoJCQkJLy8gbG9hZCB0aGUgbWVzc2FnZQ0KCQkJCSR0aGlzLT5hcHAtPmVucXVldWVNZXNzYWdlKA0KCQkJCQlUZXh0OjpzcHJpbnRmKCJJZiB0aGVyZSB3YXMgYSBkb3dubG9hZC91cGRhdGUgZXJyb3IsIGl0J3MgcHJvYmFibHkgYmVjYXVzZSB0aGUgPGEgaHJlZj0lcyA+QVBJIEFjY2VzcyBUb2tlbjwvYT4gZm9yIHVwZGF0ZXMgb2YgW1tbY29tcG9uZW50XV1dIGhhcyBub3QgYmVlbiBzZXQsIHlvdSBjYW4gc2V0IHRoaXMgYWNjZXNzIHRva2VuIGluIHRoZSA8YSBocmVmPSVzID5nbG9iYWwgb3B0aW9ucyB0YWI8L2E+LiIsDQoJCQkJCQkkZ2V0X2FjY2Vzc190b2tlbl91cmwsDQoJCQkJCQkkc2V0X2FjY2Vzc190b2tlbl91cmwNCgkJCQkJKSwgJ25vdGljZScpOw0KCQkJfQ0KCQl9DQoJfQ0K', 'componentbuilder', '', '', '', 'Ly8gbmVlZHMgZml4', '', '', '', '1.0.2', '{\"property_selection0\":{\"property\":\"39\"},\"property_selection1\":{\"property\":\"37\"}}', 'WW91IGNhbiB1c2UgYWxsIHRoZSBub3JtYWwgbWFya2Rvd24sIGluY2x1ZGluZyB0aGUgcGxhY2UtaG9sZGVycy4=', '', '', '', 'Update (git.vdm.dev)', '', 1, '', '', 1, '2021-12-08 07:42:39', '2024-08-06 20:57:44', 18, '', 9), (28, 1, '', '', '', 1, '', '', '', '', '', '', '', 1, 1, 'This plugin is used to load PreUpVer on your website. So it adds https://cdn.jsdelivr.net/gh/Llewellynvdm/PreUpVer@1.0.0/dist/js/preupver.min.js to the header of your website. See: https://git.vdm.dev/Llewellyn/PreUpVer for more details.', '{}', 'dd6580c4-6bbb-4d13-a868-0b38fbb6a66e', 'dXNlIEpvb21sYVxDTVNcUGx1Z2luXENNU1BsdWdpbjsNCnVzZSBKb29tbGFcQ01TXEh0bWxcSFRNTEhlbHBlcjsNCg==', 8, '{\"method_selection0\":{\"method\":\"122\"}}', 'CS8qKg0KCSAqIEFwcGxpY2F0aW9uIG9iamVjdA0KCSAqDQoJICogQHZhciAgICBDTVNBcHBsaWNhdGlvbg0KCSAqIEBzaW5jZSAgMS4wLjANCgkgKi8NCglwcm90ZWN0ZWQgICRhcHA7DQoNCgkvKioNCgkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBoZWFkIGlzIGNvbXBpbGVkIGFuZCBhbGxvd3MgbWFuaXB1bGF0aW9uIG9mIHRoZSBoZWFkIGRhdGEuDQoJICogSW4gdGhpcyBjYXNlLCBpdCdzIHVzZWQgdG8gYWRkIGEgSmF2YVNjcmlwdCBmaWxlIHRvIHRoZSBmcm9udCBlbmQgb2YgdGhlIEpvb21sYSBzaXRlLg0KCSAqDQoJICogQHJldHVybiAgdm9pZA0KCSAqDQoJICogQHNpbmNlICAgMy4wLjANCgkgKiBAdGhyb3dzICBFeGNlcHRpb24gb24gZXJyb3IuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIG9uQmVmb3JlQ29tcGlsZUhlYWQoKQ0KCXsNCgkJLy8gQ2hlY2sgaWYgd2UgYXJlIGluIHRoZSBzaXRlIGFwcGxpY2F0aW9uDQoJCWlmICgkdGhpcy0+YXBwLT5pc0NsaWVudCgnc2l0ZScpKSB7DQoJCQlIVE1MSGVscGVyOjpfKCdzY3JpcHQnLCAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL0xsZXdlbGx5bnZkbS9QcmVVcFZlckAxLjAuMC9kaXN0L2pzL3ByZXVwdmVyLm1pbi5qcycsIFsndmVyc2lvbicgPT4gJ2F1dG8nXSk7DQoJCX0NCgl9', 'PreUpVerLoader', '', '', '', 'CQkJJGp2ZXJzaW9uID0gbmV3IEpWZXJzaW9uKCk7DQoJCQlpZiAoISRqdmVyc2lvbi0+aXNDb21wYXRpYmxlKCczLjEwLjAnKSkgew0KCQkJCSRhcHAtPmVucXVldWVNZXNzYWdlKCdQbGVhc2UgdXBncmFkZSB0byBhdCBsZWFzdCBKb29tbGEhIDMuMTAgYmVmb3JlIGNvbnRpbnVpbmchJywgJ2Vycm9yJyk7DQoJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfQ0K', '', '', '', '1.0.0', '{\"property_selection0\":{\"property\":\"25\"}}', 'IyBQcmVVcFZlciBMb2FkZXIgKFtbW3BsdWdpbi52ZXJzaW9uXV1dKQ0KDQojIyBJbnRyb2R1Y3Rpb24NCg0KUHJlVXBWZXIgaXMgYSB2ZXJzYXRpbGUgSmF2YVNjcmlwdCBsaWJyYXJ5IGRlc2lnbmVkIHRvIGF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZSB2ZXJzaW9uIG51bWJlcnMgb2YgbGlicmFyeSBzY3JpcHRzIGluIHlvdXIgZG9jdW1lbnRhdGlvbi4gSXQgaWRlbnRpZmllcyBzcGVjaWZpYyBgPHByZT5gIHRhZ3Mgb24geW91ciB3ZWJwYWdlIGFuZCB1cGRhdGVzIHRoZW0gd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gdGFnIGZldGNoZWQgZnJvbSBhIHNwZWNpZmllZCByZXBvc2l0b3J5LCBlbnN1cmluZyB5b3VyIGRvY3VtZW50YXRpb24gYWx3YXlzIGRpc3BsYXlzIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24uDQoNCiMjIEhvdyBJdCBXb3Jrcw0KDQpQcmVVcFZlciBvcGVyYXRlcyBieSBzZWFyY2hpbmcgZm9yIGA8cHJlPmAgdGFncyB3aXRoIGEgZGVzaWduYXRlZCBjbGFzcyAoYHByZXVwdmVyYCkgYW5kIHVzaW5nIHRoZWlyIGRhdGEgYXR0cmlidXRlcyB0byBwZXJmb3JtIHZlcnNpb24gdXBkYXRlcy4gSXQgc2ltcGxpZmllcyB0aGUgcHJvY2VzcyBvZiBrZWVwaW5nIHlvdXIgbGlicmFyeSByZWZlcmVuY2VzIHVwLXRvLWRhdGUgaW4gZG9jdW1lbnRhdGlvbi4NCg0KIyMjIEF1dG9tYXRpYyBEZXRlY3Rpb24gYW5kIFVwZGF0aW5nDQoNCldoZW4gdGhlIHdlYnBhZ2UgbG9hZHMsIFByZVVwVmVyIGZpbmRzIGFsbCBgPHByZT5gIHRhZ3MgbWFya2VkIHdpdGggdGhlIGBwcmV1cHZlcmAgY2xhc3MuIEl0IHRoZW4gZXh0cmFjdHMgbmVjZXNzYXJ5IGRldGFpbHMgZnJvbSB0aGVpciBkYXRhIGF0dHJpYnV0ZXMgYW5kIHVwZGF0ZXMgZWFjaCB0YWcgd2l0aCB0aGUgbGF0ZXN0IGxpYnJhcnkgdmVyc2lvbi4NCg0KIyMjIFVzYWdlDQoNCjEuICoqTWFya2luZyBgPHByZT5gIFRhZ3M6KioNCg0KICAgQWRkIHRoZSBgY2xhc3M9InByZXVwdmVyImAgdG8gYDxwcmU+YCB0YWdzIGluIHlvdXIgSFRNTCBhbmQgZGVmaW5lIHRoZSByZXF1aXJlZCBkYXRhIGF0dHJpYnV0ZXMgZm9yIGF1dG9tYXRpYyB1cGRhdGluZzoNCg0KICAgYGBgaHRtbA0KICAgPHByZSBpZD0idW5pcXVlLWlkIiBjbGFzcz0icHJldXB2ZXIiDQogICAgICAgIGRhdGEtYXBpLXVybD0iaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy91c2VybmFtZS9saWJyYXJ5L3RhZ3MiDQogICAgICAgIGRhdGEtZGVzY3JpcHRpb249IkRlc2NyaXB0aW9uIG9mIHRoZSBsaWJyYXJ5IHNjcmlwdCINCiAgICAgICAgZGF0YS11cmw9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC91c2VybmFtZS9saWJyYXJ5QCR7dmVyc2lvbn0vZGlzdC9saWJyYXJ5Lm1pbi5qcyI+DQogICA8L3ByZT4NCiAgIGBgYA0KDQogICBSZXBsYWNlIGB1bmlxdWUtaWRgLCBgdXNlcm5hbWVgLCBgbGlicmFyeWAsIGFuZCBvdGhlciBwbGFjZWhvbGRlcnMgd2l0aCB5b3VyIHNwZWNpZmljIGRldGFpbHMuDQoNCjIuICoqQXR0cmlidXRlcyBFeHBsYWluZWQ6KioNCg0KICAgLSBgaWRgOiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYDxwcmU+YCB0YWcuDQogICAtIGBkYXRhLWFwaS11cmxgOiBUaGUgQVBJIFVSTCB0byBmZXRjaCB0aGUgbGF0ZXN0IGxpYnJhcnkgdmVyc2lvbi4NCiAgIC0gYGRhdGEtZGVzY3JpcHRpb25gOiBBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWJyYXJ5IHNjcmlwdC4NCiAgIC0gYGRhdGEtdXJsYDogVGhlIFVSTCBvZiB0aGUgc2NyaXB0LCB3aGVyZSBgJHt2ZXJzaW9ufWAgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBudW1iZXIuDQoNCiMjIyBFeGFtcGxlDQoNCkNoZWNrIG91dCB0aGUgW3Rlc3RzXShodHRwczovL2dpdC52ZG0uZGV2L0xsZXdlbGx5bi9QcmVVcFZlci9zcmMvYnJhbmNoL21hc3Rlci90ZXN0cy8pIGZvbGRlciBmb3IgdGhlIGV4YW1wbGVzIHdlIHVzZSB0byB0ZXN0IGlmIHRoaXMgbGlicmFyeSB3b3JrcyBhcyBleHBlY3RlZC4NCg0KIyBCdWlsZCBEZXRhaWxzDQoNCisgKkF1dGhvcio6IFtMbGV3ZWxseW4gdmFuIGRlciBNZXJ3ZV0obWFpbHRvOmpvb21sYUB2ZG0uaW8pDQorICpOYW1lKjogW1ByZVVwVmVyIExvYWRlcl0oaHR0cHM6Ly9naXQudmRtLmRldi9MbGV3ZWxseW4vUHJlVXBWZXIpDQorICpGaXJzdCBCdWlsZCo6ICMjI0NSRUFUSU9OREFURSMjIw0KKyAqTGFzdCBCdWlsZCo6ICMjI0JVSUxEREFURSMjIw0KKyAqVmVyc2lvbio6IFtbW3BsdWdpbi52ZXJzaW9uXV1dDQorICpDb3B5cmlnaHQqOiAjIyNDT1BZUklHSFQjIyMNCisgKkxpY2Vuc2UqOiAjIyNMSUNFTlNFIyMjDQoNCj4gVGhpcyAqKnBsdWdpbioqIHdhcyBidWlsZCB3aXRoIGEgSm9vbWxhIFtBdXRvbWF0ZWQgQ29tcG9uZW50IEJ1aWxkZXJdKGh0dHBzOi8vd3d3Lmpvb21sYWNvbXBvbmVudGJ1aWxkZXIuY29tKS4NCj4gRGV2ZWxvcGVkIGJ5IFtMbGV3ZWxseW4gdmFuIGRlciBNZXJ3ZV0obWFpbHRvOmpvb21sYUB2ZG0uaW8p', '', '', '', 'PreUpVer Loader', '', 1, '', '', 1, '2023-11-28 09:01:02', '2024-08-06 20:58:28', 6, '', 2), -(46, 1, '', '', '', 1, '', '', '', '', '', '', '', '', 1, 'Add Access Token to easy update [[[Component]]]', '{}', '5236660d-5dee-492b-925c-15b96cb6ea44', 'dXNlIEpvb21sYVxDTVNcVXJpXFVyaTsNCnVzZSBKb29tbGFcQ01TXExhbmd1YWdlXFRleHQ7DQp1c2UgSm9vbWxhXENNU1xDb21wb25lbnRcQ29tcG9uZW50SGVscGVyOw==', 12, '{\"method_selection0\":{\"method\":\"103\"}}', 'CS8qKg0KCSAqIEFmZmVjdHMgY29uc3RydWN0b3IgYmVoYXZpb3VyLiBJZiB0cnVlLCBsYW5ndWFnZSBmaWxlcyB3aWxsIGJlIGxvYWRlZCBhdXRvbWF0aWNhbGx5Lg0KCSAqDQoJICogQHZhciAgICBib29sZWFuDQoJICogQHNpbmNlICAxLjAuMA0KCSAqLw0KCXByb3RlY3RlZCAgJGF1dG9sb2FkTGFuZ3VhZ2UgPSB0cnVlOw0KDQoJLyoqDQoJICogb25JbnN0YWxsZXJCZWZvcmVQYWNrYWdlRG93bmxvYWQuDQoJICoNCgkgKiBGb3IgbW9kaWZpY2F0aW9uIG9mIFVSTCBhbmQgaGVhZGVycyBiZWZvcmUgcGFja2FnZSBkb3dubG9hZA0KCSAqDQoJICogQHJldHVybiAgdm9pZA0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIG9uSW5zdGFsbGVyQmVmb3JlUGFja2FnZURvd25sb2FkKCYkdXJsLCAmJGhlYWRlcnMpDQoJew0KCQkvLyBzZXQgdGhlIFVSSSBvYmplY3QNCgkJJHVyaSA9IFVyaTo6Z2V0SW5zdGFuY2UoJHVybCk7DQoJCSRwYXJ0cyA9IGV4cGxvZGUoJy8nLCAkdXJpLT5nZXRQYXRoKCkpOw0KDQoJCS8vIGNoZWNrIHRoYXQgdGhpcyBpcyBvdXIgQVBJDQoJCWlmICgkdXJpLT5nZXRIb3N0KCkgPT0gJ1tbW2dpdGVhX3VybF1dXScgJiYgaW5fYXJyYXkoJ1tbW2dpdGVhX3BhY2thZ2VfbmFtZV1dXScsICRwYXJ0cykpDQoJCXsNCgkJCS8vIGdldCB0aGUgdG9rZW4gaWYgc2V0DQoJCQkkdG9rZW4gPSBDb21wb25lbnRIZWxwZXI6OmdldFBhcmFtcygnY29tX1tbW2NvbXBvbmVudF1dXScpLT5nZXQoJ2dpdGVhX3Rva2VuJywgZmFsc2UpOw0KCQkJLy8gb25seSBhZGQgaWYgdG9rZW4gaXMgc2V0DQoJCQlpZiAoJHRva2VuKQ0KCQkJew0KCQkJCS8vIGFkZCB0aGUgdG9rZW4NCgkJCQkkdXJpLT5zZXRWYXIoJ2FjY2Vzc190b2tlbicsICR0b2tlbik7DQoJCQkJLy8gdXBkYXRlIHRoZSBVUkwNCgkJCQkkdXJsID0gJHVyaS0+dG9TdHJpbmcoKTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkvLyBzZXQgdGhlIHJldHVybiBVUkwNCgkJCQkkcmV0dXJuID0gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoKHN0cmluZykgVXJpOjpnZXRJbnN0YW5jZSgpKSk7DQoJCQkJLy8gc2V0IHRoZSB1cmxzDQoJCQkJJGdldF9hY2Nlc3NfdG9rZW5fdXJsID0gJyJodHRwczovL1tbW2dpdGVhX3VybF1dXS91c2VyL3NldHRpbmdzL2FwcGxpY2F0aW9ucyIgdGFyZ2V0PSJfYmxhbmsiIHRpdGxlPSInIC4gVGV4dDo6XygnR2V0IEFjY2VzcyBUb2tlbicpIC4gJyInOw0KCQkJCSRzZXRfYWNjZXNzX3Rva2VuX3VybCA9ICciJyAuIFVyaTo6cm9vdCgpIC4gJ2FkbWluaXN0cmF0b3IvaW5kZXgucGhwP29wdGlvbj1jb21fY29uZmlnJnZpZXc9Y29tcG9uZW50JmNvbXBvbmVudD1jb21fW1tbY29tcG9uZW50XV1dJnBhdGg9JnJldHVybj0nIC4gJHJldHVybiAuICciIHRpdGxlPSInIC4gVGV4dDo6XygnU2V0IEFjY2VzcyBUb2tlbicpIC4gJyInOw0KCQkJCS8vIGxvYWQgdGhlIG1lc3NhZ2UNCgkJCQkkdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+ZW5xdWV1ZU1lc3NhZ2UoDQoJCQkJCVRleHQ6OnNwcmludGYoIklmIHRoZXJlIHdhcyBhIGRvd25sb2FkL3VwZGF0ZSBlcnJvciwgaXQncyBwcm9iYWJseSBiZWNhdXNlIHRoZSA8YSBocmVmPSVzID5BUEkgQWNjZXNzIFRva2VuPC9hPiBmb3IgdXBkYXRlcyBvZiBbW1tjb21wb25lbnRdXV0gaGFzIG5vdCBiZWVuIHNldCwgeW91IGNhbiBzZXQgdGhpcyBhY2Nlc3MgdG9rZW4gaW4gdGhlIDxhIGhyZWY9JXMgPmdsb2JhbCBvcHRpb25zIHRhYjwvYT4uIiwNCgkJCQkJCSRnZXRfYWNjZXNzX3Rva2VuX3VybCwNCgkJCQkJCSRzZXRfYWNjZXNzX3Rva2VuX3VybA0KCQkJCQkpLCAnbm90aWNlJyk7DQoJCQl9DQoJCX0NCgl9', 'componentbuilder', '', '', '', 'Ly8=', '', '', '', '3.0.0', '{\"property_selection0\":{\"property\":\"39\"}}', 'WW91IGNhbiB1c2UgYWxsIHRoZSBub3JtYWwgbWFya2Rvd24sIGluY2x1ZGluZyB0aGUgcGxhY2UtaG9sZGVycy4=', '', '', '', 'Update (git.vdm.dev) J5', '', 1, '', '', 1, '2024-03-10 17:27:35', '2024-09-16 14:57:33', 8, '', 9), +(46, 1, '', '', '', 1, '', '', '', '', '', '', '', '', 1, 'Add Access Token to easy update [[[Component]]]', '{}', '5236660d-5dee-492b-925c-15b96cb6ea44', 'dXNlIEpvb21sYVxDTVNcVXJpXFVyaTsNCnVzZSBKb29tbGFcQ01TXExhbmd1YWdlXFRleHQ7DQp1c2UgSm9vbWxhXENNU1xDb21wb25lbnRcQ29tcG9uZW50SGVscGVyOw==', 12, '{\"method_selection0\":{\"method\":\"103\"}}', 'CS8qKg0KCSAqIEFmZmVjdHMgY29uc3RydWN0b3IgYmVoYXZpb3VyLiBJZiB0cnVlLCBsYW5ndWFnZSBmaWxlcyB3aWxsIGJlIGxvYWRlZCBhdXRvbWF0aWNhbGx5Lg0KCSAqDQoJICogQHZhciAgICBib29sZWFuDQoJICogQHNpbmNlICAxLjAuMA0KCSAqLw0KCXByb3RlY3RlZCAgJGF1dG9sb2FkTGFuZ3VhZ2UgPSB0cnVlOw0KDQoJLyoqDQoJICogb25JbnN0YWxsZXJCZWZvcmVQYWNrYWdlRG93bmxvYWQuDQoJICoNCgkgKiBGb3IgbW9kaWZpY2F0aW9uIG9mIFVSTCBhbmQgaGVhZGVycyBiZWZvcmUgcGFja2FnZSBkb3dubG9hZA0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAkdXJsICAgICAgVGhlIFVSTCBvZiB0aGUgcGFja2FnZSBiZWluZyBkb3dubG9hZGVkDQoJICogQHBhcmFtICAgYXJyYXkgICAkaGVhZGVycyAgVGhlIEhUVFAgaGVhZGVycyB0byBpbmNsdWRlIHdpdGggdGhlIHJlcXVlc3QNCgkgKg0KCSAqIEByZXR1cm4gIHZvaWQNCgkgKg0KCSAqIEBzaW5jZSAgIDEuMA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBvbkluc3RhbGxlckJlZm9yZVBhY2thZ2VEb3dubG9hZCgmJHVybCwgJiRoZWFkZXJzKQ0KCXsNCgkJLy8gc2V0IHRoZSBVUkkgb2JqZWN0DQoJCSR1cmkgPSBVcmk6OmdldEluc3RhbmNlKCR1cmwpOw0KCQkkcGFydHMgPSBleHBsb2RlKCcvJywgJHVyaS0+Z2V0UGF0aCgpKTsNCg0KCQkvLyBjaGVjayB0aGF0IHRoaXMgaXMgb3VyIEFQSQ0KCQlpZiAoJHVyaS0+Z2V0SG9zdCgpID09ICdbW1tnaXRlYV91cmxdXV0nICYmIGluX2FycmF5KCdbW1tnaXRlYV9wYWNrYWdlX25hbWVdXV0nLCAkcGFydHMpKQ0KCQl7DQoJCQkvLyBnZXQgdGhlIHRva2VuIGlmIHNldA0KCQkJJHRva2VuID0gQ29tcG9uZW50SGVscGVyOjpnZXRQYXJhbXMoJ2NvbV9bW1tjb21wb25lbnRdXV0nKS0+Z2V0KCdnaXRlYV90b2tlbicsIGZhbHNlKTsNCg0KCQkJLy8gb25seSBhZGQgdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyIGlmIHRva2VuIGlzIHNldA0KCQkJaWYgKCR0b2tlbikNCgkJCXsNCgkJCQkvLyBBZGQgdGhlIHRva2VuIGFzIGFuIEF1dGhvcml6YXRpb24gaGVhZGVyDQoJCQkJJGhlYWRlcnNbXSA9ICdBdXRob3JpemF0aW9uOiB0b2tlbiAnIC4gJHRva2VuOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCS8vIHNldCB0aGUgcmV0dXJuIFVSTA0KCQkJCSRyZXR1cm4gPSB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgoc3RyaW5nKSBVcmk6OmdldEluc3RhbmNlKCkpKTsNCgkJCQkvLyBzZXQgdGhlIFVSTHMNCgkJCQkkZ2V0X2FjY2Vzc190b2tlbl91cmwgPSAnImh0dHBzOi8vW1tbZ2l0ZWFfdXJsXV1dL3VzZXIvc2V0dGluZ3MvYXBwbGljYXRpb25zIiB0YXJnZXQ9Il9ibGFuayIgdGl0bGU9IicgLiBUZXh0OjpfKCdHZXQgQWNjZXNzIFRva2VuJykgLiAnIic7DQoJCQkJJHNldF9hY2Nlc3NfdG9rZW5fdXJsID0gJyInIC4gVXJpOjpyb290KCkgLiAnYWRtaW5pc3RyYXRvci9pbmRleC5waHA/b3B0aW9uPWNvbV9jb25maWcmdmlldz1jb21wb25lbnQmY29tcG9uZW50PWNvbV9bW1tjb21wb25lbnRdXV0mcGF0aD0mcmV0dXJuPScgLiAkcmV0dXJuIC4gJyIgdGl0bGU9IicgLiBUZXh0OjpfKCdTZXQgQWNjZXNzIFRva2VuJykgLiAnIic7DQoNCgkJCQkvLyBMb2FkIHRoZSBtZXNzYWdlDQoJCQkJJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmVucXVldWVNZXNzYWdlKA0KCQkJCQlUZXh0OjpzcHJpbnRmKA0KCQkJCQkJIklmIHRoZXJlIHdhcyBhIGRvd25sb2FkL3VwZGF0ZSBlcnJvciwgaXQncyBwcm9iYWJseSBiZWNhdXNlIHRoZSA8YSBocmVmPSVzID5BUEkgQWNjZXNzIFRva2VuPC9hPiBmb3IgdXBkYXRlcyBvZiBbW1tjb21wb25lbnRdXV0gaGFzIG5vdCBiZWVuIHNldCwgeW91IGNhbiBzZXQgdGhpcyBhY2Nlc3MgdG9rZW4gaW4gdGhlIDxhIGhyZWY9JXMgPmdsb2JhbCBvcHRpb25zIHRhYjwvYT4uIiwNCgkJCQkJCSRnZXRfYWNjZXNzX3Rva2VuX3VybCwNCgkJCQkJCSRzZXRfYWNjZXNzX3Rva2VuX3VybA0KCQkJCQkpLA0KCQkJCQknbm90aWNlJw0KCQkJCSk7DQoJCQl9DQoJCX0NCgl9', 'componentbuilder', '', '', '', 'Ly8=', '', '', '', '3.0.0', '{\"property_selection0\":{\"property\":\"39\"}}', 'WW91IGNhbiB1c2UgYWxsIHRoZSBub3JtYWwgbWFya2Rvd24sIGluY2x1ZGluZyB0aGUgcGxhY2UtaG9sZGVycy4=', '', '', '', 'Update (git.vdm.dev) J5', '', 1, '', '', 1, '2024-03-10 17:27:35', '2024-12-17 10:06:31', 9, '', 9), (66, 1, '', '', '', 1, '', '', '', '', '', '', '', 1, 4, 'The plugin to fully integrate componentbuilder with the privacy suite of Joomla.', '{}', '8aa96d76-94e3-47d1-8dd8-f430b72ed0f7', 'dXNlIEpvb21sYVxVdGlsaXRpZXNcQXJyYXlIZWxwZXI7DQp1c2UgSm9vbWxhXENvbXBvbmVudFxQcml2YWN5XEFkbWluaXN0cmF0b3JcUGx1Z2luXFByaXZhY3lQbHVnaW47DQp1c2UgSm9vbWxhXERhdGFiYXNlXERhdGFiYXNlQXdhcmVUcmFpdDs=', 10, '{\"method_selection0\":{\"method\":\"51\"},\"method_selection1\":{\"method\":\"52\"},\"method_selection2\":{\"method\":\"53\"}}', 'CXVzZSBEYXRhYmFzZUF3YXJlVHJhaXQ7DQoNCgkvKioNCgkgKiBBZmZlY3RzIGNvbnN0cnVjdG9yIGJlaGF2aW9yLiBJZiB0cnVlLCBsYW5ndWFnZSBmaWxlcyB3aWxsIGJlIGxvYWRlZCBhdXRvbWF0aWNhbGx5Lg0KCSAqDQoJICogQHZhciAgICBib29sZWFuDQoJICogQHNpbmNlICAxLjANCgkgKi8NCglwcm90ZWN0ZWQgICRhdXRvbG9hZExhbmd1YWdlID0gdHJ1ZTsNCg0KCS8qKg0KCSAqIFBlcmZvcm1zIHZhbGlkYXRpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHJlbW92ZSBpbmZvcm1hdGlvbiByZXF1ZXN0IGNhbiBiZSBwcm9jZXNzZWQNCgkgKg0KCSAqIEBwYXJhbSAgIEpvb21sYV9fX2FmYmI4OTdmX2Y1YjhfNDY1ZF85MjEzX2RhZTVjY2YzZGYzZF9fX1Bvd2VyICAkcmVxdWVzdCAgVGhlIHJlcXVlc3QgcmVjb3JkIGJlaW5nIHByb2Nlc3NlZA0KCSAqIEBwYXJhbSAgIEpvb21sYV9fX2VmZmRhZjZkXzIyNzVfNDI1ZF85ZjUyX2Q0OTUyZTU2NGQzNF9fX1Bvd2VyICAgICAgICAgICAgICAgICR1c2VyICAgICBUaGUgdXNlciBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QgaWYgYXZhaWxhYmxlDQoJICoNCgkgKiBAcmV0dXJuICBKb29tbGFfX181YzU5OWVjZl84ZjU4XzQ0YjRfYmJhZl9hNDdlYjVkMzAyZTVfX19Qb3dlcg0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIG9uUHJpdmFjeUNhblJlbW92ZURhdGEoSm9vbWxhX19fYWZiYjg5N2ZfZjViOF80NjVkXzkyMTNfZGFlNWNjZjNkZjNkX19fUG93ZXIgJHJlcXVlc3QsIEpvb21sYV9fX2VmZmRhZjZkXzIyNzVfNDI1ZF85ZjUyX2Q0OTUyZTU2NGQzNF9fX1Bvd2VyICR1c2VyID0gbnVsbCkNCgl7DQoJCSRzdGF0dXMgPSBuZXcgSm9vbWxhX19fNWM1OTllY2ZfOGY1OF80NGI0X2JiYWZfYTQ3ZWI1ZDMwMmU1X19fUG93ZXIoKTsNCg0KCQkvLyBUaGlzIHBsdWdpbiBvbmx5IHByb2Nlc3NlcyBkYXRhIGZvciByZWdpc3RlcmVkIHVzZXIgYWNjb3VudHMNCgkJaWYgKCEkdXNlcikNCgkJew0KCQkJcmV0dXJuICRzdGF0dXM7DQoJCX0NCg0KCQkvLyBjaGVjayBpZiB0aGUgaGVscGVyIG1ldGhvZCBpcyBzZXQgaW4gdGhlIGNvbXBvbmVudA0KCQlpZiAobWV0aG9kX2V4aXN0cyhKb29tbGFfX19hZWJmZWI5Zl9mOGEzXzQyYmVfYTIxZF81ZGI1NmFlMzBjMWNfX19Qb3dlcjo6Y2xhc3MsICdvblByaXZhY3lDYW5SZW1vdmVEYXRhJykpDQoJCXsNCgkJCUpvb21sYV9fX2FlYmZlYjlmX2Y4YTNfNDJiZV9hMjFkXzVkYjU2YWUzMGMxY19fX1Bvd2VyOjpvblByaXZhY3lDYW5SZW1vdmVEYXRhKCR0aGlzLCAkc3RhdHVzLCAkcmVxdWVzdCwgJHVzZXIpOw0KCQl9DQoNCgkJcmV0dXJuICRzdGF0dXM7DQoJfQ0KDQoJLyoqDQoJICogUHJvY2Vzc2VzIGFuIGV4cG9ydCByZXF1ZXN0IGZvciBKb29tbGEgY29yZSB1c2VyIGRhdGENCgkgKg0KCSAqIEBwYXJhbSAgIEpvb21sYV9fX2FmYmI4OTdmX2Y1YjhfNDY1ZF85MjEzX2RhZTVjY2YzZGYzZF9fX1Bvd2VyICAkcmVxdWVzdCAgVGhlIHJlcXVlc3QgcmVjb3JkIGJlaW5nIHByb2Nlc3NlZA0KCSAqIEBwYXJhbSAgIEpvb21sYV9fX2VmZmRhZjZkXzIyNzVfNDI1ZF85ZjUyX2Q0OTUyZTU2NGQzNF9fX1Bvd2VyICAgICAgICAgICAgICAgICR1c2VyICAgICBUaGUgdXNlciBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QgaWYgYXZhaWxhYmxlDQoJICoNCgkgKiBAcmV0dXJuICBKb29tbGFfX19mNWUwNzUzY19jOGQ5XzQ5NjVfYTYwNl85YzQ1YjM3YTY4NTdfX19Qb3dlcltdDQoJICoNCgkgKiBAc2luY2UgICAxLjANCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gb25Qcml2YWN5RXhwb3J0UmVxdWVzdChKb29tbGFfX19hZmJiODk3Zl9mNWI4XzQ2NWRfOTIxM19kYWU1Y2NmM2RmM2RfX19Qb3dlciAkcmVxdWVzdCwgSm9vbWxhX19fZWZmZGFmNmRfMjI3NV80MjVkXzlmNTJfZDQ5NTJlNTY0ZDM0X19fUG93ZXIgJHVzZXIgPSBudWxsKQ0KCXsNCgkJJGRvbWFpbnMgPSBhcnJheSgpOw0KDQoJCS8vIFRoaXMgcGx1Z2luIG9ubHkgcHJvY2Vzc2VzIGRhdGEgZm9yIHJlZ2lzdGVyZWQgdXNlciBhY2NvdW50cw0KCQlpZiAoISR1c2VyKQ0KCQl7DQoJCQlyZXR1cm4gJGRvbWFpbnM7DQoJCX0NCg0KCQkvLyBjaGVjayBpZiB0aGUgaGVscGVyIG1ldGhvZCBpcyBzZXQgaW4gdGhlIGNvbXBvbmVudA0KCQlpZiAobWV0aG9kX2V4aXN0cyhKb29tbGFfX19hZWJmZWI5Zl9mOGEzXzQyYmVfYTIxZF81ZGI1NmFlMzBjMWNfX19Qb3dlcjo6Y2xhc3MsICdvblByaXZhY3lFeHBvcnRSZXF1ZXN0JykpDQoJCXsNCgkJCUpvb21sYV9fX2FlYmZlYjlmX2Y4YTNfNDJiZV9hMjFkXzVkYjU2YWUzMGMxY19fX1Bvd2VyOjpvblByaXZhY3lFeHBvcnRSZXF1ZXN0KCR0aGlzLCAkZG9tYWlucywgJHJlcXVlc3QsICR1c2VyKTsNCgkJfQ0KDQoJCXJldHVybiAkZG9tYWluczsNCgl9DQoNCgkvKioNCgkgKiBSZW1vdmVzIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHJlbW92ZSBpbmZvcm1hdGlvbiByZXF1ZXN0DQoJICoNCgkgKiBAcGFyYW0gICBKb29tbGFfX19hZmJiODk3Zl9mNWI4XzQ2NWRfOTIxM19kYWU1Y2NmM2RmM2RfX19Qb3dlciAgJHJlcXVlc3QgIFRoZSByZXF1ZXN0IHJlY29yZCBiZWluZyBwcm9jZXNzZWQNCgkgKiBAcGFyYW0gICBKb29tbGFfX19lZmZkYWY2ZF8yMjc1XzQyNWRfOWY1Ml9kNDk1MmU1NjRkMzRfX19Qb3dlciAgICAgICAgICAgICAgICAkdXNlciAgICAgVGhlIHVzZXIgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0IGlmIGF2YWlsYWJsZQ0KCSAqDQoJICogQHJldHVybiAgdm9pZA0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIG9uUHJpdmFjeVJlbW92ZURhdGEoSm9vbWxhX19fYWZiYjg5N2ZfZjViOF80NjVkXzkyMTNfZGFlNWNjZjNkZjNkX19fUG93ZXIgJHJlcXVlc3QsIEpvb21sYV9fX2VmZmRhZjZkXzIyNzVfNDI1ZF85ZjUyX2Q0OTUyZTU2NGQzNF9fX1Bvd2VyICR1c2VyID0gbnVsbCkNCgl7DQoJCS8vIFRoaXMgcGx1Z2luIG9ubHkgcHJvY2Vzc2VzIGRhdGEgZm9yIHJlZ2lzdGVyZWQgdXNlciBhY2NvdW50cw0KCQlpZiAoISR1c2VyKQ0KCQl7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQkvLyBjaGVjayBpZiB0aGUgaGVscGVyIG1ldGhvZCBpcyBzZXQgaW4gdGhlIGNvbXBvbmVudA0KCQlpZiAobWV0aG9kX2V4aXN0cyhKb29tbGFfX19hZWJmZWI5Zl9mOGEzXzQyYmVfYTIxZF81ZGI1NmFlMzBjMWNfX19Qb3dlcjo6Y2xhc3MsICdvblByaXZhY3lSZW1vdmVEYXRhJykpDQoJCXsNCgkJCUpvb21sYV9fX2FlYmZlYjlmX2Y4YTNfNDJiZV9hMjFkXzVkYjU2YWUzMGMxY19fX1Bvd2VyOjpvblByaXZhY3lSZW1vdmVEYXRhKCR0aGlzLCAkcmVxdWVzdCwgJHVzZXIpOw0KCQl9DQoJfQ==', '[[[Component]]]', 'Ly8gUEhQIE1ldGhvZCAodW5pbnN0YWxsKQ==', 'Ly8gUEhQIFBvc3RmbGlnaHQgKGluc3RhbGwp', 'Ly8gUEhQIFBvc3RmbGlnaHQgKHVwZGF0ZSk=', 'CQkJLy8gY2hlY2sgdGhhdCBbW1tjb21wb25lbnRdXV0gaXMgaW5zdGFsbGVkDQoJCQlpZiAoIWlzX2RpcihKUEFUSF9BRE1JTklTVFJBVE9SIC4gJy9jb21wb25lbnRzL2NvbV9bW1tjb21wb25lbnRdXV0nKSkNCgkJCXsNCgkJCQkkYXBwLT5lbnF1ZXVlTWVzc2FnZSgnW1tbY29tcG9uZW50X2Fjcm9ueW1dXV0gbXVzdCBmaXJzdCBiZSBpbnN0YWxsZWQgZnJvbSA8YSBocmVmPSJbW1tnZXRfY29tcG9uZW50X2xpbmtdXV0iIHRhcmdldD0iX2JsYW5rIj5bW1tjb21wb25lbnRfbGlua19uYW1lXV1dPC9hPi4nLCAnZXJyb3InKTsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9', 'Ly8gUEhQIFByZWZsaWdodCAodW5pbnN0YWxsKQ==', 'Ly8gUEhQIFByZWZsaWdodCAodXBkYXRlKQ==', '', '2.0.0', '{\"property_selection0\":{\"property\":\"31\"},\"property_selection1\":{\"property\":\"32\"},\"property_selection2\":{\"property\":\"33\"}}', 'IyAjIyNQTFVHSU5fTkFNRSMjIyAoIyMjVkVSU0lPTiMjIykNCg0KIyMjREVTQ1JJUFRJT04jIyMNCg0KIyBCdWlsZCBEZXRhaWxzDQoNCisgKkNvbXBhbnkqOiBbIyMjQ09NUEFOWU5BTUUjIyNdKCMjI0FVVEhPUldFQlNJVEUjIyMpDQorICpBdXRob3IqOiBbIyMjQVVUSE9SIyMjXShtYWlsdG86IyMjQVVUSE9SRU1BSUwjIyMpDQorICpWZXJzaW9uKjogIyMjVkVSU0lPTiMjIw0KKyAqQ29weXJpZ2h0KjogIyMjQ09QWVJJR0hUIyMjDQorICpMaWNlbnNlKjogIyMjTElDRU5TRSMjIw==', '', '', '', 'Global Privacy J5', '', 1, 'https://www.vdm.io/updates/componentbuilder_global_privacy.xml', '', 1, '2024-09-16 14:55:27', '2024-09-16 15:50:11', 2, '', 1); -- diff --git a/admin/src/Controller/AjaxController.php b/admin/src/Controller/AjaxController.php index f66786600..43f811f58 100644 --- a/admin/src/Controller/AjaxController.php +++ b/admin/src/Controller/AjaxController.php @@ -49,8 +49,6 @@ class AjaxController extends BaseController $this->app->setHeader('Content-Disposition','attachment;filename="getajax.json"'); $this->app->setHeader('Access-Control-Allow-Origin', '*'); // load the tasks - $this->registerTask('isNew', 'ajax'); - $this->registerTask('isRead', 'ajax'); $this->registerTask('getComponentDetails', 'ajax'); $this->registerTask('getCronPath', 'ajax'); $this->registerTask('getWiki', 'ajax'); @@ -120,104 +118,6 @@ class AjaxController extends BaseController $task = $this->getTask(); switch($task) { - case 'isNew': - try - { - $noticeValue = $jinput->get('notice', NULL, 'STRING'); - if($noticeValue && $user->id != 0) - { - $ajaxModule = $this->getModel('ajax', 'Administrator'); - if ($ajaxModule) - { - $result = $ajaxModule->isNew($noticeValue); - } - else - { - $result = ['error' => 'There was an error! [149]']; - } - } - else - { - $result = ['error' => 'There was an error! [149]']; - } - if($callback) - { - echo $callback . "(".json_encode($result).");"; - } - elseif($returnRaw) - { - echo json_encode($result); - } - else - { - echo "(".json_encode($result).");"; - } - } - catch(\Exception $e) - { - if($callback) - { - echo $callback."(".json_encode($e).");"; - } - elseif($returnRaw) - { - echo json_encode($e); - } - else - { - echo "(".json_encode($e).");"; - } - } - break; - case 'isRead': - try - { - $noticeValue = $jinput->get('notice', NULL, 'STRING'); - if($noticeValue && $user->id != 0) - { - $ajaxModule = $this->getModel('ajax', 'Administrator'); - if ($ajaxModule) - { - $result = $ajaxModule->isRead($noticeValue); - } - else - { - $result = ['error' => 'There was an error! [149]']; - } - } - else - { - $result = ['error' => 'There was an error! [149]']; - } - if($callback) - { - echo $callback . "(".json_encode($result).");"; - } - elseif($returnRaw) - { - echo json_encode($result); - } - else - { - echo "(".json_encode($result).");"; - } - } - catch(\Exception $e) - { - if($callback) - { - echo $callback."(".json_encode($e).");"; - } - elseif($returnRaw) - { - echo json_encode($e); - } - else - { - echo "(".json_encode($e).");"; - } - } - break; case 'getComponentDetails': try { diff --git a/admin/src/Model/AjaxModel.php b/admin/src/Model/AjaxModel.php index d894b755e..e2fb62348 100644 --- a/admin/src/Model/AjaxModel.php +++ b/admin/src/Model/AjaxModel.php @@ -202,35 +202,89 @@ class AjaxModel extends ListModel } /** - * set the component display - **/ + * Generate the component details display in HTML. + * + * @param object $object The component object containing details. + * @return string The HTML string for displaying component details. + */ protected function componentDetailsDisplay($object) { - // set some vars - $image = (StringHelper::check($object->image)) ? 'Joomla Component Image': ''; - $desc = (StringHelper::check($object->description)) ? $object->description : $object->short_description; - $placeholder = ($object->add_placeholders == 1) ? ' ' . Text::_('COM_COMPONENTBUILDER_YES') . ' ' : ' ' .Text::_('COM_COMPONENTBUILDER_NO') . ' ' ; - $debug = ($object->debug_linenr == 1) ? ' ' .Text::_('COM_COMPONENTBUILDER_YES') . '' : ' ' .Text::_('COM_COMPONENTBUILDER_NO') . ' ' ; - $html = array(); - $html[] = '

' . $object->name . ' (v' . $object->component_version . ')

'; - $html[] = '

' . $desc . $image . '

'; - $html[] = '
    '; - $html[] = '
  • ' . Text::_('COM_COMPONENTBUILDER_COMPANY') . ': ' . $object->companyname . '
  • '; - $html[] = '
  • ' . Text::_('COM_COMPONENTBUILDER_AUTHOR') . ': ' . $object->author . '
  • '; - $html[] = '
  • ' . Text::_('COM_COMPONENTBUILDER_EMAIL') . ': ' . $object->email . '
  • '; - $html[] = '
  • ' . Text::_('COM_COMPONENTBUILDER_WEBSITE') . ': ' . $object->website . '
  • '; - $html[] = '
'; - $html[] = '

' . Text::_('COM_COMPONENTBUILDER_COMPONENT_GLOBAL_SETTINGS') . '

'; + // Helper variables with null coalescing to ensure robust value assignment + $imageSrc = !empty($object->image) ? htmlspecialchars($object->image, ENT_QUOTES) : null; + $image = $imageSrc + ? '' . Text::_('COM_COMPONENTBUILDER_JOOMLA_COMPONENT_IMAGE') . '' + : null; + + $description = htmlspecialchars(!empty($object->description) ? $object->description : $object->short_description, ENT_QUOTES); + + $placeholderStatus = $object->add_placeholders + ? '' . Text::_('COM_COMPONENTBUILDER_YES') . '' + : '' . Text::_('COM_COMPONENTBUILDER_NO') . ''; + + $debugStatus = $object->debug_linenr + ? '' . Text::_('COM_COMPONENTBUILDER_YES') . '' + : '' . Text::_('COM_COMPONENTBUILDER_NO') . ''; + + // Author and company details + $companyDetails = ''; + + // Build HTML output + $html = []; + + // Card container + $html[] = '
'; + $html[] = '
'; + + // Header with component name and version + $html[] = '

' . htmlspecialchars($object->name, ENT_QUOTES) . ' (v' . htmlspecialchars($object->component_version, ENT_QUOTES) . ')

'; + + // Row with image and text + if (!empty($image)) + { + $html[] = '
'; + $html[] = '
'; + $html[] = '

' . $description . '

'; + $html[] = $companyDetails; + $html[] = '
'; + $html[] = '
' . $image . '
'; + $html[] = '
'; // End row + } + else + { + $html[] = '
'; + $html[] = '

' . $description . '

'; + $html[] = $companyDetails; + $html[] = '
'; + } + + // Component settings + $html[] = '

' . Text::_('COM_COMPONENTBUILDER_COMPONENT_SETTINGS') . '

'; $html[] = '

'; - $html[] = Text::_('COM_COMPONENTBUILDER_ADD_CUSTOM_CODE_PLACEHOLDERS') . '
' . $placeholder . '
'; - $html[] = Text::_('COM_COMPONENTBUILDER_DEBUG_LINE_NUMBERS') . '
' . $debug ; + $html[] = Text::_('COM_COMPONENTBUILDER_ADD_CUSTOM_CODE_PLACEHOLDERS') . ': ' . $placeholderStatus . '
'; + $html[] = Text::_('COM_COMPONENTBUILDER_DEBUG_LINE_NUMBERS') . ': ' . $debugStatus; $html[] = '

'; - $html[] = '

' . Text::_('COM_COMPONENTBUILDER_LICENSE') . '

'; - $html[] = '

' . $object->license . '

'; - $html[] = '

' . Text::_('COM_COMPONENTBUILDER_COPYRIGHT') . '

'; - $html[] = '

' . $object->copyright . '

'; - $html[] = ' ' . Text::_('COM_COMPONENTBUILDER_EDIT') . ' ' .$object->system_name . '

'; - // now return the diplay + + // License details + $html[] = '

' . Text::_('COM_COMPONENTBUILDER_LICENSE') . '

'; + $html[] = '

' . nl2br(htmlspecialchars($object->license, ENT_QUOTES)) . '

'; + + // Copyright + $html[] = '

' . Text::_('COM_COMPONENTBUILDER_COPYRIGHT') . '

'; + $html[] = '

' . nl2br(htmlspecialchars($object->copyright, ENT_QUOTES)) . '

'; + + // Edit button + $html[] = ''; + $html[] = ' ' . Text::_('COM_COMPONENTBUILDER_EDIT') . ' ' . htmlspecialchars($object->system_name, ENT_QUOTES); + $html[] = ''; + + $html[] = '
'; // End card body + $html[] = '
'; // End card + return implode("\n", $html); } @@ -274,55 +328,6 @@ class AjaxModel extends ListModel return function_exists('curl_version'); } - /** - * Check and if a notice is new (per/user) - * - * @param string|null $notice The current notice - * - * @return bool true if is new - * @since 2.0.0 - */ - public function isNew(?string $notice): bool - { - // first get the file path - $path_filename = FileHelper::getPath('path', 'usernotice', 'md', Factory::getUser()->username, JPATH_COMPONENT_ADMINISTRATOR); - - // check if the file is set - if (($content = FileHelper::getContent($path_filename, FALSE)) !== FALSE) - { - if ($notice == $content) - { - return false; - } - } - return true; - } - - /** - * Check if a notice has been read (per/user) - * - * @param string|null $notice The current notice - * - * @return bool true if is read - * @since 2.0.0 - */ - public function isRead(?string $notice): bool - { - // first get the file path - $path_filename = FileHelper::getPath('path', 'usernotice', 'md', Factory::getUser()->username, JPATH_COMPONENT_ADMINISTRATOR); - - // set as read if not already set - if (($content = FileHelper::getContent($path_filename, FALSE)) !== FALSE) - { - if ($notice == $content) - { - return true; - } - } - - return FileHelper::write($path_filename, $notice); - } - /** * get Current Version * @@ -3780,7 +3785,7 @@ class AjaxModel extends ListModel * @return array|null * @since 3.2.0 **/ - public function replaceAll(string $tableName, string $searchValue, ?string $replaceValue = null, + public function replaceAll(string $tableName, string $searchValue, ?string $replaceValue, int $matchCase, int $wholeWord, int $regexSearch, int $componentId): ?array { // check if this is a valid table @@ -3827,7 +3832,7 @@ class AjaxModel extends ListModel * @since 3.2.0 **/ public function getSearchValue(string $fieldName, int $rowId, string $tableName, - string $searchValue, ?string $replaceValue = null, int $matchCase, int $wholeWord, int $regexSearch): array + string $searchValue, ?string $replaceValue, int $matchCase, int $wholeWord, int $regexSearch): array { // check if this is a valid table and field if ($rowId > 0 && SearchFactory::_('Table')->exist($tableName, $fieldName)) @@ -3874,7 +3879,7 @@ class AjaxModel extends ListModel * @since 3.2.0 **/ public function getReplaceValue(string $fieldName, int $rowId, $line, string $tableName, - string $searchValue, ?string $replaceValue = null, int $matchCase, int $wholeWord, int $regexSearch): array + string $searchValue, ?string $replaceValue, int $matchCase, int $wholeWord, int $regexSearch): array { // check if this is a valid table and field if ($rowId > 0 && SearchFactory::_('Table')->exist($tableName, $fieldName)) diff --git a/admin/src/Model/ComponentbuilderModel.php b/admin/src/Model/ComponentbuilderModel.php index c0a40ecf2..fe643ec52 100644 --- a/admin/src/Model/ComponentbuilderModel.php +++ b/admin/src/Model/ComponentbuilderModel.php @@ -528,97 +528,6 @@ class ComponentbuilderModel extends ListModel } - public function getNoticeboard() - { - // get the document to load the scripts - $document = Factory::getDocument(); - Html::_('script', "media/com_componentbuilder/js/marked.js", ['version' => 'auto']); - $document->addScriptDeclaration(' - var token = "' . Session::getFormToken() . '"; - var noticeboard = "https://vdm.bz/componentbuilder-noticeboard-md"; - document.addEventListener("DOMContentLoaded", function() { - fetch(noticeboard) - .then(response => { - if (!response.ok) { - throw new Error("Network response was not ok"); - } - return response.text(); - }) - .then(board => { - if (board.length > 5) { - document.getElementById("noticeboard-md").innerHTML = marked.parse(board); - getIS(1, board) - .then(result => { - if (result) { - document.querySelectorAll("#cpanel_tabTabs a").forEach(link => { - if (link.href.includes("#vast_development_method") || link.href.includes("#notice_board")) { - var textVDM = link.textContent; - link.innerHTML = "1 " + textVDM; - link.id = "vdm-new-notice"; - document.getElementById("vdm-new-notice").addEventListener("click", () => { - getIS(2, board) - .then(result => { - if (result) { - document.querySelectorAll(".vdm-new-notice").forEach(element => { - element.style.opacity = 0; - }); - } - }); - }); - } - }); - } - }); - } else { - document.getElementById("noticeboard-md").innerHTML = "'.Text::_('COM_COMPONENTBUILDER_ALL_IS_GOOD_PLEASE_CHECK_AGAIN_LATER').'."; - } - }) - .catch(error => { - console.error("There was an error!", error); - document.getElementById("noticeboard-md").innerHTML = "'.Text::_('COM_COMPONENTBUILDER_ALL_IS_GOOD_PLEASE_CHECK_AGAIN_LATER').'."; - }); - }); - - // to check is READ/NEW - function getIS(type, notice) { - let getUrl = ""; - if (type === 1) { - getUrl = "index.php?option=com_componentbuilder&task=ajax.isNew&format=json&raw=true"; - } else if (type === 2) { - getUrl = "index.php?option=com_componentbuilder&task=ajax.isRead&format=json&raw=true"; - } - let request = new URLSearchParams(); - if (token.length > 0 && notice.length) { - request.append(token, "1"); - request.append("notice", notice); - } - return fetch(getUrl, { - method: "POST", - headers: { - "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8" - }, - body: request - }).then(response => response.json()); - } - -document.addEventListener("DOMContentLoaded", function() { - document.querySelectorAll(".loading-dots").forEach(function(loading_dots) { - let x = 0; - let intervalId = setInterval(function() { - if (!loading_dots.classList.contains("loading-dots")) { - clearInterval(intervalId); - return; - } - let dots = ".".repeat(x % 8); - loading_dots.textContent = dots; - x++; - }, 500); - }); -});'); - - return '
'.Text::_('COM_COMPONENTBUILDER_THE_NOTICE_BOARD_IS_LOADING').'..
'; - } - public function getReadme() { $document = Factory::getDocument(); diff --git a/admin/src/View/Compiler/HtmlView.php b/admin/src/View/Compiler/HtmlView.php index 3a6629e06..2fab37b58 100644 --- a/admin/src/View/Compiler/HtmlView.php +++ b/admin/src/View/Compiler/HtmlView.php @@ -354,51 +354,6 @@ class HtmlView extends BaseHtmlView $form->setField($xml, null, true, 'builder'); } - // Joomla Version 3 attributes - $attributes = [ - 'type' => 'note', - 'name' => 'joomla_version_note_three', - 'description' => 'COM_COMPONENTBUILDER_YOUR_COMPONENT_WILL_BE_COMPILED_TO_WORK_IN_JOOMLA_THREE', - 'class' => 'alert alert-success', - 'showon' => 'joomla_version:3']; - - // add to form - $xml = FormHelper::xml($attributes); - if ($xml instanceof \SimpleXMLElement) - { - $form->setField($xml, null, true, 'builder'); - } - - // Joomla Version 4 and five attributes - $attributes = [ - 'type' => 'note', - 'name' => 'joomla_version_note_four', - 'description' => 'COM_COMPONENTBUILDER_YOUR_COMPONENT_WILL_BE_COMPILED_TO_WORK_IN_JOOMLA_FOUR', - 'class' => 'alert alert-success', - 'showon' => 'joomla_version:4']; - - // add to form - $xml = FormHelper::xml($attributes); - if ($xml instanceof \SimpleXMLElement) - { - $form->setField($xml, null, true, 'builder'); - } - - // Joomla Version 5 and five attributes - $attributes = [ - 'type' => 'note', - 'name' => 'joomla_version_note_five', - 'description' => 'COM_COMPONENTBUILDER_YOUR_COMPONENT_WILL_BE_COMPILED_TO_WORK_IN_JOOMLA_FIVE', - 'class' => 'alert alert-success', - 'showon' => 'joomla_version:5']; - - // add to form - $xml = FormHelper::xml($attributes); - if ($xml instanceof \SimpleXMLElement) - { - $form->setField($xml, null, true, 'builder'); - } - // Advanced Options $attributes = [ 'type' => 'radio', @@ -634,6 +589,9 @@ class HtmlView extends BaseHtmlView // Initialize the header checker. $HeaderCheck = new HeaderCheck(); + // Add View JavaScript File + Html::_('script', "administrator/components/com_componentbuilder/assets/js/compiler.js", ['version' => 'auto']); + // Load uikit options. $uikit = $this->params->get('uikit_load'); // Set script size. @@ -715,70 +673,6 @@ class HtmlView extends BaseHtmlView } } }); - } - - document.addEventListener('DOMContentLoaded', function() { - fetchNoticeboard(\"https://vdm.bz/componentbuilder-noticeboard-md\", \".noticeboard-md\", true); - fetchNoticeboard(\"https://vdm.bz/componentbuilder-pro-noticeboard-md\", \".proboard-md\", false); - }); - function fetchNoticeboard(url, selector, processGetIS) { - fetch(url) - .then(response => { - if (!response.ok) { - throw new Error('Network response was not ok'); - } - return response.text(); - }) - .then(board => { - var elements = document.querySelectorAll(selector); - if (board.length > 5) { - let html_board = marked.parse(board); - elements.forEach(element => { - element.innerHTML = html_board; - }); - if (processGetIS) { - getIS(1, board).then(result => { - if (result) { - document.querySelectorAll(\".vdm-new-notice\").forEach(element => { - element.style.display = 'block'; - }); - getIS(2, board); - } - }); - } - } else { - elements.forEach(element => { - element.innerHTML = all_is_good; - }); - } - }) - .catch(error => { - console.error('There was an error!', error); - document.querySelectorAll(selector).forEach(element => { - element.innerHTML = all_is_good; - }); - }); - } - // to check is READ/NEW - function getIS(type, notice) { - let getUrl = \"\"; - if (type === 1) { - getUrl = JRouter(\"index.php?option=com_componentbuilder&task=ajax.isNew&format=json&raw=true\"); - } else if (type === 2) { - getUrl = JRouter(\"index.php?option=com_componentbuilder&task=ajax.isRead&format=json&raw=true\"); - } - let request = new URLSearchParams(); - if (token.length > 0 && notice.length) { - request.append(token, \"1\"); - request.append(\"notice\", notice); - } - return fetch(getUrl, { - method: \"POST\", - headers: { - \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\" - }, - body: request - }).then(response => response.json()); } "); } diff --git a/admin/src/View/Componentbuilder/HtmlView.php b/admin/src/View/Componentbuilder/HtmlView.php index 44e30b55f..cb2731c2a 100644 --- a/admin/src/View/Componentbuilder/HtmlView.php +++ b/admin/src/View/Componentbuilder/HtmlView.php @@ -48,7 +48,6 @@ class HtmlView extends BaseHtmlView // get the manifest details of the component $this->manifest = ComponentbuilderHelper::manifest(); $this->wiki = $this->get('Wiki'); - $this->noticeboard = $this->get('Noticeboard'); $this->readme = $this->get('Readme'); $this->version = $this->get('Version'); @@ -103,7 +102,7 @@ class HtmlView extends BaseHtmlView // set page title $this->getDocument()->setTitle(Text::_('COM_COMPONENTBUILDER_DASHBOARD')); // add manifest to page JavaScript - $this->getDocument()->addScriptDeclaration("var manifest = JSON.parse('" . json_encode($this->manifest) . "');", "text/javascript"); + $this->getDocument()->addScriptDeclaration("var manifest = JSON.parse(" . json_encode($this->manifest) . ");", "text/javascript"); // add styles foreach ($this->styles as $style) { diff --git a/admin/tmpl/compiler/default.php b/admin/tmpl/compiler/default.php index 81642e261..56dbaec36 100644 --- a/admin/tmpl/compiler/default.php +++ b/admin/tmpl/compiler/default.php @@ -154,17 +154,17 @@ document.addEventListener('DOMContentLoaded', function() { form->renderFieldset('builder'); ?> - -
+
form->renderFieldset('advanced'); ?>
- 'noticeboard' , 'active' => $noticeboardOptions[array_rand($noticeboardOptions)])); ?> +
- diff --git a/admin/tmpl/componentbuilder/default_notice_board_vast_development_method.php b/admin/tmpl/componentbuilder/default_notice_board_vast_development_method.php index 1d28ee3f9..a8ea495d6 100644 --- a/admin/tmpl/componentbuilder/default_notice_board_vast_development_method.php +++ b/admin/tmpl/componentbuilder/default_notice_board_vast_development_method.php @@ -12,9 +12,15 @@ use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\HTML\HTMLHelper as Html; +use Joomla\CMS\Layout\LayoutHelper; // No direct access to this file defined('_JEXEC') or die; ?> -noticeboard; ?> + 'auto']); +Html::_('stylesheet', "administrator/components/com_componentbuilder/assets/css/compiler.css", ['version' => 'auto']); +Html::_('script', "media/com_componentbuilder/js/marked.js", ['version' => 'auto']); +echo LayoutHelper::render('jcbnoticeboard', null); +?> diff --git a/componentbuilder.xml b/componentbuilder.xml index 8d633a86b..6209a44e9 100644 --- a/componentbuilder.xml +++ b/componentbuilder.xml @@ -1,15 +1,15 @@ COM_COMPONENTBUILDER - 16th December, 2024 + 28th December, 2024 Llewellyn van der Merwe joomla@vdm.io https://dev.vdm.io Copyright (C) 2015 Vast Development Method. All rights reserved. GNU General Public License version 2 or later; see LICENSE.txt - 5.0.4-beta2 + 5.0.4-beta3 Component Builder (v.5.0.4-beta2) +

Component Builder (v.5.0.4-beta3)

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 c4075d95d..bcf02c7b1 100644 --- a/componentbuilder_update_server.xml +++ b/componentbuilder_update_server.xml @@ -134,7 +134,7 @@ 5.0.4-beta https://dev.vdm.io - https://git.vdm.dev/api/v1/repos/joomla/pkg-component-builder/archive/v5.0.4-beta2.zip + https://git.vdm.dev/api/v1/repos/joomla/pkg-component-builder/archive/v5.0.4-beta3.zip beta @@ -149,10 +149,10 @@ pkg_component_builder package site - 5.0.4-beta2 + 5.0.4-beta3 https://dev.vdm.io - https://git.vdm.dev/api/v1/repos/joomla/pkg-component-builder/archive/v5.0.4-beta2.zip + https://git.vdm.dev/api/v1/repos/joomla/pkg-component-builder/archive/v5.0.4-beta3.zip beta diff --git a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Component/Placeholder.php b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Component/Placeholder.php index e762fed9b..c17351028 100644 --- a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Component/Placeholder.php +++ b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Compiler/Component/Placeholder.php @@ -124,6 +124,8 @@ final class Placeholder implements PlaceholderInterface $bucket[Placefix::_('NamespacePrefix')] = $config->namespace_prefix; $bucket[Placefix::_h('NAMESPACEPREFIX')] = $config->namespace_prefix; $bucket[Placefix::_('NAMESPACEPREFIX')] = $config->namespace_prefix; + $bucket[Placefix::_('POWERLOADERPATH')] = $config->component_autoloader_path; + $bucket[Placefix::_h('POWERLOADERPATH')] = $config->component_autoloader_path; // get the current components overrides if (($_placeholders = GetHelper::var( diff --git a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Network/Resolve.php b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Network/Resolve.php index fec698935..85d423390 100644 --- a/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Network/Resolve.php +++ b/libraries/vendor_jcb/VDM.Joomla/src/Componentbuilder/Network/Resolve.php @@ -95,6 +95,7 @@ final class Resolve * @param string &$repository The repository name (passed by reference). * * @return void + * @throws \Exception * @since 5.0.4 */ private function resolve(string $target, string &$domain, string &$organisation, string &$repository): void