mirror of https://github.com/statping/statping
i18n implementation for frontend, oauth url fixes, added language into Core,
parent
bb9eacc522
commit
98175ab326
|
@ -1,4 +1,4 @@
|
||||||
*.gohtml linguist-language=golang
|
*.gohtml linguist-index=golang
|
||||||
*.js linguist-detectable=false
|
*.js linguist-detectable=false
|
||||||
*.yml linguist-detectable=false
|
*.yml linguist-detectable=false
|
||||||
*.json linguist-detectable=false
|
*.json linguist-detectable=false
|
||||||
|
|
4
LICENSE
4
LICENSE
|
@ -117,8 +117,8 @@ form of a work.
|
||||||
|
|
||||||
A "Standard Interface" means an interface that either is an official
|
A "Standard Interface" means an interface that either is an official
|
||||||
standard defined by a recognized standards body, or, in the case of
|
standard defined by a recognized standards body, or, in the case of
|
||||||
interfaces specified for a particular programming language, one that
|
interfaces specified for a particular programming index, one that
|
||||||
is widely used among developers working in that language.
|
is widely used among developers working in that index.
|
||||||
|
|
||||||
The "System Libraries" of an executable work include anything, other
|
The "System Libraries" of an executable work include anything, other
|
||||||
than the work as a whole, that (a) is included in the normal form of
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
|
|
@ -22,7 +22,12 @@ const webpackConfig = {
|
||||||
{
|
{
|
||||||
test: /\.vue$/,
|
test: /\.vue$/,
|
||||||
loader: 'vue-loader',
|
loader: 'vue-loader',
|
||||||
include: [ helpers.root('src') ]
|
include: [ helpers.root('src') ],
|
||||||
|
options: {
|
||||||
|
loaders: {
|
||||||
|
i18n: '@kazupon/vue-i18n-loader'
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.js$/,
|
test: /\.js$/,
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
"vue-cookies": "^1.7.0",
|
"vue-cookies": "^1.7.0",
|
||||||
"vue-flatpickr-component": "^8.1.5",
|
"vue-flatpickr-component": "^8.1.5",
|
||||||
"vue-github-button": "^1.1.2",
|
"vue-github-button": "^1.1.2",
|
||||||
|
"vue-i18n": "^8.18.1",
|
||||||
"vue-moment": "^4.1.0",
|
"vue-moment": "^4.1.0",
|
||||||
"vue-observe-visibility": "^0.4.6",
|
"vue-observe-visibility": "^0.4.6",
|
||||||
"vue-router": "~3.0",
|
"vue-router": "~3.0",
|
||||||
|
@ -51,6 +52,7 @@
|
||||||
"@babel/plugin-syntax-import-meta": "~7.2",
|
"@babel/plugin-syntax-import-meta": "~7.2",
|
||||||
"@babel/polyfill": "~7.2",
|
"@babel/polyfill": "~7.2",
|
||||||
"@babel/preset-env": "^7.9.0",
|
"@babel/preset-env": "^7.9.0",
|
||||||
|
"@kazupon/vue-i18n-loader": "^0.5.0",
|
||||||
"@vue/babel-preset-app": "^4.1.2",
|
"@vue/babel-preset-app": "^4.1.2",
|
||||||
"@vue/cli-plugin-babel": "^4.1.0",
|
"@vue/cli-plugin-babel": "^4.1.0",
|
||||||
"@vue/cli-service": "^4.2.3",
|
"@vue/cli-service": "^4.2.3",
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import Api from './API';
|
|
||||||
import Footer from "./components/Index/Footer";
|
import Footer from "./components/Index/Footer";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
@ -28,6 +27,9 @@
|
||||||
async beforeMount() {
|
async beforeMount() {
|
||||||
await this.$store.dispatch('loadCore')
|
await this.$store.dispatch('loadCore')
|
||||||
|
|
||||||
|
this.$i18n.locale = this.core.language || "en";
|
||||||
|
// this.$i18n.locale = "ru";
|
||||||
|
|
||||||
if (!this.core.setup) {
|
if (!this.core.setup) {
|
||||||
this.$router.push('/setup')
|
this.$router.push('/setup')
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,8 @@
|
||||||
this.edit = v
|
this.edit = v
|
||||||
},
|
},
|
||||||
editUser(u, mode) {
|
editUser(u, mode) {
|
||||||
|
delete(u.password)
|
||||||
|
delete(u.confirm_password)
|
||||||
this.user = u
|
this.user = u
|
||||||
this.edit = !mode
|
this.edit = !mode
|
||||||
},
|
},
|
||||||
|
|
|
@ -6,11 +6,11 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mt-2">
|
<div class="row mt-2">
|
||||||
<div class="col-4 text-left font-2 text-muted">30 Days Ago</div>
|
<div class="col-3 text-left font-2 text-muted">30 Days Ago</div>
|
||||||
<div class="col-4 text-center font-2" :class="{'text-muted': service.online, 'text-danger': !service.online}">
|
<div class="col-6 text-center font-2" :class="{'text-muted': service.online, 'text-danger': !service.online}">
|
||||||
{{service_txt}}
|
{{service_txt}}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-4 text-right font-2 text-muted">Today</div>
|
<div class="col-3 text-right font-2 text-muted">Today</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -36,14 +36,7 @@ export default {
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
service_txt() {
|
service_txt() {
|
||||||
const s = this.service
|
return this.smallText(this.service)
|
||||||
if (!s.online) {
|
|
||||||
if (!this.toUnix(this.parseISO(s.last_success))) {
|
|
||||||
return `Always Offline`
|
|
||||||
}
|
|
||||||
return `Offline for ${this.ago(s.last_success)}`
|
|
||||||
}
|
|
||||||
return `${this.service.online_24_hours}% Uptime`
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
|
|
|
@ -223,18 +223,6 @@ export default {
|
||||||
this.stats.low_ping.chart = pingData.chart;
|
this.stats.low_ping.chart = pingData.chart;
|
||||||
this.stats.low_ping.value = this.humanTime(pingData.low);
|
this.stats.low_ping.value = this.humanTime(pingData.low);
|
||||||
},
|
},
|
||||||
smallText(s) {
|
|
||||||
const incidents = s.incidents
|
|
||||||
if (s.online) {
|
|
||||||
return `Checked ${this.ago(s.last_success)} ago`
|
|
||||||
} else {
|
|
||||||
const last = s.last_failure
|
|
||||||
if (last) {
|
|
||||||
return `Offline, last error: ${last} ${this.ago(last.created_at)}`
|
|
||||||
}
|
|
||||||
return `Service has been offline for ${this.ago(s.last_success)}`
|
|
||||||
}
|
|
||||||
},
|
|
||||||
visibleChart(isVisible, entry) {
|
visibleChart(isVisible, entry) {
|
||||||
if (isVisible && !this.visible) {
|
if (isVisible && !this.visible) {
|
||||||
this.visible = true
|
this.visible = true
|
||||||
|
|
|
@ -31,6 +31,18 @@
|
||||||
<small class="form-text text-muted">HTML is allowed inside the footer</small>
|
<small class="form-text text-muted">HTML is allowed inside the footer</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Language</label>
|
||||||
|
<select v-model="core.language" class="form-control">
|
||||||
|
<option value="en">English</option>
|
||||||
|
<option value="es">Spanish</option>
|
||||||
|
<option value="fr">French</option>
|
||||||
|
<option value="ru">Russian</option>
|
||||||
|
<option value="de">German</option>
|
||||||
|
</select>
|
||||||
|
<small class="form-text text-muted">HTML is allowed inside the footer</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="form-group row mt-3">
|
<div class="form-group row mt-3">
|
||||||
<label class="col-sm-10 col-form-label">Enable Error Reporting</label>
|
<label class="col-sm-10 col-form-label">Enable Error Reporting</label>
|
||||||
<div class="col-sm-2 float-right">
|
<div class="col-sm-2 float-right">
|
||||||
|
|
|
@ -51,7 +51,7 @@
|
||||||
<label for="gh_callback" class="col-sm-4 col-form-label">Callback URL</label>
|
<label for="gh_callback" class="col-sm-4 col-form-label">Callback URL</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input v-bind:value="`${core.domain}/api/oauth/github`" type="text" class="form-control" id="gh_callback" readonly>
|
<input v-bind:value="`${core.domain}/oauth/github`" type="text" class="form-control" id="gh_callback" readonly>
|
||||||
<div class="input-group-append copy-btn">
|
<div class="input-group-append copy-btn">
|
||||||
<button @click.prevent="copy(`${core.domain}/oauth/github`)" class="btn btn-outline-secondary" type="button">Copy</button>
|
<button @click.prevent="copy(`${core.domain}/oauth/github`)" class="btn btn-outline-secondary" type="button">Copy</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -90,7 +90,7 @@
|
||||||
<label for="google_callback" class="col-sm-4 col-form-label">Callback URL</label>
|
<label for="google_callback" class="col-sm-4 col-form-label">Callback URL</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input v-bind:value="`${core.domain}/api/oauth/google`" type="text" class="form-control" id="google_callback" readonly>
|
<input v-bind:value="`${core.domain}/oauth/google`" type="text" class="form-control" id="google_callback" readonly>
|
||||||
<div class="input-group-append copy-btn">
|
<div class="input-group-append copy-btn">
|
||||||
<button @click.prevent="copy(`${core.domain}/oauth/google`)" class="btn btn-outline-secondary" type="button">Copy</button>
|
<button @click.prevent="copy(`${core.domain}/oauth/google`)" class="btn btn-outline-secondary" type="button">Copy</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -136,7 +136,7 @@
|
||||||
<label for="slack_callback" class="col-sm-4 col-form-label">Callback URL</label>
|
<label for="slack_callback" class="col-sm-4 col-form-label">Callback URL</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input v-bind:value="`${core.domain}/api/oauth/slack`" type="text" class="form-control" id="slack_callback" readonly>
|
<input v-bind:value="`${core.domain}/oauth/slack`" type="text" class="form-control" id="slack_callback" readonly>
|
||||||
<div class="input-group-append copy-btn">
|
<div class="input-group-append copy-btn">
|
||||||
<button @click.prevent="copy(`${core.domain}/oauth/slack`)" class="btn btn-outline-secondary" type="button">Copy</button>
|
<button @click.prevent="copy(`${core.domain}/oauth/slack`)" class="btn btn-outline-secondary" type="button">Copy</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -54,11 +54,14 @@
|
||||||
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="service_interval" class="col-sm-4 col-form-label">Check Interval</label>
|
<label for="service_interval" class="col-sm-4 col-form-label">Check Interval</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-6">
|
||||||
<span class="slider-info">{{secondsHumanize(service.check_interval)}}</span>
|
<span class="slider-info">{{secondsHumanize(service.check_interval)}}</span>
|
||||||
<input v-model="service.check_interval" type="range" class="slider" id="service_interval" min="1" max="1800" :step="stepVal(service.check_interval)">
|
<input v-model="service.check_interval" type="range" class="slider" id="service_interval" min="1" max="1800" :step="1">
|
||||||
<small id="interval" class="form-text text-muted">Interval to check your service state</small>
|
<small id="interval" class="form-text text-muted">Interval to check your service state</small>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<input v-model="service.check_interval" type="text" name="check_interval" class="form-control">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -99,11 +102,16 @@
|
||||||
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-4 col-form-label">Request Timeout</label>
|
<label class="col-sm-4 col-form-label">Request Timeout</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-6">
|
||||||
<span v-if="service.timeout >= 0" class="slider-info">{{secondsHumanize(service.timeout)}}</span>
|
<span v-if="service.timeout >= 0" class="slider-info">{{secondsHumanize(service.timeout)}}</span>
|
||||||
<input v-model="service.timeout" type="range" id="timeout" name="timeout" class="slider" min="1" max="180">
|
<input v-model="service.timeout" type="range" id="timeout" name="timeout" class="slider" min="1" max="180">
|
||||||
<small class="form-text text-muted">If the endpoint does not respond within this time it will be considered to be offline</small>
|
<small class="form-text text-muted">If the endpoint does not respond within this time it will be considered to be offline</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<input v-model="service.timeout" type="text" name="service_timeout" class="form-control">
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="service.type.match(/^(http)$/) && service.method.match(/^(POST|PATCH|DELETE|PUT)$/)" class="form-group row">
|
<div v-if="service.type.match(/^(http)$/) && service.method.match(/^(POST|PATCH|DELETE|PUT)$/)" class="form-group row">
|
||||||
|
|
|
@ -9,7 +9,17 @@
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-6">
|
<div class="col-6">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Database Connection</label>
|
<label>{{ $t('setup.language') }}</label>
|
||||||
|
<select @change="changeLanguages" v-model="setup.language" id="language" class="form-control">
|
||||||
|
<option value="en">English</option>
|
||||||
|
<option value="es">Spanish</option>
|
||||||
|
<option value="fr">French</option>
|
||||||
|
<option value="ru">Russian</option>
|
||||||
|
<option value="de">German</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>{{ $t('setup.connection') }}</label>
|
||||||
<select @change="canSubmit" v-model="setup.db_connection" id="db_connection" class="form-control">
|
<select @change="canSubmit" v-model="setup.db_connection" id="db_connection" class="form-control">
|
||||||
<option value="sqlite">SQLite</option>
|
<option value="sqlite">SQLite</option>
|
||||||
<option value="postgres">Postgres</option>
|
<option value="postgres">Postgres</option>
|
||||||
|
@ -17,23 +27,23 @@
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="setup.db_connection !== 'sqlite'" class="form-group">
|
<div v-if="setup.db_connection !== 'sqlite'" class="form-group">
|
||||||
<label>Host</label>
|
<label>{{ $t('setup.host') }}</label>
|
||||||
<input @keyup="canSubmit" v-model="setup.db_host" id="db_host" type="text" class="form-control" placeholder="localhost">
|
<input @keyup="canSubmit" v-model="setup.db_host" id="db_host" type="text" class="form-control" placeholder="localhost">
|
||||||
</div>
|
</div>
|
||||||
<div v-if="setup.db_connection !== 'sqlite'" class="form-group">
|
<div v-if="setup.db_connection !== 'sqlite'" class="form-group">
|
||||||
<label>Database Port</label>
|
<label>{{ $t('port') }}</label>
|
||||||
<input @keyup="canSubmit" v-model="setup.db_port" id="db_port" type="text" class="form-control" placeholder="localhost">
|
<input @keyup="canSubmit" v-model="setup.db_port" id="db_port" type="text" class="form-control" placeholder="localhost">
|
||||||
</div>
|
</div>
|
||||||
<div v-if="setup.db_connection !== 'sqlite'" class="form-group">
|
<div v-if="setup.db_connection !== 'sqlite'" class="form-group">
|
||||||
<label>Username</label>
|
<label>{{ $t('username') }}</label>
|
||||||
<input @keyup="canSubmit" v-model="setup.db_user" id="db_user" type="text" class="form-control" placeholder="root">
|
<input @keyup="canSubmit" v-model="setup.db_user" id="db_user" type="text" class="form-control" placeholder="root">
|
||||||
</div>
|
</div>
|
||||||
<div v-if="setup.db_connection !== 'sqlite'" class="form-group">
|
<div v-if="setup.db_connection !== 'sqlite'" class="form-group">
|
||||||
<label for="db_password">Password</label>
|
<label for="db_password">{{ $t('password') }}</label>
|
||||||
<input @keyup="canSubmit" v-model="setup.db_password" id="db_password" type="password" class="form-control" placeholder="password123">
|
<input @keyup="canSubmit" v-model="setup.db_password" id="db_password" type="password" class="form-control" placeholder="password123">
|
||||||
</div>
|
</div>
|
||||||
<div v-if="setup.db_connection !== 'sqlite'" class="form-group">
|
<div v-if="setup.db_connection !== 'sqlite'" class="form-group">
|
||||||
<label for="db_database">Database</label>
|
<label for="db_database">{{ $t('database') }}</label>
|
||||||
<input @keyup="canSubmit" v-model="setup.db_database" id="db_database" type="text" class="form-control" placeholder="Database name">
|
<input @keyup="canSubmit" v-model="setup.db_database" id="db_database" type="text" class="form-control" placeholder="Database name">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -42,50 +52,50 @@
|
||||||
<div class="col-6">
|
<div class="col-6">
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Project Name</label>
|
<label>{{ $t('setup.project_name') }}</label>
|
||||||
<input @keyup="canSubmit" v-model="setup.project" id="project" type="text" class="form-control" placeholder="Great Uptime" required>
|
<input @keyup="canSubmit" v-model="setup.project" id="project" type="text" class="form-control" placeholder="Great Uptime" required>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Project Description</label>
|
<label>{{ $t('setup.project_description') }}</label>
|
||||||
<input @keyup="canSubmit" v-model="setup.description" id="description" type="text" class="form-control" placeholder="Great Uptime">
|
<input @keyup="canSubmit" v-model="setup.description" id="description" type="text" class="form-control" placeholder="Great Uptime">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="domain">Domain URL</label>
|
<label for="domain">{{ $t('setup.domain') }}</label>
|
||||||
<input @keyup="canSubmit" v-model="setup.domain" type="text" class="form-control" id="domain" required>
|
<input @keyup="canSubmit" v-model="setup.domain" type="text" class="form-control" id="domain" required>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Admin Username</label>
|
<label>{{ $t('setup.username') }}</label>
|
||||||
<input @keyup="canSubmit" v-model="setup.username" id="username" type="text" class="form-control" placeholder="admin" required>
|
<input @keyup="canSubmit" v-model="setup.username" id="username" type="text" class="form-control" placeholder="admin" required>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Admin Password</label>
|
<label>{{ $t('setup.username') }}</label>
|
||||||
<input @keyup="canSubmit" v-model="setup.password" id="password" type="password" class="form-control" placeholder="password" required>
|
<input @keyup="canSubmit" v-model="setup.password" id="password" type="password" class="form-control" placeholder="password" required>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Confirm Admin Password</label>
|
<label>{{ $t('setup.password_confirm') }}</label>
|
||||||
<input @keyup="canSubmit" v-model="setup.confirm_password" id="password_confirm" type="password" class="form-control" placeholder="password" required>
|
<input @keyup="canSubmit" v-model="setup.confirm_password" id="password_confirm" type="password" class="form-control" placeholder="password" required>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-8">
|
<div class="col-8">
|
||||||
<label>Email Address</label>
|
<label>{{ $t('email') }}</label>
|
||||||
<input @keyup="canSubmit" v-model="setup.email" id="email" type="text" class="form-control" placeholder="myemail@domain.com">
|
<input @keyup="canSubmit" v-model="setup.email" id="email" type="text" class="form-control" placeholder="myemail@domain.com">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-4">
|
<div class="col-4">
|
||||||
<label class="d-none d-sm-block">Newsletter</label>
|
<label class="d-none d-sm-block">{{ $t('setup.newsletter') }}</label>
|
||||||
<span @click="setup.newsletter = !!setup.newsletter" class="switch">
|
<span @click="setup.newsletter = !!setup.newsletter" class="switch">
|
||||||
<input v-model="setup.newsletter" type="checkbox" name="using_cdn" class="switch" id="send_newsletter" :checked="setup.newsletter">
|
<input v-model="setup.newsletter" type="checkbox" name="using_cdn" class="switch" id="send_newsletter" :checked="setup.newsletter">
|
||||||
<label for="send_newsletter"></label>
|
<label for="send_newsletter"></label>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<small>We will not share your email, emails are only for major updates.</small>
|
<small>{{ $t('setup.newsletter_note') }}</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -115,6 +125,7 @@
|
||||||
loading: false,
|
loading: false,
|
||||||
disabled: true,
|
disabled: true,
|
||||||
setup: {
|
setup: {
|
||||||
|
language: "en",
|
||||||
db_connection: "sqlite",
|
db_connection: "sqlite",
|
||||||
db_host: "",
|
db_host: "",
|
||||||
db_port: "",
|
db_port: "",
|
||||||
|
@ -146,6 +157,9 @@
|
||||||
this.setup.domain = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ":"+window.location.port : "")
|
this.setup.domain = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ":"+window.location.port : "")
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
changeLanguages() {
|
||||||
|
this.$i18n.locale = this.setup.language
|
||||||
|
},
|
||||||
canSubmit() {
|
canSubmit() {
|
||||||
this.error = null
|
this.error = null
|
||||||
const s = this.setup
|
const s = this.setup
|
||||||
|
|
|
@ -82,10 +82,7 @@
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
in_user() {
|
in_user() {
|
||||||
let u = this.in_user
|
this.user = this.in_user
|
||||||
u.password = null
|
|
||||||
u.password_confirm = null
|
|
||||||
this.user = u
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
const english = {
|
||||||
|
setup: {
|
||||||
|
language: "Language",
|
||||||
|
connection: "Database Connection",
|
||||||
|
host: "Host",
|
||||||
|
database: "Database",
|
||||||
|
project_name: "Project Name",
|
||||||
|
project_description: "Project Description",
|
||||||
|
domain: "Domain URL",
|
||||||
|
username: "Admin Username",
|
||||||
|
password: "Admin Username",
|
||||||
|
password_confirm: "Confirm Admin Username",
|
||||||
|
newsletter: "Newsletter",
|
||||||
|
newsletter_note: "We will not share your email, emails are only for major updates.",
|
||||||
|
},
|
||||||
|
email: "Email Address",
|
||||||
|
port: "Database Port",
|
||||||
|
username: "Username",
|
||||||
|
password: 'password',
|
||||||
|
service: 'service',
|
||||||
|
online: 'online',
|
||||||
|
offline: 'offline',
|
||||||
|
incident: 'incident',
|
||||||
|
group: 'group',
|
||||||
|
message: 'message',
|
||||||
|
logout: 'logout',
|
||||||
|
sample_data: 'Sample Data',
|
||||||
|
today: 'Today',
|
||||||
|
day: 'day',
|
||||||
|
hour: 'hour',
|
||||||
|
}
|
||||||
|
|
||||||
|
export default english
|
|
@ -0,0 +1,19 @@
|
||||||
|
const french = {
|
||||||
|
setup: {
|
||||||
|
language: "Langue",
|
||||||
|
database_connection: "Database Connection"
|
||||||
|
},
|
||||||
|
service: 'service',
|
||||||
|
online: 'online',
|
||||||
|
offline: 'offline',
|
||||||
|
incident: 'incident',
|
||||||
|
group: 'group',
|
||||||
|
message: 'message',
|
||||||
|
logout: 'logout',
|
||||||
|
sample_data: 'Sample Data',
|
||||||
|
today: 'Today',
|
||||||
|
day: 'day',
|
||||||
|
hour: 'hour',
|
||||||
|
}
|
||||||
|
|
||||||
|
export default french
|
|
@ -0,0 +1,19 @@
|
||||||
|
const german = {
|
||||||
|
setup: {
|
||||||
|
language: "Sprache",
|
||||||
|
database_connection: "Database Connection"
|
||||||
|
},
|
||||||
|
service: 'service',
|
||||||
|
online: 'online',
|
||||||
|
offline: 'offline',
|
||||||
|
incident: 'incident',
|
||||||
|
group: 'group',
|
||||||
|
message: 'message',
|
||||||
|
logout: 'logout',
|
||||||
|
sample_data: 'Sample Data',
|
||||||
|
today: 'Today',
|
||||||
|
day: 'day',
|
||||||
|
hour: 'hour',
|
||||||
|
}
|
||||||
|
|
||||||
|
export default german
|
|
@ -0,0 +1,15 @@
|
||||||
|
import english from "./english"
|
||||||
|
import spanish from "./spanish"
|
||||||
|
import german from "./german"
|
||||||
|
import russian from "./russian";
|
||||||
|
import french from "./french";
|
||||||
|
|
||||||
|
const language = {
|
||||||
|
en: english,
|
||||||
|
es: spanish,
|
||||||
|
de: german,
|
||||||
|
ru: russian,
|
||||||
|
fr: french,
|
||||||
|
}
|
||||||
|
|
||||||
|
export default language
|
|
@ -0,0 +1,19 @@
|
||||||
|
const russian = {
|
||||||
|
setup: {
|
||||||
|
language: "язык",
|
||||||
|
database_connection: "Database Connection"
|
||||||
|
},
|
||||||
|
service: 'service',
|
||||||
|
online: 'online',
|
||||||
|
offline: 'offline',
|
||||||
|
incident: 'incident',
|
||||||
|
group: 'group',
|
||||||
|
message: 'message',
|
||||||
|
logout: 'logout',
|
||||||
|
sample_data: 'Sample Data',
|
||||||
|
today: 'Today',
|
||||||
|
day: 'day',
|
||||||
|
hour: 'hour',
|
||||||
|
}
|
||||||
|
|
||||||
|
export default russian
|
|
@ -0,0 +1,19 @@
|
||||||
|
const spanish = {
|
||||||
|
setup: {
|
||||||
|
language: "Idioma",
|
||||||
|
database_connection: "Database Connection"
|
||||||
|
},
|
||||||
|
service: 'service',
|
||||||
|
online: 'online',
|
||||||
|
offline: 'offline',
|
||||||
|
incident: 'incident',
|
||||||
|
group: 'group',
|
||||||
|
message: 'message',
|
||||||
|
logout: 'logout',
|
||||||
|
sample_data: 'Sample Data',
|
||||||
|
today: 'Today',
|
||||||
|
day: 'day',
|
||||||
|
hour: 'hour',
|
||||||
|
}
|
||||||
|
|
||||||
|
export default spanish
|
|
@ -4,9 +4,13 @@ import VueApexCharts from 'vue-apexcharts'
|
||||||
import VueObserveVisibility from 'vue-observe-visibility'
|
import VueObserveVisibility from 'vue-observe-visibility'
|
||||||
import VueClipboard from 'vue-clipboard2'
|
import VueClipboard from 'vue-clipboard2'
|
||||||
import VueCookies from 'vue-cookies'
|
import VueCookies from 'vue-cookies'
|
||||||
|
import VueI18n from 'vue-i18n'
|
||||||
|
import router from './routes'
|
||||||
|
import "./mixin"
|
||||||
|
import "./icons"
|
||||||
import App from '@/App.vue'
|
import App from '@/App.vue'
|
||||||
import store from './store'
|
import store from './store'
|
||||||
|
import language from './languages'
|
||||||
|
|
||||||
Vue.component('apexchart', VueApexCharts)
|
Vue.component('apexchart', VueApexCharts)
|
||||||
|
|
||||||
|
@ -14,16 +18,19 @@ Vue.use(VueClipboard);
|
||||||
Vue.use(VueRouter);
|
Vue.use(VueRouter);
|
||||||
Vue.use(VueObserveVisibility);
|
Vue.use(VueObserveVisibility);
|
||||||
Vue.use(VueCookies);
|
Vue.use(VueCookies);
|
||||||
|
Vue.use(VueI18n);
|
||||||
|
|
||||||
|
const i18n = new VueI18n({
|
||||||
|
fallbackLocale: "en",
|
||||||
|
messages: language
|
||||||
|
});
|
||||||
|
|
||||||
Vue.$cookies.config('3d')
|
Vue.$cookies.config('3d')
|
||||||
|
|
||||||
import router from './routes'
|
|
||||||
import "./mixin"
|
|
||||||
import "./icons"
|
|
||||||
|
|
||||||
|
|
||||||
Vue.config.productionTip = false
|
Vue.config.productionTip = false
|
||||||
new Vue({
|
new Vue({
|
||||||
router,
|
router,
|
||||||
store,
|
store,
|
||||||
|
i18n,
|
||||||
render: h => h(App),
|
render: h => h(App),
|
||||||
}).$mount('#app')
|
}).$mount('#app')
|
||||||
|
|
|
@ -20,18 +20,7 @@ export default Vue.mixin({
|
||||||
return startOfToday()
|
return startOfToday()
|
||||||
},
|
},
|
||||||
secondsHumanize (val) {
|
secondsHumanize (val) {
|
||||||
if (!Number.isInteger(val)) {
|
return `${val} seconds`
|
||||||
return "0 seconds"
|
|
||||||
}
|
|
||||||
const t2 = addSeconds(new Date(0), val)
|
|
||||||
if (val >= 60) {
|
|
||||||
let minword = "minute"
|
|
||||||
if (val >= 120) {
|
|
||||||
minword = "minutes"
|
|
||||||
}
|
|
||||||
return format(t2, "m '"+minword+"' s 'seconds'")
|
|
||||||
}
|
|
||||||
return format(t2, "s 'seconds'")
|
|
||||||
},
|
},
|
||||||
utc(val) {
|
utc(val) {
|
||||||
return new Date.UTC(val)
|
return new Date.UTC(val)
|
||||||
|
@ -57,6 +46,24 @@ export default Vue.mixin({
|
||||||
parseISO(v) {
|
parseISO(v) {
|
||||||
return parseISO(v)
|
return parseISO(v)
|
||||||
},
|
},
|
||||||
|
isZero(val) {
|
||||||
|
return getUnixTime(parseISO(val)) <= 0
|
||||||
|
},
|
||||||
|
smallText(s) {
|
||||||
|
const incidents = s.incidents
|
||||||
|
if (s.online) {
|
||||||
|
return `Online, checked ${this.ago(s.last_success)} ago`
|
||||||
|
} else {
|
||||||
|
const last = s.last_failure
|
||||||
|
if (last) {
|
||||||
|
return `Offline, last error: ${last} ${this.ago(last.created_at)}`
|
||||||
|
}
|
||||||
|
if (this.isZero(s.last_success)) {
|
||||||
|
return `Service has never been online`
|
||||||
|
}
|
||||||
|
return `Service has been offline for ${this.ago(s.last_success)}`
|
||||||
|
}
|
||||||
|
},
|
||||||
toUnix(val) {
|
toUnix(val) {
|
||||||
return getUnixTime(val)
|
return getUnixTime(val)
|
||||||
},
|
},
|
||||||
|
|
|
@ -1371,6 +1371,14 @@
|
||||||
"@types/yargs" "^15.0.0"
|
"@types/yargs" "^15.0.0"
|
||||||
chalk "^3.0.0"
|
chalk "^3.0.0"
|
||||||
|
|
||||||
|
"@kazupon/vue-i18n-loader@^0.5.0":
|
||||||
|
version "0.5.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@kazupon/vue-i18n-loader/-/vue-i18n-loader-0.5.0.tgz#64819fc9dbe21bac523e3436b7e15c32bcd33b92"
|
||||||
|
integrity sha512-Tp2mXKemf9/RBhI9CW14JjR9oKjL2KH7tV6S0eKEjIBuQBAOFNuPJu3ouacmz9hgoXbNp+nusw3MVQmxZWFR9g==
|
||||||
|
dependencies:
|
||||||
|
js-yaml "^3.13.1"
|
||||||
|
json5 "^2.1.1"
|
||||||
|
|
||||||
"@mrmlnc/readdir-enhanced@^2.2.1":
|
"@mrmlnc/readdir-enhanced@^2.2.1":
|
||||||
version "2.2.1"
|
version "2.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
|
resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
|
||||||
|
@ -7063,6 +7071,13 @@ json5@^2.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
minimist "^1.2.0"
|
minimist "^1.2.0"
|
||||||
|
|
||||||
|
json5@^2.1.1:
|
||||||
|
version "2.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
|
||||||
|
integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
|
||||||
|
dependencies:
|
||||||
|
minimist "^1.2.5"
|
||||||
|
|
||||||
json5@^2.1.2:
|
json5@^2.1.2:
|
||||||
version "2.1.2"
|
version "2.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e"
|
resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e"
|
||||||
|
@ -11884,6 +11899,11 @@ vue-hot-reload-api@^2.3.0:
|
||||||
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2"
|
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2"
|
||||||
integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==
|
integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==
|
||||||
|
|
||||||
|
vue-i18n@^8.18.1:
|
||||||
|
version "8.18.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.18.1.tgz#2e683ac93a15617bdcd210f99359d6034e8425dd"
|
||||||
|
integrity sha512-K+hFQJksF8Ph23pnhbwSyoQx+4Y1q/rh2o7GiXI/3rLCCrwanUbzudC8+trp0Mb8rn9y83DYF6RXNrMd+VsuCw==
|
||||||
|
|
||||||
vue-loader@^15.8.3:
|
vue-loader@^15.8.3:
|
||||||
version "15.9.0"
|
version "15.9.0"
|
||||||
resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.0.tgz#5d4b0378a4606188fc83e587ed23c94bc3a10998"
|
resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.0.tgz#5d4b0378a4606188fc83e587ed23c94bc3a10998"
|
||||||
|
|
|
@ -29,10 +29,6 @@ type oAuth struct {
|
||||||
func oauthHandler(w http.ResponseWriter, r *http.Request) {
|
func oauthHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
vars := mux.Vars(r)
|
vars := mux.Vars(r)
|
||||||
provider := vars["provider"]
|
provider := vars["provider"]
|
||||||
code := r.URL.Query().Get("code")
|
|
||||||
fmt.Println("code: ", code)
|
|
||||||
fmt.Println("client: ", core.App.OAuth.SlackClientID)
|
|
||||||
fmt.Println("secret: ", core.App.OAuth.SlackClientSecret)
|
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
var oauth *oAuth
|
var oauth *oAuth
|
||||||
|
|
|
@ -134,6 +134,9 @@ func processSetupHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func registerNews(email, domain string) error {
|
func registerNews(email, domain string) error {
|
||||||
|
if email == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
v := url.Values{}
|
v := url.Values{}
|
||||||
v.Set("email", email)
|
v.Set("email", email)
|
||||||
v.Set("domain", domain)
|
v.Set("domain", domain)
|
||||||
|
|
|
@ -13,6 +13,7 @@ type DbConfig struct {
|
||||||
DbData string `yaml:"database" json:"-"`
|
DbData string `yaml:"database" json:"-"`
|
||||||
DbPort int `yaml:"port" json:"-"`
|
DbPort int `yaml:"port" json:"-"`
|
||||||
ApiSecret string `yaml:"api_secret" json:"-"`
|
ApiSecret string `yaml:"api_secret" json:"-"`
|
||||||
|
Language string `yaml:"language" json:"language"`
|
||||||
Project string `yaml:"-" json:"-"`
|
Project string `yaml:"-" json:"-"`
|
||||||
Description string `yaml:"-" json:"-"`
|
Description string `yaml:"-" json:"-"`
|
||||||
Domain string `yaml:"-" json:"-"`
|
Domain string `yaml:"-" json:"-"`
|
||||||
|
|
|
@ -50,6 +50,7 @@ func (c *Core) Create() error {
|
||||||
ApiSecret: secret,
|
ApiSecret: secret,
|
||||||
Version: App.Version,
|
Version: App.Version,
|
||||||
Domain: c.Domain,
|
Domain: c.Domain,
|
||||||
|
Language: "en",
|
||||||
MigrationId: utils.Now().Unix(),
|
MigrationId: utils.Now().Unix(),
|
||||||
}
|
}
|
||||||
q := db.Create(&newCore)
|
q := db.Create(&newCore)
|
||||||
|
|
|
@ -28,6 +28,7 @@ type Core struct {
|
||||||
Footer null.NullString `gorm:"column:footer" json:"footer"`
|
Footer null.NullString `gorm:"column:footer" json:"footer"`
|
||||||
Domain string `gorm:"not null;column:domain" json:"domain"`
|
Domain string `gorm:"not null;column:domain" json:"domain"`
|
||||||
Version string `gorm:"column:version" json:"version"`
|
Version string `gorm:"column:version" json:"version"`
|
||||||
|
Language string `gorm:"column:language" json:"language"`
|
||||||
Setup bool `gorm:"-" json:"setup"`
|
Setup bool `gorm:"-" json:"setup"`
|
||||||
MigrationId int64 `gorm:"column:migration_id" json:"migration_id,omitempty"`
|
MigrationId int64 `gorm:"column:migration_id" json:"migration_id,omitempty"`
|
||||||
UseCdn null.NullBool `gorm:"column:use_cdn;default:false" json:"using_cdn,omitempty"`
|
UseCdn null.NullBool `gorm:"column:use_cdn;default:false" json:"using_cdn,omitempty"`
|
||||||
|
|
|
@ -56,6 +56,7 @@ func setDefaults() {
|
||||||
Params.SetDefault("DESCRIPTION", "This status page has sample data included")
|
Params.SetDefault("DESCRIPTION", "This status page has sample data included")
|
||||||
Params.SetDefault("REMOVE_AFTER", 2160*time.Hour)
|
Params.SetDefault("REMOVE_AFTER", 2160*time.Hour)
|
||||||
Params.SetDefault("CLEANUP_INTERVAL", 1*time.Hour)
|
Params.SetDefault("CLEANUP_INTERVAL", 1*time.Hour)
|
||||||
|
Params.SetDefault("LANGUAGE", "en")
|
||||||
|
|
||||||
dbConn := Params.GetString("DB_CONN")
|
dbConn := Params.GetString("DB_CONN")
|
||||||
dbInt := Params.GetInt("DB_PORT")
|
dbInt := Params.GetInt("DB_PORT")
|
||||||
|
|
Loading…
Reference in New Issue