/* global propertyhive_onboarding */ /** * Property Hive onboarding wizard. */ jQuery( function( $ ) { 'use strict'; var config = window.propertyhive_onboarding || {}; var fallbackSteps = [ 'intro', 'departments', 'country', 'office', 'usage', 'license', 'demo-data', 'complete' ]; var steps = $.isArray( config.steps ) && config.steps.length ? config.steps : fallbackSteps; var $wizard = $( '.ph-onboarding' ); var currentStep = $wizard.data( 'current-step' ) || 'intro'; var demoImported = $wizard.data( 'demo-imported' ) === 'yes'; var demoImporting = false; var licenseActivated = config.license_activated === 'yes'; var licenseActivating = false; var addressLookupTimer = null; var addressLookupXhr = null; var addressGetXhr = null; var fieldControls = { departments: 'input[name="departments[]"]', country: '[data-country-select]', office_name: '[data-office-field="office_name"]', office_address_1: '[data-office-field="office_address_1"]', office_address_2: '[data-office-field="office_address_2"]', office_address_3: '[data-office-field="office_address_3"]', office_address_4: '[data-office-field="office_address_4"]', office_postcode: '[data-office-field="office_postcode"]', office_telephone_number: '[data-office-field="office_telephone_number"]', office_email_address: '[data-office-field="office_email_address"]', usage: 'input[name="usage[]"]', license_key: 'input[name="license_key"]', demo_data_choice: 'input[name="demo_data_choice"]' }; var officeRules = [ { field: 'office_name', maxLength: 120, maxMessage: 'officeNameTooLong' }, { field: 'office_address_1', maxLength: 120, maxMessage: 'officeAddressTooLong' }, { field: 'office_address_2', required: false, maxLength: 120, maxMessage: 'officeAddress2TooLong' }, { field: 'office_address_3', required: false, maxLength: 120, maxMessage: 'officeAddress3TooLong' }, { field: 'office_address_4', required: false, maxLength: 120, maxMessage: 'officeAddress4TooLong' }, { field: 'office_postcode', maxLength: 20, maxMessage: 'officePostcodeTooLong' }, { field: 'office_telephone_number', maxLength: 30, maxMessage: 'officePhoneTooLong' }, { field: 'office_email_address', maxLength: 100, maxMessage: 'officeEmailTooLong' } ]; function getStepIndex( step ) { var index = $.inArray( step, steps ); return index < 0 ? 0 : index; } function selectedValues( name ) { return $( 'input[name="' + name + '[]"]:checked' ).map( function() { return $( this ).val(); } ).get(); } function text( key, fallback ) { return config.i18n && config.i18n[ key ] ? config.i18n[ key ] : fallback; } function fieldSelector( field ) { return '[data-validation-field="' + field + '"]'; } function errorSelector( field ) { return '[data-field-error="' + field + '"]'; } function clearFieldError( field ) { $( fieldSelector( field ) ).removeClass( 'has-error' ); $( errorSelector( field ) ).text( '' ).hide(); if ( fieldControls[ field ] ) { $( fieldControls[ field ] ).removeAttr( 'aria-invalid' ); } } function setFieldError( field, message ) { var $field = $( fieldSelector( field ) ); var $error = $( errorSelector( field ) ); if ( ! $field.length || ! $error.length ) { return; } $field.addClass( 'has-error' ); $error.text( message ).css( 'display', 'block' ); if ( fieldControls[ field ] ) { $( fieldControls[ field ] ).attr( 'aria-invalid', 'true' ); } } function clearValidation( step ) { var $scope = step ? $( '.ph-onboarding__panel[data-step="' + step + '"]' ) : $wizard; $scope.find( '[data-validation-field]' ).removeClass( 'has-error' ); $scope.find( '[data-field-error]' ).text( '' ).hide(); $scope.find( '[aria-invalid="true"]' ).removeAttr( 'aria-invalid' ); } function applyFieldErrors( errors ) { var firstMessage = ''; var firstField = ''; if ( ! errors ) { return ''; } $.each( errors, function( field, message ) { if ( ! firstMessage ) { firstMessage = message; firstField = field; } setFieldError( field, message ); } ); if ( firstField && fieldControls[ firstField ] ) { $( fieldControls[ firstField ] ).first().trigger( 'focus' ); } return firstMessage; } function fieldValue( field ) { return $.trim( $( fieldControls[ field ] ).val() || '' ); } function isValidEmail( value ) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test( value ); } function isValidPhone( value ) { var digits = value.replace( /\D+/g, '' ); return digits.length >= 7 && /^[0-9+\-\s().]+$/.test( value ); } function setMessage( message, type ) { var $message = $( '[data-message]' ); $message.removeClass( 'is-error is-success' ); if ( ! message ) { $message.text( '' ).hide(); return; } $message.addClass( type === 'error' ? 'is-error' : 'is-success' ).text( message ).show(); } function setAddressStatus( message, type ) { var $status = $( '[data-address-lookup-status]' ); $status.removeClass( 'is-error is-success' ); if ( ! message ) { $status.text( '' ).hide(); return; } $status.addClass( type === 'error' ? 'is-error' : 'is-success' ).text( message ).show(); } function clearAddressResults() { $( '[data-address-lookup-results]' ).empty().prop( 'hidden', true ); } function renderAddressSuggestions( suggestions ) { var $results = $( '[data-address-lookup-results]' ); $results.empty(); if ( ! suggestions || ! suggestions.length ) { clearAddressResults(); setAddressStatus( text( 'addressLookupNoResults', 'No matching addresses found.' ), 'error' ); return; } $.each( suggestions, function( index, suggestion ) { if ( ! suggestion.id || ! suggestion.address ) { return; } $( '