blob: bf20c64ee63ac9bb7a602b8c11f9b4dae93dc45f [file]
<div x-data="alpineConfiguration()" x-init="initPage()">
<div>
<h2>Configuration</h2>
</div>
<hr>
<div class="container">
<div class="tabs is-centered is-small is-toggle">
<ul>
<li x-bind:class="{ 'is-active': activeTab === 'settings' }" @click="activeTab = 'settings'">
<a>
<span class="icon is-small"><i class="fas fa-cogs" aria-hidden="true"></i></span>
<span>Settings</span>
</a>
</li>
<li x-bind:class="{ 'is-active': activeTab === 'plugins' }" @click="activeTab = 'plugins'">
<a>
<span class="icon is-small"><i class="fas fa-puzzle-piece" aria-hidden="true"></i></span>
<span>Plugins</span>
</a>
</li>
</ul>
</div>
<div x-show="activeTab === 'settings'">
<table class="table">
<thead>
<tr>
<th>Setting Name</th>
<th>Current Value</th>
<th></th>
</tr>
</thead>
<tbody>
<template x-for="setting of Object.keys(settings)" :key="setting">
<tr>
<td x-text="setting"></td>
<td>
<input class="input is-small" x-model="settings[setting]">
</td>
<td>
<button class="button is-small is-primary" @click="updateSetting(setting)">Update</button>
</td>
</tr>
</template>
</tbody>
</table>
</div>
<div x-show="activeTab === 'plugins'">
<table class="table">
<col width="15%">
<col width="70%">
<col width="15%">
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th></th>
</tr>
</thead>
<tbody>
<template x-for="plugin of plugins" :key="plugin.name">
<tr>
<td x-text="plugin.name"></td>
<td x-text="plugin.description"></td>
<td>
<button x-show="!plugin.enabled && !pendingPlugins.includes(plugin.name)" class="button is-small is-primary" @click="enablePlugin(plugin.name)">Enable</button>
<p class="has-text-success" x-show="plugin.enabled && !pendingPlugins.includes(plugin.name)">Enabled</p>
<p class="has-text-info" x-show="pendingPlugins.includes(plugin.name)">Pending Restart</p>
</td>
</tr>
</template>
</tbody>
</table>
</div>
</div>
</div>
<script>
function alpineConfiguration() {
return {
settings: {},
plugins: [],
pendingPlugins: [],
activeTab: 'settings',
initPage() {
apiV2('GET', '/api/v2/config/main').then((config) => {
delete config.plugins;
this.settings = config;
return apiV2('GET', '/api/v2/plugins');
}).then((plugins) => {
this.plugins = plugins;
}).catch((error) => {
toast('Error loading page', false);
console.error(error);
});
},
updateSetting(setting) {
let requestBody = {
value: this.settings[setting].toString(),
prop: setting
};
apiV2('PATCH', '/api/v2/config/main', requestBody).then((response) => {
toast('Setting updated', true);
}).catch((error) => {
toast(`Error updating ${setting}`, false);
console.error(error);
});
},
enablePlugin(pluginName) {
pluginName = sanitize(pluginName);
let requestBody = {
value: pluginName,
prop: 'plugin'
};
apiV2('PATCH', '/api/v2/config/main', requestBody).then((response) => {
toast('Plugin enabled! Restart the server for the changes to take effect.', true);
this.pendingPlugins.push(pluginName);
}).catch((error) => {
toast(`Error enabling ${pluginName}`, false);
console.error(error);
});
},
};
}
// # sourceURL=configuration.js
</script>