minor design change.
This commit is contained in:
@@ -4,13 +4,13 @@
|
||||
<div class="navbar-brand pl-5">
|
||||
<NuxtLink class="navbar-item" to="/" @click.native="(e) => changeRoute(e)">
|
||||
<span class="icon-text">
|
||||
<span class="icon"><i class="fas fa-home"></i></span>
|
||||
<span class="icon"><i class="fas fa-home" /></span>
|
||||
<span>Home</span>
|
||||
</span>
|
||||
</NuxtLink>
|
||||
|
||||
<a class="navbar-item is-hidden-tablet" id="top" href="#bottom">
|
||||
<span class="icon"><i class="fas fa-arrow-down"></i></span>
|
||||
<span class="icon"><i class="fas fa-arrow-down" /></span>
|
||||
</a>
|
||||
|
||||
<button class="navbar-burger burger" @click="showMenu = !showMenu">
|
||||
@@ -21,39 +21,39 @@
|
||||
</div>
|
||||
|
||||
<div class="navbar-menu" :class="{ 'is-active': showMenu }">
|
||||
<div class="navbar-start" v-if="hasAPISettings">
|
||||
<div class="navbar-start" v-if="hasAPISettings && !showConnection">
|
||||
<NuxtLink class="navbar-item" to="/backends" @click.native="(e) => changeRoute(e)">
|
||||
<span class="icon-text">
|
||||
<span class="icon"><i class="fas fa-server"></i></span>
|
||||
<span class="icon"><i class="fas fa-server" /></span>
|
||||
<span>Backends</span>
|
||||
</span>
|
||||
</NuxtLink>
|
||||
|
||||
<NuxtLink class="navbar-item" to="/history"
|
||||
@click.native="(e) => changeRoute(e, () => dEvent('history_main_link_clicked', { 'clear': true }))">
|
||||
@click.native="(e) => changeRoute(e, () => dEvent('history_main_link_clicked', { 'clear': true }))">
|
||||
<span class="icon-text">
|
||||
<span class="icon"><i class="fas fa-history"></i></span>
|
||||
<span class="icon"><i class="fas fa-history" /></span>
|
||||
<span>History</span>
|
||||
</span>
|
||||
</NuxtLink>
|
||||
|
||||
<NuxtLink class="navbar-item" to="/tasks" @click.native="(e) => changeRoute(e)">
|
||||
<span class="icon-text">
|
||||
<span class="icon"><i class="fas fa-tasks"></i></span>
|
||||
<span class="icon"><i class="fas fa-tasks" /></span>
|
||||
<span>Tasks</span>
|
||||
</span>
|
||||
</NuxtLink>
|
||||
|
||||
<NuxtLink class="navbar-item" to="/env" @click.native="(e) => changeRoute(e)">
|
||||
<span class="icon-text">
|
||||
<span class="icon"><i class="fas fa-cogs"></i></span>
|
||||
<span class="icon"><i class="fas fa-cogs" /></span>
|
||||
<span>Env</span>
|
||||
</span>
|
||||
</NuxtLink>
|
||||
|
||||
<NuxtLink class="navbar-item" to="/logs" @click.native="(e) => changeRoute(e)">
|
||||
<span class="icon-text">
|
||||
<span class="icon"><i class="fas fa-globe"></i></span>
|
||||
<span class="icon"><i class="fas fa-globe" /></span>
|
||||
<span>Logs</span>
|
||||
</span>
|
||||
</NuxtLink>
|
||||
@@ -61,106 +61,99 @@
|
||||
<div class="navbar-item has-dropdown">
|
||||
<a class="navbar-link" @click="(e) => openMenu(e)">
|
||||
<span class="icon-text">
|
||||
<span class="icon"><i class="fas fa-ellipsis-vertical"></i></span>
|
||||
<span class="icon"><i class="fas fa-ellipsis-vertical" /></span>
|
||||
<span>More</span>
|
||||
</span>
|
||||
</a>
|
||||
<div class="navbar-dropdown">
|
||||
|
||||
<NuxtLink class="navbar-item" to="/console" @click.native="(e) => changeRoute(e)" v-if="hasAPISettings">
|
||||
<span class="icon-text">
|
||||
<span class="icon"><i class="fas fa-terminal" /></span>
|
||||
<span>Console</span>
|
||||
</span>
|
||||
</NuxtLink>
|
||||
|
||||
<hr class="navbar-divider">
|
||||
|
||||
<NuxtLink class="navbar-item" to="/parity" @click.native="(e) => changeRoute(e)">
|
||||
<span class="icon"><i class="fas fa-database"></i></span>
|
||||
<span class="icon"><i class="fas fa-database" /></span>
|
||||
<span>Data Parity</span>
|
||||
</NuxtLink>
|
||||
|
||||
<NuxtLink class="navbar-item" to="/integrity" @click.native="(e) => changeRoute(e)">
|
||||
<span class="icon"><i class="fas fa-file"></i></span>
|
||||
<span class="icon"><i class="fas fa-file" /></span>
|
||||
<span>Files Integrity</span>
|
||||
</NuxtLink>
|
||||
<hr class="navbar-divider">
|
||||
|
||||
<NuxtLink class="navbar-item" to="/events" @click.native="(e) => changeRoute(e)">
|
||||
<span class="icon"><i class="fas fa-calendar-alt"></i></span>
|
||||
<span class="icon"><i class="fas fa-calendar-alt" /></span>
|
||||
<span>Events</span>
|
||||
</NuxtLink>
|
||||
|
||||
<NuxtLink class="navbar-item" to="/ignore" @click.native="(e) => changeRoute(e)">
|
||||
<span class="icon"><i class="fas fa-ban"></i></span>
|
||||
<span class="icon"><i class="fas fa-ban" /></span>
|
||||
<span>Ignore List</span>
|
||||
</NuxtLink>
|
||||
|
||||
<NuxtLink class="navbar-item" to="/report" @click.native="(e) => changeRoute(e)">
|
||||
<span class="icon"><i class="fas fa-flag"></i></span>
|
||||
<span class="icon"><i class="fas fa-flag" /></span>
|
||||
<span>Basic Report</span>
|
||||
</NuxtLink>
|
||||
<hr class="navbar-divider">
|
||||
|
||||
<NuxtLink class="navbar-item" to="/suppression" @click.native="(e) => changeRoute(e)">
|
||||
<span class="icon"><i class="fas fa-bug-slash"></i></span>
|
||||
<span class="icon"><i class="fas fa-bug-slash" /></span>
|
||||
<span>Log Suppression</span>
|
||||
</NuxtLink>
|
||||
|
||||
<NuxtLink class="navbar-item" to="/custom" @click.native="(e) => changeRoute(e)">
|
||||
<span class="icon"><i class="fas fa-map"></i></span>
|
||||
<span class="icon"><i class="fas fa-map" /></span>
|
||||
<span>Custom GUIDs</span>
|
||||
</NuxtLink>
|
||||
|
||||
<hr class="navbar-divider">
|
||||
|
||||
<NuxtLink class="navbar-item" to="/backup" @click.native="(e) => changeRoute(e)">
|
||||
<span class="icon"><i class="fas fa-sd-card"></i></span>
|
||||
<span class="icon"><i class="fas fa-sd-card" /></span>
|
||||
<span>Backups</span>
|
||||
</NuxtLink>
|
||||
|
||||
<hr class="navbar-divider">
|
||||
|
||||
<NuxtLink class="navbar-item" to="/reset" @click.native="(e) => changeRoute(e)">
|
||||
<span class="icon"><i class="fas fa-redo"></i></span>
|
||||
<span class="icon"><i class="fas fa-redo" /></span>
|
||||
<span>System reset</span>
|
||||
</NuxtLink>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="navbar-end pr-3">
|
||||
<NuxtLink class="navbar-item" to="/console" @click.native="(e) => changeRoute(e)" v-if="hasAPISettings">
|
||||
<span class="icon-text">
|
||||
<span class="icon"><i class="fas fa-terminal"></i></span>
|
||||
<span>Console</span>
|
||||
</span>
|
||||
</NuxtLink>
|
||||
|
||||
<div class="navbar-item">
|
||||
<button class="button is-dark has-tooltip-bottom" v-tooltip.bottom="'Switch to Light theme'"
|
||||
v-if="'auto' === selectedTheme" @click="selectTheme('light')">
|
||||
<span class="icon has-text-warning"><i class="fas fa-sun"/></span>
|
||||
v-if="'auto' === selectedTheme" @click="selectTheme('light')">
|
||||
<span class="icon has-text-warning"><i class="fas fa-sun" /></span>
|
||||
</button>
|
||||
<button class="button is-dark has-tooltip-bottom" v-tooltip.bottom="'Switch to Dark theme'"
|
||||
v-if="'light' === selectedTheme" @click="selectTheme('dark')">
|
||||
<span class="icon"><i class="fas fa-moon"/></span>
|
||||
v-if="'light' === selectedTheme" @click="selectTheme('dark')">
|
||||
<span class="icon"><i class="fas fa-moon" /></span>
|
||||
</button>
|
||||
<button class="button is-dark has-tooltip-bottom" v-tooltip.bottom="'Switch to auto theme'"
|
||||
v-if="'dark' === selectedTheme" @click="selectTheme('auto')">
|
||||
<span class="icon"><i class="fas fa-microchip"/></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="navbar-item" v-if="hasAPISettings">
|
||||
<button class="button is-dark" @click="showTaskRunner = !showTaskRunner" v-tooltip="'Task Runner Status'">
|
||||
<span class="icon">
|
||||
<i class="fas fa-microchip"
|
||||
:class="{ 'has-text-success': taskRunner.status, 'has-text-warning': !taskRunner.status }"></i>
|
||||
</span>
|
||||
<button class="button is-dark has-tooltip-bottom" v-tooltip.bottom="'Switch to Auto theme'"
|
||||
v-if="'dark' === selectedTheme" @click="selectTheme('auto')">
|
||||
<span class="icon"><i class="fas fa-microchip" /></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="navbar-item" v-if="hasAPISettings">
|
||||
<button class="button is-dark" @click="showUserSelection = !showUserSelection" v-tooltip="'Change User'">
|
||||
<span class="icon"><i class="fas fa-users"/></span>
|
||||
<span class="icon"><i class="fas fa-users" /></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="navbar-item">
|
||||
<button class="button is-dark" @click="showConnection = !showConnection" v-tooltip="'Configure connection'">
|
||||
<span class="icon"><i class="fas fa-cog"/></span>
|
||||
<span class="icon"><i class="fas fa-cog" /></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -175,7 +168,7 @@
|
||||
Configure API Connection
|
||||
</p>
|
||||
<span class="card-header-icon">
|
||||
<span class="icon"><i class="fas fa-cog"></i></span>
|
||||
<span class="icon"><i class="fas fa-cog" /></span>
|
||||
</span>
|
||||
</header>
|
||||
<div class="card-content">
|
||||
@@ -183,7 +176,7 @@
|
||||
<div class="field">
|
||||
<label class="label" for="api_token">
|
||||
<span class="icon-text">
|
||||
<span class="icon"><i class="fas fa-key"></i></span>
|
||||
<span class="icon"><i class="fas fa-key" /></span>
|
||||
<span>API Token</span>
|
||||
</span>
|
||||
</label>
|
||||
@@ -192,14 +185,14 @@
|
||||
<div class="field has-addons">
|
||||
<div class="control is-expanded">
|
||||
<input class="input" id="api_token" v-model="api_token" required placeholder="API Token..."
|
||||
@keyup="api_status = false; api_response = ''"
|
||||
:type="false === exposeToken ? 'password' : 'text'">
|
||||
@keyup="api_status = false; api_response = ''"
|
||||
:type="false === exposeToken ? 'password' : 'text'">
|
||||
</div>
|
||||
<div class="control">
|
||||
<button type="button" class="button is-primary" @click="exposeToken = !exposeToken"
|
||||
v-tooltip="'Show/Hide token'">
|
||||
<span class="icon" v-if="!exposeToken"><i class="fas fa-eye"></i></span>
|
||||
<span class="icon" v-else><i class="fas fa-eye-slash"></i></span>
|
||||
v-tooltip="'Show/Hide token'">
|
||||
<span class="icon" v-if="!exposeToken"><i class="fas fa-eye" /></span>
|
||||
<span class="icon" v-else><i class="fas fa-eye-slash" /></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -216,7 +209,7 @@
|
||||
<div class="field">
|
||||
<label class="label" for="api_url">
|
||||
<span class="icon-text">
|
||||
<span class="icon"><i class="fas fa-link"></i></span>
|
||||
<span class="icon"><i class="fas fa-link" /></span>
|
||||
<span>API URL</span>
|
||||
</span>
|
||||
</label>
|
||||
@@ -224,8 +217,7 @@
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input" id="api_url" type="url" v-model="api_url" required
|
||||
placeholder="API URL... http://localhost:8081"
|
||||
@keyup="api_status = false; api_response = ''">
|
||||
placeholder="API URL... http://localhost:8081" @keyup="api_status = false; api_response = ''">
|
||||
<p class="help">
|
||||
Use <a href="javascript:void(0)" @click="setOrigin">current page URL</a>.
|
||||
</p>
|
||||
@@ -237,7 +229,7 @@
|
||||
<div class="field">
|
||||
<label class="label" for="api_path">
|
||||
<span class="icon-text">
|
||||
<span class="icon"><i class="fas fa-folder"></i></span>
|
||||
<span class="icon"><i class="fas fa-folder" /></span>
|
||||
<span>API Path</span>
|
||||
</span>
|
||||
</label>
|
||||
@@ -245,7 +237,7 @@
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input" id="api_path" type="text" v-model="api_path" required
|
||||
placeholder="API Path... /v1/api" @keyup="api_status = false; api_response = ''">
|
||||
placeholder="API Path... /v1/api" @keyup="api_status = false; api_response = ''">
|
||||
<p class="help">
|
||||
Use <a href="javascript:void(0)" @click="api_path = '/v1/api'">Set default API Path</a>.
|
||||
</p>
|
||||
@@ -260,12 +252,12 @@
|
||||
<div class="field has-addons">
|
||||
<div class="control is-expanded">
|
||||
<input class="input" type="text" v-model="api_response" readonly disabled
|
||||
:class="{ 'has-background-success': true === api_status, 'has-background-warning': true !== api_status }">
|
||||
:class="{ 'has-background-success': true === api_status, 'has-background-warning': true !== api_status }">
|
||||
</div>
|
||||
<div class="control">
|
||||
<button type="submit" class="button is-primary" :disabled="!api_url || !api_token">
|
||||
<span class="icon-text">
|
||||
<span class="icon"><i class="fas fa-save"></i></span>
|
||||
<span class="icon"><i class="fas fa-save" /></span>
|
||||
<span>Save</span>
|
||||
</span>
|
||||
</button>
|
||||
@@ -273,7 +265,7 @@
|
||||
</div>
|
||||
<p class="help">
|
||||
<span class="icon-text">
|
||||
<span class="icon has-text-danger"><i class="fas fa-info"></i></span>
|
||||
<span class="icon has-text-danger"><i class="fas fa-info" /></span>
|
||||
<span>These settings are stored locally in your browser. You need to re-add them if you access
|
||||
the
|
||||
<code>WebUI</code> from different browser.</span>
|
||||
@@ -294,15 +286,15 @@
|
||||
class="has-text-danger">ALL VISITORS</strong> by setting the following environment variable
|
||||
<code>WS_API_AUTO=true</code>
|
||||
in <code>/config/.env</code> file. Understand that this option <strong class="has-text-danger">PUBLICLY
|
||||
EXPOSES YOUR API TOKEN</strong> to <u>ALL VISITORS</u>. Anyone who is able to reach this page will be
|
||||
EXPOSES YOUR API TOKEN</strong> to <u>ALL VISITORS</u>. Anyone who is able to reach this page will be
|
||||
granted access to your <code>WatchState API</code> which exposes your other media backends data including
|
||||
their secrets. <strong>this option is great security risk and SHOULD NEVER be used if
|
||||
<code>WatchState</code> is exposed to the internet.</strong>
|
||||
<code>WatchState</code> is exposed to the internet.</strong>
|
||||
</p>
|
||||
|
||||
<p>Please visit
|
||||
<span class="icon">
|
||||
<i class="fab fa-github"></i>
|
||||
<i class="fab fa-github" />
|
||||
</span>
|
||||
<NuxtLink target="_blank" to="https://github.com/arabcoders/watchstate/blob/master/FAQ.md#ws_api_auto">
|
||||
This link
|
||||
@@ -314,28 +306,26 @@
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<TaskRunnerStatus v-if="showTaskRunner || false === taskRunner?.status" :status="taskRunner"
|
||||
@taskrunner_update="e => taskRunner = e"/>
|
||||
<NuxtPage v-if="!showConnection && hasAPISettings"/>
|
||||
<no-api v-if="!hasAPISettings"/>
|
||||
<NuxtPage v-if="!showConnection && hasAPISettings" />
|
||||
<no-api v-if="!hasAPISettings" />
|
||||
</div>
|
||||
|
||||
<div class="columns is-multiline is-mobile mt-3">
|
||||
<div class="column is-12 is-hidden-tablet has-text-centered">
|
||||
<a href="#top" id="bottom" class="button">
|
||||
<span class="icon"><i class="fas fa-arrow-up"></i> </span>
|
||||
<span class="icon"><i class="fas fa-arrow-up" /> </span>
|
||||
<span>Go to Top</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="column is-6 is-9-mobile has-text-left">
|
||||
<NuxtLink @click="loadFile = '/README.md'" v-text="'README'"/>
|
||||
<NuxtLink @click="loadFile = '/README.md'" v-text="'README'" />
|
||||
-
|
||||
<NuxtLink @click="loadFile = '/FAQ.md'" v-text="'FAQ'"/>
|
||||
<NuxtLink @click="loadFile = '/FAQ.md'" v-text="'FAQ'" />
|
||||
-
|
||||
<NuxtLink @click="loadFile = '/NEWS.md'" v-text="'News'"/>
|
||||
<NuxtLink @click="loadFile = '/NEWS.md'" v-text="'News'" />
|
||||
-
|
||||
<NuxtLink :to="changelog_url" v-text="'ChangeLog'"/>
|
||||
<NuxtLink :to="changelog_url" v-text="'ChangeLog'" />
|
||||
</div>
|
||||
<div class="column is-6 is-4-mobile has-text-right">
|
||||
{{ api_version }} - <a href="https://github.com/arabcoders/watchstate" target="_blank">WatchState</a>
|
||||
@@ -344,13 +334,13 @@
|
||||
|
||||
<template v-if="loadFile">
|
||||
<Overlay @closeOverlay="closeOverlay" :title="loadFile">
|
||||
<Markdown :file="loadFile"/>
|
||||
<Markdown :file="loadFile" />
|
||||
</Overlay>
|
||||
</template>
|
||||
|
||||
<template v-if="showUserSelection">
|
||||
<Overlay @closeOverlay="() => showUserSelection = false" title="Change User">
|
||||
<UserSelection/>
|
||||
<UserSelection />
|
||||
</Overlay>
|
||||
</template>
|
||||
</div>
|
||||
@@ -358,21 +348,18 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {ref} from 'vue'
|
||||
import { ref } from 'vue'
|
||||
import 'assets/css/bulma.css'
|
||||
import 'assets/css/style.css'
|
||||
import 'assets/css/all.css'
|
||||
import {useStorage} from '@vueuse/core'
|
||||
import { useStorage } from '@vueuse/core'
|
||||
import request from '~/utils/request.js'
|
||||
import Markdown from '~/components/Markdown.vue'
|
||||
import TaskRunnerStatus from '~/components/TaskRunnerStatus.vue'
|
||||
import UserSelection from '~/components/UserSelection.vue'
|
||||
|
||||
const selectedTheme = useStorage('theme', (() => window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')())
|
||||
const showConnection = ref(false)
|
||||
|
||||
const taskRunner = ref({status: true, message: '', restartable: false})
|
||||
const showTaskRunner = ref(false)
|
||||
const showUserSelection = ref(false)
|
||||
|
||||
const real_api_user = useStorage('api_user', 'main')
|
||||
@@ -456,10 +443,7 @@ onMounted(async () => {
|
||||
}
|
||||
|
||||
await getVersion()
|
||||
const response = await request('/system/taskrunner')
|
||||
taskRunner.value = await response.json();
|
||||
|
||||
window.addEventListener('taskrunner_update', e => taskRunner.value = e.detail)
|
||||
} catch (e) {
|
||||
}
|
||||
})
|
||||
@@ -539,7 +523,7 @@ const autoConfig = async () => {
|
||||
headers: {
|
||||
'Accept': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({'origin': window.location.origin})
|
||||
body: JSON.stringify({ 'origin': window.location.origin })
|
||||
})
|
||||
|
||||
const json = await response.json()
|
||||
|
||||
@@ -8,9 +8,15 @@
|
||||
</span>
|
||||
<div class="is-pulled-right">
|
||||
<div class="field is-grouped">
|
||||
<p class="control">
|
||||
<button class="button" @click="showTaskRunner = !showTaskRunner" v-tooltip="'Task Runner Status'"
|
||||
:class="{ 'is-primary': taskRunner.status, 'is-danger': !taskRunner.status }">
|
||||
<span class="icon"><i class="fas fa-microchip" /></span>
|
||||
</button>
|
||||
</p>
|
||||
<p class="control">
|
||||
<button class="button is-info" @click="loadContent()" :disabled="isLoading"
|
||||
:class="{'is-loading':isLoading}">
|
||||
:class="{ 'is-loading': isLoading }">
|
||||
<span class="icon"><i class="fas fa-sync"></i></span>
|
||||
</button>
|
||||
</p>
|
||||
@@ -23,16 +29,20 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-12" v-if="showTaskRunner || false === taskRunner?.status">
|
||||
<TaskRunnerStatus :status="taskRunner" @taskrunner_update="e => taskRunner = e" />
|
||||
</div>
|
||||
|
||||
<div id="queued_tasks" class="column is-12" v-if="queued.length > 0">
|
||||
<Message message_class="has-background-success-90 has-text-dark" title="Queued Tasks"
|
||||
icon="fas fa-circle-notch fa-spin">
|
||||
icon="fas fa-circle-notch fa-spin">
|
||||
<p>
|
||||
The following tasks
|
||||
<template v-for="(task, index) in queued" :key="`queued-${index}`">
|
||||
<NuxtLink :to="`#${task}`">
|
||||
<span class="tag has-text-dark is-capitalized">{{ task }}</span>
|
||||
</NuxtLink>
|
||||
<template v-if="queued.length > index+1">, </template>
|
||||
<template v-if="queued.length > index + 1">, </template>
|
||||
</template>
|
||||
are queued to be run in background soon.
|
||||
</p>
|
||||
@@ -40,19 +50,19 @@
|
||||
</div>
|
||||
|
||||
<div class="column is-12" v-if="isLoading">
|
||||
<Message message_class="has-background-info-90 has-text-dark" title="Loading"
|
||||
icon="fas fa-spinner fa-spin" message="Loading data. Please wait..."/>
|
||||
<Message message_class="has-background-info-90 has-text-dark" title="Loading" icon="fas fa-spinner fa-spin"
|
||||
message="Loading data. Please wait..." />
|
||||
</div>
|
||||
|
||||
<div v-for="task in tasks" :key="task.name" class="column is-6-tablet is-12-mobile">
|
||||
<div class="card" :class="{ 'is-gray' : !task.enabled, 'is-success': task.enabled }">
|
||||
<div class="card" :class="{ 'is-gray': !task.enabled, 'is-success': task.enabled }">
|
||||
<header class="card-header">
|
||||
<div class="is-capitalized card-header-title">
|
||||
{{ task.name }}
|
||||
</div>
|
||||
<span class="card-header-icon" v-tooltip="'Enable/Disable Task.'" v-if="task.allow_disable">
|
||||
<input :id="task.name" type="checkbox" class="switch is-success" :checked="task.enabled"
|
||||
@change="toggleTask(task)">
|
||||
@change="toggleTask(task)">
|
||||
<label :for="task.name"></label>
|
||||
</span>
|
||||
</header>
|
||||
@@ -64,7 +74,7 @@
|
||||
<div class="column is-12 has-text-left">
|
||||
<strong class="is-hidden-mobile">Runs: </strong>
|
||||
<NuxtLink class="has-tooltip" target="_blank"
|
||||
:to="`https://crontab.guru/#${task.timer.replace(/ /g, '_')}`">
|
||||
:to="`https://crontab.guru/#${task.timer.replace(/ /g, '_')}`">
|
||||
{{ cronstrue.toString(task.timer) }}
|
||||
</NuxtLink>
|
||||
</div>
|
||||
@@ -74,7 +84,7 @@
|
||||
{{ task.timer }}
|
||||
</span>
|
||||
<NuxtLink v-else class="has-tooltip"
|
||||
:to='makeEnvLink(`WS_CRON_${task.name.toUpperCase()}_AT`, task.timer)'>
|
||||
:to='makeEnvLink(`WS_CRON_${task.name.toUpperCase()}_AT`, task.timer)'>
|
||||
{{ task.timer }}
|
||||
</NuxtLink>
|
||||
</div>
|
||||
@@ -84,7 +94,7 @@
|
||||
{{ task.args }}
|
||||
</span>
|
||||
<NuxtLink v-else class="has-tooltip"
|
||||
:to='makeEnvLink(`WS_CRON_${task.name.toUpperCase()}_ARGS`, task.args)'>
|
||||
:to='makeEnvLink(`WS_CRON_${task.name.toUpperCase()}_ARGS`, task.args)'>
|
||||
{{ task.args }}
|
||||
</NuxtLink>
|
||||
</div>
|
||||
@@ -92,7 +102,7 @@
|
||||
<strong class="is-hidden-mobile">Prev Run: </strong>
|
||||
<template v-if="task.enabled">
|
||||
<span class="has-tooltip"
|
||||
v-tooltip="`Last run was at: ${moment(task.prev_run).format(TOOLTIP_DATE_FORMAT)}`">
|
||||
v-tooltip="`Last run was at: ${moment(task.prev_run).format(TOOLTIP_DATE_FORMAT)}`">
|
||||
{{ task.prev_run ? moment(task.prev_run).fromNow() : '???' }}
|
||||
</span>
|
||||
</template>
|
||||
@@ -104,7 +114,7 @@
|
||||
<strong class="is-hidden-mobile">Next Run: </strong>
|
||||
<template v-if="task.enabled">
|
||||
<span class="has-tooltip"
|
||||
v-tooltip="`Next run will be at: ${moment(task.next_run).format(TOOLTIP_DATE_FORMAT)}`">
|
||||
v-tooltip="`Next run will be at: ${moment(task.next_run).format(TOOLTIP_DATE_FORMAT)}`">
|
||||
{{ task.next_run ? moment(task.next_run).fromNow() : 'Never' }}
|
||||
</span>
|
||||
</template>
|
||||
@@ -117,7 +127,7 @@
|
||||
<footer class="card-footer">
|
||||
<div class="card-footer-item">
|
||||
<button class="button is-info" @click="queueTask(task)"
|
||||
:class="{'is-danger':task.queued,'is-info':!task.queued}">
|
||||
:class="{ 'is-danger': task.queued, 'is-info': !task.queued }">
|
||||
<span class="icon-text">
|
||||
<span class="icon"><i class="fas fa-clock" :class="{ 'fa-spin': task.queued }"></i></span>
|
||||
<span>
|
||||
@@ -142,7 +152,7 @@
|
||||
|
||||
<div class="column is-12">
|
||||
<Message message_class="has-background-info-90 has-text-dark" :toggle="show_page_tips"
|
||||
@toggle="show_page_tips = !show_page_tips" :use-toggle="true" title="Tips" icon="fas fa-info-circle">
|
||||
@toggle="show_page_tips = !show_page_tips" :use-toggle="true" title="Tips" icon="fas fa-info-circle">
|
||||
<ul>
|
||||
<li>For long running tasks like <code>Import</code> and <code>Export</code>, you should queue the task to
|
||||
run
|
||||
@@ -152,7 +162,7 @@
|
||||
<li>Use the switch next to the task to enable or disable the task from being run automatically.</li>
|
||||
<li>To change when task is scheduled to run, please visit
|
||||
<span class="icon"><i class="fas fa-cogs"></i> </span>
|
||||
<NuxtLink to="/env" v-text="'Environment variables'"/>
|
||||
<NuxtLink to="/env" v-text="'Environment variables'" />
|
||||
page. The <code>WS_CRON_(TASK)_*</code> variables are used to control scheduled tasks.
|
||||
</li>
|
||||
<li>Clicking on the <code>Runs</code> link will take you to external page that will show for you more
|
||||
@@ -170,17 +180,20 @@
|
||||
import 'assets/css/bulma-switch.css'
|
||||
import moment from 'moment'
|
||||
import request from '~/utils/request'
|
||||
import {awaitElement, makeConsoleCommand, notification, parse_api_response, TOOLTIP_DATE_FORMAT} from '~/utils/index'
|
||||
import { awaitElement, makeConsoleCommand, notification, parse_api_response, TOOLTIP_DATE_FORMAT } from '~/utils/index'
|
||||
import cronstrue from 'cronstrue'
|
||||
import Message from '~/components/Message'
|
||||
import {useStorage} from '@vueuse/core'
|
||||
import { useStorage } from '@vueuse/core'
|
||||
import TaskRunnerStatus from '~/components/TaskRunnerStatus'
|
||||
|
||||
useHead({title: 'Tasks'})
|
||||
useHead({ title: 'Tasks' })
|
||||
|
||||
const tasks = ref([])
|
||||
const queued = ref([])
|
||||
const isLoading = ref(false)
|
||||
const show_page_tips = useStorage('show_page_tips', true)
|
||||
const taskRunner = ref({ status: true, message: '', restartable: false })
|
||||
const showTaskRunner = ref(false)
|
||||
|
||||
const loadContent = async () => {
|
||||
isLoading.value = true
|
||||
@@ -193,8 +206,7 @@ const loadContent = async () => {
|
||||
}
|
||||
tasks.value = json.tasks
|
||||
queued.value = json.queued
|
||||
|
||||
dEvent('taskrunner_update', json.status);
|
||||
taskRunner.value = json, status
|
||||
} catch (e) {
|
||||
notification('error', 'Error', `Request error. ${e.message}`)
|
||||
} finally {
|
||||
@@ -212,7 +224,7 @@ const toggleTask = async task => {
|
||||
|
||||
const update = await request(`/system/env/${keyName}`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({"value": !task.enabled})
|
||||
body: JSON.stringify({ "value": !task.enabled })
|
||||
})
|
||||
|
||||
if (200 !== update.status) {
|
||||
@@ -237,7 +249,7 @@ const queueTask = async task => {
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await request(`/tasks/${task.name}/queue`, {method: is_queued ? 'DELETE' : 'POST'})
|
||||
const response = await request(`/tasks/${task.name}/queue`, { method: is_queued ? 'DELETE' : 'POST' })
|
||||
if (response.ok) {
|
||||
notification('success', 'Success', `Task '${task.name}' has been ${is_queued ? 'cancelled' : 'queued'}.`)
|
||||
task.queued = !is_queued
|
||||
|
||||
Reference in New Issue
Block a user