import Page from '../../common/components/Page'; import Button from '../../common/components/Button'; import Dropdown from '../../common/components/Dropdown'; import AddExtensionModal from './AddExtensionModal'; import LoadingModal from './LoadingModal'; import ItemList from '../../common/utils/ItemList'; import icon from '../../common/helpers/icon'; export default class ExtensionsPage extends Page { view() { return (
{Button.component( { icon: 'fas fa-plus', className: 'Button Button--primary', onclick: () => app.modal.show(AddExtensionModal), }, app.translator.trans('core.admin.extensions.add_button') )}
    {Object.keys(app.data.extensions).map((id) => { const extension = app.data.extensions[id]; const controls = this.controlItems(extension.id).toArray(); return (
  • {extension.icon ? icon(extension.icon.name) : ''} {controls.length ? ( {controls} ) : ( '' )}
    {extension.version}
    {extension.description}
  • ); })}
); } controlItems(name) { const items = new ItemList(); const enabled = this.isEnabled(name); if (app.extensionSettings[name]) { items.add( 'settings', Button.component( { icon: 'fas fa-cog', onclick: app.extensionSettings[name], }, app.translator.trans('core.admin.extensions.settings_button') ) ); } if (!enabled) { items.add( 'uninstall', Button.component( { icon: 'far fa-trash-alt', onclick: () => { app .request({ url: app.forum.attribute('apiUrl') + '/extensions/' + name, method: 'DELETE', }) .then(() => window.location.reload()); app.modal.show(LoadingModal); }, }, app.translator.trans('core.admin.extensions.uninstall_button') ) ); } return items; } isEnabled(name) { const enabled = JSON.parse(app.data.settings.extensions_enabled); return enabled.indexOf(name) !== -1; } toggle(id) { const enabled = this.isEnabled(id); app .request({ url: app.forum.attribute('apiUrl') + '/extensions/' + id, method: 'PATCH', body: { enabled: !enabled }, errorHandler: this.onerror.bind(this), }) .then(() => { if (!enabled) localStorage.setItem('enabledExtension', id); window.location.reload(); }); app.modal.show(LoadingModal); } onerror(e) { // We need to give the modal animation time to start; if we close the modal too early, // it breaks the bootstrap modal library. // TODO: This workaround should be removed when we move away from bootstrap JS for modals. setTimeout(() => { app.modal.close(); }, 300); // Bootstrap's Modal.TRANSITION_DURATION is 300 ms. if (e.status !== 409) { throw e; } const error = e.response.errors[0]; app.alerts.show( { type: 'error' }, app.translator.trans(`core.lib.error.${error.code}_message`, { extension: error.extension, extensions: error.extensions.join(', '), }) ); } }