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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ywana-core8",
3
- "version": "0.0.986",
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.1.1",
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",
@@ -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 = Object.assign({}, listeners)
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 = Object.assign({}, listeners, newListeners)
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
- function canOK() {
14
- return form.password1 && form.password2
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
- if (form.password1 === form.password2) {
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={!canOK()} action={ok} />
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
+ });