import StringBuffer from 'discourse/mixins/string-buffer'; import { iconHTML } from 'discourse/helpers/fa-icon'; export default Ember.Component.extend(StringBuffer, { classNameBindings: [':popup-tip', 'good', 'bad', 'shownAt::hide'], animateAttribute: null, bouncePixels: 6, bounceDelay: 100, rerenderTriggers: ['validation.reason'], click() { this.set('shownAt', false); }, good: function() { return !this.get('validation.failed'); }.property('validation'), bad: function() { return this.get('validation.failed'); }.property('validation'), bounce: function() { if( this.get('shownAt') ) { var $elem = this.$(); if( !this.animateAttribute ) { this.animateAttribute = $elem.css('left') === 'auto' ? 'right' : 'left'; } if( this.animateAttribute === 'left' ) { this.bounceLeft($elem); } else { this.bounceRight($elem); } } }.observes('shownAt'), renderString(buffer) { const reason = this.get('validation.reason'); if (!reason) { return; } buffer.push("" + iconHTML('times-circle') + ""); buffer.push(reason); }, bounceLeft($elem) { for( var i = 0; i < 5; i++ ) { $elem.animate({ left: '+=' + this.bouncePixels }, this.bounceDelay).animate({ left: '-=' + this.bouncePixels }, this.bounceDelay); } }, bounceRight($elem) { for( var i = 0; i < 5; i++ ) { $elem.animate({ right: '-=' + this.bouncePixels }, this.bounceDelay).animate({ right: '+=' + this.bouncePixels }, this.bounceDelay); } } });