first commit

This commit is contained in:
2025-06-17 11:53:18 +02:00
commit 9f0f7ba12b
8804 changed files with 1369176 additions and 0 deletions

View File

@ -0,0 +1,110 @@
.com-apps-container .badge {
margin: 1px;
}
.com-apps-container .badge.badge-success {
background-color: var(--success);
}
.com-apps-container .badge.badge-secondary {
background-color: var(--secondary);
}
.com-apps-container .badge.badge-danger {
background-color: var(--danger);
}
.com-apps-container .badge.badge-warning {
background-color: var(--warning);
}
.com-apps-container .fader {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
margin-top: 5px;
text-align: center;
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(70%, rgba(255, 255, 255, 0)), color-stop(95%, rgb(255, 255, 255)));
background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0) 70%, rgb(255, 255, 255) 95%);
}
.com-apps-container .com-apps-sidebar .nav .nav {
-webkit-padding-start: 15px;
padding-inline-start: 15px;
}
.com-apps-container .com-apps-sidebar a:hover, .com-apps-container .com-apps-sidebar a.active {
color: #fff;
text-decoration: none;
background-color: #33608f;
}
.com-apps-container .grid-container .card {
height: 400px;
margin-bottom: 2rem;
}
.com-apps-container .grid-container .card:hover {
background-color: var(--gray-200);
}
.com-apps-container .grid-container .card-img, .com-apps-container .grid-container .card-img-top {
height: 6rem;
overflow: hidden;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.com-apps-container .grid-container .card-text {
height: 160px;
overflow: hidden;
}
.com-apps-container .grid-container .card-body {
padding: 0.5rem;
cursor: pointer;
}
.com-apps-container .list-container {
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.com-apps-container .list-container .fader {
background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0)), color-stop(25%, rgb(255, 255, 255)));
background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0) 0%, rgb(255, 255, 255) 25%);
}
.com-apps-container .list-container .list-group-item {
margin-bottom: 10px;
}
.com-apps-container .list-container .list-group-item:hover {
background-color: #f8f8f8;
}
.com-apps-container .list-container .list-group-item .row {
cursor: pointer;
}
.com-apps-container .item-view {
margin-top: 3rem;
}
.com-apps-container .item-view a[target=_blank] span.icon-download, .com-apps-container .item-view a[target=_blank] span.icon-list, .com-apps-container .item-view a[target=_blank] span.icon-share-alt {
display: none;
}
.com-apps-container .form-row {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
.com-apps-container .form-row .col-md:first-child {
-webkit-margin-end: 0.8rem;
margin-inline-end: 0.8rem;
}
.com-apps-container .form-row .input-group .input-group-append button#search-extensions {
border-start-start-radius: 0;
border-end-start-radius: 0;
}
.com-apps-container .form-row .input-group .input-group-append button#search-reset {
-webkit-margin-start: 0.8rem;
margin-inline-start: 0.8rem;
}
.ifw-busy {
overflow: hidden;
}
.ifw-loading-container {
top: 0;
left: 0;
z-index: 1000;
width: 100%;
height: 100%;
background: url("../../system/images/ajax-loader.gif?v=144b8c") rgba(255, 255, 255, 0.7) 50% 10px no-repeat;
opacity: 0.95;
}

View File

@ -0,0 +1 @@
.com-apps-container .badge{margin:1px}.com-apps-container .badge.badge-success{background-color:var(--success)}.com-apps-container .badge.badge-secondary{background-color:var(--secondary)}.com-apps-container .badge.badge-danger{background-color:var(--danger)}.com-apps-container .badge.badge-warning{background-color:var(--warning)}.com-apps-container .fader{background-image:-webkit-gradient(linear,left top,left bottom,color-stop(70%,hsla(0,0%,100%,0)),color-stop(95%,#fff));background-image:linear-gradient(180deg,hsla(0,0%,100%,0) 70%,#fff 95%);height:100%;left:0;margin-top:5px;position:absolute;text-align:center;top:0;width:100%}.com-apps-container .com-apps-sidebar .nav .nav{-webkit-padding-start:15px;padding-inline-start:15px}.com-apps-container .com-apps-sidebar a.active,.com-apps-container .com-apps-sidebar a:hover{background-color:#33608f;color:#fff;text-decoration:none}.com-apps-container .grid-container .card{height:400px;margin-bottom:2rem}.com-apps-container .grid-container .card:hover{background-color:var(--gray-200)}.com-apps-container .grid-container .card-img,.com-apps-container .grid-container .card-img-top{border-top-left-radius:0;border-top-right-radius:0;height:6rem;overflow:hidden}.com-apps-container .grid-container .card-text{height:160px;overflow:hidden}.com-apps-container .grid-container .card-body{cursor:pointer;padding:.5rem}.com-apps-container .list-container{-webkit-box-sizing:border-box;box-sizing:border-box}.com-apps-container .list-container .fader{background-image:-webkit-gradient(linear,left top,left bottom,from(hsla(0,0%,100%,0)),color-stop(25%,#fff));background-image:linear-gradient(180deg,hsla(0,0%,100%,0) 0,#fff 25%)}.com-apps-container .list-container .list-group-item{margin-bottom:10px}.com-apps-container .list-container .list-group-item:hover{background-color:#f8f8f8}.com-apps-container .list-container .list-group-item .row{cursor:pointer}.com-apps-container .item-view{margin-top:3rem}.com-apps-container .item-view a[target=_blank] span.icon-download,.com-apps-container .item-view a[target=_blank] span.icon-list,.com-apps-container .item-view a[target=_blank] span.icon-share-alt{display:none}.com-apps-container .form-row{display:-webkit-box;display:-ms-flexbox;display:flex}.com-apps-container .form-row .col-md:first-child{-webkit-margin-end:.8rem;margin-inline-end:.8rem}.com-apps-container .form-row .input-group .input-group-append button#search-extensions{border-end-start-radius:0;border-start-start-radius:0}.com-apps-container .form-row .input-group .input-group-append button#search-reset{-webkit-margin-start:.8rem;margin-inline-start:.8rem}.ifw-busy{overflow:hidden}.ifw-loading-container{background:url("../../system/images/ajax-loader.gif?v=144b8c") hsla(0,0%,100%,.7) 50% 10px no-repeat;height:100%;left:0;opacity:.95;top:0;width:100%;z-index:1000}

Binary file not shown.

View File

@ -0,0 +1,365 @@
/**
* @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
if (!Joomla) {
throw new Error('Joomla API is not properly initialised');
}
const allowList = {
button: ['type'],
input: ['type', 'name', 'placeholder', 'inputmode'],
select: ['name'],
option: ['value', 'selected']
};
const webInstallerOptions = {
view: 'dashboard',
id: 0,
ordering: '',
version: 'current',
list: 0,
options: Joomla.getOptions('plg_installer_webinstaller', {})
};
let instance;
class WebInstaller {
initialise() {
webInstallerOptions.loaded = 1;
const cancelButton = document.getElementById('uploadform-web-cancel');
cancelButton.addEventListener('click', () => {
document.getElementById('uploadform-web').classList.add('hidden');
if (webInstallerOptions.list && document.querySelector('.list-view')) {
document.querySelector('.list-view').click();
}
});
const installButton = document.getElementById('uploadform-web-install');
installButton.addEventListener('click', () => {
if (webInstallerOptions.options.installFrom === 4) {
this.submitButtonUrl();
} else {
this.submitButtonWeb();
}
});
this.loadweb(`${webInstallerOptions.options.base_url}index.php?format=json&option=com_apps&view=dashboard`);
this.clickforlinks();
}
loadweb(url) {
if (!url) {
return false;
}
// eslint-disable-next-line prefer-regex-literals
const pattern1 = new RegExp(webInstallerOptions.options.base_url);
const pattern2 = /^index\.php/;
if (!(pattern1.test(url) || pattern2.test(url))) {
window.open(url, '_blank');
return false;
}
let requestUrl = `${url}&product=${webInstallerOptions.options.product}&release=${webInstallerOptions.options.release}&dev_level=${webInstallerOptions.options.dev_level}&list=${webInstallerOptions.list ? 'list' : 'grid'}&lang=${webInstallerOptions.options.language}`;
const orderingSelect = document.getElementById('com-apps-ordering');
const versionSelect = document.getElementById('com-apps-filter-joomla-version');
if (webInstallerOptions.ordering !== '' && orderingSelect && orderingSelect.value) {
webInstallerOptions.ordering = orderingSelect.value;
requestUrl += `&ordering=${webInstallerOptions.ordering}`;
}
if (webInstallerOptions.version !== '' && versionSelect && versionSelect.value) {
webInstallerOptions.version = versionSelect.value;
requestUrl += `&filter_version=${webInstallerOptions.version}`;
}
WebInstaller.showLoadingLayer();
new Promise((resolve, reject) => {
Joomla.request({
url: requestUrl,
onSuccess: resp => {
let response;
try {
response = JSON.parse(resp);
} catch (error) {
throw new Error('Failed to parse JSON');
}
if (document.getElementById('web-loader')) {
document.getElementById('web-loader').classList.add('hidden');
}
const jedContainer = document.getElementById('jed-container');
jedContainer.innerHTML = Joomla.sanitizeHtml(response.data.html, allowList);
document.getElementById('com-apps-searchbox').addEventListener('keypress', ({
which
}) => {
if (which === 13) {
this.initiateSearch();
}
});
document.getElementById('search-extensions').addEventListener('click', () => {
this.initiateSearch();
});
document.getElementById('search-reset').addEventListener('click', () => {
const searchBox = document.getElementById('com-apps-searchbox');
searchBox.value = '';
this.initiateSearch();
document.getElementById('search-reset').setAttribute('disabled', 'disabled');
});
if (document.getElementById('com-apps-searchbox').value === '') {
document.getElementById('search-reset').setAttribute('disabled', 'disabled');
}
document.getElementById('search-reset').innerHTML = Joomla.sanitizeHtml(Joomla.Text._('JSEARCH_FILTER_CLEAR'));
// eslint-disable-next-line no-shadow
const orderingSelect = document.getElementById('com-apps-ordering');
// eslint-disable-next-line no-shadow
const versionSelect = document.getElementById('com-apps-filter-joomla-version');
if (orderingSelect) {
orderingSelect.addEventListener('change', () => {
const index = orderingSelect.selectedIndex;
webInstallerOptions.ordering = orderingSelect.options[index].value;
this.installfromwebajaxsubmit();
});
}
if (versionSelect) {
versionSelect.addEventListener('change', () => {
const index = versionSelect.selectedIndex;
webInstallerOptions.version = versionSelect.options[index].value;
this.installfromwebajaxsubmit();
});
}
if (webInstallerOptions.options.installfrom_url !== '') {
WebInstaller.installfromweb(webInstallerOptions.options.installfrom_url);
}
resolve();
},
onError: request => {
const errorContainer = document.getElementById('web-loader-error');
const loaderContainer = document.getElementById('web-loader');
if (request.responseText && errorContainer) {
errorContainer.innerHTML = Joomla.sanitizeHtml(request.responseText);
}
if (loaderContainer) {
loaderContainer.classList.add('hidden');
errorContainer.classList.remove('hidden');
}
Joomla.renderMessages({
danger: [Joomla.Text._('PLG_INSTALLER_WEBINSTALLER_INSTALL_WEB_LOADING_ERROR')]
}, '#web-loader-error');
reject();
}
});
}).finally(() => {
// Promise has been settled.
// Run the following whether or not it was a success.
const installAtField = document.getElementById('joomlaapsinstallatinput');
if (installAtField) {
installAtField.value = webInstallerOptions.options.installat_url;
}
this.clickforlinks();
WebInstaller.clicker();
if (webInstallerOptions.view !== 'extension') {
[].slice.call(document.querySelectorAll('div.load-extension')).forEach(element => {
element.addEventListener('click', event => {
event.preventDefault();
this.processLinkClick(element.getAttribute('data-url'));
});
element.setAttribute('href', '#');
});
}
if (webInstallerOptions.view === 'extension') {
const installExtensionButton = document.getElementById('install-extension');
const installExtensionFromExternalButton = document.getElementById('install-extension-from-external');
if (installExtensionButton) {
installExtensionButton.addEventListener('click', () => {
WebInstaller.installfromweb(installExtensionButton.getAttribute('data-downloadurl'), installExtensionButton.getAttribute('data-name'));
document.getElementById('uploadform-web-install').scrollIntoView({
behavior: 'smooth',
block: 'start'
});
});
}
if (installExtensionFromExternalButton) {
installExtensionFromExternalButton.addEventListener('click', () => {
const redirectUrl = installExtensionFromExternalButton.getAttribute('data-downloadurl');
const redirectConfirm = window.confirm(Joomla.Text._('PLG_INSTALLER_WEBINSTALLER_REDIRECT_TO_EXTERNAL_SITE_TO_INSTALL').replace('[SITEURL]', redirectUrl));
if (redirectConfirm !== true) {
return;
}
document.getElementById('adminForm').setAttribute('action', redirectUrl);
document.querySelector('input[name=task]').setAttribute('disabled', true);
document.querySelector('input[name=install_directory]').setAttribute('disabled', true);
document.querySelector('input[name=install_url]').setAttribute('disabled', true);
document.querySelector('input[name=installtype]').setAttribute('disabled', true);
document.querySelector('input[name=filter_search]').setAttribute('disabled', true);
document.getElementById('adminForm').submit();
});
}
}
if (webInstallerOptions.list && document.querySelector('.list-view')) {
document.querySelector('.list-view').click();
}
WebInstaller.hideLoadingLayer();
});
return true;
}
clickforlinks() {
[].slice.call(document.querySelectorAll('a.transcode')).forEach(element => {
const ajaxurl = element.getAttribute('href');
element.addEventListener('click', event => {
event.preventDefault();
this.processLinkClick(ajaxurl);
});
element.setAttribute('href', '#');
});
}
initiateSearch() {
document.getElementById('search-reset').removeAttribute('disabled');
webInstallerOptions.view = 'dashboard';
this.installfromwebajaxsubmit();
}
installfromwebajaxsubmit() {
let tail = `&view=${webInstallerOptions.view}`;
if (webInstallerOptions.id) {
tail += `&id=${webInstallerOptions.id}`;
}
if (document.getElementById('com-apps-searchbox').value) {
const value = encodeURI(document.getElementById('com-apps-searchbox').value.toLowerCase().replace(/ +/g, '_').replace(/[^a-z0-9-_]/g, '').trim());
tail += `&filter_search=${value}`;
}
const orderingSelect = document.getElementById('com-apps-ordering');
const versionSelect = document.getElementById('com-apps-filter-joomla-version');
if (webInstallerOptions.ordering !== '' && orderingSelect && orderingSelect.value) {
webInstallerOptions.ordering = orderingSelect.value;
}
if (webInstallerOptions.ordering) {
tail += `&ordering=${webInstallerOptions.ordering}`;
}
if (webInstallerOptions.version !== '' && versionSelect && versionSelect.value) {
webInstallerOptions.version = versionSelect.value;
}
if (webInstallerOptions.version) {
tail += `&filter_version=${webInstallerOptions.version}`;
}
this.loadweb(`${webInstallerOptions.options.base_url}index.php?format=json&option=com_apps${tail}`);
}
processLinkClick(url) {
const pattern1 = new RegExp(webInstallerOptions.options.base_url);
const pattern2 = /^index\.php/;
if (pattern1.test(url) || pattern2.test(url)) {
webInstallerOptions.view = url.replace(/^.+[&?]view=(\w+).*$/, '$1');
if (webInstallerOptions.view === 'dashboard') {
webInstallerOptions.id = 0;
} else if (webInstallerOptions.view === 'category') {
webInstallerOptions.id = url.replace(/^.+[&?]id=(\d+).*$/, '$1');
}
this.loadweb(webInstallerOptions.options.base_url + url);
} else {
this.loadweb(url);
}
}
static showLoadingLayer() {
document.getElementById('web').appendChild(document.createElement('joomla-core-loader'));
}
static hideLoadingLayer() {
const spinnerElement = document.querySelector('#web joomla-core-loader');
spinnerElement.parentNode.removeChild(spinnerElement);
}
static clicker() {
if (document.querySelector('.grid-view')) {
document.querySelector('.grid-view').addEventListener('click', () => {
webInstallerOptions.list = 0;
document.querySelector('.list-container').classList.add('hidden');
document.querySelector('.grid-container').classList.remove('hidden');
document.getElementById('btn-list-view').classList.remove('active');
document.getElementById('btn-grid-view').classList.remove('active');
});
}
if (document.querySelector('.list-view')) {
document.querySelector('.list-view').addEventListener('click', () => {
webInstallerOptions.list = 1;
document.querySelector('.grid-container').classList.add('hidden');
document.querySelector('.list-container').classList.remove('hidden');
document.getElementById('btn-grid-view').classList.remove('active');
document.getElementById('btn-list-view').classList.add('active');
});
}
}
/**
* @param {string} installUrl
* @param {string} name
* @returns {boolean}
*/
static installfromweb(installUrl, name = null) {
if (!installUrl) {
Joomla.renderMessages({
warning: [Joomla.Text._('PLG_INSTALLER_WEBINSTALLER_CANNOT_INSTALL_EXTENSION_IN_PLUGIN')]
});
return false;
}
document.getElementById('install_url').value = installUrl;
document.getElementById('uploadform-web-url').innerText = installUrl;
if (name) {
document.getElementById('uploadform-web-name').innerText = name;
document.getElementById('uploadform-web-name-label').classList.remove('hidden');
} else {
document.getElementById('uploadform-web-name-label').classList.add('hidden');
}
document.getElementById('uploadform-web').classList.remove('hidden');
return true;
}
// eslint-disable-next-line class-methods-use-this
submitButtonUrl() {
const form = document.getElementById('adminForm');
// do field validation
if (form.install_url.value === '' || form.install_url.value === 'http://' || form.install_url.value === 'https://') {
Joomla.renderMessages({
warning: [Joomla.Text._('COM_INSTALLER_MSG_INSTALL_ENTER_A_URL')]
});
} else {
const loading = document.getElementById('loading');
if (loading) {
loading.classList.remove('hidden');
}
form.installtype.value = 'url';
form.submit();
}
}
submitButtonWeb() {
const form = document.getElementById('adminForm');
// do field validation
if (form.install_url.value !== '' || form.install_url.value !== 'http://' || form.install_url.value !== 'https://') {
this.submitButtonUrl();
} else if (form.install_url.value === '') {
Joomla.renderMessages({
warning: [Joomla.apps.options.btntxt]
});
} else {
document.querySelector('#appsloading').classList.remove('hidden');
form.installtype.value = 'web';
form.submit();
}
}
}
customElements.whenDefined('joomla-tab').then(() => {
const installerTabs = document.getElementById('myTab');
const link = installerTabs.querySelector('button[aria-controls=web]');
// Stop if the IFW tab cannot be found
if (!link) {
return;
}
if (webInstallerOptions.options.installfromon) {
link.click();
}
if (link.hasAttribute('aria-expanded') && link.getAttribute('aria-expanded') === 'true' && !instance) {
instance = new WebInstaller();
instance.initialise();
}
if (webInstallerOptions.options.installfrom_url !== '') {
link.click();
}
link.addEventListener('joomla.tab.shown', () => {
if (!instance) {
instance = new WebInstaller();
instance.initialise();
}
});
});

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -0,0 +1,158 @@
// Bootstrap functions
@import "../../../../media/vendor/bootstrap/scss/functions";
// Bootstrap other
@import "../../../../media/vendor/bootstrap/scss/mixins";
@import "../../../../media/vendor/bootstrap/scss/variables";
// Extension variables
$extension-types: (
"jcommercial": #f6c801,
"jcomponent": #1e9e33,
"jlanguage": $dark,
"jmodule": #e20a0a,
"jplugin": #57278e,
"jspecific": #d69b34,
"jtool": #333
);
.com-apps-container {
// Extension type badges
.badge {
margin: 1px;
// BS5 Dropped all .badge-* color classes
&.badge-success {
background-color: var(--success);
}
&.badge-secondary {
background-color: var(--secondary);
}
&.badge-danger {
background-color: var(--danger);
}
&.badge-warning {
background-color: var(--warning);
}
}
.fader {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
margin-top: 5px;
text-align: center;
@include gradient-y(rgba(255,255,255,0), rgba(255,255,255,1), 70%, 95%);
}
.com-apps-sidebar {
// Bootstrap 4 does not indent second level navigation
.nav {
.nav {
padding-inline-start: 15px;
}
}
a {
&:hover,
&.active {
color: $white;
text-decoration: none;
background-color: #33608f;
}
}
}
.grid-container {
.card {
height: 400px;
margin-bottom: 2rem;
&:hover {
background-color: var(--gray-200);
}
}
.card-img, .card-img-top {
height: 6rem;
overflow: hidden;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.card-text {
height: 160px;
overflow: hidden;
}
.card-body {
padding: .5rem;
cursor: pointer;
}
}
.list-container {
box-sizing: border-box;
// Override fader gradient
.fader {
@include gradient-y(rgba(255,255,255,0), rgba(255,255,255,1), 0%, 25%);
}
.list-group-item {
margin-bottom: 10px;
&:hover {
background-color: #f8f8f8;
}
.row {
cursor: pointer;
}
}
}
.item-view {
margin-top: 3rem;
a[target="_blank"] {
span.icon-download, span.icon-list, span.icon-share-alt {
display: none;
}
}
}
.form-row {
display: flex;
.col-md:first-child {
margin-inline-end: .8rem;
}
.input-group {
.input-group-append {
button#search-extensions {
border-start-start-radius: 0;
border-end-start-radius: 0;
}
button#search-reset {
margin-inline-start: .8rem;
}
}
}
}
}
// Disallow scrolling when overlay is active
.ifw-busy {
overflow: hidden;
}
.ifw-loading-container {
top: 0;
left: 0;
z-index: 1000;
width: 100%;
height: 100%;
background: url("../../system/images/ajax-loader.gif") rgba(255,255,255,.7) 50% 10px no-repeat;
opacity: .95;
}