Merge branch 'master' of github.com:Lissy93/dashy into FEATURE/minimal-view

This commit is contained in:
Alicia Sykes
2021-08-08 14:09:19 +01:00
23 changed files with 330 additions and 119 deletions

View File

@@ -17,7 +17,13 @@
"remember-me-never": "Never",
"remember-me-hour": "4 Hours",
"remember-me-day": "1 Day",
"remember-me-week": "1 Week"
"remember-me-week": "1 Week",
"error-missing-username": "Missing Username",
"error-missing-password": "Missing Password",
"error-incorrect-username": "User not found",
"error-incorrect-password": "Incorrect Password",
"success-message": "Logging in...",
"logout-message": "Logged Out"
},
"config": {
"main-tab": "Config",
@@ -59,7 +65,9 @@
"item-size-small": "Small",
"item-size-medium": "Medium",
"item-size-large": "Large",
"config-launcher-label": "Config"
"config-launcher-label": "Config",
"config-launcher-tooltip": "Update Configuration",
"sign-out-tooltip": "Sign Out"
},
"updates": {
"app-version-note": "Dashy version",

150
src/assets/locales/fr.json Normal file
View File

@@ -0,0 +1,150 @@
{
"home": {
"no-results": "Aucun résultat",
"no-data": "Aucune donnée configurée"
},
"search": {
"search-label": "Recherche",
"search-placeholder": "Commencez à taper pour filtrer",
"clear-search-tooltip": "Effacer la recherche"
},
"login": {
"title": "Dashy",
"username-label": "Nom d'utilisateur",
"password-label": "Mot de passe",
"login-button": "Connexion",
"remember-me-label": "Se souvenir de moi",
"remember-me-never": "Jamais",
"remember-me-hour": "4 Heures",
"remember-me-day": "1 Jour",
"remember-me-week": "1 Semaine",
"error-missing-username": "Nom d'utilisateur manquant",
"error-missing-password": "Mot de passe manquant",
"error-incorrect-username": "Utilisateur inexistant",
"error-incorrect-password": "Mot de passe incorrect",
"success-message": "Connexion ...",
"logout-message": "Déconnexion"
},
"config": {
"main-tab": "Configuration",
"view-config-tab": "Afficher la configuration",
"edit-config-tab": "Modifier la configuration",
"custom-css-tab": "Styles personnalisés",
"heading": "Options de Configuration",
"download-config-button": "Télécharger la configuration",
"edit-config-button": "Modifier la configuration",
"edit-css-button": "Styles personnalisés",
"cloud-sync-button": "Activer la synchro. dans le cloud",
"edit-cloud-sync-button": "Modifier la synchro. dans le cloud",
"rebuild-app-button": "Reconstruire l'application",
"change-language-button": "Changer la langue",
"reset-settings-button": "Réinitialiser les paramètres locaux",
"app-info-button": "Informations sur l'application",
"backup-note": "Il est recommandé de faire une sauvegarde de votre configuration avant d'apporter des modifications.",
"reset-config-msg-l1": "Cela supprimera tous les paramètres utilisateur du stockage local, mais n'affectera pas votre fichier 'conf.yml'.",
"reset-config-msg-l2": "Vous devez d'abord sauvegarder toutes les modifications locales si vous souhaitez les utiliser à l'avenir.",
"reset-config-msg-l3": "Êtes-vous sur de vouloir continuer ?",
"data-cleared-msg": "Données effacées avec succès",
"actions-label": "Actions",
"copy-config-label": "Copier la configuration",
"data-copied-msg": "La configuration a été copiée dans le presse-papiers",
"reset-config-label": "Réinitialiser la configuration",
"css-save-btn": "Enregistrer",
"css-note-label": "Note",
"css-note-l1": "Vous devrez actualiser la page pour que les modifications prennent effet.",
"css-note-l2": "Les modifications ne sont stockés que localement, il est donc recommandé de faire une copie de votre CSS.",
"css-note-l3": "Pour supprimer tous les styles personnalisés, supprimez le contenu et appuyez sur Enregistrer."
},
"settings": {
"theme-label": "Thème",
"layout-label": "Disposition",
"layout-auto": "Auto",
"layout-horizontal": "Horizontal",
"layout-vertical": "Vertical",
"item-size-label": "Taille",
"item-size-small": "Petite",
"item-size-medium": "Moyenne",
"item-size-large": "Grande",
"config-launcher-label": "Config.",
"config-launcher-tooltip": "Modifier la configuration",
"sign-out-tooltip": "Déconnexion"
},
"updates": {
"app-version-note": "Version de Dashy",
"up-to-date": "À jour",
"out-of-date": "Mise à jour disponible !",
"unsupported-version-l1": "Vous utilisez une version non prise en charge de Dashy",
"unsupported-version-l2": "Pour une meilleure expérience et des correctifs de sécurité récents, veuillez mettre à jour vers"
},
"language-switcher": {
"title": "Changer la langue",
"dropdown-label": "Sélectionnez une langue",
"save-button": "Enregistrer",
"success-msg": "Langue mise à jour vers"
},
"theme-maker": {
"title": "Configurateur de Thèmes",
"export-button": "Exporter des variables personnalisées",
"reset-button": "Réinitialiser les styles pour",
"show-all-button": "Afficher toutes les variables",
"save-button": "Enregistrer",
"cancel-button": "Annuler",
"saved-toast": "{theme} mis à jour avec succès",
"copied-toast": "Données du thème {theme} copiées dans le presse-papiers",
"reset-toast": "Couleurs personnalisées pour {theme} supprimées"
},
"config-editor": {
"save-location-label": "Enregistrer localement",
"location-local-label": "Appliquer localement",
"location-disk-label": "Appliquer dans le fichier de configuration",
"save-button": "Enregistrer",
"valid-label": "La configuration est valide",
"status-success-msg": "Tâche terminée",
"status-fail-msg": "Échec de la tâche",
"success-msg-disk": "Le fichier de configuration est écrit avec succès sur le disque",
"success-msg-local": "Les modifications locales ont bien été enregistrées",
"success-note-l1": "L'application devrait se reconstruire automatiquement.",
"success-note-l2": "Cela peut prendre une minute.",
"success-note-l3": "Vous devrez actualiser la page pour que les modifications prennent effet.",
"error-msg-save-mode": "Veuillez sélectionner un mode d'enregistrement : Local ou Fichier",
"error-msg-cannot-save": "Une erreur s'est produite lors de l'enregistrement de la configuration",
"error-msg-bad-json": "Erreur dans le fichier JSON, il est peut-être mal formé",
"warning-msg-validation": "Attention"
},
"app-rebuild": {
"title": "Reconstruire l'application",
"rebuild-note-l1": "Une reconstruction est requise pour que les modifications écrites dans le fichier conf.yml prennent effet.",
"rebuild-note-l2": "Cela devrait se produire automatiquement, mais si ce n'est pas le cas, vous pouvez le déclencher manuellement ici.",
"rebuild-note-l3": "Ceci n'est pas nécessaire pour les modifications stockées localement.",
"rebuild-button": "Démarrer la reconstruction",
"rebuilding-status-1": "Reconstruction ...",
"rebuilding-status-2": "Cela peut prendre quelques minutes",
"error-permission": "Vous n'êtes pas autorisé à executer cette action",
"success-msg": "Construction terminée avec succès",
"fail-msg": "Échec de la construction",
"reload-note": "Un rechargement de la page est maintenant requis pour que les modifications prennent effet",
"reload-button": "Rafraîchir la page"
},
"cloud-sync": {
"title": "Sauvegarde Cloud & Restauration",
"intro-l1": "Ce service de sauvegarde et de restauration depuis le cloud est une fonctionnalité facultative qui vous permet de télécharger votre configuration sur Internet, puis de la restaurer sur n'importe quel autre appareil ou instance de Dashy.",
"intro-l2": "Toutes les données sont entièrement chiffrées de bout en bout avec le protocole AES, en utilisant votre mot de passe comme clé.",
"intro-l3": "Pour plus d'informations, veuillez consulter la",
"backup-title-setup": "Sauvegarder",
"backup-title-update": "Mettre à jour la sauvegarde",
"password-label-setup": "Choisissez un mot de passe",
"password-label-update": "Entrer votre mot de passe",
"backup-button-setup": "Sauvegarde",
"backup-button-update": "Mettre à jour la sauvegarde",
"backup-id-label": "Votre identifiant de sauvegarde",
"backup-id-note": "Il vous sera demandé par la suite pour restaurer à partir de votre sauvegarde. Alors gardez-le, avec votre mot de passe dans un endroit sûr.",
"restore-title": "Restauration",
"restore-id-label": "Identifiant de sauvegarde",
"restore-password-label": "Mot de passe",
"restore-button": "Restaurer",
"backup-error-unknown": "Impossible de traiter la demande",
"backup-error-password": "Mot de passe incorrect. Veuillez saisir votre mot de passe actuel.",
"backup-success-msg": "Sauvegarde effectuée avec succès",
"restore-success-msg": "Configuration restaurée avec succès"
}
}

View File

@@ -79,9 +79,6 @@
</template>
<script>
import hljs from 'highlight.js/lib/core';
import yaml from 'highlight.js/lib/languages/yaml';
import 'highlight.js/styles/mono-blue.css';
import JsonToYaml from '@/utils/JsonToYaml';
import { localStorageKeys, modalNames } from '@/utils/defaults';
@@ -179,20 +176,11 @@ export default {
element.click();
document.body.removeChild(element);
},
/* Highlights the YAML config in View config tab */
initiateStntaxHighlighter() {
hljs.registerLanguage('yaml', yaml);
const highlighted = hljs.highlight(this.jsonParser(this.config), { language: 'yaml' }).value;
document.getElementById('conf-yaml').innerHTML = highlighted;
},
getLanguage() {
const lang = getUsersLanguage();
return lang ? `${lang.flag} ${lang.name}` : '';
},
},
mounted() {
this.initiateStntaxHighlighter();
},
};
</script>

View File

@@ -4,7 +4,6 @@
<v-jsoneditor
v-model="jsonData"
:options="options"
height="500px"
/>
<!-- Options raido, and save button -->
<div class="save-options">
@@ -293,6 +292,10 @@ div.save-options {
}
}
.jsoneditor-container.min-box {
height: 58vh;
}
.jsoneditor, .jsoneditor-menu {
border-color: var(--primary);
}

View File

@@ -1,7 +1,7 @@
<template>
<div>
<div class="display-options">
<IconLogout @click="logout()" v-tooltip="tooltip('Sign Out')"
<IconLogout @click="logout()" v-tooltip="tooltip($t('settings.sign-out-tooltip'))"
class="layout-icon" tabindex="-2" />
</div>
</div>
@@ -19,7 +19,7 @@ export default {
methods: {
logout() {
registerLogout();
this.$toasted.show('Logged Out');
this.$toasted.show(this.$t('login.logout-message'));
setTimeout(() => {
location.reload(true); // eslint-disable-line no-restricted-globals
}, 500);

View File

@@ -4,7 +4,7 @@
<span>{{ $t('settings.config-launcher-label') }}</span>
<div class="config-buttons">
<IconSpanner @click="showEditor()" tabindex="-2"
v-tooltip="tooltip('Update configuration')" />
v-tooltip="tooltip($t('settings.config-launcher-tooltip'))" />
</div>
<!-- Modal containing all the configuration options -->
@@ -73,6 +73,7 @@ export default {
display: flex;
flex-direction: column;
color: var(--settings-text-color);
min-width: 3.2rem;
svg {
path {
fill: var(--settings-text-color);

View File

@@ -37,7 +37,6 @@ import ItemSizeSelector from '@/components/Settings/ItemSizeSelector';
import AppButtons from '@/components/Settings/AppButtons';
import KeyboardShortcutInfo from '@/components/Settings/KeyboardShortcutInfo';
import AppInfoModal from '@/components/Configuration/AppInfoModal';
import { logout as registerLogout } from '@/utils/Auth';
import IconOpen from '@/assets/interface-icons/config-open-settings.svg';
import IconClose from '@/assets/interface-icons/config-close.svg';
import {
@@ -88,13 +87,6 @@ export default {
getInitialTheme() {
return this.appConfig.theme || '';
},
logout() {
registerLogout();
this.$toasted.show('Logged Out');
setTimeout(() => {
location.reload(true); // eslint-disable-line no-restricted-globals
}, 100);
},
isUserLoggedIn() {
return !!localStorage[localStorageKeys.USERNAME];
},
@@ -199,25 +191,6 @@ export default {
}
}
svg.logout-icon {
path {
fill: var(--settings-text-color);
}
width: 1rem;
height: 1rem;
margin: 0.35rem 0.2rem;
padding: 0.2rem;
text-align: center;
background: var(--background);
border: 1px solid var(--settings-text-color);;
border-radius: var(--curve-factor);
cursor: pointer;
&:hover, &.selected {
background: var(--settings-text-color);
path { fill: var(--background); }
}
}
@include tablet {
section {
display: block;

View File

@@ -126,6 +126,7 @@ export default {
<style lang="scss">
@import 'vue-select/src/scss/vue-select.scss';
@import '@/styles/style-helpers.scss';
.theme-dropdown {
div.vs__dropdown-toggle {
@@ -146,10 +147,13 @@ export default {
}
ul.vs__dropdown-menu {
width: auto;
background: var(--background);
z-index: 5;
max-width: 13rem;
overflow-x: hidden;
@extend .scroll-bar;
background: var(--background);
border-radius: var(--curve-factor);
border-top: 1px solid var(--settings-text-color);
}
li.vs__dropdown-option--highlight {
background: var(--settings-text-color);

View File

@@ -498,7 +498,7 @@ html[data-theme='material'] {
--nav-link-border-color: #0c4eba;
--settings-text-color: #363636;
--config-code-color: #363636;
--config-settings-background: #fff;
--config-settings-background: #f5f5f5;
--config-settings-color: #473f3f;
--heading-text-color: #fff;
--curve-factor: 4px;
@@ -508,6 +508,11 @@ html[data-theme='material'] {
--footer-text-color: #f5f5f5cc;
// --login-form-background-secondary: #f5f5f5cc;
--context-menu-secondary-color: #f5f5f5;
--transparent-white-50: #00000080;
div.jsoneditor div.jsoneditor-menu {
background: #5c90eb !important;
}
header {
background: #4285f4;

View File

@@ -43,24 +43,24 @@ export const isLoggedIn = (users) => {
* @param {String[]} users An array of valid user objects
* @returns {Object} An object containing a boolean result and a message
*/
export const checkCredentials = (username, pass, users) => {
let response;
export const checkCredentials = (username, pass, users, messages) => {
let response; // Will store an object containing boolean and message
if (!username) {
response = { correct: false, msg: 'Missing Username' };
response = { correct: false, msg: messages.missingUsername };
} else if (!pass) {
response = { correct: false, msg: 'Missing Password' };
response = { correct: false, msg: messages.missingPassword };
} else {
users.forEach((user) => {
if (user.user.toLowerCase() === username.toLowerCase()) {
if (user.user.toLowerCase() === username.toLowerCase()) { // User found
if (user.hash.toLowerCase() === sha256(pass).toString().toLowerCase()) {
response = { correct: true, msg: 'Logging in...' };
} else {
response = { correct: false, msg: 'Incorrect Password' };
response = { correct: true, msg: messages.successMsg }; // Password is correct
} else { // User found, but password is not a match
response = { correct: false, msg: messages.incorrectPassword };
}
}
});
}
return response || { correct: false, msg: 'User not found' };
return response || { correct: false, msg: messages.incorrectUsername };
};
/**

View File

@@ -2,6 +2,7 @@
import en from '@/assets/locales/en.json';
import de from '@/assets/locales/de.json';
import nl from '@/assets/locales/nl.json';
import fr from '@/assets/locales/fr.json';
// Language data - Add your country name, locale code and imported file here
export const languages = [
@@ -23,6 +24,12 @@ export const languages = [
locale: nl,
flag: '🇳🇱',
},
{
name: 'French',
code: 'fr',
locale: fr,
flag: '🇲🇫',
},
// Including:
// name - Human readable name for your language (e.g German)
// code - ISO language code (e.g. de)

View File

@@ -218,7 +218,7 @@ export default {
padding-bottom: 1px;
background: var(--background);
// min-height: calc(100vh - 126px);
min-height: calc(100vh - var(--footer-height));
min-height: calc(99.9vh - var(--footer-height));
}
/* Outside container wrapping the item groups*/

View File

@@ -40,6 +40,10 @@ import { checkCredentials, login } from '@/utils/Auth';
export default {
name: 'login',
components: {
Button,
Input,
},
props: {
appConfig: Object,
},
@@ -50,23 +54,41 @@ export default {
message: '',
status: 'waiting', // wating, error, success
timeout: { label: this.$t('login.remember-me-never'), time: 0 },
dropDownMenu: [ // Data for timeout dropdown menu, translated label + value in ms
};
},
computed: {
/* Data for timeout dropdown menu, translated label + value in ms */
dropDownMenu() {
return [
{ label: this.$t('login.remember-me-never'), time: 0 },
{ label: this.$t('login.remember-me-hour'), time: 14400 * 1000 },
{ label: this.$t('login.remember-me-day'), time: 86400 * 1000 },
{ label: this.$t('login.remember-me-week'), time: 604800 * 1000 },
],
};
},
components: {
Button,
Input,
];
},
/* Translations for login response messages */
responseMessages() {
return {
missingUsername: this.$t('login.error-missing-username'),
missingPassword: this.$t('login.error-missing-password'),
incorrectUsername: this.$t('login.error-incorrect-username'),
incorrectPassword: this.$t('login.error-incorrect-password'),
successMsg: this.$t('login.success-message'),
};
},
},
methods: {
/* Checks form is filled in, then initiates the login, and redirects to /home */
submitLogin() {
// Use selected timeout, if available,else revedrt to zero
const timeout = this.timeout ? this.timeout.time : 0;
const response = checkCredentials(this.username, this.password, this.appConfig.auth || []);
// Check users credentials
const response = checkCredentials(
this.username,
this.password,
this.appConfig.auth || [], // All users
this.responseMessages, // Translated response messages
);
this.message = response.msg; // Show error or success message to the user
this.status = response.correct ? 'success' : 'error';
if (response.correct) { // Yay, credentials were correct :)
@@ -76,7 +98,7 @@ export default {
}, 250);
}
},
/* Since we don't have the Theme setter at this point, we must manually set users theme */
/* Since Theme setter isn't loaded at this point, we must manually get and apply users theme */
setTheme() {
const theme = localStorage[localStorageKeys.THEME] || Defaults.theme;
document.getElementsByTagName('html')[0].setAttribute('data-theme', theme);