ywana-core8 0.0.986 → 0.0.988
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +88 -39
- package/dist/index.cjs.map +1 -1
- package/dist/index.modern.js +88 -39
- package/dist/index.modern.js.map +1 -1
- package/dist/index.umd.js +88 -39
- package/dist/index.umd.js.map +1 -1
- package/package.json +5 -3
- package/src/incubator/task.js +5 -4
- package/src/widgets/login/ResetPasswordBox.js +17 -12
- package/src/widgets/login/ResetPasswordBoxTest.js +24 -0
- package/src/widgets/login/login_commons.js +45 -0
- package/src/widgets/login/login_commons.test.js +51 -0
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "ywana-core8",
|
3
|
-
"version": "0.0.
|
3
|
+
"version": "0.0.988",
|
4
4
|
"description": "ywana-core8",
|
5
5
|
"homepage": "https://ywana.github.io/workspace",
|
6
6
|
"author": "Ernesto Roldan Garcia",
|
@@ -11,7 +11,8 @@
|
|
11
11
|
"module": "dist/index.modern.js",
|
12
12
|
"scripts": {
|
13
13
|
"build": "microbundle --no-compress --jsx React.createElement",
|
14
|
-
"dev": "microbundle watch --no-compress --jsx React.createElement"
|
14
|
+
"dev": "microbundle watch --no-compress --jsx React.createElement",
|
15
|
+
"test": "jest"
|
15
16
|
},
|
16
17
|
"bugs": {
|
17
18
|
"url": "https://github.com/ywana/ywana-core8/issues"
|
@@ -25,6 +26,7 @@
|
|
25
26
|
},
|
26
27
|
"devDependencies": {
|
27
28
|
"gh-pages": "^3.2.3",
|
29
|
+
"jest": "^29.7.0",
|
28
30
|
"microbundle": "^0.14.2",
|
29
31
|
"react": "^17.0.2",
|
30
32
|
"react-dom": "^17.0.2"
|
@@ -33,7 +35,7 @@
|
|
33
35
|
"axios": "^1.3.4",
|
34
36
|
"crypto-js": "^4.1.1",
|
35
37
|
"deep-equal": "^2.0.5",
|
36
|
-
"material-design-icons-iconfont": "^6.
|
38
|
+
"material-design-icons-iconfont": "^6.7.0",
|
37
39
|
"moment": "^2.29.1",
|
38
40
|
"moment-range": "^4.0.2",
|
39
41
|
"react-datepicker": "^4.6.0",
|
package/src/incubator/task.js
CHANGED
@@ -18,6 +18,9 @@ export const TaskContextProvider = (props) => {
|
|
18
18
|
const [ listeners, setListeners ] = useState({})
|
19
19
|
|
20
20
|
useEffect(() => {
|
21
|
+
|
22
|
+
if (Object.keys(listeners).length === 0) return
|
23
|
+
|
21
24
|
const _interval = setInterval(async () => {
|
22
25
|
const taskIDs = Object.keys(listeners)
|
23
26
|
for (let i = 0; i < taskIDs.length; i++) {
|
@@ -80,13 +83,12 @@ export const TaskContextProvider = (props) => {
|
|
80
83
|
}
|
81
84
|
|
82
85
|
function addListener(taskID, listener) {
|
83
|
-
const next =
|
84
|
-
next[taskID] = listener
|
86
|
+
const next = { ...listeners, [taskID]: listener }
|
85
87
|
setListeners(next)
|
86
88
|
}
|
87
89
|
|
88
90
|
function addListeners(newListeners) {
|
89
|
-
const next =
|
91
|
+
const next = { ...listeners, ...newListeners }
|
90
92
|
setListeners(next)
|
91
93
|
}
|
92
94
|
|
@@ -124,7 +126,6 @@ export const TASK_STATES = {
|
|
124
126
|
"COMPLETED": "COMPLETED",
|
125
127
|
"FAULTED": "FAULTED",
|
126
128
|
"CANCELED": "CANCELED",
|
127
|
-
|
128
129
|
"QUEUED": "QUEUED",
|
129
130
|
}
|
130
131
|
|
@@ -1,5 +1,6 @@
|
|
1
|
-
import React, { useState } from 'react'
|
1
|
+
import React, { useState, useEffect } from 'react'
|
2
2
|
import { TextField, Text, Button } from '../../html'
|
3
|
+
import { validatePassword } from './login_commons'
|
3
4
|
import './ResetPasswordBox.css'
|
4
5
|
|
5
6
|
/**
|
@@ -8,10 +9,21 @@ import './ResetPasswordBox.css'
|
|
8
9
|
export const ResetPasswordBox = ({ logo, title, userRequired = true, lang = "EN", children, onOK, onClose }) => {
|
9
10
|
|
10
11
|
const [form, setForm] = useState({})
|
12
|
+
const [isValid, setIsValid] = useState(false)
|
11
13
|
const [error, setError] = useState()
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
+
useEffect(() => {
|
16
|
+
setIsValid(validate())
|
17
|
+
}, [form.password1, form.password2])
|
18
|
+
|
19
|
+
function validate() {
|
20
|
+
const hasRequiredUser = userRequired ? form.user && form.user.length > 0 : true
|
21
|
+
const hasPassword1 = form.password1 && form.password1.length > 0
|
22
|
+
const [isValid, error] = hasPassword1 ? validatePassword(form.password1) : [false, "La contraseña es requerida."]
|
23
|
+
setError(error)
|
24
|
+
const areEqual = form.password1 === form.password2
|
25
|
+
if (isValid && !areEqual) setError("Las contraseñas no coinciden.")
|
26
|
+
return hasRequiredUser && areEqual && isValid
|
15
27
|
}
|
16
28
|
|
17
29
|
function changeField(id, value) {
|
@@ -21,14 +33,7 @@ export const ResetPasswordBox = ({ logo, title, userRequired = true, lang = "EN"
|
|
21
33
|
|
22
34
|
function ok() {
|
23
35
|
if (onOK && canOK()) {
|
24
|
-
|
25
|
-
setError(null)
|
26
|
-
onOK(form)
|
27
|
-
} else {
|
28
|
-
|
29
|
-
const errorLabel = lang === "EN" ? "Passwords do not match" : "Las claves no coinciden"
|
30
|
-
setError(errorLabel)
|
31
|
-
}
|
36
|
+
onOK(form)
|
32
37
|
}
|
33
38
|
}
|
34
39
|
|
@@ -59,7 +64,7 @@ export const ResetPasswordBox = ({ logo, title, userRequired = true, lang = "EN"
|
|
59
64
|
</main>
|
60
65
|
<footer>
|
61
66
|
<Button label={cancelLabel} action={close} />
|
62
|
-
<Button label={okLabel} raised disabled={!
|
67
|
+
<Button label={okLabel} raised disabled={!isValid} action={ok} />
|
63
68
|
</footer>
|
64
69
|
</div>
|
65
70
|
)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import React, { useState } from 'react'
|
2
|
+
import { Icon , Button, Text, TextField } from '../../html'
|
3
|
+
import { ResetPasswordBox } from './ResetPasswordBox'
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Reset Password Box
|
7
|
+
*/
|
8
|
+
export const ResetPasswordBoxTest = (prop) => {
|
9
|
+
|
10
|
+
const config = {
|
11
|
+
title: 'Reset Password',
|
12
|
+
userRequired: false,
|
13
|
+
lang: 'EN',
|
14
|
+
onOK: (form) => {
|
15
|
+
console.log('onOK', form)
|
16
|
+
},
|
17
|
+
onClose: () => {
|
18
|
+
console.log('onClose')
|
19
|
+
}
|
20
|
+
}
|
21
|
+
return (
|
22
|
+
<ResetPasswordBox {...config} />
|
23
|
+
)
|
24
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
export function validatePassword(contraseña) {
|
2
|
+
|
3
|
+
let error = ""
|
4
|
+
|
5
|
+
// Verificar longitud mínima y máxima
|
6
|
+
if (contraseña.length < 15 || contraseña.length > 50) {
|
7
|
+
error = 'La contraseña debe tener entre 15 y 50 caracteres.';
|
8
|
+
return [ false, error]
|
9
|
+
}
|
10
|
+
|
11
|
+
// Verificar al menos una letra (mayúscula o minúscula)
|
12
|
+
if (!/[A-Za-z]/.test(contraseña)) {
|
13
|
+
error = 'La contraseña debe contener al menos una letra (A-Z o a-z).';
|
14
|
+
return [ false, error]
|
15
|
+
}
|
16
|
+
|
17
|
+
// Verificar al menos un número
|
18
|
+
if (!/[0-9]/.test(contraseña)) {
|
19
|
+
error = 'La contraseña debe contener al menos un número (0-9).';
|
20
|
+
return [ false, error]
|
21
|
+
}
|
22
|
+
|
23
|
+
// Verificar al menos una minúscula
|
24
|
+
if (!/[a-z]/.test(contraseña)) {
|
25
|
+
error = 'La contraseña debe contener al menos una letra en minúscula (a-z).';
|
26
|
+
return [ false, error]
|
27
|
+
}
|
28
|
+
|
29
|
+
// Verificar al menos una mayúscula
|
30
|
+
if (!/[A-Z]/.test(contraseña)) {
|
31
|
+
error = 'La contraseña debe contener al menos una letra en mayúscula (A-Z).';
|
32
|
+
return [ false, error]
|
33
|
+
}
|
34
|
+
|
35
|
+
// Verificar al menos un carácter especial
|
36
|
+
if (!/[<>+&!?*\-_%\.:=]/.test(contraseña)) {
|
37
|
+
error = 'La contraseña debe contener al menos un carácter especial (< > + & ! ? * - _ % . : =).';
|
38
|
+
return [ false, error]
|
39
|
+
}
|
40
|
+
|
41
|
+
// Si todas las validaciones pasan
|
42
|
+
return [true, error];
|
43
|
+
}
|
44
|
+
|
45
|
+
//module.exports = { validatePassword }
|
@@ -0,0 +1,51 @@
|
|
1
|
+
const login_commons = require('./login_commons');
|
2
|
+
const { validatePassword } = login_commons;
|
3
|
+
|
4
|
+
describe('validatePassword', () => {
|
5
|
+
test('debería devolver un error si la longitud es menor a 15 caracteres', () => {
|
6
|
+
const [isValid, error] = validatePassword('Abc123!');
|
7
|
+
expect(isValid).toBe(false);
|
8
|
+
expect(error).toBe('La contraseña debe tener entre 15 y 50 caracteres.');
|
9
|
+
});
|
10
|
+
|
11
|
+
test('debería devolver un error si la longitud es mayor a 50 caracteres', () => {
|
12
|
+
const [isValid, error] = validatePassword('A'.repeat(51) + '1!aB');
|
13
|
+
expect(isValid).toBe(false);
|
14
|
+
expect(error).toBe('La contraseña debe tener entre 15 y 50 caracteres.');
|
15
|
+
});
|
16
|
+
|
17
|
+
test('debería devolver un error si no contiene letras', () => {
|
18
|
+
const [isValid, error] = validatePassword('1234567890!@#$%^&*()');
|
19
|
+
expect(isValid).toBe(false);
|
20
|
+
expect(error).toBe('La contraseña debe contener al menos una letra (A-Z o a-z).');
|
21
|
+
});
|
22
|
+
|
23
|
+
test('debería devolver un error si no contiene números', () => {
|
24
|
+
const [isValid, error] = validatePassword('Aaaaaaaa!aaaaaaa');
|
25
|
+
expect(isValid).toBe(false);
|
26
|
+
expect(error).toBe('La contraseña debe contener al menos un número (0-9).');
|
27
|
+
});
|
28
|
+
|
29
|
+
test('debería devolver un error si no contiene minúsculas', () => {
|
30
|
+
const [isValid, error] = validatePassword('AAAAAAAAAAAAA1!');
|
31
|
+
expect(isValid).toBe(false);
|
32
|
+
expect(error).toBe('La contraseña debe contener al menos una letra en minúscula (a-z).');
|
33
|
+
});
|
34
|
+
|
35
|
+
test('debería devolver un error si no contiene mayúsculas', () => {
|
36
|
+
const [isValid, error] = validatePassword('aaaaaaaaaaaaa1!');
|
37
|
+
expect(isValid).toBe(false);
|
38
|
+
expect(error).toBe('La contraseña debe contener al menos una letra en mayúscula (A-Z).');
|
39
|
+
});
|
40
|
+
|
41
|
+
test('debería devolver un error si no contiene un carácter especial', () => {
|
42
|
+
const [isValid, error] = validatePassword('Aaaaaaaa1Aaaaaaaa');
|
43
|
+
expect(isValid).toBe(false);
|
44
|
+
expect(error).toBe('La contraseña debe contener al menos un carácter especial (< > + & ! ? * - _ % . : =).');
|
45
|
+
});
|
46
|
+
|
47
|
+
test('debería devolver true si la contraseña es válida', () => {
|
48
|
+
const [isValid, error] = validatePassword('Aaaaaaaa1Aaaaa!a');
|
49
|
+
expect(isValid).toBe(true);
|
50
|
+
});
|
51
|
+
});
|