mirror of
https://github.com/fruithost/Panel.git
synced 2026-11-02 10:07:24 +09:00
213 lines
7.6 KiB
JavaScript
213 lines
7.6 KiB
JavaScript
/**
|
|
* fruithost | OpenSource Hosting
|
|
*
|
|
* @author Adrian Preuß
|
|
* @version 1.0.0
|
|
* @license MIT
|
|
*/
|
|
'use strict';
|
|
|
|
class ModuleInfo {
|
|
constructor() {
|
|
let modal = document.querySelector('div#module_info');
|
|
|
|
if(modal) {
|
|
modal.addEventListener('show.bs.modal', this.onShow.bind(this));
|
|
}
|
|
}
|
|
|
|
error(modal, text) {
|
|
// @ToDo Create Error
|
|
console.warn('TPL-Error', text);
|
|
}
|
|
|
|
build(modal, response) {
|
|
let tabs = [];
|
|
let module = response.info;
|
|
|
|
if(typeof(response.info) == 'undefined') {
|
|
return;
|
|
}
|
|
|
|
/* Header */
|
|
try {
|
|
if(module.name) {
|
|
modal.querySelector('.modal-title').innerText = module.name;
|
|
}
|
|
|
|
if(module.icon) {
|
|
modal.querySelector('.module-icon').innerHTML = module.icon;
|
|
}
|
|
|
|
if(module.name) {
|
|
modal.querySelector('.module-name').innerText = module.name;
|
|
}
|
|
|
|
if(module.version) {
|
|
modal.querySelector('.module-version').innerText = module.version;
|
|
}
|
|
|
|
if(module.description) {
|
|
modal.querySelector('.module-description').innerText = module.description;
|
|
}
|
|
|
|
if(module.author) {
|
|
if(module.author.email) {
|
|
if(module.author.email) {
|
|
modal.querySelector('.module-author').innerHTML = '<a href="mailto:' + module.author.email + '" class="text-decoration-none" target="_blank">' + module.author.name + '</a>';
|
|
} else if(module.author.name) {
|
|
modal.querySelector('.module-author').innerHTML = module.author.name;
|
|
} else {
|
|
modal.querySelector('.module-author').innerHTML = 'Unknown'; // @ToDo Language
|
|
}
|
|
}
|
|
|
|
if(module.author.url) {
|
|
modal.querySelector('.module-url').innerHTML = '<a href="' + module.author.url + '" class="text-decoration-none" target="_blank">' + module.author.url + '</a>';
|
|
}
|
|
}
|
|
} catch(e) {
|
|
console.error('[ERROR]', 'Can\'t handle Module-Infos:', e);
|
|
}
|
|
|
|
/* Readme */
|
|
try {
|
|
if(response.readme.length > 0) {
|
|
tabs.push('details');
|
|
modal.querySelector('.nav-item.details-tab').classList.remove('d-none');
|
|
modal.querySelector('div#details-pane').innerHTML = response.readme;
|
|
} else {
|
|
modal.querySelector('div#details-pane').innerHTML = '';
|
|
}
|
|
} catch (e) {
|
|
console.error('[ERROR]', 'Can\'t handle Module-Readme:', e);
|
|
}
|
|
|
|
/* Screenshots */
|
|
try {
|
|
if(response.screenshots.length > 0) {
|
|
tabs.push('screenshots');
|
|
let screenshots = modal.querySelector('div#screenshotHolder div.carousel-inner');
|
|
modal.querySelector('.nav-item.screenshots-tab').classList.remove('d-none');
|
|
screenshots.innerHTML = '';
|
|
|
|
response.screenshots.forEach((entry, index) => {
|
|
let container = document.createElement('div');
|
|
container.classList.add('carousel-item');
|
|
|
|
if(index === 0) {
|
|
container.classList.add('active');
|
|
}
|
|
|
|
/* Image */
|
|
let image = new Image();
|
|
image.src = entry;
|
|
image.classList.add('d-block');
|
|
image.classList.add('w-100');
|
|
container.appendChild(image);
|
|
|
|
/* Description */
|
|
if (typeof(module.screenshots[index].description) !== 'undefined') {
|
|
let descripton = document.createElement('div');
|
|
|
|
descripton.classList.add('carousel-caption');
|
|
descripton.classList.add('d-none');
|
|
descripton.classList.add('d-md-block');
|
|
descripton.innerHTML = '<p>' + module.screenshots[index].description + '</p>';
|
|
|
|
container.appendChild(descripton);
|
|
}
|
|
|
|
screenshots.appendChild(container);
|
|
});
|
|
} else {
|
|
screenshots.innerHTML = '';
|
|
}
|
|
} catch (e) {
|
|
console.error('[ERROR]', 'Can\'t handle Module-Screenshots:', e);
|
|
}
|
|
|
|
/* Changelog */
|
|
try {
|
|
if(response.changelog.length > 0) {
|
|
tabs.push('changelog');
|
|
modal.querySelector('.nav-item.changelog-tab').classList.remove('d-none');
|
|
modal.querySelector('div#changelog-pane').innerHTML = response.changelog;
|
|
} else {
|
|
modal.querySelector('div#changelog-pane').innerHTML = '';
|
|
}
|
|
} catch (e) {
|
|
console.error('[ERROR]', 'Can\'t handle Module-Changelog:', e);
|
|
}
|
|
|
|
/* Find the first Tab */
|
|
if(tabs.length > 0) {
|
|
let active = tabs[0];
|
|
|
|
modal.querySelector('.nav.nav-tabs').classList.remove('d-none');
|
|
modal.querySelector('.nav-item.' + active + '-tab').classList.remove('d-none');
|
|
modal.querySelector('.nav-item.' + active + '-tab .nav-link').classList.add('active');
|
|
modal.querySelector('.nav-item.' + active + '-tab .nav-link').ariaSelected = true;
|
|
modal.querySelector('#' + active + '-pane').classList.add('active');
|
|
modal.querySelector('#' + active + '-pane').classList.add('show');
|
|
} else {
|
|
modal.querySelector('.nav.nav-tabs').classList.add('d-none');
|
|
}
|
|
|
|
this.loading(modal, false);
|
|
}
|
|
|
|
loading(modal, state) {
|
|
let loading = modal.querySelector('.modal-loading');
|
|
|
|
if(loading) {
|
|
loading.dataset.fetching = (state ? 'true' : 'false');
|
|
}
|
|
}
|
|
|
|
onShow(event) {
|
|
let modal = event.target;
|
|
modal.classList.add('modal-xl');
|
|
this.loading(modal, true);
|
|
|
|
/* Default hide all Tabs */
|
|
[
|
|
'details',
|
|
'screenshots',
|
|
'changelog',
|
|
'features'
|
|
].forEach((tab) => {
|
|
modal.querySelector('.nav-item.' + tab + '-tab').classList.add('d-none');
|
|
modal.querySelector('#' + tab + '-pane').classList.remove('show');
|
|
modal.querySelector('#' + tab + '-pane').classList.remove('active');
|
|
modal.querySelector('.nav-item.' + tab + '-tab .nav-link').classList.remove('active');
|
|
modal.querySelector('.nav-item.' + tab + '-tab .nav-link').ariaSelected = false;
|
|
});
|
|
|
|
new Ajax('/ajax').onSuccess( (response) => {
|
|
switch(response) {
|
|
case 'NO_PERMISSIONS':
|
|
this.error(modal, 'You have no permissions for this action.'); // @ToDo Language
|
|
break;
|
|
case 'NO_REPOSITORYS':
|
|
this.error(modal, 'No repositorys.'); // @ToDo Language
|
|
break;
|
|
case 'MODULE_NOT_FOUND':
|
|
this.error(modal, 'Module not found.'); // @ToDo Language
|
|
break;
|
|
case 'MODULE_EMPTY':
|
|
this.error(modal, 'Module is empty.'); // @ToDo Language
|
|
break;
|
|
default:
|
|
this.build(modal, response);
|
|
break;
|
|
}
|
|
}).post({
|
|
'module': event.relatedTarget.dataset.module
|
|
});
|
|
}
|
|
}
|
|
|
|
window.addEventListener('DOMContentLoaded', () => {
|
|
window.ModuleInfo = new ModuleInfo();
|
|
}); |