Release of v5.0.4-beta3
Fix the noticeboard to display Llewellyn's Joomla Social feed. Started compiling JCB5 on Joomla 5 with PHP 8.2.
This commit is contained in:
parent
df8f55b61a
commit
418624b63e
12
CHANGELOG.md
12
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
|
||||
|
@ -3270,7 +3270,7 @@ class Com_ComponentbuilderInstallerScript implements InstallerScriptInterface
|
||||
echo '<div style="background-color: #fff;" class="alert alert-info"><a target="_blank" href="https://dev.vdm.io" title="Component Builder">
|
||||
<img src="components/com_componentbuilder/assets/images/vdm-component.jpg"/>
|
||||
</a>
|
||||
<h3>Upgrade to Version 5.0.4-beta2 Was Successful! Let us know if anything is not working as expected.</h3></div>';
|
||||
<h3>Upgrade to Version 5.0.4-beta3 Was Successful! Let us know if anything is not working as expected.</h3></div>';
|
||||
|
||||
// Add/Update component in the action logs extensions table.
|
||||
$this->setActionLogsExtensions();
|
||||
|
10
README.md
10
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).
|
||||
|
@ -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).
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
326
admin/assets/js/compiler.js
Normal file
326
admin/assets/js/compiler.js
Normal file
@ -0,0 +1,326 @@
|
||||
/**
|
||||
* @package Joomla.Component.Builder
|
||||
*
|
||||
* @created 30th April, 2015
|
||||
* @author Llewellyn van der Merwe <https://dev.vdm.io>
|
||||
* @git Joomla Component Builder <https://git.vdm.dev/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 = `<div class="alert alert-danger">Error loading feed. Please try again later.</div>`;
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
<i class="icon-comments-2"></i> ${post.replies_count}
|
||||
<i class="icon-heart"></i> ${post.favourites_count}
|
||||
<i class="icon-loop"></i> ${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 += `
|
||||
<div class="placeholder">
|
||||
<div class="placeholder-circle"></div>
|
||||
<div class="placeholder-line"></div>
|
||||
<div class="placeholder-line"></div>
|
||||
<div class="placeholder-line"></div>
|
||||
<div class="placeholder-line"></div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
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 = "";
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
{
|
||||
|
@ -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.<br />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 know</a>."
|
||||
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="<b>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<br />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 <b>local snippet</b> (with the same name, library and type) has a <b>diverged</b> from the community snippet (with the same name, library and type) in that it does not have the same <b>creation</b> or <b>modified date</b>."
|
||||
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 <b>%s</b> server!"
|
||||
COM_COMPONENTBUILDER_THE_PRIVATE_KEY_FILE_COULD_NOT_BE_LOADEDFOUND_FOR_BSB_SERVER="The private key file could not be loaded/found for <b>%s</b> 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 <b>ALL</b> 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."
|
||||
|
@ -23,8 +23,8 @@ defined('JPATH_BASE') or die;
|
||||
|
||||
|
||||
?>
|
||||
<div class="well well-small">
|
||||
<h2 class="module-title nav-header"><?= Text::_('COM_COMPONENTBUILDER_JCB_PRO_NOTICE_BOARD') ?></h2>
|
||||
<div class="proboard-md"><small><?= Text::_('COM_COMPONENTBUILDER_THE_PRO_BOARD_IS_LOADING') ?><span class="loading-dots">.</span></small></div>
|
||||
<div style="text-align:right;"><small><a href="https://vdm.bz/get-jcb-pro-membership" target="_blank" style="color:gray">JCB PRO</a></small></div>
|
||||
</div>
|
||||
<div id="noticeboard">
|
||||
<?php echo LayoutHelper::render('mastodon', $displayData ?? []); ?>
|
||||
</div>
|
||||
<?php echo LayoutHelper::render('socialnetworking', null); ?>
|
||||
<div class="p-md-3"><?php echo ComponentbuilderHelper::getDynamicContent('banner', '728-90'); ?></div>
|
@ -1,37 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Component.Builder
|
||||
*
|
||||
* @created 30th April, 2015
|
||||
* @author Llewellyn van der Merwe <https://dev.vdm.io>
|
||||
* @git Joomla Component Builder <https://git.vdm.dev/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;
|
||||
|
||||
|
||||
|
||||
?>
|
||||
<div id="<?php echo $displayData['id']; ?>">
|
||||
<?php echo Html::_('bootstrap.startTabSet', $displayData['id'] . '_tab', array('active' => $displayData['active'] . '-noticeboard')); ?>
|
||||
<?php echo Html::_('bootstrap.addTab', $displayData['id'] . '_tab', 'vdm-noticeboard', Text::_('COM_COMPONENTBUILDER_VDM_BOARD', true)); ?>
|
||||
<?php echo LayoutHelper::render('jcbnoticeboardvdm', null); ?>
|
||||
<div class="p-md-3"><?php echo ComponentbuilderHelper::getDynamicContent('banner', '728-90'); ?></div>
|
||||
<?php echo Html::_('bootstrap.endTab'); ?>
|
||||
<?php echo Html::_('bootstrap.addTab', $displayData['id'] . '_tab', 'pro-noticeboard', Text::_('COM_COMPONENTBUILDER_JCB_PRO_BOARD', true)); ?>
|
||||
<?php echo LayoutHelper::render('jcbnoticeboardpro', null); ?>
|
||||
<div class="p-md-3"><?php echo ComponentbuilderHelper::getDynamicContent('banner', '728-90'); ?></div>
|
||||
<?php echo Html::_('bootstrap.endTab'); ?>
|
||||
<?php echo Html::_('bootstrap.endTabSet'); ?>
|
||||
</div>
|
@ -1,30 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Component.Builder
|
||||
*
|
||||
* @created 30th April, 2015
|
||||
* @author Llewellyn van der Merwe <https://dev.vdm.io>
|
||||
* @git Joomla Component Builder <https://git.vdm.dev/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;
|
||||
|
||||
|
||||
|
||||
?>
|
||||
<div class="well well-small">
|
||||
<h2 class="module-title nav-header"><?= Text::_('COM_COMPONENTBUILDER_VDM_NOTICE_BOARD') ?><span class="vdm-new-notice" style="display:none; color:red;"> (<?= Text::_('COM_COMPONENTBUILDER_NEW_NOTICE') ?>)</span></h2>
|
||||
<div class="noticeboard-md"><small><?= Text::_('COM_COMPONENTBUILDER_THE_NOTICE_BOARD_IS_LOADING') ?><span class="loading-dots">.</span></small></div>
|
||||
<div style="text-align:right;"><small><a href="https://github.com/Llewellynvdm" target="_blank" style="color:gray"><<ewe>>yn</a></small></div>
|
||||
</div>
|
@ -116,9 +116,25 @@ $support_button = $button_names[random_int(0, 32)];
|
||||
?>
|
||||
<?php echo $support_message; ?>
|
||||
<br /><br />
|
||||
<img src="https://opencollective.com/joomla-component-builder/tiers/badge.svg" />
|
||||
<div style="display: flex; flex-wrap: wrap; gap: 10px;">
|
||||
<a href="https://opencollective.com/joomla-component-builder/contribute/donation-15820/checkout?interval=month&amount=40&contributeAs=me" title="Support Joomla Component Builder">
|
||||
<img src="https://opencollective.com/joomla-component-builder/tiers/badge.svg" alt="Joomla Component Builder Badge" />
|
||||
</a>
|
||||
<a href="https://status.vdm.dev/status/jcb" title="JCB Powers Uptime">
|
||||
<img src="https://status.vdm.dev/api/badge/25/uptime?labelPrefix=JCB+Powers+" alt="JCB Powers Uptime">
|
||||
</a>
|
||||
<a href="https://git.vdm.dev/joomla/pkg-component-builder/src/branch/5.x" title="Joomla 5 Compatible">
|
||||
<img src="https://img.shields.io/badge/Joomla-5.x%20Compatible-green.svg" alt="Joomla 5 Compatible">
|
||||
</a>
|
||||
<a href="https://git.vdm.dev/joomla/Component-Builder/src/branch/5.x/LICENSE.txt" title="GPLv3 License">
|
||||
<img src="https://img.shields.io/badge/License-GPLv2-blue.svg" alt="GPLv3 License">
|
||||
</a>
|
||||
<a href="https://github.com/vdm-io/Joomla-Component-Builder/stargazers" title="GitHub Stars">
|
||||
<img src="https://img.shields.io/github/stars/vdm-io/Joomla-Component-Builder.svg?style=flat&label=Star" alt="GitHub Stars">
|
||||
</a>
|
||||
</div>
|
||||
<br /><br />
|
||||
<a class="btn btn-mini btn-success" href="https://opencollective.com/joomla-component-builder/donate?interval=month&amount=20" title="<?php echo $support_titles; ?>" trage="_blank">
|
||||
<a class="btn btn-mini btn-outline-dark" style="width: 100%;" href="https://opencollective.com/joomla-component-builder/contribute/donation-15820/checkout?interval=month&amount=40&contributeAs=me" title="<?php echo $support_titles; ?>" target="_blank">
|
||||
<?php echo $support_button; ?>
|
||||
</a>
|
||||
<br />
|
||||
|
74
admin/layouts/mastodon.php
Normal file
74
admin/layouts/mastodon.php
Normal file
@ -0,0 +1,74 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Component.Builder
|
||||
*
|
||||
* @created 30th April, 2015
|
||||
* @author Llewellyn van der Merwe <https://dev.vdm.io>
|
||||
* @git Joomla Component Builder <https://git.vdm.dev/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");
|
||||
|
||||
?>
|
||||
<div class="well well-small mastadon-display-block">
|
||||
<h2>
|
||||
<a
|
||||
href="<?php echo $invite_url; ?>"
|
||||
title="<?php echo $invite_title; ?>">
|
||||
<?php echo $invite_heading; ?>
|
||||
</a>
|
||||
<a
|
||||
type="button"
|
||||
id="<?php echo $button_id; ?>"
|
||||
href="#"
|
||||
title="<?php echo Text::_('COM_COMPONENTBUILDER_REFRESH_FEED'); ?>">
|
||||
<i class="icon-loop"></i>
|
||||
</a>
|
||||
</h2>
|
||||
<div id="<?php echo $id; ?>"
|
||||
data-instance="<?php echo $instance; ?>"
|
||||
data-account-id="<?php echo $account; ?>"
|
||||
data-post-count="<?php echo $posts; ?>">
|
||||
</div>
|
||||
<script>
|
||||
new MastodonFeed("<?php echo $id; ?>", "<?php echo $button_id; ?>");
|
||||
</script>
|
||||
</div>
|
64
admin/layouts/socialnetworking.php
Normal file
64
admin/layouts/socialnetworking.php
Normal file
@ -0,0 +1,64 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Component.Builder
|
||||
*
|
||||
* @created 30th April, 2015
|
||||
* @author Llewellyn van der Merwe <https://dev.vdm.io>
|
||||
* @git Joomla Component Builder <https://git.vdm.dev/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;
|
||||
|
||||
|
||||
|
||||
?>
|
||||
<div id="llewellyns-social-icons" class="float-end social-icons">
|
||||
<a href="https://volunteers.joomla.org/joomlers/1396-llewellyn-van-der-merwe" class="text-decoration-none me-2" data-description="<?php echo Text::_('COM_COMPONENTBUILDER_JOIN_LLEWELLYN_ON_THE_JOOMLA_VOLUNTEER_PORTAL_SHAPING_THE_FUTURE_TOGETHER'); ?>">
|
||||
<i class="fa fa-joomla"></i>
|
||||
</a>
|
||||
<a href="https://git.vdm.dev/octoleo" class="text-decoration-none me-2" data-description="--quiet">
|
||||
<i class="fa fa-linux"></i>
|
||||
</a>
|
||||
<a href="https://git.vdm.dev/Llewellyn" class="text-decoration-none me-2" data-description="<?php echo Text::_('COM_COMPONENTBUILDER_COLLABORATE_AND_INNOVATE_WITH_LLEWELLYN_ON_GIT_BUILDING_A_BETTER_CODE_FUTURE'); ?>">
|
||||
<i class="fa fa-code-branch"></i>
|
||||
</a>
|
||||
<a href="https://joomla.social/@llewellyn" class="text-decoration-none me-2" data-description="<?php echo Text::_('COM_COMPONENTBUILDER_CONNECT_AND_ENGAGE_WITH_LLEWELLYN_ON_JOOMLA_SOCIAL_EMPOWERING_COMMUNITIES_ONE_POST_AT_A_TIME'); ?>">
|
||||
<i class="fa-brands fa-mastodon"></i>
|
||||
</a>
|
||||
<a href="https://x.com/llewellynvdm" class="text-decoration-none me-2" data-description="<?php echo Text::_('COM_COMPONENTBUILDER_JOIN_THE_CONVERSATION_WITH_LLEWELLYN_ON_X_WHERE_IDEAS_TAKE_FLIGHT'); ?>">
|
||||
<i class="fa-brands fa-x-twitter"></i>
|
||||
</a>
|
||||
<a href="https://github.com/Llewellynvdm" class="text-decoration-none me-2" data-description="<?php echo Text::_('COM_COMPONENTBUILDER_BUILD_INNOVATE_AND_THRIVE_WITH_LLEWELLYN_ON_GITHUB_TURNING_IDEAS_INTO_IMPACT'); ?>">
|
||||
<i class="fa fa-github"></i>
|
||||
</a>
|
||||
<a href="https://www.youtube.com/@OctoYou" class="text-decoration-none me-2" data-description="<?php echo Text::_('COM_COMPONENTBUILDER_EXPLORE_LEARN_AND_CREATE_WITH_LLEWELLYN_ON_YOUTUBE_YOUR_GATEWAY_TO_INSPIRATION'); ?>">
|
||||
<i class="fa fa-youtube"></i>
|
||||
</a>
|
||||
<a href="https://hub.docker.com/u/llewellyn" class="text-decoration-none me-2" data-description="<?php echo Text::_('COM_COMPONENTBUILDER_LLEWELLYN_ON_DOCKER_CONTAINERIZE_YOUR_CREATIVITY'); ?>">
|
||||
<i class="fa-brands fa-docker"></i>
|
||||
</a>
|
||||
<a href="https://opencollective.com/joomla-component-builder" class="text-decoration-none me-2" data-description="<?php echo Text::_('COM_COMPONENTBUILDER_DONATE_TOWARDS_JCB_HELP_LLEWELLYN_FINANCIALLY_SO_HE_CAN_CONTINUE_DEVELOPING_THIS_GREAT_TOOL'); ?>">
|
||||
<i class="fa-solid fa-circle-dollar-to-slot"></i>
|
||||
</a>
|
||||
<a href="https://git.vdm.dev/Llewellyn/gpg" class="text-decoration-none" data-description="<?php echo Text::_("COM_COMPONENTBUILDER_UNLOCK_TRUST_AND_SECURITY_WITH_LLEWELLYNS_GPG_KEY_YOUR_GATEWAY_TO_VERIFIED_CONNECTIONS"); ?>">
|
||||
<i class="fa-solid fa-fingerprint"></i>
|
||||
</a>
|
||||
</div>
|
||||
<br>
|
||||
<div id="llewellyns-social-icon-details" class="float-end social-icon-details"></div>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
new IconWaveAnimator("llewellyns-social-icons", "llewellyns-social-icon-details");
|
||||
});
|
||||
</script>
|
File diff suppressed because one or more lines are too long
@ -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
|
||||
{
|
||||
|
@ -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)) ? '<img alt="Joomla Component Image" src="'. Uri::root() . $object->image . '" style="float: right;">': '';
|
||||
$desc = (StringHelper::check($object->description)) ? $object->description : $object->short_description;
|
||||
$placeholder = ($object->add_placeholders == 1) ? '<span class="btn btn-small btn-success"> ' . Text::_('COM_COMPONENTBUILDER_YES') . ' </span>' : '<span class="btn btn-small btn-danger"> ' .Text::_('COM_COMPONENTBUILDER_NO') . ' </span>' ;
|
||||
$debug = ($object->debug_linenr == 1) ? '<span class="btn btn-small btn-success"> ' .Text::_('COM_COMPONENTBUILDER_YES') . '</span>' : ' <span class="btn btn-small btn-danger"> ' .Text::_('COM_COMPONENTBUILDER_NO') . ' </span>' ;
|
||||
$html = array();
|
||||
$html[] = '<h3>' . $object->name . ' (v' . $object->component_version . ')</h3>';
|
||||
$html[] = '<p>' . $desc . $image . '</p>';
|
||||
$html[] = '<ul>';
|
||||
$html[] = '<li>' . Text::_('COM_COMPONENTBUILDER_COMPANY') . ': <b>' . $object->companyname . '</b></li>';
|
||||
$html[] = '<li>' . Text::_('COM_COMPONENTBUILDER_AUTHOR') . ': <b>' . $object->author . '</b></li>';
|
||||
$html[] = '<li>' . Text::_('COM_COMPONENTBUILDER_EMAIL') . ': <b>' . $object->email . '</b></li>';
|
||||
$html[] = '<li>' . Text::_('COM_COMPONENTBUILDER_WEBSITE') . ': <b>' . $object->website . '</b></li>';
|
||||
$html[] = '</ul>';
|
||||
$html[] = '<h4>' . Text::_('COM_COMPONENTBUILDER_COMPONENT_GLOBAL_SETTINGS') . '</h4>';
|
||||
// Helper variables with null coalescing to ensure robust value assignment
|
||||
$imageSrc = !empty($object->image) ? htmlspecialchars($object->image, ENT_QUOTES) : null;
|
||||
$image = $imageSrc
|
||||
? '<img alt="' . Text::_('COM_COMPONENTBUILDER_JOOMLA_COMPONENT_IMAGE') . '" src="' . Uri::root() . $imageSrc . '" class="img-fluid" style="max-width: 250px;">'
|
||||
: null;
|
||||
|
||||
$description = htmlspecialchars(!empty($object->description) ? $object->description : $object->short_description, ENT_QUOTES);
|
||||
|
||||
$placeholderStatus = $object->add_placeholders
|
||||
? '<span class="badge bg-success">' . Text::_('COM_COMPONENTBUILDER_YES') . '</span>'
|
||||
: '<span class="badge bg-danger">' . Text::_('COM_COMPONENTBUILDER_NO') . '</span>';
|
||||
|
||||
$debugStatus = $object->debug_linenr
|
||||
? '<span class="badge bg-success">' . Text::_('COM_COMPONENTBUILDER_YES') . '</span>'
|
||||
: '<span class="badge bg-danger">' . Text::_('COM_COMPONENTBUILDER_NO') . '</span>';
|
||||
|
||||
// Author and company details
|
||||
$companyDetails = '<ul class="list-unstyled">';
|
||||
$companyDetails .= '<li><strong>' . Text::_('COM_COMPONENTBUILDER_COMPANY') . ':</strong> ' . htmlspecialchars($object->companyname ?? 'Vast Development Method', ENT_QUOTES) . '</li>';
|
||||
$companyDetails .= '<li><strong>' . Text::_('COM_COMPONENTBUILDER_AUTHOR') . ':</strong> ' . htmlspecialchars($object->author ?? 'Llewellyn van der Merwe', ENT_QUOTES) . '</li>';
|
||||
$companyDetails .= '<li><strong>' . Text::_('COM_COMPONENTBUILDER_EMAIL') . ':</strong> <a href="mailto:' . htmlspecialchars($object->email ?? 'joomla@vdm.io', ENT_QUOTES) . '">' . htmlspecialchars($object->email ?? 'joomla@vdm.io', ENT_QUOTES) . '</a></li>';
|
||||
$companyDetails .= '<li><strong>' . Text::_('COM_COMPONENTBUILDER_WEBSITE') . ':</strong> <a href="' . htmlspecialchars($object->website ?? 'https://dev.vdm.io', ENT_QUOTES) . '" target="_blank" rel="noopener">' . htmlspecialchars($object->website ?? 'https://dev.vdm.io', ENT_QUOTES) . '</a></li>';
|
||||
$companyDetails .= '</ul>';
|
||||
|
||||
// Build HTML output
|
||||
$html = [];
|
||||
|
||||
// Card container
|
||||
$html[] = '<div class="card mb-4">';
|
||||
$html[] = '<div class="card-body">';
|
||||
|
||||
// Header with component name and version
|
||||
$html[] = '<h2 class="card-title">' . htmlspecialchars($object->name, ENT_QUOTES) . ' (v' . htmlspecialchars($object->component_version, ENT_QUOTES) . ')</h2>';
|
||||
|
||||
// Row with image and text
|
||||
if (!empty($image))
|
||||
{
|
||||
$html[] = '<div class="row align-items-center">';
|
||||
$html[] = '<div class="col-md-7">';
|
||||
$html[] = '<p>' . $description . '</p>';
|
||||
$html[] = $companyDetails;
|
||||
$html[] = '</div>';
|
||||
$html[] = '<div class="col-md-5">' . $image . '</div>';
|
||||
$html[] = '</div>'; // End row
|
||||
}
|
||||
else
|
||||
{
|
||||
$html[] = '<div class="row align-items-center">';
|
||||
$html[] = '<p>' . $description . '</p>';
|
||||
$html[] = $companyDetails;
|
||||
$html[] = '</div>';
|
||||
}
|
||||
|
||||
// Component settings
|
||||
$html[] = '<h3 class="mt-4">' . Text::_('COM_COMPONENTBUILDER_COMPONENT_SETTINGS') . '</h3>';
|
||||
$html[] = '<p>';
|
||||
$html[] = Text::_('COM_COMPONENTBUILDER_ADD_CUSTOM_CODE_PLACEHOLDERS') . '<br />' . $placeholder . '<br />';
|
||||
$html[] = Text::_('COM_COMPONENTBUILDER_DEBUG_LINE_NUMBERS') . '<br />' . $debug ;
|
||||
$html[] = Text::_('COM_COMPONENTBUILDER_ADD_CUSTOM_CODE_PLACEHOLDERS') . ': ' . $placeholderStatus . '<br>';
|
||||
$html[] = Text::_('COM_COMPONENTBUILDER_DEBUG_LINE_NUMBERS') . ': ' . $debugStatus;
|
||||
$html[] = '</p>';
|
||||
$html[] = '<h4>' . Text::_('COM_COMPONENTBUILDER_LICENSE') . '</h4>';
|
||||
$html[] = '<p>' . $object->license . '</p>';
|
||||
$html[] = '<h4>' . Text::_('COM_COMPONENTBUILDER_COPYRIGHT') . '</h4>';
|
||||
$html[] = '<p>' . $object->copyright . '<br /><br />';
|
||||
$html[] = '<a href="index.php?option=com_componentbuilder&ref=compiler&view=joomla_components&task=joomla_component.edit&id=' . (int) $object->id . '" class="btn btn-small span12"><span class="icon-edit"></span> ' . Text::_('COM_COMPONENTBUILDER_EDIT') . ' ' .$object->system_name . '</a></p>';
|
||||
// now return the diplay
|
||||
|
||||
// License details
|
||||
$html[] = '<h3 class="mt-4">' . Text::_('COM_COMPONENTBUILDER_LICENSE') . '</h3>';
|
||||
$html[] = '<p>' . nl2br(htmlspecialchars($object->license, ENT_QUOTES)) . '</p>';
|
||||
|
||||
// Copyright
|
||||
$html[] = '<h3 class="mt-4">' . Text::_('COM_COMPONENTBUILDER_COPYRIGHT') . '</h3>';
|
||||
$html[] = '<p>' . nl2br(htmlspecialchars($object->copyright, ENT_QUOTES)) . '</p>';
|
||||
|
||||
// Edit button
|
||||
$html[] = '<a href="index.php?option=com_componentbuilder&ref=compiler&view=joomla_components&task=joomla_component.edit&id=' . (int)$object->id . '" class="btn btn-outline-action btn-lg mt-3" style="width: 100%;">';
|
||||
$html[] = '<span class="icon-edit"></span> ' . Text::_('COM_COMPONENTBUILDER_EDIT') . ' ' . htmlspecialchars($object->system_name, ENT_QUOTES);
|
||||
$html[] = '</a>';
|
||||
|
||||
$html[] = '</div>'; // End card body
|
||||
$html[] = '</div>'; // 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))
|
||||
|
@ -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 = "<span class=\"label label-important vdm-new-notice\">1</span> " + 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 '<div id="noticeboard-md">'.Text::_('COM_COMPONENTBUILDER_THE_NOTICE_BOARD_IS_LOADING').'.<span class="loading-dots">.</span></small></div>';
|
||||
}
|
||||
|
||||
public function getReadme()
|
||||
{
|
||||
$document = Factory::getDocument();
|
||||
|
@ -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());
|
||||
}
|
||||
");
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -154,17 +154,17 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
<?php echo $this->form->renderFieldset('builder'); ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<button class="btn btn-primary btn-lg px-4 me-sm-3" onclick="Joomla.submitbutton('compiler.compiler')"><span class="icon-cog icon-white"></span>
|
||||
<button class="btn btn-primary btn-lg px-4 me-sm-3" style="width: 100%;" onclick="Joomla.submitbutton('compiler.compiler')"><span class="icon-cog icon-white"></span>
|
||||
<?php echo Text::_('COM_COMPONENTBUILDER_COMPILE_COMPONENT'); ?>
|
||||
</button>
|
||||
<input type="hidden" name="install_item_id" value="0">
|
||||
<input type="hidden" name="version" value="3" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-7 p-md-3">
|
||||
<div class="col-md-8 p-md-3">
|
||||
<div id="advance-details"><?php echo $this->form->renderFieldset('advanced'); ?></div>
|
||||
<div id="component-details"><?php echo $selectNotice; ?></div>
|
||||
<?php echo LayoutHelper::render('jcbnoticeboardtabs', array('id' => 'noticeboard' , 'active' => $noticeboardOptions[array_rand($noticeboardOptions)])); ?>
|
||||
<?php echo LayoutHelper::render('jcbnoticeboard', null); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div id="get-compiler-animations" style="display:none;" class="row p-md-3">
|
||||
@ -184,9 +184,8 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
<p style="font-size: smaller;"><?php echo Text::_('COM_COMPONENTBUILDER_DURING_THE_INITIAL_COMPILATION_OF_ANY_COMPONENT_THE_PROCESS_MAY_TAKE_ADDITIONAL_TIME_AS_WE_RETRIEVE_AND_CONFIGURE_THE_ASSOCIATED_SUPERPOWERS_'); ?></p>
|
||||
<div style="text-align: center;"><?php echo ComponentbuilderHelper::getDynamicContent('builder-gif', $this->builder_gif_size); ?></div>
|
||||
</div>
|
||||
<div id="compiler-notice" class="col-md-6 p-md-3" style="display:none;">
|
||||
<?php echo LayoutHelper::render('jcbnoticeboard' . $noticeboardOptions[array_rand($noticeboardOptions)], null); ?>
|
||||
<div class="p-md-3"><?php echo ComponentbuilderHelper::getDynamicContent('banner', '728-90'); ?></div>
|
||||
<div id="compiler-notice" class="col-md-8 p-md-3" style="display:none;">
|
||||
<?php echo LayoutHelper::render('jcbnoticeboard', ['id' => 'mastodon-feed-2', 'button_id' => 'refresh-feed-2', 'posts' => 7]); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -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;
|
||||
|
||||
?>
|
||||
<?php echo $this->noticeboard; ?>
|
||||
<?php
|
||||
Html::_('script', "administrator/components/com_componentbuilder/assets/js/compiler.js", ['version' => '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);
|
||||
?>
|
||||
|
@ -1,15 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<extension type="component" version="5.0" method="upgrade">
|
||||
<name>COM_COMPONENTBUILDER</name>
|
||||
<creationDate>16th December, 2024</creationDate>
|
||||
<creationDate>28th December, 2024</creationDate>
|
||||
<author>Llewellyn van der Merwe</author>
|
||||
<authorEmail>joomla@vdm.io</authorEmail>
|
||||
<authorUrl>https://dev.vdm.io</authorUrl>
|
||||
<copyright>Copyright (C) 2015 Vast Development Method. All rights reserved.</copyright>
|
||||
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
|
||||
<version>5.0.4-beta2</version>
|
||||
<version>5.0.4-beta3</version>
|
||||
<description><![CDATA[
|
||||
<h1>Component Builder (v.5.0.4-beta2)</h1>
|
||||
<h1>Component Builder (v.5.0.4-beta3)</h1>
|
||||
<div style="clear: both;"></div>
|
||||
<p>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.
|
||||
|
||||
|
@ -134,7 +134,7 @@
|
||||
<version>5.0.4-beta</version>
|
||||
<infourl title="Component Builder!">https://dev.vdm.io</infourl>
|
||||
<downloads>
|
||||
<downloadurl type="full" format="zip">https://git.vdm.dev/api/v1/repos/joomla/pkg-component-builder/archive/v5.0.4-beta2.zip</downloadurl>
|
||||
<downloadurl type="full" format="zip">https://git.vdm.dev/api/v1/repos/joomla/pkg-component-builder/archive/v5.0.4-beta3.zip</downloadurl>
|
||||
</downloads>
|
||||
<tags>
|
||||
<tag>beta</tag>
|
||||
@ -149,10 +149,10 @@
|
||||
<element>pkg_component_builder</element>
|
||||
<type>package</type>
|
||||
<client>site</client>
|
||||
<version>5.0.4-beta2</version>
|
||||
<version>5.0.4-beta3</version>
|
||||
<infourl title="Component Builder!">https://dev.vdm.io</infourl>
|
||||
<downloads>
|
||||
<downloadurl type="full" format="zip">https://git.vdm.dev/api/v1/repos/joomla/pkg-component-builder/archive/v5.0.4-beta2.zip</downloadurl>
|
||||
<downloadurl type="full" format="zip">https://git.vdm.dev/api/v1/repos/joomla/pkg-component-builder/archive/v5.0.4-beta3.zip</downloadurl>
|
||||
</downloads>
|
||||
<tags>
|
||||
<tag>beta</tag>
|
||||
|
@ -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(
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user