Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bb7cdf5dd4 | ||
|
|
253af55790 | ||
|
|
62c3cca9a7 | ||
|
|
b476a19b79 | ||
|
|
3379c65a87 | ||
|
|
1a6fc40804 | ||
|
|
42092efcd2 | ||
|
|
5c91bddfe7 |
@@ -142,15 +142,20 @@ const UserAddStep = React.memo(
|
||||
onChange={handleFieldChange}
|
||||
/>
|
||||
<div className={styles.text}>{t('common.password')}</div>
|
||||
<Input.Password
|
||||
fluid
|
||||
ref={passwordField}
|
||||
name="password"
|
||||
value={data.password}
|
||||
readOnly={isSubmitting}
|
||||
className={styles.field}
|
||||
onChange={handleFieldChange}
|
||||
/>
|
||||
<div className={styles.field}>
|
||||
<Input.Password
|
||||
fluid
|
||||
ref={passwordField}
|
||||
name="password"
|
||||
value={data.password}
|
||||
readOnly={isSubmitting}
|
||||
className={styles.field}
|
||||
onChange={handleFieldChange}
|
||||
/>
|
||||
<div className={styles.note}>
|
||||
{t('common.mustBeAtLeast6CharactersLongAndContainAtLeastOneLetterAndNumber')}
|
||||
</div>
|
||||
</div>
|
||||
<div className={styles.text}>{t('common.name')}</div>
|
||||
<Input
|
||||
fluid
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.note {
|
||||
font-size: 11px;
|
||||
margin-top: 4px;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.text {
|
||||
color: #444444;
|
||||
font-size: 12px;
|
||||
|
||||
@@ -7,6 +7,7 @@ import { useDidUpdate, usePrevious, useToggle } from '../../lib/hooks';
|
||||
import { Input, Popup } from '../../lib/custom-ui';
|
||||
|
||||
import { useForm } from '../../hooks';
|
||||
import { isPassword } from '../../utils/validator';
|
||||
|
||||
import styles from './UserPasswordEditStep.module.scss';
|
||||
|
||||
@@ -56,7 +57,7 @@ const UserPasswordEditStep = React.memo(
|
||||
const currentPasswordField = useRef(null);
|
||||
|
||||
const handleSubmit = useCallback(() => {
|
||||
if (!data.password) {
|
||||
if (!data.password || !isPassword(data.password)) {
|
||||
passwordField.current.select();
|
||||
return;
|
||||
}
|
||||
@@ -112,14 +113,18 @@ const UserPasswordEditStep = React.memo(
|
||||
)}
|
||||
<Form onSubmit={handleSubmit}>
|
||||
<div className={styles.text}>{t('common.newPassword')}</div>
|
||||
<Input.Password
|
||||
fluid
|
||||
ref={passwordField}
|
||||
name="password"
|
||||
value={data.password}
|
||||
className={styles.field}
|
||||
onChange={handleFieldChange}
|
||||
/>
|
||||
<div className={styles.field}>
|
||||
<Input.Password
|
||||
fluid
|
||||
ref={passwordField}
|
||||
name="password"
|
||||
value={data.password}
|
||||
onChange={handleFieldChange}
|
||||
/>
|
||||
<div className={styles.note}>
|
||||
{t('common.mustBeAtLeast6CharactersLongAndContainAtLeastOneLetterAndNumber')}
|
||||
</div>
|
||||
</div>
|
||||
{usePasswordConfirmation && (
|
||||
<>
|
||||
<div className={styles.text}>{t('common.currentPassword')}</div>
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.note {
|
||||
font-size: 11px;
|
||||
margin-top: 4px;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.text {
|
||||
color: #444444;
|
||||
font-size: 12px;
|
||||
|
||||
@@ -6,6 +6,8 @@ import remarkBreaks from 'remark-breaks';
|
||||
|
||||
import './Markdown.module.scss'; // FIXME: import as styles?
|
||||
|
||||
const ABSOLUTE_URL_REGEX = /^(?:https?:)?\/\//i;
|
||||
|
||||
const Markdown = React.memo(({ linkStopPropagation, ...props }) => {
|
||||
const handleLinkClick = useCallback((event) => {
|
||||
event.stopPropagation();
|
||||
@@ -16,25 +18,30 @@ const Markdown = React.memo(({ linkStopPropagation, ...props }) => {
|
||||
jsx-a11y/click-events-have-key-events,
|
||||
jsx-a11y/no-static-element-interactions,
|
||||
react/jsx-props-no-spreading */
|
||||
({ node, ...linkProps }) => <a {...linkProps} onClick={handleLinkClick} />,
|
||||
({ node, ...linkProps }) => (
|
||||
<a
|
||||
{...linkProps}
|
||||
rel={
|
||||
ABSOLUTE_URL_REGEX.test(linkProps.href) && linkProps.target === '_blank'
|
||||
? 'noreferrer'
|
||||
: undefined
|
||||
}
|
||||
onClick={linkStopPropagation ? handleLinkClick : undefined}
|
||||
/>
|
||||
),
|
||||
/* eslint-enable jsx-a11y/anchor-has-content,
|
||||
jsx-a11y/click-events-have-key-events,
|
||||
jsx-a11y/no-static-element-interactions,
|
||||
react/jsx-props-no-spreading */
|
||||
[handleLinkClick],
|
||||
[linkStopPropagation, handleLinkClick],
|
||||
);
|
||||
|
||||
let components;
|
||||
if (linkStopPropagation) {
|
||||
components = {
|
||||
a: linkRenderer,
|
||||
};
|
||||
}
|
||||
|
||||
return (
|
||||
<ReactMarkdown
|
||||
{...props} // eslint-disable-line react/jsx-props-no-spreading
|
||||
components={components}
|
||||
components={{
|
||||
a: linkRenderer,
|
||||
}}
|
||||
remarkPlugins={[remarkGfm, remarkBreaks]}
|
||||
className="markdown-body"
|
||||
/>
|
||||
|
||||
@@ -117,7 +117,7 @@ export default {
|
||||
phone: 'Telefon',
|
||||
preferences: 'Volby',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tip: dejte Ctrl-V (Cmd-V na Mac) pro vložení přílohy ze schránky.',
|
||||
'Tip: dejte Ctrl-V (Cmd-V na Mac) pro vložení přílohy ze schránky',
|
||||
project: 'Projekt',
|
||||
projectNotFound_title: 'Projekt nenalezen',
|
||||
removeManager_title: 'Odstranit vedoucího',
|
||||
|
||||
@@ -23,7 +23,7 @@ export default {
|
||||
administrator: 'Administrator',
|
||||
all: 'Alle',
|
||||
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
|
||||
'Alle Änderungen werden automatisch gespeichert,<br />sobald die Verbindung wiederhergestellt wurde.',
|
||||
'Alle Änderungen werden automatisch gespeichert,<br />sobald die Verbindung wiederhergestellt wurde',
|
||||
areYouSureYouWantToDeleteThisAttachment:
|
||||
'Sind Sie sicher, dass Sie diesen Anhang löschen möchten?',
|
||||
areYouSureYouWantToDeleteThisBoard: 'Sind Sie sicher, dass Sie dieses Board löschen möchten?',
|
||||
@@ -123,7 +123,7 @@ export default {
|
||||
phone: 'Telefon',
|
||||
preferences: 'Voreinstellungen',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tipp: Drücken Sie STRG-V (Cmd-V auf Mac), um einen Anhang aus der Zwischenablage hinzuzufügen.',
|
||||
'Tipp: Drücken Sie STRG-V (Cmd-V auf Mac), um einen Anhang aus der Zwischenablage hinzuzufügen',
|
||||
project: 'Projekt',
|
||||
projectNotFound_title: 'Projekt nicht gefunden',
|
||||
removeManager_title: 'Manager entfernen',
|
||||
|
||||
@@ -105,6 +105,8 @@ export default {
|
||||
members: 'Members',
|
||||
minutes: 'Minutes',
|
||||
moveCard_title: 'Move Card',
|
||||
mustBeAtLeast6CharactersLongAndContainAtLeastOneLetterAndNumber:
|
||||
'Must be at least 6 characters long and contain at least one letter and number',
|
||||
name: 'Name',
|
||||
newEmail: 'New e-mail',
|
||||
newPassword: 'New password',
|
||||
@@ -121,7 +123,7 @@ export default {
|
||||
phone: 'Phone',
|
||||
preferences: 'Preferences',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tip: press Ctrl-V (Cmd-V on Mac) to add an attachment from the clipboard.',
|
||||
'Tip: press Ctrl-V (Cmd-V on Mac) to add an attachment from the clipboard',
|
||||
project: 'Project',
|
||||
projectNotFound_title: 'Project Not Found',
|
||||
removeManager_title: 'Remove Manager',
|
||||
|
||||
@@ -106,7 +106,7 @@ export default {
|
||||
phone: 'Teléfono',
|
||||
preferences: 'Preferencias',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tip: presiona Ctrl-V (Cmd-V en Mac) para añadir adjuntos desde el portapapeles.',
|
||||
'Tip: presiona Ctrl-V (Cmd-V en Mac) para añadir adjuntos desde el portapapeles',
|
||||
project: 'Proyecto',
|
||||
projectNotFound_title: 'Proyecto no encontrado',
|
||||
removeMember_title: 'Remover Miembro',
|
||||
@@ -115,7 +115,7 @@ export default {
|
||||
selectList: 'Seleccionar Lista',
|
||||
selectProject: 'Seleccionar Proyecto',
|
||||
settings: 'Configuraciones',
|
||||
subscribeToMyOwnCardsByDefault: 'Suscribirme a mis propias tarjetas por defecto.',
|
||||
subscribeToMyOwnCardsByDefault: 'Suscribirme a mis propias tarjetas por defecto',
|
||||
taskActions_title: 'Acciones de Tareas',
|
||||
tasks: 'Tareas',
|
||||
time: 'Tiempo',
|
||||
|
||||
@@ -121,7 +121,7 @@ export default {
|
||||
phone: 'Telefono',
|
||||
preferences: 'Preferenze',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tip: prmi Ctrl-V (Cmd-V on Mac) per aggiungere un allegato dalla clipboard.',
|
||||
'Tip: prmi Ctrl-V (Cmd-V on Mac) per aggiungere un allegato dalla clipboard',
|
||||
project: 'Progetto',
|
||||
projectNotFound_title: 'Progetto non trovato',
|
||||
removeManager_title: 'Rimuovi Manager',
|
||||
|
||||
@@ -117,7 +117,7 @@ export default {
|
||||
phone: '電話番号',
|
||||
preferences: '環境設定',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'ヒント: Ctrl-V(MacではCmd-V)を押して、クリップボードから添付ファイルを追加します。',
|
||||
'ヒント: Ctrl-V(MacではCmd-V)を押して、クリップボードから添付ファイルを追加します',
|
||||
project: 'プロジェクト',
|
||||
projectNotFound_title: 'プロジェクトがありません',
|
||||
removeManager_title: 'マネージャーを削除',
|
||||
|
||||
@@ -106,7 +106,7 @@ export default {
|
||||
phone: 'Telefon',
|
||||
preferences: 'Preferencje',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Podpowiedź: naciśnij Ctrl-V (Cmd-V na Macu) aby dodać załącznik ze schowka.',
|
||||
'Podpowiedź: naciśnij Ctrl-V (Cmd-V na Macu) aby dodać załącznik ze schowka',
|
||||
project: 'Projekt',
|
||||
projectNotFound_title: 'Projekt Nie Znaleziony',
|
||||
removeMember_title: 'Usuń Członka',
|
||||
|
||||
@@ -100,6 +100,8 @@ export default {
|
||||
members: 'Участники',
|
||||
minutes: 'Минуты',
|
||||
moveCard: 'Перемещение карточки',
|
||||
mustBeAtLeast6CharactersLongAndContainAtLeastOneLetterAndNumber:
|
||||
'Должен быть не менее 6 символов и содержать хотя бы одну букву и цифру',
|
||||
name: 'Имя',
|
||||
newEmail: 'Новый e-mail',
|
||||
newPassword: 'Новый пароль',
|
||||
@@ -116,7 +118,7 @@ export default {
|
||||
phone: 'Телефон',
|
||||
preferences: 'Предпочтения',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Совет: нажмите Ctrl-V (Cmd-V на Mac), чтобы добавить вложение из буфера обмена.',
|
||||
'Совет: нажмите Ctrl-V (Cmd-V на Mac), чтобы добавить вложение из буфера обмена',
|
||||
project: 'Проект',
|
||||
projectActions: 'Действия с проектом',
|
||||
projectNotFound: 'Проект не найден',
|
||||
|
||||
@@ -118,7 +118,7 @@ export default {
|
||||
phone: 'Telefón',
|
||||
preferences: 'Voľby',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tip: stlačte Ctrl-V (Cmd-V na Mac) pre vloženie prílohy zo schránky.',
|
||||
'Tip: stlačte Ctrl-V (Cmd-V na Mac) pre vloženie prílohy zo schránky',
|
||||
project: 'Projekt',
|
||||
projectNotFound_title: 'Projekt neexistuje',
|
||||
removeManager_title: 'Odstrániť správcu',
|
||||
|
||||
@@ -119,7 +119,7 @@ export default {
|
||||
phone: 'Telefon',
|
||||
preferences: 'Preferenser',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tips: tryck på Ctrl-V (Cmd-V på Mac) för att lägga till en bilaga från urklipp.',
|
||||
'Tips: tryck på Ctrl-V (Cmd-V på Mac) för att lägga till en bilaga från urklipp',
|
||||
project: 'Projekt',
|
||||
projectNotFound_title: 'Projekt Ej Funnet',
|
||||
removeManager_title: 'Ta Bort Projektledare',
|
||||
|
||||
@@ -112,7 +112,7 @@ export default {
|
||||
phone: 'Telefon',
|
||||
preferences: 'Afzalliklar',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
"Tip: Buferdan ilova qo'shish uchun Ctrl-V (Mac da Cmd-V) ni bosing.",
|
||||
"Tip: Buferdan ilova qo'shish uchun Ctrl-V (Mac da Cmd-V) ni bosing",
|
||||
project: 'Loyiha',
|
||||
projectNotFound_title: 'Loyiha Topilmadi',
|
||||
removeManager_title: "Boshqaruvchini O'chirish",
|
||||
|
||||
@@ -110,7 +110,7 @@ export default {
|
||||
phone: '电话',
|
||||
preferences: '偏好',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'提示: 点击 Ctrl-V (Mac: Cmd-V) 从剪切板添加附件.',
|
||||
'提示: 点击 Ctrl-V (Mac: Cmd-V) 从剪切板添加附件',
|
||||
project: '项目',
|
||||
projectNotFound_title: '项目未找到',
|
||||
removeManager_title: '删除管理员',
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
const PASSWORD_REGEX = /^(?=.*[A-Za-z])(?=.*\d).+$/;
|
||||
const USERNAME_REGEX = /^[a-zA-Z0-9]+((_|\.)?[a-zA-Z0-9])*$/;
|
||||
|
||||
// eslint-disable-next-line import/prefer-default-export
|
||||
export const isPassword = (string) => {
|
||||
return string.length >= 6 && PASSWORD_REGEX.test(string);
|
||||
};
|
||||
|
||||
export const isUsername = (string) => {
|
||||
return string.length >= 3 && string.length <= 16 && USERNAME_REGEX.test(string);
|
||||
};
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "planka",
|
||||
"version": "1.7.2",
|
||||
"version": "1.7.5",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "planka",
|
||||
"version": "1.7.2",
|
||||
"version": "1.7.5",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "planka",
|
||||
"version": "1.7.2",
|
||||
"version": "1.7.5",
|
||||
"private": true,
|
||||
"homepage": "https://plankanban.github.io/planka",
|
||||
"repository": {
|
||||
|
||||
@@ -16,6 +16,8 @@ module.exports = {
|
||||
},
|
||||
password: {
|
||||
type: 'string',
|
||||
minLength: 6,
|
||||
regex: /^(?=.*[A-Za-z])(?=.*\d).+$/,
|
||||
required: true,
|
||||
},
|
||||
name: {
|
||||
|
||||
@@ -18,6 +18,8 @@ module.exports = {
|
||||
},
|
||||
password: {
|
||||
type: 'string',
|
||||
minLength: 6,
|
||||
regex: /^(?=.*[A-Za-z])(?=.*\d).+$/,
|
||||
required: true,
|
||||
},
|
||||
currentPassword: {
|
||||
|
||||
Reference in New Issue
Block a user