chore: Bump terms

This commit is contained in:
Maksim Eltyshev
2026-02-11 14:03:37 +01:00
parent d84b615815
commit 168776aef8
42 changed files with 456 additions and 155 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
## [2.0.0] - 2026-02-10
## [2.0.0] - 2026-02-11
### Added
@@ -3,10 +3,10 @@
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
*/
import React, { useCallback, useState } from 'react';
import React, { useCallback, useMemo, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { useTranslation } from 'react-i18next';
import { Button, Checkbox, Dropdown, Modal } from 'semantic-ui-react';
import { Button, Checkbox, Dropdown, Modal, Segment } from 'semantic-ui-react';
import selectors from '../../../selectors';
import entryActions from '../../../entry-actions';
@@ -18,6 +18,25 @@ import styles from './TermsModal.module.scss';
const LOCALES = TERMS_LANGUAGES.map((language) => localeByLanguage[language]);
const splitTermsAndConfirmations = (content) => {
const separator = '\n---\n';
const index = content.lastIndexOf(separator);
if (index === -1) {
return [content.trim(), []];
}
const terms = content.slice(0, index).trim();
const confirmations = content
.slice(index + separator.length)
.split('\n')
.map((confirmation) => confirmation.replace(/^✔️\s*/, '').replace(/\*\*(.*?)\*\*/, '$1'))
.filter(Boolean);
return [terms, confirmations];
};
const TermsModal = React.memo(() => {
const {
termsForm: { payload: terms, isSubmitting, isCancelling, isLanguageUpdating },
@@ -25,7 +44,12 @@ const TermsModal = React.memo(() => {
const dispatch = useDispatch();
const [t] = useTranslation();
const [isTermsAccepted, setIsTermsAccepted] = useState(false);
const [acceptedConfirmationsSet, setAcceptedConfirmationsSet] = useState(new Set());
const [content, confirmations] = useMemo(
() => splitTermsAndConfirmations(terms.content),
[terms.content],
);
const handleContinueClick = useCallback(() => {
dispatch(entryActions.acceptTerms(terms.signature));
@@ -42,10 +66,22 @@ const TermsModal = React.memo(() => {
[dispatch],
);
const handleToggleAcceptClick = useCallback((_, { checked }) => {
setIsTermsAccepted(checked);
const handleToggleConfirmationAccept = useCallback((index) => {
setAcceptedConfirmationsSet((prevAcceptedConfirmationsSet) => {
const nextAcceptedConfirmationsSet = new Set(prevAcceptedConfirmationsSet);
if (nextAcceptedConfirmationsSet.has(index)) {
nextAcceptedConfirmationsSet.delete(index);
} else {
nextAcceptedConfirmationsSet.add(index);
}
return nextAcceptedConfirmationsSet;
});
}, []);
const isAllConfirmationsAccepted = acceptedConfirmationsSet.size === confirmations.length;
return (
<Modal open centered={false}>
<Modal.Content>
@@ -63,7 +99,20 @@ const TermsModal = React.memo(() => {
className={styles.language}
onChange={handleLanguageChange}
/>
<Markdown>{terms.content}</Markdown>
<Markdown>{content}</Markdown>
{confirmations.length > 0 && (
<Segment size="massive" className={styles.confirmations}>
{confirmations.map((confirmation, index) => (
<Checkbox
key={confirmation}
checked={acceptedConfirmationsSet.has(index)}
label={confirmation}
className={styles.confirmationCheckbox}
onChange={() => handleToggleConfirmationAccept(index)}
/>
))}
</Segment>
)}
</Modal.Content>
<Modal.Actions>
<Button
@@ -74,15 +123,11 @@ const TermsModal = React.memo(() => {
className={styles.cancelButton}
onClick={handleCancelClick}
/>
<Checkbox
label={t('common.iHaveReadAndAgreeToTheseTerms')}
onChange={handleToggleAcceptClick}
/>
<Button
positive
content={t('action.continue')}
loading={isSubmitting}
disabled={!isTermsAccepted || isSubmitting || isCancelling}
disabled={!isAllConfirmationsAccepted || isSubmitting || isCancelling}
onClick={handleContinueClick}
/>
</Modal.Actions>
@@ -8,6 +8,19 @@
margin-left: 0;
}
.confirmations {
border-color: #5aac44;
border-width: 2px;
box-shadow: none;
display: flex;
flex-direction: column;
row-gap: 12px;
}
.confirmationCheckbox {
font-weight: bold;
}
.language {
margin-bottom: 20px;
}
-1
View File
@@ -5,7 +5,6 @@ export default {
adminLoginRequiredToInitializeInstance: 'مطلوب تسجيل دخول المدير لتهيئة المثيل',
emailAlreadyInUse: 'البريد الإلكتروني مستخدم بالفعل',
emailOrUsername: 'البريد الإلكتروني أو اسم المستخدم',
iHaveReadAndAgreeToTheseTerms: 'لقد قرأت ووافقت على هذه الشروط',
invalidCredentials: 'بيانات الاعتماد غير صالحة',
invalidEmailOrUsername: 'البريد الإلكتروني أو اسم المستخدم غير صالح',
invalidPassword: 'كلمة المرور غير صالحة',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Необходимо е влизане на администратор за инициализиране на инстанцията',
emailAlreadyInUse: 'Имейлът вече се използва',
emailOrUsername: 'Имейл или потребителско име',
iHaveReadAndAgreeToTheseTerms: 'Прочетох и се съгласявам с тези условия',
invalidCredentials: 'Невалидни данни за вход',
invalidEmailOrUsername: 'Невалиден имейл или потребителско име',
invalidPassword: 'Невалидна парола',
-1
View File
@@ -6,7 +6,6 @@ export default {
"Es requereix inici de sessió d'administrador per inicialitzar la instància",
emailAlreadyInUse: 'Correu electrònic ja en ús',
emailOrUsername: "Correu electrònic o nom d'usuari",
iHaveReadAndAgreeToTheseTerms: 'He llegit i accepto aquests termes',
invalidCredentials: 'Credencials no vàlides',
invalidEmailOrUsername: "Correu electrònic o nom d'usuari no vàlid",
invalidPassword: 'Contrasenya no vàlida',
-1
View File
@@ -6,7 +6,6 @@ export default {
'K inicializaci instance je nutné přihlášení správce.',
emailAlreadyInUse: 'E-mail se již používá',
emailOrUsername: 'E-mail nebo uživatelské jméno',
iHaveReadAndAgreeToTheseTerms: 'Přečetl jsem si tyto podmínky a souhlasím s nimi.',
invalidCredentials: 'Neplatné přihlašovací údaje',
invalidEmailOrUsername: 'Nesprávný e-mail nebo uživatelské jméno',
invalidPassword: 'Nesprávné heslo',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Administrator login påkrævet for at initialisere instans',
emailAlreadyInUse: 'E-mail allerede i brug',
emailOrUsername: 'E-mail eller brugernavn',
iHaveReadAndAgreeToTheseTerms: 'Jeg har læst og accepterer disse vilkår',
invalidCredentials: 'Forkerte loginoplysninger',
invalidEmailOrUsername: 'Ugyldig e-mail eller brugernavn',
invalidPassword: 'Ugyldig adgangskode',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Admin-Anmeldung erforderlich zur Initialisierung der Instanz',
emailAlreadyInUse: 'E-mail Adresse wird bereits benutzt',
emailOrUsername: 'E-Mail-Adresse oder Benutzername',
iHaveReadAndAgreeToTheseTerms: 'Ich habe diese Bedingungen gelesen und stimme ihnen zu',
invalidCredentials: 'Ungültige Anmeldeinformationen',
invalidEmailOrUsername: 'Ungültige E-Mail-Adresse oder Benutzername',
invalidPassword: 'Ungültiges Passwort',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Απαιτείται σύνδεση διαχειριστή για την αρχικοποίηση της εφαρμογής',
emailAlreadyInUse: 'Το e-mail χρησιμοποιείται ήδη',
emailOrUsername: 'E-mail ή όνομα χρήστη',
iHaveReadAndAgreeToTheseTerms: 'Έχω διαβάσει και συμφωνώ με αυτούς τους όρους',
invalidCredentials: 'Μη έγκυρα στοιχεία σύνδεσης',
invalidEmailOrUsername: 'Μη έγκυρο e-mail ή όνομα χρήστη',
invalidPassword: 'Μη έγκυρος κωδικός',
-1
View File
@@ -5,7 +5,6 @@ export default {
adminLoginRequiredToInitializeInstance: 'Admin login required to initialize instance',
emailAlreadyInUse: 'E-mail already in use',
emailOrUsername: 'E-mail or username',
iHaveReadAndAgreeToTheseTerms: 'I have read and agree to these Terms',
invalidCredentials: 'Invalid credentials',
invalidEmailOrUsername: 'Invalid e-mail or username',
invalidPassword: 'Invalid password',
-1
View File
@@ -5,7 +5,6 @@ export default {
adminLoginRequiredToInitializeInstance: 'Admin login required to initialize instance',
emailAlreadyInUse: 'E-mail already in use',
emailOrUsername: 'E-mail or username',
iHaveReadAndAgreeToTheseTerms: 'I have read and agree to these Terms',
invalidCredentials: 'Invalid credentials',
invalidEmailOrUsername: 'Invalid e-mail or username',
invalidPassword: 'Invalid password',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Se requiere inicio de sesión de administrador para inicializar la instancia',
emailAlreadyInUse: 'Correo electrónico ya en uso',
emailOrUsername: 'Correo electrónico o nombre de usuario',
iHaveReadAndAgreeToTheseTerms: 'He leído y acepto estos términos',
invalidCredentials: 'Credenciales no válidas',
invalidEmailOrUsername: 'Correo electrónico o nombre de usuario no válido',
invalidPassword: 'Contraseña no válida',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Administraatori sisselogimine on vajalik rakenduse käivitamiseks',
emailAlreadyInUse: 'E-post on juba kasutusel',
emailOrUsername: 'E-post või kasutajanimi',
iHaveReadAndAgreeToTheseTerms: 'Olen lugenud ja nõustun nende tingimustega',
invalidCredentials: 'Vale kasutajanimi või parool',
invalidEmailOrUsername: 'Vale e-post või kasutajanimi',
invalidPassword: 'Vale parool',
-1
View File
@@ -5,7 +5,6 @@ export default {
adminLoginRequiredToInitializeInstance: 'ورود مدیر برای راه‌اندازی نمونه مورد نیاز است',
emailAlreadyInUse: 'ایمیل قبلا استفاده شده است',
emailOrUsername: 'ایمیل یا نام کاربری',
iHaveReadAndAgreeToTheseTerms: 'این شرایط را خوانده‌ام و با آن موافقم',
invalidCredentials: 'اطلاعات ورود نامعتبر',
invalidEmailOrUsername: 'ایمیل یا نام کاربری نامعتبر است',
invalidPassword: 'رمز عبور نامعتبر است',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Järjestelmänvalvojan kirjautuminen vaaditaan instanssin alustamiseksi',
emailAlreadyInUse: 'Sähköposti on jo käytössä',
emailOrUsername: 'Sähköposti tai käyttäjänimi',
iHaveReadAndAgreeToTheseTerms: 'Olen lukenut ja hyväksyn nämä ehdot',
invalidCredentials: 'Virheelliset tunnistetiedot',
invalidEmailOrUsername: 'Virheellinen sähköposti tai käyttäjänimi',
invalidPassword: 'Virheellinen salasana',
-1
View File
@@ -6,7 +6,6 @@ export default {
"Connexion administrateur requise pour initialiser l'instance",
emailAlreadyInUse: 'E-mail déjà utilisé',
emailOrUsername: "E-mail ou nom d'utilisateur",
iHaveReadAndAgreeToTheseTerms: "J'ai lu et j'accepte ces conditions",
invalidCredentials: 'Identifiants invalides',
invalidEmailOrUsername: "E-mail ou nom d'utilisateur invalide",
invalidPassword: 'Mot de passe invalide',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Rendszergazdai bejelentkezés szükséges a példány inicializálásához',
emailAlreadyInUse: 'Az e-mail cím már használatban van',
emailOrUsername: 'E-mail vagy felhasználó',
iHaveReadAndAgreeToTheseTerms: 'Elolvastam és elfogadom ezeket a feltételeket',
invalidCredentials: 'Érvénytelen hitelesítő adatok',
invalidEmailOrUsername: 'Érvénytelen e-mail vagy felhasználó',
invalidPassword: 'Érvénytelen jelszó',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Login admin diperlukan untuk menginisialisasi instance',
emailAlreadyInUse: 'E-mail telah digunakan',
emailOrUsername: 'E-mail atau username',
iHaveReadAndAgreeToTheseTerms: 'Saya telah membaca dan menyetujui syarat-syarat ini',
invalidCredentials: 'Kredensial tidak valid',
invalidEmailOrUsername: 'E-mail atau username salah',
invalidPassword: 'Kata sandi salah',
-1
View File
@@ -6,7 +6,6 @@ export default {
"Login amministratore richiesto per inizializzare l'istanza",
emailAlreadyInUse: 'E-mail già in uso',
emailOrUsername: 'E-mail o username',
iHaveReadAndAgreeToTheseTerms: 'Ho letto e accetto questi termini',
invalidCredentials: 'Credenziali non valide',
invalidEmailOrUsername: 'E-mail o username non valido',
invalidPassword: 'Password non valida',
-1
View File
@@ -6,7 +6,6 @@ export default {
'インスタンスを初期化するには管理者ログインが必要です',
emailAlreadyInUse: 'Eメールは既に使われています',
emailOrUsername: 'Eメールまたはユーザー名',
iHaveReadAndAgreeToTheseTerms: 'これらの利用規約を読み、同意します',
invalidCredentials: '認証情報が無効です',
invalidEmailOrUsername: 'Eメールまたはユーザー名が無効',
invalidPassword: 'パスワードが無効',
-1
View File
@@ -5,7 +5,6 @@ export default {
adminLoginRequiredToInitializeInstance: '인스턴스 초기화를 위해 관리자 로그인이 필요합니다',
emailAlreadyInUse: '이미 사용 중인 이메일',
emailOrUsername: '이메일 또는 사용자 이름',
iHaveReadAndAgreeToTheseTerms: '이 약관을 읽고 동의합니다',
invalidCredentials: '잘못된 자격 증명',
invalidEmailOrUsername: '잘못된 이메일 또는 사용자 이름',
invalidPassword: '잘못된 비밀번호',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Beheerder login vereist om instantie te initialiseren',
emailAlreadyInUse: 'E-mail is al in gebruik',
emailOrUsername: 'E-mail of gebruikersnaam',
iHaveReadAndAgreeToTheseTerms: 'Ik heb deze voorwaarden gelezen en ga ermee akkoord',
invalidCredentials: 'Ongeldige inloggegevens',
invalidEmailOrUsername: 'Ongeldig e-mailadres of gebruikersnaam',
invalidPassword: 'Ongeldig wachtwoord',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Wymagane logowanie administratora do inicjalizacji instancji',
emailAlreadyInUse: 'E-mail jest już używany',
emailOrUsername: 'E-mail lub nazwa użytkownika',
iHaveReadAndAgreeToTheseTerms: 'Przeczytałem i zgadzam się z tymi warunkami',
invalidCredentials: 'Błędne dane logowania',
invalidEmailOrUsername: 'Błędny e-mail lub nazwa użytkownika',
invalidPassword: 'Błędne hasło',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Login de administrador necessário para inicializar a instância',
emailAlreadyInUse: 'E-mail já está em uso',
emailOrUsername: 'E-mail ou nome de usuário',
iHaveReadAndAgreeToTheseTerms: 'Li e concordo com estes termos',
invalidCredentials: 'Credenciais inválidas',
invalidEmailOrUsername: 'E-mail ou nome de usuário inválido',
invalidPassword: 'Senha inválida',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Início de sessão de administrador necessário para inicializar a instância',
emailAlreadyInUse: 'E-mail já está em uso',
emailOrUsername: 'E-mail ou nome de utilizador',
iHaveReadAndAgreeToTheseTerms: 'Li e concordo com estes termos',
invalidCredentials: 'Credenciais inválidas',
invalidEmailOrUsername: 'E-mail ou nome de utilizador inválido',
invalidPassword: 'Palavra-passe inválida',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Este necesară autentificarea administratorului pentru a inițializa instanța',
emailAlreadyInUse: 'E-mail deja utilizat',
emailOrUsername: 'E-mail sau nume de utilizator',
iHaveReadAndAgreeToTheseTerms: 'Am citit și sunt de acord cu acești termeni',
invalidCredentials: 'Credențiale nevalide',
invalidEmailOrUsername: 'E-mail sau nume de utilizator introduse greșit',
invalidPassword: 'Parola greșita',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Требуется вход администратора для инициализации экземпляра',
emailAlreadyInUse: 'E-mail уже занят',
emailOrUsername: 'E-mail или имя пользователя',
iHaveReadAndAgreeToTheseTerms: 'Я прочитал и согласен с этими условиями',
invalidCredentials: 'Недействительные учетные данные',
invalidEmailOrUsername: 'Неверный e-mail или имя пользователя',
invalidPassword: 'Неверный пароль',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Na inicializáciu inštancie je potrebné prihlásenie správcu',
emailAlreadyInUse: 'E-mail je už použitý',
emailOrUsername: 'E-mail alebo používateľské meno',
iHaveReadAndAgreeToTheseTerms: 'Prečítal som si a súhlasím s týmito podmienkami',
invalidCredentials: 'Neplatné prihlasovacie údaje',
invalidEmailOrUsername: 'Nesprávny e-mail alebo používateľské meno',
invalidPassword: 'Nesprávne heslo',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Потребна је администраторска пријава за иницијализацију инстанце',
emailAlreadyInUse: 'Е-пошта је већ у употреби',
emailOrUsername: 'Е-пошта или корисничко име',
iHaveReadAndAgreeToTheseTerms: 'Прочитао сам и слажем се са овим условима',
invalidCredentials: 'Неисправни акредитиви',
invalidEmailOrUsername: 'Неисправна е-пошта или корисничко име',
invalidPassword: 'Неисправна лозинка',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Potrebna je administratorska prijava za inicijalizaciju instance',
emailAlreadyInUse: 'E-pošta je već u upotrebi',
emailOrUsername: 'E-pošta ili korisničko ime',
iHaveReadAndAgreeToTheseTerms: 'Pročitao sam i slažem se sa ovim uslovima',
invalidCredentials: 'Neispravni akreditivi',
invalidEmailOrUsername: 'Neispravna e-pošta ili korisničko ime',
invalidPassword: 'Neispravna lozinka',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Administratörsinloggning krävs för att initiera instansen',
emailAlreadyInUse: 'E-mail används redan',
emailOrUsername: 'E-mail eller användarnamn',
iHaveReadAndAgreeToTheseTerms: 'Jag har läst och godkänner dessa villkor',
invalidCredentials: 'Ogiltiga inloggningsuppgifter',
invalidEmailOrUsername: 'Ogiltig e-mail eller användarnamn',
invalidPassword: 'Ogiltigt lösenord',
-1
View File
@@ -5,7 +5,6 @@ export default {
adminLoginRequiredToInitializeInstance: 'Örneği başlatmak için yönetici girişi gerekli',
emailAlreadyInUse: 'E-posta adresi zaten kullanımda',
emailOrUsername: 'E-posta adresi veya kullanıcı adı',
iHaveReadAndAgreeToTheseTerms: 'Bu şartları okudum ve kabul ediyorum',
invalidCredentials: 'Geçersiz kimlik bilgileri',
invalidEmailOrUsername: 'Geçersiz e-posta adresi veya kullanıcı adı',
invalidPassword: 'Hatalı şifre',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Потрібен вхід адміністратора для ініціалізації екземпляра',
emailAlreadyInUse: 'Електронна пошта вже використовується',
emailOrUsername: "Електронна пошта або ім'я користувача",
iHaveReadAndAgreeToTheseTerms: 'Я прочитав і погоджуюся з цими умовами',
invalidCredentials: 'Неправильні облікові дані',
invalidEmailOrUsername: "Неправильна електронна пошта або ім'я користувача",
invalidPassword: 'Неправильний пароль',
-1
View File
@@ -6,7 +6,6 @@ export default {
'Tizimni ishga tushirish uchun admin kirishi talab qilinadi',
emailAlreadyInUse: 'E-mail allaqachon mavjud',
emailOrUsername: 'E-mail yoki foydalanuvchi nomi',
iHaveReadAndAgreeToTheseTerms: "Men ushbu shartlarni o'qidim va roziman",
invalidCredentials: "Noto'g'ri kirish ma'lumotlari",
invalidEmailOrUsername: "Noto'g'ri e-mail yoki foydalanuvchi nomi",
invalidPassword: "Noto'g'ri parol",
-1
View File
@@ -5,7 +5,6 @@ export default {
adminLoginRequiredToInitializeInstance: 'Cần đăng nhập quản trị để khởi tạo phiên bản',
emailAlreadyInUse: 'E-mail đã được sử dụng',
emailOrUsername: 'E-mail hoặc tên đăng nhập',
iHaveReadAndAgreeToTheseTerms: 'Tôi đã đọc và đồng ý với các điều khoản này',
invalidCredentials: 'Thông tin đăng nhập không hợp lệ',
invalidEmailOrUsername: 'E-mail hoặc tên đăng nhập không hợp lệ',
invalidPassword: 'Mật khẩu không hợp lệ',
-1
View File
@@ -5,7 +5,6 @@ export default {
adminLoginRequiredToInitializeInstance: '需要管理员登录以初始化实例',
emailAlreadyInUse: '邮箱已使用',
emailOrUsername: '邮箱或用户名',
iHaveReadAndAgreeToTheseTerms: '我已阅读并同意这些条款',
invalidCredentials: '无效凭证',
invalidEmailOrUsername: '无效的邮箱或用户名',
invalidPassword: '密码错误',
-1
View File
@@ -5,7 +5,6 @@ export default {
adminLoginRequiredToInitializeInstance: '需要管理員登入以初始化實例',
emailAlreadyInUse: '郵箱已被使用',
emailOrUsername: '郵箱或使用者名稱',
iHaveReadAndAgreeToTheseTerms: '我已閱讀並同意這些條款',
invalidCredentials: '無效憑證',
invalidEmailOrUsername: '無效的郵箱或使用者名稱',
invalidPassword: '密碼錯誤',