// Register eslint ignored glabals - to be revisited. // https://github.com/woocommerce/automatewoo/issues/1212 /* global _, automatewooValidateLocalizedErrorMessages, AW, tinyMCE */ /** * Workflow field validator */ ( function ( $, localizedErrorMessages ) { const self = { errorMessages: {}, init() { setInterval( function () { if ( typeof tinyMCE !== 'undefined' ) { tinyMCE.triggerSave(); } $( '.automatewoo-field-wrap textarea.wp-editor-area' ).each( function () { $( this ).attr( 'data-automatewoo-validate', 'variables' ); self.validateField( $( this ) ); } ); }, 2000 ); $( document.body ).on( 'keyup blur change', '[data-automatewoo-validate]', function ( event ) { self.validateField( $( event.target ) ); } ); self.validateAllFields(); }, validateAllFields() { $( '[data-automatewoo-validate]' ).each( function () { self.validateField( $( this ) ); } ); }, validateField( $field ) { if ( ! AW.workflow ) { return; } const errors = []; const text = $field.val(); self.clearFieldErrors( $field ); const usedVariables = AW.Validate.getVariablesFromText( text ); if ( self.fieldSupports( 'variables', $field ) ) { const trigger = AW.workflow.get( 'trigger' ); _.each( usedVariables, function ( variable ) { const valid = self.isVariableValidForTrigger( variable, trigger ); if ( valid !== true ) { errors.push( self.getErrorMessage( valid, self.getVariableWithoutParams( variable ) ) ); } } ); } else if ( usedVariables ) { errors.push( self.getErrorMessage( 'noVariablesSupport' ) ); } if ( errors.length ) { self.setFieldErrors( $field, errors ); } }, setFieldErrors( $field, errors ) { $field.addClass( 'automatewoo-field--invalid' ); const $wrap = $field.parents( '.automatewoo-field-wrap:first' ); $wrap.append( '
' ); const $errors = $wrap.find( '.automatewoo-field-errors' ); if ( $field.is( '.wp-editor-area' ) ) { $wrap .find( '.wp-editor-container' ) .addClass( 'automatewoo-field--invalid' ); } _.each( errors, function ( error ) { $errors.append( '
' + error + '
' ); } ); }, clearFieldErrors( $field ) { const $wrap = $field.parents( '.automatewoo-field-wrap:first' ); $field.removeClass( 'automatewoo-field--invalid' ); if ( $field.is( '.wp-editor-area' ) ) { $wrap .find( '.wp-editor-container' ) .removeClass( 'automatewoo-field--invalid' ); } $wrap.find( '.automatewoo-field-errors' ).remove(); }, fieldSupports( option, $field ) { const options = $field.data( 'automatewoo-validate' ).split( ' ' ); return _.indexOf( options, option ) !== -1; }, /** * @param {string} variable * @param {Object} trigger Workflow trigger. * @return {boolean|string} `true` if valid, validation error otherwise. */ isVariableValidForTrigger( variable, trigger ) { if ( ! trigger ) { return 'noTrigger'; } const dataType = self.getDataTypeFromVariable( variable ); if ( dataType && _.indexOf( trigger.supplied_data_items, dataType ) === -1 ) { return 'invalidDataType'; } const dataField = self.getDataFieldFromVariable( variable ); const variables = AW.workflow.get( 'variables' ); if ( variables && variables[ dataType ] ) { if ( variables[ dataType ].indexOf( dataField ) === -1 ) { return 'invalidVariable'; } } return true; }, /** * Extract variables from a text field * * @param {string} text * @return {Array|false} Array of variables, or `false` if none. */ getVariablesFromText( text ) { const variables = text.match( /{{(.*?)}}/g ); if ( ! variables ) { return false; } _.each( variables, function ( variable, i ) { variables[ i ] = variable.replace( /{|}/g, '' ).trim(); } ); return variables; }, getVariableWithoutParams( variable ) { return variable.replace( /(\|.*)/, '' ); }, /** * @param {string} variable */ getDataTypeFromVariable( variable ) { if ( variable.indexOf( '.' ) === -1 ) { return false; } return variable.replace( /(\..*)/, '' ); }, /** * @param {string} variable */ getDataFieldFromVariable( variable ) { variable = self.getVariableWithoutParams( variable ); const dotpos = variable.indexOf( '.' ); if ( dotpos === -1 ) { return false; } return variable.substring( dotpos + 1 ).trim(); }, getErrorMessage( error, replace ) { if ( ! self.errorMessages[ error ] ) { return 'Unknown error, please try refreshing your browser.'; } let message = self.errorMessages[ error ]; if ( typeof replace === 'string' ) { message = message.replace( '%s', replace ); } return message; }, }; AW.Validate = self; self.errorMessages = localizedErrorMessages; } )( jQuery, automatewooValidateLocalizedErrorMessages );