diff --git a/client/src/components/common/AdministrationModal/UsersPane/UsersPane.jsx b/client/src/components/common/AdministrationModal/UsersPane/UsersPane.jsx index b8ce043d..c9a67af9 100755 --- a/client/src/components/common/AdministrationModal/UsersPane/UsersPane.jsx +++ b/client/src/components/common/AdministrationModal/UsersPane/UsersPane.jsx @@ -1,3 +1,8 @@ +/*! + * Copyright (c) 2024 PLANKA Software GmbH + * Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md + */ + import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useSelector } from 'react-redux'; import { useTranslation } from 'react-i18next'; diff --git a/client/src/components/common/GhostError/GhostError.jsx b/client/src/components/common/GhostError/GhostError.jsx new file mode 100644 index 00000000..b0c58d46 --- /dev/null +++ b/client/src/components/common/GhostError/GhostError.jsx @@ -0,0 +1,134 @@ +/*! + * Copyright (c) 2024 PLANKA Software GmbH + * Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md + */ + +import React, { useCallback, useEffect, useRef } from 'react'; +import PropTypes from 'prop-types'; +import { useTranslation } from 'react-i18next'; +import { Button, Icon } from 'semantic-ui-react'; + +import history from '../../../history'; +import Paths from '../../../constants/Paths'; + +import styles from './GhostError.module.scss'; + +const GhostError = React.memo(({ message }) => { + const [t] = useTranslation(); + + const eyesRef = useRef(null); + + const handleBackClick = useCallback(() => { + history.back(); + }, []); + + const handleHomeClick = useCallback(() => { + history.push(Paths.ROOT); + }, []); + + useEffect(() => { + let pageX = document.documentElement.clientWidth; + let pageY = document.documentElement.clientHeight; + + const handleMouseMove = (event) => { + if (!eyesRef.current) { + return; + } + + // Vertical axis + const mouseY = event.pageY; + const yAxis = ((pageY / 2 - mouseY) / pageY) * -300; + + // Horizontal axis + const mouseX = event.pageX / -pageX; + const xAxis = -mouseX * 100 - 100; + + // Apply transform to eyes + eyesRef.current.style.transform = `translate(${xAxis}%, ${yAxis}%)`; + }; + + const handleResize = () => { + pageX = document.documentElement.clientWidth; + pageY = document.documentElement.clientHeight; + }; + + document.addEventListener('mousemove', handleMouseMove); + window.addEventListener('resize', handleResize); + + return () => { + document.removeEventListener('mousemove', handleMouseMove); + window.removeEventListener('resize', handleResize); + }; + }, []); + + return ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ {t('common.whoops', { + context: 'title', + })} +

+
+ {t(message, { + context: 'title', + })} +
+ {window.history.length > 1 && ( + + )} + +
+
+ ); +}); + +GhostError.propTypes = { + message: PropTypes.string, +}; + +GhostError.defaultProps = { + message: 'common.pageNotFound', +}; + +export default GhostError; diff --git a/client/src/components/common/GhostError/GhostError.module.scss b/client/src/components/common/GhostError/GhostError.module.scss new file mode 100644 index 00000000..261e17db --- /dev/null +++ b/client/src/components/common/GhostError/GhostError.module.scss @@ -0,0 +1,298 @@ +/*! + * Copyright (c) 2024 PLANKA Software GmbH + * Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md + */ + +:global(#app) { + .bottom { + display: flex; + left: 0; + position: absolute; + right: 0; + top: 100%; + + div { + background-color: #fff; + border-radius: 100%; + flex-grow: 1; + height: 20px; + position: relative; + top: -10px; + + &:nth-child(2n) { + background: transparent; + border-top: 15px solid #22252a; + top: -12px; + } + } + } + + .button { + padding: 0.78571429em 1.5em 0.78571429em; + } + + .eyeLeft { + background: #22252a; + border-radius: 50%; + height: 12px; + left: 10px; + position: absolute; + width: 12px; + } + + .eyeRight { + background: #22252a; + border-radius: 50%; + height: 12px; + position: absolute; + right: 10px; + width: 12px; + } + + .eyes { + height: 12px; + left: 50%; + position: absolute; + top: 45%; + transform: translateX(-50%); + width: 70px; + } + + .ghost { + animation: upndown 3s ease-in-out infinite; + background: #fff; + border-radius: 100px 100px 0 0; + height: 100px; + margin: 0 auto 20px; + position: relative; + width: 100px; + z-index: 1; + } + + .message { + max-width: 400px; + text-align: center; + z-index: 1; + } + + .shadow { + animation: smallnbig 3s ease-in-out infinite; + background: #000; + border-radius: 50%; + height: 20px; + margin: 0 auto 30px; + width: 80px; + } + + .symbol { + &:nth-child(1) { + animation: shine 4s ease-in-out 3s infinite; + left: 20px; + opacity: 0.3; + position: absolute; + top: 20px; + + &:before, + &:after { + background: #6b808c; + border-radius: 3px; + content: ""; + height: 3px; + position: absolute; + width: 8px; + } + + &:before { + transform: rotate(45deg); + } + + &:after { + transform: rotate(-45deg); + } + } + + &:nth-child(2) { + animation: shine 4s ease-in-out 1.3s infinite; + border: 2px solid; + border-color: #6b808c; + border-radius: 50%; + height: 12px; + opacity: 0.3; + position: absolute; + right: 30px; + top: 40px; + width: 12px; + } + + &:nth-child(3) { + animation: shine 3s ease-in-out 0.5s infinite; + bottom: 30px; + left: 30px; + opacity: 0.3; + position: absolute; + + &:before, + &:after { + background: #6b808c; + border-radius: 3px; + content: ""; + height: 3px; + position: absolute; + width: 8px; + } + + &:before { + transform: rotate(90deg); + } + + &:after { + transform: rotate(180deg); + } + } + + &:nth-child(4) { + animation: shine 6s ease-in-out 1.6s infinite; + opacity: 0.3; + position: absolute; + right: 30px; + top: 10px; + + &:before, + &:after { + background: #6b808c; + border-radius: 3px; + content: ""; + height: 3px; + position: absolute; + width: 10px; + } + + &:before { + transform: rotate(45deg); + } + + &:after { + transform: rotate(-45deg); + } + } + + &:nth-child(5) { + animation: shine 1.7s ease-in-out 7s infinite; + border: 2px solid; + border-color: #6b808c; + border-radius: 50%; + height: 8px; + opacity: 0.3; + position: absolute; + right: 5px; + top: 60px; + width: 8px; + } + + &:nth-child(6) { + animation: shine 2s ease-in-out 6s infinite; + bottom: 10px; + opacity: 0.3; + position: absolute; + right: 10px; + + &:before, + &:after { + background: #6b808c; + border-radius: 3px; + content: ""; + height: 3px; + position: absolute; + width: 10px; + } + + &:before { + transform: rotate(90deg); + } + + &:after { + transform: rotate(180deg); + } + } + } + + .symbols { + height: 200px; + left: 50%; + position: absolute; + top: 50%; + transform: translate(-50%, -50%); + width: 200px; + } + + .text { + color: #6b808c; + font-size: 18px; + line-height: 1.4; + margin-bottom: 30px; + } + + .title { + font-size: 32px; + letter-spacing: 0.5px; + } + + .wrapper { + align-items: center; + color: #fff; + display: flex; + flex-direction: column; + height: 100%; + justify-content: center; + min-height: 60vh; + padding: 40px 20px; + position: relative; + width: 100%; + } + + @keyframes shine { + 0% { + opacity: 0.3; + } + + 25% { + opacity: 0.1; + } + + 50% { + opacity: 0.3; + } + + 100% { + opacity: 0.3; + } + } + + @keyframes smallnbig { + 0% { + width: 80px; + } + + 50% { + width: 90px; + } + + 100% { + width: 80px; + } + } + + @keyframes upndown { + 0% { + transform: translateY(5px); + } + + 50% { + transform: translateY(15px); + } + + 100% { + transform: translateY(5px); + } + } +} diff --git a/client/src/components/common/GhostError/index.js b/client/src/components/common/GhostError/index.js new file mode 100644 index 00000000..5b81eff0 --- /dev/null +++ b/client/src/components/common/GhostError/index.js @@ -0,0 +1,8 @@ +/*! + * Copyright (c) 2024 PLANKA Software GmbH + * Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md + */ + +import GhostError from './GhostError'; + +export default GhostError; diff --git a/client/src/components/common/NotFound.jsx b/client/src/components/common/NotFound.jsx deleted file mode 100755 index 63eeff8c..00000000 --- a/client/src/components/common/NotFound.jsx +++ /dev/null @@ -1,21 +0,0 @@ -/*! - * Copyright (c) 2024 PLANKA Software GmbH - * Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md - */ - -import React from 'react'; -import { useTranslation } from 'react-i18next'; - -const NotFound = React.memo(() => { - const [t] = useTranslation(); - - return ( -

- {t('common.pageNotFound', { - context: 'title', - })} -

- ); -}); - -export default NotFound; diff --git a/client/src/components/common/Root.jsx b/client/src/components/common/Root.jsx index 03ea0e0f..4c857d4d 100755 --- a/client/src/components/common/Root.jsx +++ b/client/src/components/common/Root.jsx @@ -15,7 +15,7 @@ import { ReduxRouter } from '../../lib/redux-router'; import Paths from '../../constants/Paths'; import Login from './Login'; import Core from './Core'; -import NotFound from './NotFound'; +import GhostError from './GhostError'; import 'react-datepicker/dist/react-datepicker.css'; import 'photoswipe/dist/photoswipe.css'; @@ -37,7 +37,7 @@ function Root({ store, history }) { } /> } /> } /> - } /> + } /> diff --git a/client/src/components/common/Static/Static.jsx b/client/src/components/common/Static/Static.jsx index 235d790d..42429b1a 100644 --- a/client/src/components/common/Static/Static.jsx +++ b/client/src/components/common/Static/Static.jsx @@ -13,6 +13,7 @@ import { useTransitioning } from '../../../lib/hooks'; import selectors from '../../../selectors'; import { BoardViews } from '../../../constants/Enums'; import Home from '../Home'; +import GhostError from '../GhostError'; import Board from '../../boards/Board'; import styles from './Static.module.scss'; @@ -42,40 +43,13 @@ const Static = React.memo(() => { contentNode = ; } else if (cardId === null) { wrapperClassNames = [isFavoritesActive && styles.wrapperWithFavorites, styles.wrapperFlex]; - - contentNode = ( -
-

- {t('common.cardNotFound', { - context: 'title', - })} -

-
- ); + contentNode = ; } else if (board === null) { wrapperClassNames = [isFavoritesActive && styles.wrapperWithFavorites, styles.wrapperFlex]; - - contentNode = ( -
-

- {t('common.boardNotFound', { - context: 'title', - })} -

-
- ); + contentNode = ; } else if (projectId === null) { wrapperClassNames = [isFavoritesActive && styles.wrapperWithFavorites, styles.wrapperFlex]; - - contentNode = ( -
-

- {t('common.projectNotFound', { - context: 'title', - })} -

-
- ); + contentNode = ; } else if (board === undefined) { wrapperClassNames = [ isFavoritesActive ? styles.wrapperProjectWithFavorites : styles.wrapperProject, diff --git a/client/src/locales/ar-YE/login.js b/client/src/locales/ar-YE/login.js index 2227de53..e7464f4d 100644 --- a/client/src/locales/ar-YE/login.js +++ b/client/src/locales/ar-YE/login.js @@ -19,11 +19,14 @@ export default { unknownError: 'خطأ غير معروف، يرجى المحاولة لاحقاً', useSingleSignOn: 'استخدم تسجيل الدخول الموحد', usernameAlreadyInUse: 'اسم المستخدم تم استخدامه بالفعل', + whoops_title: 'عفواً!', }, action: { cancelAndClose: 'إلغاء وإغلاق', continue: 'متابعة', + goBack: 'العودة', + goHome: 'الذهاب للرئيسية', logIn: 'تسجيل الدخول', logInWithSso: 'تسجيل الدخول باستخدام SSO', }, diff --git a/client/src/locales/bg-BG/login.js b/client/src/locales/bg-BG/login.js index ad7390ae..5a95581d 100644 --- a/client/src/locales/bg-BG/login.js +++ b/client/src/locales/bg-BG/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Неизвестна грешка, опитайте отново по-късно', useSingleSignOn: 'Използване на single sign-on', usernameAlreadyInUse: 'Потребителското име вече се използва', + whoops_title: 'Опа!', }, action: { cancelAndClose: 'Отказ и затваряне', continue: 'Продължи', + goBack: 'Назад', + goHome: 'Към началото', logIn: 'Вход', logInWithSso: 'Вход чрез SSO', }, diff --git a/client/src/locales/cs-CZ/login.js b/client/src/locales/cs-CZ/login.js index cbaba70f..b737bc33 100644 --- a/client/src/locales/cs-CZ/login.js +++ b/client/src/locales/cs-CZ/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Neznámá chyba, zkuste to později', useSingleSignOn: 'Použít jednorázové přihlášení', usernameAlreadyInUse: 'Uživatelské jméno se již používá', + whoops_title: 'Jejda!', }, action: { cancelAndClose: 'Zrušit a zavřít', continue: 'Pokračovat', + goBack: 'Zpět', + goHome: 'Domů', logIn: 'Přihlásit se', logInWithSso: 'Přihlásit se pomocí SSO', }, diff --git a/client/src/locales/da-DK/login.js b/client/src/locales/da-DK/login.js index ddb730ab..87aa00f5 100644 --- a/client/src/locales/da-DK/login.js +++ b/client/src/locales/da-DK/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Ukendt fejl - prøv igen', useSingleSignOn: 'Anvend single sign-on', usernameAlreadyInUse: 'Brugernavn allerede i brug', + whoops_title: 'Ups!', }, action: { cancelAndClose: 'Annuller og luk', continue: 'Fortsæt', + goBack: 'Gå tilbage', + goHome: 'Gå hjem', logIn: 'Log på', logInWithSso: 'Log på med SSO', }, diff --git a/client/src/locales/de-DE/login.js b/client/src/locales/de-DE/login.js index 9f076374..5d7d73b0 100644 --- a/client/src/locales/de-DE/login.js +++ b/client/src/locales/de-DE/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Unbekannter Fehler, bitte später erneut versuchen', useSingleSignOn: 'Einmalige Anmeldung (SSO) verwenden', usernameAlreadyInUse: 'Benutzername wird bereits verwendet', + whoops_title: 'Hoppla!', }, action: { cancelAndClose: 'Abbrechen und schließen', continue: 'Fortfahren', + goBack: 'Zurück gehen', + goHome: 'Zur Startseite', logIn: 'Einloggen', logInWithSso: 'Einloggen mit SSO', }, diff --git a/client/src/locales/el-GR/login.js b/client/src/locales/el-GR/login.js index a51cf168..e18ccad9 100644 --- a/client/src/locales/el-GR/login.js +++ b/client/src/locales/el-GR/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Άγνωστο σφάλμα, δοκιμάστε ξανά αργότερα', useSingleSignOn: 'Χρήση Single Sign-On', usernameAlreadyInUse: 'Το όνομα χρήστη χρησιμοποιείται ήδη', + whoops_title: 'Ωχ!', }, action: { cancelAndClose: 'Ακύρωση και κλείσιμο', continue: 'Συνέχεια', + goBack: 'Επιστροφή', + goHome: 'Αρχική σελίδα', logIn: 'Σύνδεση', logInWithSso: 'Σύνδεση με SSO', }, diff --git a/client/src/locales/en-GB/login.js b/client/src/locales/en-GB/login.js index 919c402f..81206524 100644 --- a/client/src/locales/en-GB/login.js +++ b/client/src/locales/en-GB/login.js @@ -19,11 +19,14 @@ export default { unknownError: 'Unknown error, try again later', useSingleSignOn: 'Use single sign-on', usernameAlreadyInUse: 'Username already in use', + whoops_title: 'Whoops!', }, action: { cancelAndClose: 'Cancel and close', continue: 'Continue', + goBack: 'Go back', + goHome: 'Go home', logIn: 'Log in', logInWithSso: 'Log in with SSO', }, diff --git a/client/src/locales/en-US/login.js b/client/src/locales/en-US/login.js index 919c402f..81206524 100644 --- a/client/src/locales/en-US/login.js +++ b/client/src/locales/en-US/login.js @@ -19,11 +19,14 @@ export default { unknownError: 'Unknown error, try again later', useSingleSignOn: 'Use single sign-on', usernameAlreadyInUse: 'Username already in use', + whoops_title: 'Whoops!', }, action: { cancelAndClose: 'Cancel and close', continue: 'Continue', + goBack: 'Go back', + goHome: 'Go home', logIn: 'Log in', logInWithSso: 'Log in with SSO', }, diff --git a/client/src/locales/es-ES/login.js b/client/src/locales/es-ES/login.js index b7a0587b..d07d65b1 100644 --- a/client/src/locales/es-ES/login.js +++ b/client/src/locales/es-ES/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Error desconocido, inténtalo más tarde', useSingleSignOn: 'Usar inicio de sesión único', usernameAlreadyInUse: 'Nombre de usuario ya en uso', + whoops_title: '¡Ups!', }, action: { cancelAndClose: 'Cancelar y cerrar', continue: 'Continuar', + goBack: 'Volver', + goHome: 'Ir al inicio', logIn: 'Iniciar sesión', logInWithSso: 'Iniciar sesión con SSO', }, diff --git a/client/src/locales/et-EE/login.js b/client/src/locales/et-EE/login.js index d93c7eb5..7128832e 100644 --- a/client/src/locales/et-EE/login.js +++ b/client/src/locales/et-EE/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Tundmatu viga, proovi hiljem uuesti', useSingleSignOn: 'Kasuta ühekordset sisselogimist', usernameAlreadyInUse: 'Kasutajanimi on juba kasutusel', + whoops_title: 'Ups!', }, action: { cancelAndClose: 'Tühista ja sulge', continue: 'Jätka', + goBack: 'Tagasi', + goHome: 'Koju', logIn: 'Logi sisse', logInWithSso: 'Logi sisse SSO-ga', }, diff --git a/client/src/locales/fa-IR/login.js b/client/src/locales/fa-IR/login.js index 8ab8abde..ce39d0eb 100644 --- a/client/src/locales/fa-IR/login.js +++ b/client/src/locales/fa-IR/login.js @@ -19,11 +19,14 @@ export default { unknownError: 'خطای ناشناخته، بعداً دوباره تلاش کنید', useSingleSignOn: 'استفاده از ورود یکپارچه', usernameAlreadyInUse: 'نام کاربری قبلا استفاده شده است', + whoops_title: 'اوه!', }, action: { cancelAndClose: 'لغو و بستن', continue: 'ادامه', + goBack: 'بازگشت', + goHome: 'رفتن به خانه', logIn: 'ورود', logInWithSso: 'ورود با SSO', }, diff --git a/client/src/locales/fi-FI/login.js b/client/src/locales/fi-FI/login.js index 52c38b03..5c69248c 100644 --- a/client/src/locales/fi-FI/login.js +++ b/client/src/locales/fi-FI/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Tuntematon virhe, yritä myöhemmin uudelleen', useSingleSignOn: 'Käytä kertakirjautumista', usernameAlreadyInUse: 'Käyttäjänimi on jo käytössä', + whoops_title: 'Hups!', }, action: { cancelAndClose: 'Peruuta ja sulje', continue: 'Jatka', + goBack: 'Takaisin', + goHome: 'Kotiin', logIn: 'Kirjaudu sisään', logInWithSso: 'Kirjaudu SSO:lla', }, diff --git a/client/src/locales/fr-FR/login.js b/client/src/locales/fr-FR/login.js index 44ed9aa4..a4410062 100644 --- a/client/src/locales/fr-FR/login.js +++ b/client/src/locales/fr-FR/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Erreur inconnue, réessayez plus tard', useSingleSignOn: "Utiliser l'authentification unique", usernameAlreadyInUse: "Nom d'utilisateur déjà utilisé", + whoops_title: 'Oups !', }, action: { cancelAndClose: 'Annuler et fermer', continue: 'Continuer', + goBack: 'Retour', + goHome: "Aller à l'accueil", logIn: 'Se connecter', logInWithSso: "Se connecter avec l'authentification unique", }, diff --git a/client/src/locales/hu-HU/login.js b/client/src/locales/hu-HU/login.js index ace09755..da81a03d 100644 --- a/client/src/locales/hu-HU/login.js +++ b/client/src/locales/hu-HU/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Ismeretlen hiba, próbáld meg később újra', useSingleSignOn: 'Egyszeri bejelentkezés használata', usernameAlreadyInUse: 'A felhasználónév már használatban van', + whoops_title: 'Hoppá!', }, action: { cancelAndClose: 'Mégse és bezárás', continue: 'Folytatás', + goBack: 'Vissza', + goHome: 'Kezdőlapra', logIn: 'Belépés', logInWithSso: 'Belépés SSO-val', }, diff --git a/client/src/locales/id-ID/login.js b/client/src/locales/id-ID/login.js index aa9bb395..032a75f5 100644 --- a/client/src/locales/id-ID/login.js +++ b/client/src/locales/id-ID/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Kesalahan tidak diketahui, coba lagi nanti.', useSingleSignOn: 'Gunakan single sign-on', usernameAlreadyInUse: 'Username telah digunakan', + whoops_title: 'Ups!', }, action: { cancelAndClose: 'Batal dan tutup', continue: 'Lanjutkan', + goBack: 'Kembali', + goHome: 'Ke beranda', logIn: 'Masuk', logInWithSso: 'Masuk dengan SSO', }, diff --git a/client/src/locales/it-IT/login.js b/client/src/locales/it-IT/login.js index 615ad7c1..608a7b14 100644 --- a/client/src/locales/it-IT/login.js +++ b/client/src/locales/it-IT/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Errore sconosciuto, prova ancora', useSingleSignOn: 'Accedi con SSO', usernameAlreadyInUse: 'Username già in uso', + whoops_title: 'Ops!', }, action: { cancelAndClose: 'Annulla e chiudi', continue: 'Continua', + goBack: 'Torna indietro', + goHome: 'Vai alla home', logIn: 'Accedi', logInWithSso: 'Accedi con SSO', }, diff --git a/client/src/locales/ja-JP/login.js b/client/src/locales/ja-JP/login.js index 7861fc21..efc4824a 100644 --- a/client/src/locales/ja-JP/login.js +++ b/client/src/locales/ja-JP/login.js @@ -20,11 +20,14 @@ export default { unknownError: '不明なエラーです。後でもう一度試してください。', useSingleSignOn: 'SSOを使用', usernameAlreadyInUse: 'ユーザー名は既に使われています', + whoops_title: 'おっと!', }, action: { cancelAndClose: 'キャンセルして閉じる', continue: '続行', + goBack: '戻る', + goHome: 'ホームへ', logIn: 'ログイン', logInWithSso: 'SSOでログイン', }, diff --git a/client/src/locales/ko-KR/login.js b/client/src/locales/ko-KR/login.js index 222d22c7..1e63164c 100644 --- a/client/src/locales/ko-KR/login.js +++ b/client/src/locales/ko-KR/login.js @@ -19,11 +19,14 @@ export default { unknownError: '알 수 없는 오류, 나중에 다시 시도하세요', useSingleSignOn: 'Single Sign-On(SSO) 사용', usernameAlreadyInUse: '이미 사용 중인 사용자 이름', + whoops_title: '앗!', }, action: { cancelAndClose: '취소 후 닫기', continue: '계속', + goBack: '뒤로 가기', + goHome: '홈으로 가기', logIn: '로그인', logInWithSso: 'SSO로 로그인', }, diff --git a/client/src/locales/nl-NL/login.js b/client/src/locales/nl-NL/login.js index ad164ab5..e36c19b2 100644 --- a/client/src/locales/nl-NL/login.js +++ b/client/src/locales/nl-NL/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Onbekende fout, probeer het later opnieuw', useSingleSignOn: 'Gebruik single sign-on', usernameAlreadyInUse: 'Gebruikersnaam is al in gebruik', + whoops_title: 'Oeps!', }, action: { cancelAndClose: 'Annuleren en sluiten', continue: 'Doorgaan', + goBack: 'Terug gaan', + goHome: 'Naar startpagina', logIn: 'Inloggen', logInWithSso: 'Inloggen met SSO', }, diff --git a/client/src/locales/pl-PL/login.js b/client/src/locales/pl-PL/login.js index 2b99db1f..4b4d4bc1 100644 --- a/client/src/locales/pl-PL/login.js +++ b/client/src/locales/pl-PL/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Nieznany błąd, spróbuj ponownie później', useSingleSignOn: 'Użyj logowania SSO', usernameAlreadyInUse: 'Nazwa użytkownika nie jest dostępna', + whoops_title: 'Ups!', }, action: { cancelAndClose: 'Anuluj i zamknij', continue: 'Kontynuuj', + goBack: 'Wróć', + goHome: 'Idź do domu', logIn: 'Zaloguj', logInWithSso: 'Zaloguj z SSO', }, diff --git a/client/src/locales/pt-BR/login.js b/client/src/locales/pt-BR/login.js index 99430df2..effbc3b0 100644 --- a/client/src/locales/pt-BR/login.js +++ b/client/src/locales/pt-BR/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Erro desconhecido, tente novamente mais tarde', useSingleSignOn: 'Usar login único', usernameAlreadyInUse: 'Nome de usuário já está em uso', + whoops_title: 'Ops!', }, action: { cancelAndClose: 'Cancelar e fechar', continue: 'Continuar', + goBack: 'Voltar', + goHome: 'Ir para início', logIn: 'Entrar', logInWithSso: 'Entrar com SSO', }, diff --git a/client/src/locales/pt-PT/login.js b/client/src/locales/pt-PT/login.js index 3921e4eb..98c64ae1 100644 --- a/client/src/locales/pt-PT/login.js +++ b/client/src/locales/pt-PT/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Erro desconhecido, tente novamente mais tarde', useSingleSignOn: 'Utilizar início de sessão único', usernameAlreadyInUse: 'Nome de utilizador já está em uso', + whoops_title: 'Ups!', }, action: { cancelAndClose: 'Cancelar e fechar', continue: 'Continuar', + goBack: 'Voltar', + goHome: 'Ir para início', logIn: 'Iniciar sessão', logInWithSso: 'Iniciar sessão com SSO', }, diff --git a/client/src/locales/ro-RO/login.js b/client/src/locales/ro-RO/login.js index 840c40cc..c18721fc 100644 --- a/client/src/locales/ro-RO/login.js +++ b/client/src/locales/ro-RO/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Eroarea necunoscuta, mai incercați', useSingleSignOn: 'Folosiți autentificarea unica', usernameAlreadyInUse: 'Nume utilizator deja exista', + whoops_title: 'Ups!', }, action: { cancelAndClose: 'Anulează și închide', continue: 'Continuă', + goBack: 'Înapoi', + goHome: 'Acasă', logIn: 'Autentificarea', logInWithSso: 'Autentificarea cu SSO', }, diff --git a/client/src/locales/ru-RU/login.js b/client/src/locales/ru-RU/login.js index e8ff5992..0d1cb159 100644 --- a/client/src/locales/ru-RU/login.js +++ b/client/src/locales/ru-RU/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Что-то пошло не так, попробуйте позже', useSingleSignOn: 'Используйте единый вход', usernameAlreadyInUse: 'Имя пользователя уже занято', + whoops_title: 'Упс!', }, action: { cancelAndClose: 'Отменить и закрыть', continue: 'Продолжить', + goBack: 'Назад', + goHome: 'На главную', logIn: 'Войти', logInWithSso: 'Войти с помощью единого входа', }, diff --git a/client/src/locales/sk-SK/login.js b/client/src/locales/sk-SK/login.js index d4958fa4..7a91103d 100644 --- a/client/src/locales/sk-SK/login.js +++ b/client/src/locales/sk-SK/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Neznáma chyba, skúste to neskôr', useSingleSignOn: 'Použiť jednotné prihlásenie', usernameAlreadyInUse: 'Používateľské meno je zabrané', + whoops_title: 'Ups!', }, action: { cancelAndClose: 'Zrušiť a zavrieť', continue: 'Pokračovať', + goBack: 'Ísť späť', + goHome: 'Ísť domov', logIn: 'Prihlásiť sa', logInWithSso: 'Prihlásiť sa cez SSO', }, diff --git a/client/src/locales/sr-Cyrl-RS/login.js b/client/src/locales/sr-Cyrl-RS/login.js index d948ddce..eb53fe01 100644 --- a/client/src/locales/sr-Cyrl-RS/login.js +++ b/client/src/locales/sr-Cyrl-RS/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Непозната грешка, покушајте поново касније', useSingleSignOn: 'Користи универзалну пријаву', usernameAlreadyInUse: 'Корисничко име је већ у употреби', + whoops_title: 'Упс!', }, action: { cancelAndClose: 'Откажи и затвори', continue: 'Настави', + goBack: 'Назад', + goHome: 'Иди кући', logIn: 'Пријава', logInWithSso: 'Пријава са УП', }, diff --git a/client/src/locales/sr-Latn-RS/login.js b/client/src/locales/sr-Latn-RS/login.js index 86a645d6..75e2ee86 100644 --- a/client/src/locales/sr-Latn-RS/login.js +++ b/client/src/locales/sr-Latn-RS/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Nepoznata greška, pokušajte ponovo kasnije', useSingleSignOn: 'Koristi univerzalnu prijavu', usernameAlreadyInUse: 'Korisničko ime je već u upotrebi', + whoops_title: 'Ups!', }, action: { cancelAndClose: 'Otkaži i zatvori', continue: 'Nastavi', + goBack: 'Nazad', + goHome: 'Idi kući', logIn: 'Prijava', logInWithSso: 'Prijava sa UP', }, diff --git a/client/src/locales/sv-SE/login.js b/client/src/locales/sv-SE/login.js index b3ba95e5..58743087 100644 --- a/client/src/locales/sv-SE/login.js +++ b/client/src/locales/sv-SE/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Okänt fel, försök igen senare', useSingleSignOn: 'Använd enkel inloggning', usernameAlreadyInUse: 'Användarnamnet används redan', + whoops_title: 'Hoppsan!', }, action: { cancelAndClose: 'Avbryt och stäng', continue: 'Fortsätt', + goBack: 'Gå tillbaka', + goHome: 'Gå hem', logIn: 'Logga in', logInWithSso: 'Logga in med SSO', }, diff --git a/client/src/locales/tr-TR/login.js b/client/src/locales/tr-TR/login.js index 3eb83bb2..2c78dd41 100644 --- a/client/src/locales/tr-TR/login.js +++ b/client/src/locales/tr-TR/login.js @@ -19,11 +19,14 @@ export default { unknownError: 'Bilinmeyen hata, daha sonra tekrar deneyin', useSingleSignOn: 'Tek oturum açma kullan', usernameAlreadyInUse: 'Kullanıcı adı zaten kullanımda', + whoops_title: 'Hata!', }, action: { cancelAndClose: 'İptal et ve kapat', continue: 'Devam et', + goBack: 'Geri dön', + goHome: 'Ana sayfaya git', logIn: 'Giriş yap', logInWithSso: 'SSO ile giriş yap', }, diff --git a/client/src/locales/uk-UA/login.js b/client/src/locales/uk-UA/login.js index 64afefb9..41ee019e 100644 --- a/client/src/locales/uk-UA/login.js +++ b/client/src/locales/uk-UA/login.js @@ -20,11 +20,14 @@ export default { unknownError: 'Невідома помилка, спробуйте ще раз пізніше', useSingleSignOn: 'Використовувати одночасний вхід', usernameAlreadyInUse: "Ім'я користувача вже використовується", + whoops_title: 'Ой!', }, action: { cancelAndClose: 'Скасувати та закрити', continue: 'Продовжити', + goBack: 'Назад', + goHome: 'На головну', logIn: 'Увійти', logInWithSso: 'Увійти за допомогою SSO', }, diff --git a/client/src/locales/uz-UZ/login.js b/client/src/locales/uz-UZ/login.js index 9ec9f600..29768cb3 100644 --- a/client/src/locales/uz-UZ/login.js +++ b/client/src/locales/uz-UZ/login.js @@ -20,11 +20,14 @@ export default { unknownError: "Noma'lum xatolik, qaytadan urinib ko'ring", useSingleSignOn: 'Yagona kirish tizimidan foydalaning', usernameAlreadyInUse: 'Foydalanuvchi nomi allaqachon mavjud', + whoops_title: 'Voy!', }, action: { cancelAndClose: 'Bekor qilish va yopish', continue: 'Davom etish', + goBack: 'Orqaga', + goHome: 'Bosh sahifaga', logIn: 'Kirish', logInWithSso: 'SSO orqali kirish', }, diff --git a/client/src/locales/zh-CN/login.js b/client/src/locales/zh-CN/login.js index 0b5c673c..8c51d33f 100644 --- a/client/src/locales/zh-CN/login.js +++ b/client/src/locales/zh-CN/login.js @@ -19,11 +19,14 @@ export default { unknownError: '未知错误,请稍后重试', useSingleSignOn: '使用单点登录', usernameAlreadyInUse: '用户名已被占用', + whoops_title: '哎呀!', }, action: { cancelAndClose: '取消并关闭', continue: '继续', + goBack: '返回', + goHome: '回到首页', logIn: '登录', logInWithSso: '使用SSO登录', }, diff --git a/client/src/locales/zh-TW/login.js b/client/src/locales/zh-TW/login.js index 9f380dc5..e8147489 100644 --- a/client/src/locales/zh-TW/login.js +++ b/client/src/locales/zh-TW/login.js @@ -19,11 +19,14 @@ export default { unknownError: '未知錯誤,請稍後重試', useSingleSignOn: '使用單一登入', usernameAlreadyInUse: '使用者名稱已被佔用', + whoops_title: '哎呀!', }, action: { cancelAndClose: '取消並關閉', continue: '繼續', + goBack: '返回', + goHome: '回到首頁', logIn: '登入', logInWithSso: '使用SSO登入', }, diff --git a/client/src/reducers/core.js b/client/src/reducers/core.js index 1c18bbeb..f0917084 100755 --- a/client/src/reducers/core.js +++ b/client/src/reducers/core.js @@ -39,8 +39,8 @@ export default (state = initialState, { type, payload }) => { const nextState = { ...state, isContentFetching: false, - boardId: payload.currentBoardId, - cardId: payload.currentCardId, + boardId: payload.currentBoardId || null, + cardId: payload.currentCardId || null, }; if (payload.currentCardId) { diff --git a/client/src/sagas/core/services/router.js b/client/src/sagas/core/services/router.js index 6f348401..a5efd858 100644 --- a/client/src/sagas/core/services/router.js +++ b/client/src/sagas/core/services/router.js @@ -47,6 +47,7 @@ export function* handleLocationChange() { const pathsMatch = yield select(selectors.selectPathsMatch); if (!pathsMatch) { + yield put(actions.handleLocationChange()); return; }