Fix some linter errors, use blob URL for download
Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
parent
69c2b09bcc
commit
b8fd877654
6 changed files with 28 additions and 16 deletions
1
.eslintignore
Normal file
1
.eslintignore
Normal file
|
@ -0,0 +1 @@
|
||||||
|
src/langs/langs.tpl.js
|
|
@ -1,7 +1,6 @@
|
||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<!-- Required meta tags -->
|
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
@ -64,4 +63,3 @@
|
||||||
></script>
|
></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
26
src/app.vue
26
src/app.vue
|
@ -1,3 +1,4 @@
|
||||||
|
<!-- eslint-disable vue/no-v-html -->
|
||||||
<template>
|
<template>
|
||||||
<div id="app">
|
<div id="app">
|
||||||
<b-navbar
|
<b-navbar
|
||||||
|
@ -76,7 +77,10 @@
|
||||||
v-html="$t('title-explanation')"
|
v-html="$t('title-explanation')"
|
||||||
/>
|
/>
|
||||||
<ul>
|
<ul>
|
||||||
<li v-for="explanation in $t('items-explanation')">
|
<li
|
||||||
|
v-for="(explanation, idx) in $t('items-explanation')"
|
||||||
|
:key="`idx${idx}`"
|
||||||
|
>
|
||||||
{{ explanation }}
|
{{ explanation }}
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -255,7 +259,7 @@
|
||||||
<i class="fas fa-fw fa-clipboard" />
|
<i class="fas fa-fw fa-clipboard" />
|
||||||
</b-button>
|
</b-button>
|
||||||
<b-button
|
<b-button
|
||||||
:href="`data:text/plain;charset=UTF-8,${encodeURIComponent(secret)}`"
|
:href="secretContentBlobURL"
|
||||||
download
|
download
|
||||||
title="Download Secret as Text File"
|
title="Download Secret as Text File"
|
||||||
>
|
>
|
||||||
|
@ -305,6 +309,8 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
/* global maxSecretExpire */
|
||||||
|
|
||||||
import crypto from './crypto.js'
|
import crypto from './crypto.js'
|
||||||
import qrcode from 'qrcode'
|
import qrcode from 'qrcode'
|
||||||
|
|
||||||
|
@ -351,10 +357,11 @@ export default {
|
||||||
explanationShown: false,
|
explanationShown: false,
|
||||||
mode: 'create',
|
mode: 'create',
|
||||||
secret: '',
|
secret: '',
|
||||||
|
secretContentBlobURL: '',
|
||||||
|
secretContentQRDataURL: '',
|
||||||
secretExpiry: null,
|
secretExpiry: null,
|
||||||
secretId: '',
|
secretId: '',
|
||||||
secretQRDataURL: '',
|
secretQRDataURL: '',
|
||||||
secretContentQRDataURL: '',
|
|
||||||
securePassword: '',
|
securePassword: '',
|
||||||
selectedExpiry: null,
|
selectedExpiry: null,
|
||||||
showError: false,
|
showError: false,
|
||||||
|
@ -443,7 +450,7 @@ export default {
|
||||||
window.setTimeout(() => this.$refs.secretUrl.focus(), 100)
|
window.setTimeout(() => this.$refs.secretUrl.focus(), 100)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(() => {
|
||||||
// Network error
|
// Network error
|
||||||
this.error = this.$t('alert-something-went-wrong')
|
this.error = this.$t('alert-something-went-wrong')
|
||||||
this.showError = true
|
this.showError = true
|
||||||
|
@ -533,7 +540,7 @@ export default {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(() => {
|
||||||
// Network error
|
// Network error
|
||||||
this.error = this.$t('alert-something-went-wrong')
|
this.error = this.$t('alert-something-went-wrong')
|
||||||
this.showError = true
|
this.showError = true
|
||||||
|
@ -558,6 +565,11 @@ export default {
|
||||||
},
|
},
|
||||||
|
|
||||||
secret(to) {
|
secret(to) {
|
||||||
|
if (this.secretContentBlobURL) {
|
||||||
|
window.URL.revokeObjectURL(this.secretContentBlobURL)
|
||||||
|
}
|
||||||
|
this.secretContentBlobURL = window.URL.createObjectURL(new Blob([to], { type: 'text/plain' }))
|
||||||
|
|
||||||
if (this.customize.disableQRSupport || !to) {
|
if (this.customize.disableQRSupport || !to) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -566,7 +578,9 @@ export default {
|
||||||
.then(url => {
|
.then(url => {
|
||||||
this.secretContentQRDataURL = url
|
this.secretContentQRDataURL = url
|
||||||
})
|
})
|
||||||
.catch(() => this.secretContentQRDataURL = null)
|
.catch(() => {
|
||||||
|
this.secretContentQRDataURL = null
|
||||||
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
secretUrl(to) {
|
secretUrl(to) {
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
// Auto-Generated, do not edit!
|
// Auto-Generated, do not edit!
|
||||||
|
|
||||||
const switchFormal = (formal, informal) => {
|
const switchFormal = (formal, informal) => window.useFormalLanguage ? formal : informal
|
||||||
return window.useFormalLanguage ? formal : informal
|
|
||||||
}
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
'ca': JSON.parse('{"alert-secret-not-found":"Aquest no és el secret que busques\u0026hellip; - Si esperaves que el secret estiguera ací, és possible que s\'haja vist compromés, ja que una altra persona podria haver obert l\'enllaç en comptes de tu.","alert-something-went-wrong":"Alguna cosa ha eixit malament. Ens sap molt greu\u0026hellip;","btn-create-secret":"Crea el secret!","btn-new-secret":"Nou secret","btn-reveal-secret":"Mostra\'m el secret!","btn-show-explanation":"Com funciona?","expire-default":"Caducitat predeterminada","expire-n-days":"{n} dia | {n} dies","expire-n-hours":"{n} hora | {n} hores","expire-n-minutes":"{n} minut | {n} minuts","expire-n-seconds":"{n} segon | {n} segons","items-explanation":["Introduïx un secret en el formulari que hi ha en aquesta pàgina","El teu navegador xifra el secret utilitzant una contrasenya generada","Únicament s\'envia al servidor el secret xifrat (mai s\'envien ni el secret sense xifrar ni la contrasenya!)","El servidor emmagatzema el secret xifrat durant un temps limitat","Envia al destinatari l\'enllaç mostrat, que conté l\'identificador del secret i la contrasenya de desxifrat","El destinatari pot veure el secret una sola vegada: si no pot, el secret podria haver sigut vist per una altra persona!","Quan s\'ha obtingut per primera i única vegada el secret xifrat, s\'elimina del servidor"],"label-expiry":"Caduca en:","label-secret-data":"Informació secreta:","text-burn-hint":"Per favor, recorda no accedir a aquest enllaç tu mateix, ja que això destruiria el secret. Només has de passar-li\'l a una altra persona!","text-burn-time":"Si no es mostra abans, aquest secret s\'eliminarà automàticament:","text-hint-burned":"\u003cstrong\u003eAtenció:\u003c/strong\u003e Només veuràs això una vegada. Quan recarregues la pàgina, el secret desapareixerà, així que copia\'l ja\u0026hellip;","text-powered-by":"Funciona amb","text-pre-reveal-hint":"Per a mostrar el secret prem aquest botó, però tingues en compte que en fer-ho es destruirà. Només pots veure\'l una vegada!","text-pre-url":"El teu secret ha sigut creat i emmagatzemat en el següent enllaç:","text-secret-create-disabled":"La creació de nous secrets està desactivada en aquesta instància.","title-explanation":"Així és com funciona\u0026hellip;","title-new-secret":"Crea un nou secret","title-reading-secret":"Obtenint el teu secret\u0026hellip;","title-secret-create-disabled":"S\'ha desactivat la creació de secrets...","title-secret-created":"Secret creat!"}'),
|
'ca': JSON.parse('{"alert-secret-not-found":"Aquest no és el secret que busques\u0026hellip; - Si esperaves que el secret estiguera ací, és possible que s\'haja vist compromés, ja que una altra persona podria haver obert l\'enllaç en comptes de tu.","alert-something-went-wrong":"Alguna cosa ha eixit malament. Ens sap molt greu\u0026hellip;","btn-create-secret":"Crea el secret!","btn-new-secret":"Nou secret","btn-reveal-secret":"Mostra\'m el secret!","btn-show-explanation":"Com funciona?","expire-default":"Caducitat predeterminada","expire-n-days":"{n} dia | {n} dies","expire-n-hours":"{n} hora | {n} hores","expire-n-minutes":"{n} minut | {n} minuts","expire-n-seconds":"{n} segon | {n} segons","items-explanation":["Introduïx un secret en el formulari que hi ha en aquesta pàgina","El teu navegador xifra el secret utilitzant una contrasenya generada","Únicament s\'envia al servidor el secret xifrat (mai s\'envien ni el secret sense xifrar ni la contrasenya!)","El servidor emmagatzema el secret xifrat durant un temps limitat","Envia al destinatari l\'enllaç mostrat, que conté l\'identificador del secret i la contrasenya de desxifrat","El destinatari pot veure el secret una sola vegada: si no pot, el secret podria haver sigut vist per una altra persona!","Quan s\'ha obtingut per primera i única vegada el secret xifrat, s\'elimina del servidor"],"label-expiry":"Caduca en:","label-secret-data":"Informació secreta:","text-burn-hint":"Per favor, recorda no accedir a aquest enllaç tu mateix, ja que això destruiria el secret. Només has de passar-li\'l a una altra persona!","text-burn-time":"Si no es mostra abans, aquest secret s\'eliminarà automàticament:","text-hint-burned":"\u003cstrong\u003eAtenció:\u003c/strong\u003e Només veuràs això una vegada. Quan recarregues la pàgina, el secret desapareixerà, així que copia\'l ja\u0026hellip;","text-powered-by":"Funciona amb","text-pre-reveal-hint":"Per a mostrar el secret prem aquest botó, però tingues en compte que en fer-ho es destruirà. Només pots veure\'l una vegada!","text-pre-url":"El teu secret ha sigut creat i emmagatzemat en el següent enllaç:","text-secret-create-disabled":"La creació de nous secrets està desactivada en aquesta instància.","title-explanation":"Així és com funciona\u0026hellip;","title-new-secret":"Crea un nou secret","title-reading-secret":"Obtenint el teu secret\u0026hellip;","title-secret-create-disabled":"S\'ha desactivat la creació de secrets...","title-secret-created":"Secret creat!"}'),
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
// Auto-Generated, do not edit!
|
// Auto-Generated, do not edit!
|
||||||
|
|
||||||
const switchFormal = (formal, informal) => {
|
const switchFormal = (formal, informal) => window.useFormalLanguage ? formal : informal
|
||||||
return window.useFormalLanguage ? formal : informal
|
|
||||||
}
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
{{- range $lang, $translation := .Translations -}}
|
{{- range $lang, $translation := .Translations -}}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
/* eslint-disable sort-imports */
|
||||||
|
/* global version */
|
||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
import VueI18n from 'vue-i18n'
|
import VueI18n from 'vue-i18n'
|
||||||
|
|
||||||
|
@ -16,15 +18,16 @@ const cookieSet = Object.fromEntries(document.cookie.split('; ')
|
||||||
.map(el => decodeURIComponent(el))))
|
.map(el => decodeURIComponent(el))))
|
||||||
|
|
||||||
const i18n = new VueI18n({
|
const i18n = new VueI18n({
|
||||||
locale: cookieSet.lang || navigator?.language || 'en',
|
|
||||||
fallbackLocale: 'en',
|
fallbackLocale: 'en',
|
||||||
|
locale: cookieSet.lang || navigator?.language || 'en',
|
||||||
messages,
|
messages,
|
||||||
})
|
})
|
||||||
|
|
||||||
new Vue({
|
new Vue({
|
||||||
el: '#app',
|
|
||||||
components: { app },
|
components: { app },
|
||||||
data: { version },
|
data: { version },
|
||||||
|
el: '#app',
|
||||||
i18n,
|
i18n,
|
||||||
|
name: 'OTSAppInterface',
|
||||||
render: createElement => createElement('app'),
|
render: createElement => createElement('app'),
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue