From 34a16930ef3ae457718e1f430bf62bf95eb7c850 Mon Sep 17 00:00:00 2001 From: Bruno Alves de Faria Date: Thu, 1 Sep 2016 08:49:36 -0300 Subject: [PATCH] LT-67: Adding validation error tooltips when focusing fields --- Packages/design/styles/components/states.styl | 27 ++++++++++--- .../client/components/base/mixins/formItem.js | 38 +++++++++++++++---- .../client/components/base/mixins/select2.js | 4 +- 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/Packages/design/styles/components/states.styl b/Packages/design/styles/components/states.styl index 78582a0b4..e8fa37fa5 100644 --- a/Packages/design/styles/components/states.styl +++ b/Packages/design/styles/components/states.styl @@ -1,7 +1,24 @@ @import "{design}/app" -.state-error:not(.component-group) - &.form-control, .form-control - theme('background-color', '$uiStateError') - theme('border-color', '$uiStateErrorBorder') - theme('color', '$uiStateErrorText') +.state-error + &+.tooltip + + .tooltip-inner + color: white + theme('background-color', '$uiStateErrorBorder') + + &.top .tooltip-arrow + theme('border-top-color', '$uiStateErrorBorder') + &.right .tooltip-arrow + theme('border-right-color', '$uiStateErrorBorder') + &.bottom .tooltip-arrow + theme('border-bottom-color', '$uiStateErrorBorder') + &.left .tooltip-arrow + theme('border-left-color', '$uiStateErrorBorder') + + + &:not(.component-group) + &.form-control, .form-control + theme('background-color', '$uiStateError') + theme('border-color', '$uiStateErrorBorder') + theme('color', '$uiStateErrorText') diff --git a/Packages/ohif-core/client/components/base/mixins/formItem.js b/Packages/ohif-core/client/components/base/mixins/formItem.js index 1580ebae9..2842e1dab 100644 --- a/Packages/ohif-core/client/components/base/mixins/formItem.js +++ b/Packages/ohif-core/client/components/base/mixins/formItem.js @@ -65,14 +65,25 @@ OHIF.mixins.formItem = new OHIF.Mixin({ // Set or remove the error message if (errorMessage) { - component.$element.trigger('errorin'); component.$wrapper.attr('data-error', errorMessage); } else { - component.$element.trigger('errorout'); component.$wrapper.removeAttr('data-error', errorMessage); } }; + // Toggle the state over the component + component.toggleTooltip = (isShow, message) => { + if (isShow) { + console.warn('>>>>message', message); + component.$wrapper.tooltip({ + trigger: 'manual', + title: message + }).tooltip('show'); + } else { + component.$wrapper.tooltip('destroy'); + } + }; + // Search for the parent form component component.getForm = () => { let currentComponent = component; @@ -184,15 +195,28 @@ OHIF.mixins.formItem = new OHIF.Mixin({ } }, - // TODO: [design] remove log, show error box/hint over the wrapper - errorin(event, instance) { + focus(event, instance) { + const component = instance.component; + + // Prevent event bubbling event.stopPropagation(); - console.log('ERROR when validating component', instance.component); + + // Check for error state and message + const errorMessage = component.$wrapper.attr('data-error'); + if (errorMessage) { + // Show the tooltip with the error message + component.toggleTooltip(true, errorMessage); + } }, - // TODO: [design] hide error box/hint - errorout(event, instance) { + blur(event, instance) { + const component = instance.component; + + // Prevent event bubbling event.stopPropagation(); + + // Hide any tooltips + component.toggleTooltip(false); } } diff --git a/Packages/ohif-core/client/components/base/mixins/select2.js b/Packages/ohif-core/client/components/base/mixins/select2.js index 5630548f4..68453b389 100644 --- a/Packages/ohif-core/client/components/base/mixins/select2.js +++ b/Packages/ohif-core/client/components/base/mixins/select2.js @@ -65,7 +65,9 @@ OHIF.mixins.select2 = new OHIF.Mixin({ }, events: { - 'focus .select2-hidden-accessible'(event, instance) { + 'focusin .select2-hidden-accessible'(event, instance) { + event.preventDefault(); + // Redirect the focus to select2 focus control in case of hidden // accessible being focused (e.g. clicking on outer label) $(event.currentTarget).nextAll('.select2:first').find('.select2-selection').focus();