diff --git a/CHANGELOG.md b/CHANGELOG.md index 73e4c96df..bafedc760 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [2302.01] - 2023-01-12 ### Added - -- +- [General](Inicio) Permite recuperar la contraseña ### Changed -- Se ha eliminado la sección "Control clientes" dentro de Ticket + +### Removed +- [Tickets](Control clientes) Eliminada sección diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index f6a299011..e1792ea7b 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -30,7 +30,7 @@ export default { firstModuleRemovePinIcon: 'vn-home a:nth-child(1) vn-icon[icon="remove_circle"]' }, recoverPassword: { - recoverPasswordButton: 'vn-login a[ui-sref="recoverPassword"]', + recoverPasswordButton: 'vn-login a[ui-sref="recover-password"]', email: 'vn-recover-password vn-textfield[ng-model="$ctrl.email"]', sendEmailButton: 'vn-recover-password vn-submit', }, diff --git a/e2e/paths/01-salix/04_recoverPassword.spec.js b/e2e/paths/01-salix/04_recoverPassword.spec.js index 67e6362d3..e6cb02ab1 100644 --- a/e2e/paths/01-salix/04_recoverPassword.spec.js +++ b/e2e/paths/01-salix/04_recoverPassword.spec.js @@ -1,8 +1,7 @@ import selectors from '../../helpers/selectors'; import getBrowser from '../../helpers/puppeteer'; -// https://redmine.verdnatura.es/issues/4995 fix login -xdescribe('RecoverPassword path', async() => { +describe('RecoverPassword path', async() => { let browser; let page; @@ -11,7 +10,7 @@ xdescribe('RecoverPassword path', async() => { page = browser.page; await page.waitToClick(selectors.recoverPassword.recoverPasswordButton); - await page.waitForState('recoverPassword'); + await page.waitForState('recover-password'); }); afterAll(async() => { diff --git a/front/core/services/auth.js b/front/core/services/auth.js index 04520cd0b..c15a34d94 100644 --- a/front/core/services/auth.js +++ b/front/core/services/auth.js @@ -24,7 +24,7 @@ export default class Auth { initialize() { let criteria = { to: state => { - const outLayout = ['login', 'recoverPassword', 'resetPassword']; + const outLayout = ['login', 'recover-password', 'reset-password']; return !outLayout.some(ol => ol == state.name); } }; diff --git a/front/salix/components/app/app.html b/front/salix/components/app/app.html index d32c9f68b..d6169308a 100644 --- a/front/salix/components/app/app.html +++ b/front/salix/components/app/app.html @@ -1,9 +1,3 @@ - - - - + diff --git a/front/salix/components/app/app.js b/front/salix/components/app/app.js index 91a8d2215..97384d1e1 100644 --- a/front/salix/components/app/app.js +++ b/front/salix/components/app/app.js @@ -19,12 +19,6 @@ export default class App extends Component { this.vnApp.logger = this; } - get showLayout() { - const state = this.$state.current.name || this.$location.$$path.substring(1).replace('/', '.'); - const outLayout = ['login', 'recoverPassword', 'resetPassword', 'reset-password']; - return state && !outLayout.some(ol => ol == state); - } - $onDestroy() { this.deregisterCallback(); this.vnApp.logger = null; diff --git a/front/salix/components/index.js b/front/salix/components/index.js index 3bd24d32f..f6727fadf 100644 --- a/front/salix/components/index.js +++ b/front/salix/components/index.js @@ -5,10 +5,10 @@ import './descriptor-popover'; import './home/home'; import './layout'; import './left-menu/left-menu'; -import './login/index'; -import './login/login'; -import './login/recover-password'; -import './login/reset-password'; +import './login'; +import './outLayout'; +import './recover-password'; +import './reset-password'; import './module-card'; import './module-main'; import './side-menu/side-menu'; diff --git a/front/salix/components/login/index.html b/front/salix/components/login/index.html index 186979f8c..963c23061 100644 --- a/front/salix/components/login/index.html +++ b/front/salix/components/login/index.html @@ -1,6 +1,27 @@ -
- -
- -
+ + + + + + + diff --git a/front/salix/components/login/index.js b/front/salix/components/login/index.js index f0e21fa29..150e896a1 100644 --- a/front/salix/components/login/index.js +++ b/front/salix/components/login/index.js @@ -1,16 +1,43 @@ import ngModule from '../../module'; -import Component from 'core/lib/component'; import './style.scss'; -export default class OutLayout extends Component { - constructor($element, $scope) { - super($element, $scope); +/** + * A simple login form. + */ +export default class Controller { + constructor($, $element, vnAuth) { + Object.assign(this, { + $, + $element, + vnAuth, + user: localStorage.getItem('lastUser'), + remember: true + }); + } + + submit() { + this.loading = true; + this.vnAuth.login(this.user, this.password, this.remember) + .then(() => { + localStorage.setItem('lastUser', this.user); + this.loading = false; + }) + .catch(err => { + this.loading = false; + this.password = ''; + this.focusUser(); + throw err; + }); + } + + focusUser() { + this.$.userField.select(); + this.$.userField.focus(); } } +Controller.$inject = ['$scope', '$element', 'vnAuth']; -OutLayout.$inject = ['$element', '$scope']; - -ngModule.vnComponent('vnOutLayout', { +ngModule.vnComponent('vnLogin', { template: require('./index.html'), - controller: OutLayout + controller: Controller }); diff --git a/front/salix/components/login/locale/es.yml b/front/salix/components/login/locale/es.yml index e3a5815c1..c34861bfb 100644 --- a/front/salix/components/login/locale/es.yml +++ b/front/salix/components/login/locale/es.yml @@ -1,16 +1,5 @@ User: Usuario Password: Contraseña -Email: Correo electrónico Do not close session: No cerrar sesión Enter: Entrar I do not remember my password: No recuerdo mi contraseña -Recover password: Recuperar contraseña -We will sent you an email to recover your password: Te enviaremos un correo para restablecer tu contraseña -Notification sent!: ¡Notificación enviada! -Reset password: Restrablecer contraseña -New password: Nueva contraseña -Repeat password: Repetir contraseña -Password requirements: > - La contraseña debe tener al menos {{ length }} caracteres de longitud, - {{nAlpha}} caracteres alfabéticos, {{nUpper}} letras mayúsculas, {{nDigits}} - dígitos y {{nPunct}} símbolos (Ej: $%&.) diff --git a/front/salix/components/login/login.html b/front/salix/components/login/login.html deleted file mode 100644 index 807e4b284..000000000 --- a/front/salix/components/login/login.html +++ /dev/null @@ -1,32 +0,0 @@ -
- -
- - - - - - - -
-
diff --git a/front/salix/components/login/login.js b/front/salix/components/login/login.js deleted file mode 100644 index b5f8c1e7d..000000000 --- a/front/salix/components/login/login.js +++ /dev/null @@ -1,43 +0,0 @@ -import ngModule from '../../module'; -import './style.scss'; - -/** - * A simple login form. - */ -export default class Controller { - constructor($, $element, vnAuth) { - Object.assign(this, { - $, - $element, - vnAuth, - user: localStorage.getItem('lastUser'), - remember: true - }); - } - - submit() { - this.loading = true; - this.vnAuth.login(this.user, this.password, this.remember) - .then(() => { - localStorage.setItem('lastUser', this.user); - this.loading = false; - }) - .catch(err => { - this.loading = false; - this.password = ''; - this.focusUser(); - throw err; - }); - } - - focusUser() { - this.$.userField.select(); - this.$.userField.focus(); - } -} -Controller.$inject = ['$scope', '$element', 'vnAuth']; - -ngModule.vnComponent('vnLogin', { - template: require('./login.html'), - controller: Controller -}); diff --git a/front/salix/components/login/style.scss b/front/salix/components/login/style.scss index 5a7e72245..f13c9cf86 100644 --- a/front/salix/components/login/style.scss +++ b/front/salix/components/login/style.scss @@ -1,8 +1,6 @@ @import "variables"; -vn-login, -vn-reset-password, -vn-recover-password{ +vn-login{ .footer { margin-top: 32px; text-align: center; @@ -24,69 +22,3 @@ vn-recover-password{ } } } - -vn-login{ - position: absolute; - height: 100%; - width: 100%; - margin: 0; - padding: 0; - color: $color-font; - font-size: 1.1rem; - font-weight: normal; - background-color: $color-bg-dark; - display: flex; - justify-content: center; - align-items: center; - overflow: auto; - - & > .box { - box-sizing: border-box; - position: absolute; - max-width: 304px; - min-width: 240px; - padding: 48px; - background-color: $color-bg-panel; - box-shadow: 0 0 16px 0 rgba(0, 0, 0, .6); - border-radius: 8px; - - & > img { - width: 100%; - padding-bottom: 16px; - } - & > form { - & > .vn-textfield { - width: 100%; - } - & > .vn-check { - display: block; - .md-label { - white-space: inherit; - } - } - } - - h5{ - color: $color-primary; - } - - .text-secondary{ - text-align: center; - padding-bottom: 16px; - } - - } - - @media screen and (max-width: 600px) { - background-color: $color-bg-panel; - - & > .box { - padding: 16px; - box-shadow: none; - } - } - - a{ - color: $color-primary; - } -} diff --git a/front/salix/components/outLayout/index.html b/front/salix/components/outLayout/index.html new file mode 100644 index 000000000..186979f8c --- /dev/null +++ b/front/salix/components/outLayout/index.html @@ -0,0 +1,6 @@ +
+ +
+ +
+
diff --git a/front/salix/components/outLayout/index.js b/front/salix/components/outLayout/index.js new file mode 100644 index 000000000..f0e21fa29 --- /dev/null +++ b/front/salix/components/outLayout/index.js @@ -0,0 +1,16 @@ +import ngModule from '../../module'; +import Component from 'core/lib/component'; +import './style.scss'; + +export default class OutLayout extends Component { + constructor($element, $scope) { + super($element, $scope); + } +} + +OutLayout.$inject = ['$element', '$scope']; + +ngModule.vnComponent('vnOutLayout', { + template: require('./index.html'), + controller: OutLayout +}); diff --git a/front/salix/components/login/logo.svg b/front/salix/components/outLayout/logo.svg similarity index 100% rename from front/salix/components/login/logo.svg rename to front/salix/components/outLayout/logo.svg diff --git a/front/salix/components/outLayout/style.scss b/front/salix/components/outLayout/style.scss new file mode 100644 index 000000000..aa94fefb3 --- /dev/null +++ b/front/salix/components/outLayout/style.scss @@ -0,0 +1,67 @@ +@import "variables"; + +vn-out-layout{ + position: absolute; + height: 100%; + width: 100%; + margin: 0; + padding: 0; + color: $color-font; + font-size: 1.1rem; + font-weight: normal; + background-color: $color-bg-dark; + display: flex; + justify-content: center; + align-items: center; + overflow: auto; + + & > .box { + box-sizing: border-box; + position: absolute; + max-width: 304px; + min-width: 240px; + padding: 48px; + background-color: $color-bg-panel; + box-shadow: 0 0 16px 0 rgba(0, 0, 0, .6); + border-radius: 8px; + + & > img { + width: 100%; + padding-bottom: 16px; + } + & > form { + & > .vn-textfield { + width: 100%; + } + & > .vn-check { + display: block; + .md-label { + white-space: inherit; + } + } + } + + h5{ + color: $color-primary; + } + + .text-secondary{ + text-align: center; + padding-bottom: 16px; + } + + } + + @media screen and (max-width: 600px) { + background-color: $color-bg-panel; + + & > .box { + padding: 16px; + box-shadow: none; + } + } + + a{ + color: $color-primary; + } +} diff --git a/front/salix/components/login/recover-password.html b/front/salix/components/recover-password/index.html similarity index 100% rename from front/salix/components/login/recover-password.html rename to front/salix/components/recover-password/index.html diff --git a/front/salix/components/login/recover-password.js b/front/salix/components/recover-password/index.js similarity index 94% rename from front/salix/components/login/recover-password.js rename to front/salix/components/recover-password/index.js index fa9bfc459..3de7f3266 100644 --- a/front/salix/components/login/recover-password.js +++ b/front/salix/components/recover-password/index.js @@ -32,6 +32,6 @@ export default class Controller { Controller.$inject = ['$scope', '$element', '$http', 'vnApp', '$translate', '$state']; ngModule.vnComponent('vnRecoverPassword', { - template: require('./recover-password.html'), + template: require('./index.html'), controller: Controller }); diff --git a/front/salix/components/recover-password/locale/es.yml b/front/salix/components/recover-password/locale/es.yml new file mode 100644 index 000000000..b71c71415 --- /dev/null +++ b/front/salix/components/recover-password/locale/es.yml @@ -0,0 +1,3 @@ +Recover password: Recuperar contraseña +We will sent you an email to recover your password: Te enviaremos un correo para restablecer tu contraseña +Notification sent!: ¡Notificación enviada! diff --git a/front/salix/components/recover-password/style.scss b/front/salix/components/recover-password/style.scss new file mode 100644 index 000000000..d3c6f594e --- /dev/null +++ b/front/salix/components/recover-password/style.scss @@ -0,0 +1,24 @@ +@import "variables"; + +vn-recover-password{ + .footer { + margin-top: 32px; + text-align: center; + position: relative; + & > .vn-submit { + display: block; + + & > input { + display: block; + width: 100%; + } + } + & > .spinner-wrapper { + position: absolute; + width: 0; + top: 3px; + right: -8px; + overflow: visible; + } + } +} diff --git a/front/salix/components/login/reset-password.html b/front/salix/components/reset-password/index.html similarity index 100% rename from front/salix/components/login/reset-password.html rename to front/salix/components/reset-password/index.html diff --git a/front/salix/components/login/reset-password.js b/front/salix/components/reset-password/index.js similarity index 96% rename from front/salix/components/login/reset-password.js rename to front/salix/components/reset-password/index.js index 9ee1fdb62..20c6c34fe 100644 --- a/front/salix/components/login/reset-password.js +++ b/front/salix/components/reset-password/index.js @@ -43,6 +43,6 @@ export default class Controller { Controller.$inject = ['$scope', '$element', '$http', 'vnApp', '$translate', '$state', '$location']; ngModule.vnComponent('vnResetPassword', { - template: require('./reset-password.html'), + template: require('./index.html'), controller: Controller }); diff --git a/front/salix/components/login/locale/en.yml b/front/salix/components/reset-password/locale/en.yml similarity index 71% rename from front/salix/components/login/locale/en.yml rename to front/salix/components/reset-password/locale/en.yml index 1ddd454b7..e5419e1c8 100644 --- a/front/salix/components/login/locale/en.yml +++ b/front/salix/components/reset-password/locale/en.yml @@ -1,7 +1,3 @@ -User: User -Password: Password -Do not close session: Do not close session -Enter: Enter Password requirements: > The password must have at least {{ length }} length characters, {{nAlpha}} alphabetic characters, {{nUpper}} capital letters, {{nDigits}} diff --git a/front/salix/components/reset-password/locale/es.yml b/front/salix/components/reset-password/locale/es.yml new file mode 100644 index 000000000..0771d5dc3 --- /dev/null +++ b/front/salix/components/reset-password/locale/es.yml @@ -0,0 +1,8 @@ +Reset password: Restrablecer contraseña +New password: Nueva contraseña +Repeat password: Repetir contraseñaç +Password changed!: ¡Contraseña cambiada! +Password requirements: > + La contraseña debe tener al menos {{ length }} caracteres de longitud, + {{nAlpha}} caracteres alfabéticos, {{nUpper}} letras mayúsculas, {{nDigits}} + dígitos y {{nPunct}} símbolos (Ej: $%&.) diff --git a/front/salix/components/reset-password/style.scss b/front/salix/components/reset-password/style.scss new file mode 100644 index 000000000..87e4adc8c --- /dev/null +++ b/front/salix/components/reset-password/style.scss @@ -0,0 +1,24 @@ +@import "variables"; + +vn-reset-password{ + .footer { + margin-top: 32px; + text-align: center; + position: relative; + & > .vn-submit { + display: block; + + & > input { + display: block; + width: 100%; + } + } + & > .spinner-wrapper { + position: absolute; + width: 0; + top: 3px; + right: -8px; + overflow: visible; + } + } +} diff --git a/front/salix/routes.js b/front/salix/routes.js index 613dc7288..f32c143ef 100644 --- a/front/salix/routes.js +++ b/front/salix/routes.js @@ -3,27 +3,38 @@ import getMainRoute from 'core/lib/get-main-route'; config.$inject = ['$stateProvider', '$urlRouterProvider']; function config($stateProvider, $urlRouterProvider) { - $urlRouterProvider.otherwise('/'); + $urlRouterProvider + .otherwise('/'); $stateProvider + .state('layout', { + abstract: true, + template: '', + }) + .state('outLayout', { + abstract: true, + template: '', + }) .state('login', { + parent: 'outLayout', url: '/login?continue', description: 'Login', - views: { - 'login': {template: ''}, - } + template: '' }) - .state('recoverPassword', { + .state('recover-password', { + parent: 'outLayout', url: '/recover-password', - description: 'Recover-password', - template: 'asd' + description: 'Recover password', + template: '' }) - .state('resetPassword', { + .state('reset-password', { + parent: 'outLayout', url: '/reset-password', - description: 'Reset-password', + description: 'Reset password', template: '' }) .state('home', { + parent: 'layout', url: '/', description: 'Home', template: '' @@ -54,6 +65,10 @@ function config($stateProvider, $urlRouterProvider) { }; if (route.abstract) configRoute.abstract = true; + + if (!route.state.includes('.')) + configRoute.parent = 'layout'; + if (route.routeParams) configRoute.params = route.routeParams;