var tribe_dropdowns = window.tribe_dropdowns || {}; ( function( $, obj, _ ) { 'use strict'; obj.selector = { dropdown: '.tribe-dropdown', created: '.tribe-dropdown-created', searchField: '.select2-search__field', }; // Setup a Dependent $.fn.tribe_dropdowns = function() { obj.dropdown( this, {} ); return this; }; obj.freefrom_create_search_choice = function( params ) { if ( 'string' !== typeof params.term ) { return null; } var term = params.term.trim(); if ( '' === term ) { return null; } var args = this.options.options; var $select = args.$select; if ( term.match( args.regexToken ) && ( ! $select.is( '[data-int]' ) || ( $select.is( '[data-int]' ) && term.match( /\d+/ ) ) ) ) { var choice = { id: term, text: term, new: true }; if ( $select.is( '[data-create-choice-template]' ) ) { choice.text = _.template( $select.data( 'createChoiceTemplate' ) )( { term: term } ); } return choice; } return null; }; /** * Better Search ID for Select2, compatible with WordPress ID from WP_Query * * @param {object|string} e Searched object or the actual ID * @return {string} ID of the object */ obj.search_id = function( e ) { var id = undefined; if ( 'undefined' !== typeof e.id ) { id = e.id; } else if ( 'undefined' !== typeof e.ID ) { id = e.ID; } else if ( 'undefined' !== typeof e.value ) { id = e.value; } return undefined === e ? undefined : id; }; /** * Better way of matching results * * @param {string} term Which term we are searching for * @param {string} text Search here * @return {boolean} */ obj.matcher = function( params, data ) { // If there are no search terms, return all of the data if ( 'string' !== typeof params.term || params.term.trim() === '') { return data; } // Do not display the item if there is no 'text' property if ( typeof data.text === 'undefined' ) { return null; } var term = params.term.trim(); var text = data.text; var $select = $( data.element ).closest( 'select' ); var args = $select.data( 'dropdown' ); var result = text.toUpperCase().indexOf( term.toUpperCase() ) !== -1; if ( ! result && 'undefined' !== typeof args.tags ){ var possible = _.where( args.tags, { text: text } ); if ( args.tags.length > 0 && _.isObject( possible ) ){ var test_value = obj.search_id( possible[0] ); result = test_value.toUpperCase().indexOf( term.toUpperCase() ) !== -1; } } return result; }; /** * If the element used as the basis of a dropdown specifies one or more numeric/text * identifiers in its val attribute, then use those to preselect the appropriate options. * * @param {object} $select * @param {function} make_selection */ obj.init_selection = function( $select, make_selection ) { var isMultiple = $select.is( '[multiple]' ); var options = $select.data( 'dropdown' ); var currentValues = $select.val().split( options.regexSplit ); var selectedItems = []; $( currentValues ).each( function( index, value ) { // eslint-disable-line no-unused-vars var searchFor = { id: this, text: this }; var data = options.ajax ? $select.data( 'options' ) : options.data; var locatedItem = find_item( searchFor, data ); if ( locatedItem && locatedItem.selected ) { selectedItems.push( locatedItem ); } } ); if ( selectedItems.length && isMultiple ) { make_selection( selectedItems ); } else if ( selectedItems.length ) { make_selection( selectedItems[ 0 ] ); } else { make_selection( false ); return; } }; /** * Searches array 'haystack' for objects that match 'description'. * * The 'description' object should take the form { id: number, text: string }. The first * object within the haystack that matches one of those two properties will be returned. * * If objects contain an array named 'children', then that array will also be searched. * * @param {Object} description * @param {Array} haystack * * @return {Object|boolean} */ function find_item( description, haystack ) { if ( ! _.isArray( haystack ) ) { return false; } for ( var index in haystack ) { var possible_match = haystack[ index ]; if ( possible_match.hasOwnProperty( 'id' ) && possible_match.id == description.id ) { // eslint-disable-line no-prototype-builtins,eqeqeq,max-len return possible_match; } if ( possible_match.hasOwnProperty( 'text' ) && possible_match.text == description.text ) { // eslint-disable-line no-prototype-builtins,eqeqeq,max-len return possible_match; } if ( possible_match.hasOwnProperty( 'children' ) && _.isArray( possible_match.children ) ) { // eslint-disable-line no-prototype-builtins,max-len var subsearch = find_item( description, possible_match.children ); if ( subsearch ) { return subsearch; } } } return false; } obj.getSelectClasses = function( $select ) { var classesToRemove = [ 'select2-hidden-accessible', 'hide-before-select2-init', ]; var originalClasses = $select.attr( 'class' ).split( /\s+/ ); return _.difference( originalClasses, classesToRemove ); }; obj.element = function( field, args ) { var $select = $( field ); var args = $.extend( {}, args ); // eslint-disable-line no-redeclare var carryOverData = [ // eslint-disable-line no-unused-vars 'depends', 'condition', 'conditionNot', 'condition-not', 'conditionNotEmpty', 'condition-not-empty', 'conditionEmpty', 'condition-empty', 'conditionIsNumeric', 'condition-is-numeric', 'conditionIsNotNumeric', 'condition-is-not-numeric', 'conditionChecked', 'condition-is-checked', ]; var $container; // Add a class for dropdown created $select.addClass( obj.selector.created.className() ); // args.debug = true; // For Reference we save the jQuery element as an Arg. args.$select = $select; // Auto define the Width of the Select2. args.dropdownAutoWidth = true; args.width = 'resolve'; // CSS for the container args.containerCss = {}; // Only apply visibility when it's a Visible Select2. if ( $select.is( ':visible' ) ) { args.containerCss.display = 'inline-block'; args.containerCss.position = 'relative'; } // CSS for the dropdown args.dropdownCss = {}; args.dropdownCss.width = 'auto'; // When we have this we replace the default with what's in the param. if ( $select.is( '[data-dropdown-css-width]' ) ) { args.dropdownCss.width = $select.data( 'dropdown-css-width' ); if ( ! args.dropdownCss.width || 'false' === args.dropdownCss.width ) { delete args.dropdownCss.width; delete args.containerCss; } } // By default we allow The field to be cleared args.allowClear = true; if ( $select.is( '[data-prevent-clear]' ) ) { args.allowClear = false; } // Pass the "Searching..." placeholder if specified if ( $select.is( '[data-searching-placeholder]' ) ) { args.formatSearching = $select.data( 'searching-placeholder' ); } // If we are dealing with a Input Hidden we need to set the Data for it to work if ( ! $select.is( '[data-placeholder]' ) && $select.is( '[placeholder]' ) ) { args.placeholder = $select.attr( 'placeholder' ); } // If we are dealing with a Input Hidden we need to set the Data for it to work. if ( $select.is( '[data-options]' ) ) { args.data = $select.data( 'options' ); } // With less then 10 args we wouldn't show the search. args.minimumResultsForSearch = 10; // Prevents the Search box to show if ( $select.is( '[data-hide-search]' ) ) { args.minimumResultsForSearch = Infinity; } // Makes sure search shows up. if ( $select.is( '[data-force-search]' ) ) { delete args.minimumResultsForSearch; } // Allows freeform entry if ( $select.is( '[data-freeform]' ) ) { args.createTag = obj.freefrom_create_search_choice; args.tags = true; $select.data( 'tags', true ); } if ( $select.is( '[multiple]' ) ) { args.multiple = true; // Set the max select items, if defined if ( $select.is( '[data-maximum-selection-size]' ) ) { args.maximumSelectionSize = $select.data( 'maximum-selection-size' ); } // If you don't have separator, add one (comma) if ( ! $select.is( 'data-separator' ) ) { $select.data( 'separator', ',' ); } if ( ! _.isArray( $select.data( 'separator' ) ) ) { args.tokenSeparators = [ $select.data( 'separator' ) ]; } else { args.tokenSeparators = $select.data( 'separator' ); } args.separator = $select.data( 'separator' ); // Define the regular Exp based on args.regexSeparatorElements = [ '^(' ]; args.regexSplitElements = [ '(?:' ]; $.each( args.tokenSeparators, function ( i, token ) { args.regexSeparatorElements.push( '[^' + token + ']+' ); args.regexSplitElements.push( '[' + token + ']' ); } ); args.regexSeparatorElements.push( ')$' ); args.regexSplitElements.push( ')' ); args.regexSeparatorString = args.regexSeparatorElements.join( '' ); args.regexSplitString = args.regexSplitElements.join( '' ); args.regexToken = new RegExp( args.regexSeparatorString, 'ig' ); args.regexSplit = new RegExp( args.regexSplitString, 'ig' ); } // Select also allows Tags, so we go with that too if ( $select.is( '[data-tags]' ) ) { args.tags = $select.data( 'tags' ); args.createSearchChoice = function( term, data ) { // eslint-disable-line no-unused-vars if ( term.match( args.regexToken ) ) { return { id: term, text: term }; } }; if ( 0 === args.tags.length ) { args.formatNoMatches = function() { return $select.attr( 'placeholder' ); }; } } // When we have a source, we do an AJAX call if ( $select.is( '[data-source]' ) ) { var source = $select.data( 'source' ); // For AJAX we reset the data args.data = { results: [] }; // Format for Parents breadcrumbs args.formatResult = function ( item, container, query ) { // eslint-disable-line no-unused-vars,max-len if ( 'undefined' !== typeof item.breadcrumbs ) { return $.merge( item.breadcrumbs, [ item.text ] ).join( ' » ' ); } return item.text; }; // instead of writing the function to execute the request we use Select2's convenient helper. args.ajax = { dataType: 'json', type: 'POST', url: obj.ajaxurl(), // parse the results into the format expected by Select2. processResults: function ( response, page, query ) { // eslint-disable-line no-unused-vars if ( ! $.isPlainObject( response ) || 'undefined' === typeof response.success ) { console.error( 'We received a malformed Object, could not complete the Select2 Search.' ); // eslint-disable-line max-len return { results: [] }; } if ( ! $.isPlainObject( response.data ) || 'undefined' === typeof response.data.results ) { console.error( 'We received a malformed results array, could not complete the Select2 Search.' ); // eslint-disable-line max-len return { results: [] }; } if ( ! response.success ) { if ( 'string' === $.type( response.data.message ) ) { console.error( response.data.message ); } else { console.error( 'The Select2 search failed in some way... Verify the source.' ); } return { results: [] }; } return response.data; }, }; // By default only send the source args.ajax.data = function( search, page ) { return { action: 'tribe_dropdown', source: source, search: search, page: page, args: $select.data( 'source-args' ), }; }; } // Attach dropdown to container in DOM. if ( $select.is( '[data-attach-container]' ) ) { // If multiple, attach container without search. if ( $select.is( '[multiple]' ) ) { $.fn.select2.amd.define( 'AttachedDropdownAdapter', [ 'select2/utils', 'select2/dropdown', 'select2/dropdown/attachContainer', ], function( utils, dropdown, attachContainer ) { return utils.Decorate( dropdown, attachContainer ); } ); args.dropdownAdapter = $.fn.select2.amd.require( 'AttachedDropdownAdapter' ); // If not multiple, attach container with search. } else { $.fn.select2.amd.define( 'AttachedWithSearchDropdownAdapter', [ 'select2/utils', 'select2/dropdown', 'select2/dropdown/search', 'select2/dropdown/minimumResultsForSearch', 'select2/dropdown/attachContainer', ], function( utils, dropdown, search, minimumResultsForSearch, attachContainer ) { var adapter = utils.Decorate( dropdown, attachContainer ); adapter = utils.Decorate( adapter, search ); adapter = utils.Decorate( adapter, minimumResultsForSearch ); return adapter; } ); args.dropdownAdapter = $.fn.select2.amd.require( 'AttachedWithSearchDropdownAdapter' ); } } // Save data on Dropdown $select.data( 'dropdown', args ); $container = $select.select2TEC( args ); // Propagating original input classes to the select2 container. $container.data( 'select2' ).$container.addClass( obj.getSelectClasses( $select ).join( ' ' ) ); // Propagating original input classes to the select2 container. $container.data( 'select2' ).$container.removeClass( 'hide-before-select2-init' ); $container.on( 'select2:open', obj.action_select2_open ); /** * @todo @bordoni Investigate how and if we should be doing this. * if ( carryOverData.length > 0 ) { carryOverData.map( function( dataKey ) { var attr = 'data-' + dataKey; var val = $select.attr( attr ); if ( ! val ) { return; } this.attr( attr, val ); }, $container ); } */ }; obj.ajaxurl = function() { if ( 'undefined' !== typeof window.ajaxurl ) { return window.ajaxurl; } if ( 'undefined' !== typeof TEC && 'undefined' !== typeof TEC.ajaxurl ) { return TEC.ajaxurl; } console.error( 'Dropdowns framework cannot properly do an AJAX request without the WordPress `ajaxurl` variable setup.' ); // eslint-disable-line max-len }; obj.action_select2_open = function( event ) { // eslint-disable-line no-unused-vars var $select = $( this ); var select2Data = $select.data( 'select2' ); var $search = select2Data.$dropdown.find( obj.selector.searchField ); // eslint-disable-line es5/no-es6-methods,max-len select2Data.$dropdown.addClass( obj.selector.dropdown.className() ); // If we have a placeholder for search, apply it! if ( $select.is( '[data-search-placeholder]' ) ) { $search.attr( 'placeholder', $select.data( 'searchPlaceholder' ) ); } }; /** * Configure the Drop Down Fields * * @param {jQuery} $fields All the fields from the page * @param {array} args Allow extending the arguments * * @return {jQuery} Affected fields */ obj.dropdown = function( $fields, args ) { var $elements = $fields.not( '.select2-offscreen, .select2-container, ' + obj.selector.created.className() ); // eslint-disable-line max-len if ( 0 === $elements.length ) { return $elements; } // Default args to avoid Undefined if ( ! args ) { args = {}; } $elements .each( function( index, element ) { // Apply element to all given items and pass args obj.element( element, args ); } ); // return to be able to chain jQuery calls return $elements; }; $( function() { $( obj.selector.dropdown ).tribe_dropdowns(); } ); // Addresses some problems with Select2 inputs not being initialized when using a browser's "Back" button. $( window ).on( 'unload', function() { $( obj.selector.dropdown ).tribe_dropdowns(); }); } )( jQuery, tribe_dropdowns, window.underscore || window._ ); /*! elementor-pro - v3.5.1 - 10-11-2021 */ .elementor-cta,.elementor-widget-call-to-action .elementor-widget-container{overflow:hidden}.elementor-cta{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-transition:.5s;-o-transition:.5s;transition:.5s}.elementor-cta--skin-classic .elementor-cta{-ms-flex-wrap:wrap;flex-wrap:wrap}.elementor-cta--skin-classic .elementor-cta__bg-wrapper{position:relative;min-height:200px;width:100%}.elementor-cta--skin-classic .elementor-cta__content{-webkit-transition:all .4s;-o-transition:all .4s;transition:all .4s;width:100%;background-color:#f7f7f7}.elementor-cta--skin-classic .elementor-cta__content-item,.elementor-cta--skin-classic .elementor-cta__content-item .elementor-icon{color:#55595c;border-color:#55595c;fill:#55595c}.elementor-cta--skin-classic .elementor-cta__button.elementor-button{color:#55595c;border-color:#55595c}.elementor-cta--skin-cover .elementor-cta{display:block}.elementor-cta--skin-cover .elementor-cta__bg-wrapper{position:absolute;top:0;left:0;right:0;bottom:0;-webkit-transition:all .4s;-o-transition:all .4s;transition:all .4s;width:100%}.elementor-cta--skin-cover .elementor-cta__content{min-height:280px}.elementor-cta--skin-cover .elementor-cta__button.elementor-button,.elementor-cta--skin-cover .elementor-cta__content-item,.elementor-cta--skin-cover .elementor-cta__content-item .elementor-icon{color:#fff;border-color:#fff}.elementor-cta--layout-image-above .elementor-cta{-ms-flex-wrap:wrap;flex-wrap:wrap}.elementor-cta--layout-image-above .elementor-cta__bg-wrapper{width:100%}.elementor-cta--layout-image-left .elementor-cta,.elementor-cta--layout-image-right .elementor-cta{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.elementor-cta--layout-image-left .elementor-cta__bg-wrapper,.elementor-cta--layout-image-right .elementor-cta__bg-wrapper{width:auto;min-width:50%}.elementor-cta--layout-image-left .elementor-cta__content,.elementor-cta--layout-image-right .elementor-cta__content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.elementor-cta--layout-image-left .elementor-cta{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.elementor-cta--layout-image-right .elementor-cta{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.elementor-cta__bg,.elementor-cta__bg-overlay{position:absolute;top:0;left:0;right:0;bottom:0;-webkit-transition:all .4s;-o-transition:all .4s;transition:all .4s}.elementor-cta__bg-wrapper{z-index:1;overflow:hidden}.elementor-cta__bg{-webkit-background-size:cover;background-size:cover;background-position:50%;z-index:1}.elementor-cta__bg-overlay{z-index:2}.elementor-cta__button.elementor-button{cursor:pointer;-ms-flex-item-align:center;align-self:center;margin-left:auto;margin-right:auto;border:2px solid #fff;background:transparent}.elementor-cta__button.elementor-button:hover{background:transparent;text-decoration:none}.elementor-cta__title{font-size:23px}.elementor-cta__content{z-index:1;overflow:hidden;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center;padding:35px;width:100%}.elementor-cta__content,.elementor-cta__content-item{position:relative;-webkit-transition:.5s;-o-transition:.5s;transition:.5s;color:#fff}.elementor-cta__content-item{width:100%;margin:0}.elementor-cta__content-item:not(:last-child){margin-bottom:15px}.elementor-cta__content-item .elementor-icon{color:#fff}.elementor-cta--valign-top .elementor-cta__content{-ms-flex-line-pack:start;align-content:flex-start;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.elementor-cta--valign-middle .elementor-cta__content{-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.elementor-cta--valign-bottom .elementor-cta__content{-ms-flex-line-pack:end;align-content:flex-end;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.elementor-cta:hover .elementor-cta__bg-overlay{background-color:rgba(0,0,0,.3)}@media (max-device-width:1024px){.elementor-cta{cursor:pointer}}@media (min-width:-1px){.elementor-cta--widescreen-layout-image-above .elementor-cta{-ms-flex-wrap:wrap;flex-wrap:wrap}.elementor-cta--widescreen-layout-image-above .elementor-cta__bg-wrapper{width:100%}.elementor-cta--widescreen-layout-image-left .elementor-cta,.elementor-cta--widescreen-layout-image-right .elementor-cta{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.elementor-cta--widescreen-layout-image-left .elementor-cta__bg-wrapper,.elementor-cta--widescreen-layout-image-right .elementor-cta__bg-wrapper{width:auto;min-width:50%}.elementor-cta--widescreen-layout-image-left .elementor-cta__content,.elementor-cta--widescreen-layout-image-right .elementor-cta__content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.elementor-cta--widescreen-layout-image-left .elementor-cta{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.elementor-cta--widescreen-layout-image-right .elementor-cta{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}}@media (max-width:-1px){.elementor-cta--laptop-layout-image-above .elementor-cta{-ms-flex-wrap:wrap;flex-wrap:wrap}.elementor-cta--laptop-layout-image-above .elementor-cta__bg-wrapper{width:100%}.elementor-cta--laptop-layout-image-left .elementor-cta,.elementor-cta--laptop-layout-image-right .elementor-cta{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.elementor-cta--laptop-layout-image-left .elementor-cta__bg-wrapper,.elementor-cta--laptop-layout-image-right .elementor-cta__bg-wrapper{width:auto;min-width:50%}.elementor-cta--laptop-layout-image-left .elementor-cta__content,.elementor-cta--laptop-layout-image-right .elementor-cta__content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.elementor-cta--laptop-layout-image-left .elementor-cta{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.elementor-cta--laptop-layout-image-right .elementor-cta{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}}@media (max-width:-1px){.elementor-cta--tablet_extra-layout-image-above .elementor-cta{-ms-flex-wrap:wrap;flex-wrap:wrap}.elementor-cta--tablet_extra-layout-image-above .elementor-cta__bg-wrapper{width:100%}.elementor-cta--tablet_extra-layout-image-left .elementor-cta,.elementor-cta--tablet_extra-layout-image-right .elementor-cta{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.elementor-cta--tablet_extra-layout-image-left .elementor-cta__bg-wrapper,.elementor-cta--tablet_extra-layout-image-right .elementor-cta__bg-wrapper{width:auto;min-width:50%}.elementor-cta--tablet_extra-layout-image-left .elementor-cta__content,.elementor-cta--tablet_extra-layout-image-right .elementor-cta__content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.elementor-cta--tablet_extra-layout-image-left .elementor-cta{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.elementor-cta--tablet_extra-layout-image-right .elementor-cta{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}}@media (max-width:1024px){.elementor-cta--tablet-layout-image-above .elementor-cta{-ms-flex-wrap:wrap;flex-wrap:wrap}.elementor-cta--tablet-layout-image-above .elementor-cta__bg-wrapper{width:100%}.elementor-cta--tablet-layout-image-left .elementor-cta,.elementor-cta--tablet-layout-image-right .elementor-cta{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.elementor-cta--tablet-layout-image-left .elementor-cta__bg-wrapper,.elementor-cta--tablet-layout-image-right .elementor-cta__bg-wrapper{width:auto;min-width:50%}.elementor-cta--tablet-layout-image-left .elementor-cta__content,.elementor-cta--tablet-layout-image-right .elementor-cta__content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.elementor-cta--tablet-layout-image-left .elementor-cta{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.elementor-cta--tablet-layout-image-right .elementor-cta{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}}@media (max-width:-1px){.elementor-cta--mobile_extra-layout-image-above .elementor-cta{-ms-flex-wrap:wrap;flex-wrap:wrap}.elementor-cta--mobile_extra-layout-image-above .elementor-cta__bg-wrapper{width:100%}.elementor-cta--mobile_extra-layout-image-left .elementor-cta,.elementor-cta--mobile_extra-layout-image-right .elementor-cta{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.elementor-cta--mobile_extra-layout-image-left .elementor-cta__bg-wrapper,.elementor-cta--mobile_extra-layout-image-right .elementor-cta__bg-wrapper{width:auto;min-width:50%}.elementor-cta--mobile_extra-layout-image-left .elementor-cta__content,.elementor-cta--mobile_extra-layout-image-right .elementor-cta__content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.elementor-cta--mobile_extra-layout-image-left .elementor-cta{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.elementor-cta--mobile_extra-layout-image-right .elementor-cta{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}}@media (max-width:767px){.elementor-cta--mobile-layout-image-above .elementor-cta{-ms-flex-wrap:wrap;flex-wrap:wrap}.elementor-cta--mobile-layout-image-above .elementor-cta__bg-wrapper{width:100%}.elementor-cta--mobile-layout-image-left .elementor-cta,.elementor-cta--mobile-layout-image-right .elementor-cta{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.elementor-cta--mobile-layout-image-left .elementor-cta__bg-wrapper,.elementor-cta--mobile-layout-image-right .elementor-cta__bg-wrapper{width:auto;min-width:50%}.elementor-cta--mobile-layout-image-left .elementor-cta__content,.elementor-cta--mobile-layout-image-right .elementor-cta__content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.elementor-cta--mobile-layout-image-left .elementor-cta{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.elementor-cta--mobile-layout-image-right .elementor-cta{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}}.elementor-ribbon{position:absolute;z-index:1;top:0;left:0;right:auto;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);width:150px;overflow:hidden;height:150px}.elementor-ribbon-inner{text-align:center;left:0;width:200%;-webkit-transform:translateY(-50%) translateX(0) translateX(35px) rotate(-45deg);-ms-transform:translateY(-50%) translateX(0) translateX(35px) rotate(-45deg);transform:translateY(-50%) translateX(0) translateX(35px) rotate(-45deg);margin-top:35px;font-size:13px;line-height:2;font-weight:800;text-transform:uppercase;background:#000;color:#fff}.elementor-ribbon.elementor-ribbon-left{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);left:0;right:auto}.elementor-ribbon.elementor-ribbon-right{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);left:auto;right:0}
Warning: Cannot modify header information - headers already sent by (output started at /home1/brighdbt/public_html/premills.com/wp-content/plugins/svg-support/functions/thumbnail-display.php:1) in /home1/brighdbt/public_html/premills.com/wp-includes/feed-rss2.php on line 8
IT Образование Archives - premier mills https://www.premills.com/category/it-obrazovanie-2/ Fri, 16 May 2025 15:29:53 +0000 en-US hourly 1 https://wordpress.org/?v=6.8.1 https://www.premills.com/wp-content/uploads/2021/08/PM_No.1_Favicon-01.png IT Образование Archives - premier mills https://www.premills.com/category/it-obrazovanie-2/ 32 32 Сайт На WordPress: Преимущества И Недостатки https://www.premills.com/sajt-na-wordpress-preimushhestva-i-nedostatki/ https://www.premills.com/sajt-na-wordpress-preimushhestva-i-nedostatki/#respond Mon, 12 May 2025 18:57:25 +0000 https://www.premills.com/?p=3604 Это разные вещи, в и данной статье мы рассмотрим именно CMS. Учитывая все описанные плюсы и минусы Вордпресс, вы можете определить, подойдет ли вашему ресурсу этот движок. Мы уже разбирали, как подобрать качественную тему WordPress для блога. Также желательно пользоваться проверенными дополнениями, чтобы ваш сайт работал исправно и без ошибок. И перед установкой шаблона, нужно […]

The post Сайт На WordPress: Преимущества И Недостатки appeared first on premier mills.

]]>
Это разные вещи, в и данной статье мы рассмотрим именно CMS. Учитывая все описанные плюсы и минусы Вордпресс, вы можете определить, подойдет ли вашему ресурсу этот движок. Мы уже разбирали, как подобрать качественную тему WordPress для блога. Также желательно пользоваться проверенными дополнениями, чтобы ваш сайт работал исправно и без ошибок. И перед установкой шаблона, нужно проверить его плагином TAC. Сегодня попытаемся разобраться с преимуществами и недостатками WordPress.

Также движок Вордпресс при загрузке картинок создает их копии разных размеров. Для удаления ненужных картинок используйте плагин DNUI (Delete not used image). Подключение большого количества плагинов действительно может отразиться на производительности ресурса — он может начать работать медленнее. Поэтому не забывайте отключать ненужные плагины и следить за их актуальностью.

Seo-оптимизация Требует Знаний И Навыков

преимущества и недостатки WordPress

Для этого не нужны навыки программирования и управления сайтом, владельцы сайтов или блогеры сами могут редактировать и поддерживать свой ресурс. Из Методология программирования этого следует, что нет нужды в тратах на веб-разработчиков и дизайнеров. Ещё одна сильная сторона LAMP — глубокая интеграция с устаревшими проектами. Это упрощает отладку, но требует внимания к настройке памяти. Совместимость тем и плагинов не гарантируется.Многие полезные темы и плагины часто пишут сторонние разработчики — это может быть как плюсом, так и минусом. Минус в том, что не все эти дополнения совместимы друг с другом и не все остаются доступными при изменениях в самом движке.

В заключение следует отметить, что WordPress — это мощный инструмент для создания и управления сайтами, но он также имеет свой набор преимуществ и недостатков. Понимая и устраняя его недостатки, владельцы сайтов смогут в полной мере воспользоваться его преимуществами и создать успешное присутствие в Интернете. Он широко распространен, прост в установке и управлении и поставляется с большим количеством тем и плагинов для настройки сайта. Однако, как и у любой другой платформы, у использования WordPress есть свои плюсы и минусы.

Какие Достоинства И Недостатки У WordPress

Хотя WordPress регулярно обновляется, безопасность остается важной проблемой. Из-за своей популярности платформа часто становится мишенью для хакеров. Использование сильных паролей, регулярные резервные копии и установка плагинов безопасности могут помочь защитить сайт. В этой статье мы приведем положительные и отрицательные стороны CMS WordPress. Это даст представление об эффективности данной системы для вашего бизнеса. Согласно исследованиям, WordPress используется на более чем 30% популярных сайтов.

Сила WordPress выходит за пределы его функций и заключается в его крепком сообществе. Эта живая и сотрудничающая группа включает разработчиков, пользователей и энтузиастов, постоянно вносящих свой вклад в развитие и совершенствование платформы. Участники активно обсуждают, делятся инсайтами и решают проблемы через разные форумы и онлайн-сообщества. Существует множество доступных ресурсов, включая учебные материалы, пособия и блоги, что служит свидетельством комплексной системы поддержки, которую предлагае WordPress. Этот общий опыт обеспечивает то, что почти любую проблему, с которой вы сталкиваетесь во время использования WordPress, можно решить немедленно.

Например, различные плагины для адаптации сайта к задачам проекта или инструменты SEO-продвижения в Google и Яндекс. ✨ Content Administration System (CMS) – система управления контентом. Это программа, которая работает на сервере в интернет (хостинге) и позволяет управлять содержимым сайта через админ-панель. Проблемы с производительностью могут возникнуть в WordPress, если сайт не верно кодируется или оптимизируется. Плохо написанный код может существенно повлиять на скорость и реагирование вашего веб-сайта, приводя к медленным временам загрузки и менее идеального пользовательского опыта. Кроме того, злоупотребление плагинами и нетяжелыми неоптимизированными изображениями также может способствовать снижению производительности.

WordPresscom И WordPressorg – Разница

преимущества и недостатки WordPress

Как только вы начнёте искать о ней отзывы и обзоры, вы сразу поймёте, что это чуть ли не идеальная система для разработки сайта новичку и для дальнейшего профессионального cms wordpress что это роста. То, что отличает WordPress, – это его модульная экосистема, позволяющая настраивать и расширять. С тысячами плагинов в вашем распоряжении мы можем быстро и эффективно добавлять дополнительные возможности по уменьшенным ресурсам и затратам. Кроме того, как открытая платформа, она может похвастаться живым сообществом пользователей и разработчиков, постоянно инновирующих и расширяющих пределы того, что может делать WordPress. На Вордпрессе можно создать интернет-магазин с помощью специальных плагинов, либо более сложные сайты с дополнительными возможностями.

преимущества и недостатки WordPress

Важно учитывать эти моменты при выборе WordPress для вашего бизнеса и правильно настроить сайт для максимальной безопасности и производительности. WordPress, хотя и имеет обширный функционал, к сожалению, не неприязнен к угрозам безопасности. Его популярность – это двусмысленный меч, который привлекает многих хакеров и злоумышленников. Как открытая платформа, код доступен для любого для тщательного изучения, включая тех, кто имеет злое намерение, что делает сайты уязвимыми перед потенциальными атаками.

  • Так что знайте, бесплатные хостинги — плохо, но это уже другая история.
  • Однако, как и у любой другой платформы, у использования WordPress есть свои плюсы и минусы.
  • «Медиафайлы» позволяют загружать и редактировать изображения и видеозаписи.
  • И сразу же после этого можно начать пользоваться системой полноценно.

Он гибкий, настраиваемый и широко поддерживается большим сообществом разработчиков и пользователей. Платформа поддерживает тысячи плагинов, добавляющих новые функциональные возможности к сайту. Вы можете добавить интернет-магазин, форум, портфолио или любой другой тип сайта. Гибкость WordPress позволяет создавать сайты любой сложности и масштабов. Использование WordPress позволит администратору сайта редактировать страницы и добавлять новый контент.

Современные темы для WordPress, как правило, имеют адаптивный дизайн, что означает, что сайт будет корректно отображаться на устройствах с разными размерами экрана. Для проектов, где LAMP не подходит, существуют альтернативы. Стек LEMP (Nginx + PHP-FPM) лучше справляется с обработкой статики и тысячами одновременных подключений. JavaScript-стеки (MEAN/MERN) на базе Node.js и React/Vue подходят для современных SPA с интенсивной работой на клиентской стороне.

К примеру, Вы установили плагин, служащий для отправки почты из непроверенного источника – и данные о Ваших подписчиках будут известны автору плагина. Платформа WordPress также известна процессом легкой и скоростной установки, не требующей вмешательства профессиональных программистов. Вы можете установить CMS на сервер и начать работу с сайтом буквально за 5-10 минут. Это одновременно экономит время на освоение CMS и дает время на приобретение практических навыков по управлению сайтом. Даже обновление модулей и плагинов – не проблема и делается в 1 клик. Отключите или удалите ненужные функции и службы на вашем сайте, чтобы снизить поверхность атак.

Это может существенно повлиять на рейтинг вашего сайта в SERP. Сама платформа не слишком search engine optimization дружественна, но ряд доступных плагинов помогают изменить ситуацию и получить необходимые инструменты (карта сайта, мета-данные для страниц и т.д.). Отыскать же и установить эти приложения не составит затруднений, а их использование в разы улучшит search engine optimization https://deveducation.com/ результаты.

The post Сайт На WordPress: Преимущества И Недостатки appeared first on premier mills.

]]>
https://www.premills.com/sajt-na-wordpress-preimushhestva-i-nedostatki/feed/ 0
Тестирование Графического Интерфейса: Руководство И Примеры https://www.premills.com/testirovanie-graficheskogo-interfejsa-rukovodstvo/ https://www.premills.com/testirovanie-graficheskogo-interfejsa-rukovodstvo/#respond Mon, 12 May 2025 18:34:18 +0000 https://www.premills.com/?p=3606 Тестирование совместимости проверяет, как интерфейс работает на различных устройствах, браузерах и операционных системах. Это важно, чтобы убедиться, что приложение корректно отображается и функционирует в разных средах. Тестирование совместимости помогает выявить проблемы, связанные с различиями в работе интерфейса на различных платформах и устройствах, и найти способы их устранения. Опросив десять команд, чтобы выяснить, какие методы тестирования […]

The post Тестирование Графического Интерфейса: Руководство И Примеры appeared first on premier mills.

]]>
Тестирование совместимости проверяет, как интерфейс работает на различных устройствах, браузерах и операционных системах. Это важно, чтобы убедиться, что приложение корректно отображается и функционирует в разных средах. Тестирование совместимости помогает выявить проблемы, связанные с различиями в работе интерфейса на различных платформах и устройствах, и найти способы их устранения. Опросив десять команд, чтобы выяснить, какие методы тестирования пользовательского интерфейса действительно работают, я составил короткий список инструментов, которые они рекомендуют.

Но следует помнить, что ни полная автоматизация, ни стопроцентное ручное тестирование не дадут гарантии идеального результата. Оптимальным подходом в данном случае является gui тестирование это разумный баланс. Тестирование графического интерфейса — это важный этап в разработке приложений, который помогает обеспечить высокое качество и положительный пользовательский опыт. Следуя приведенным рекомендациям и примерам, вы сможете эффективно тестировать интерфейсы и выявлять возможные проблемы на ранних стадиях.

Selenide — обёртка на любителя, особых преимуществ у нее по сравнению с нативными Selenium Page Objects нет, а ограничения — иногда досадные (неспособность конфигурить implicit timeout, например). По Selenoid — видео капчурить и браузеры в докере умеет и стандартный образ от github.com/…​eleniumHQ/docker-selenium . Единственное возможное преимущество Selenoid — это Selenium Hub написаный на Go. Однако актуально это становится, когда одновременных параллельных сессий больше пятнадцати-двадцати, чего при нормальной организации check move происходить не должно. «Выполнение тестов в удобное время — автотесты могут быть запущены в любое удобное время или по определенному событию. Согласно Global Quality Report около 60% организаций указали на улучшенную способность обнаруживать дефекты приложений из-за увеличения тестового покрытия.

Проверьте Совместимость С Различными Размерами Экрана

gui testing это

Обычный пользователь сначала наблюдает за дизайном и внешним видом приложения/программного обеспечения, а также за тем, насколько легко ему понять пользовательский интерфейс. Если пользователю не нравится интерфейс или приложение кажется сложным для понимания, он никогда больше не будет использовать это приложение. Вот почему графический интерфейс вызывает беспокойство, и необходимо провести надлежащее тестирование, чтобы убедиться, что графический интерфейс не содержит ошибок. Автоматизировать тестирование графического пользовательского интерфейса – безумно сложный процесс, о чем свидетельствуют массовые печальные показатели выполнения тестов. Совершите хотя бы одну из них, и ваш проект автоматизации тестирования гарантированно провалится.

  • Во время записи шаги теста записываются инструментом автоматизации.
  • Недостатки оценки большого текстового блока HTML хорошо задокументированы.
  • Для каждого теста будет запущен свой Docker-контейнер, который будет остановлен после окончания теста.
  • От того насколько правильно будут отражаться графические элементы приложения, зависит его удобство и лояльность пользователей.
  • TC 14 — Убедитесь, что в сообщениях об ошибках должны использоваться правильные метки.
  • Оно заключается в правильном применении макетирования и управления состояниями для приведения приложения в желаемую конфигурацию.

Еще 57% отметили увеличение повторного использования тест-кейсов после применения автоматизации. Ваши пользователи взаимодействуют с пользовательским интерфейсом различными способами. Например, с помощью мыши, сенсорного экрана, клавиатуры и устройства чтения с экрана. Доступность  — это практика, позволяющая сделать веб-сайты удобными для всех людей. Существует два типа интерфейсов для компьютерного приложения. Интерфейс командной строки, где вы вводите текст, и компьютер отвечает на эту команду.

gui testing это

Кроме того, Selenium позволяет создавать тесты на различных языках программирования, таких как Java, C#, Python и другие, что делает его удобным для использования в различных проектах. Тестирование совместимости может включать проверку работы интерфейса на различных версиях операционных систем, браузеров и устройств. Это помогает убедиться, что интерфейс работает корректно и предоставляет пользователю положительный опыт независимо от используемой платформы. UI-тестирование — это мощный драйвер развития пользовательского опыта и повышения количества удовлетворенных клиентов. А главная задача QA-инженеров помочь сделать интерфейс простым и удобным во всех браузерах и на всех устройствах.

gui testing это

Пользователь не имеет никаких знаний о программном обеспечении/приложении XYZ. Именно пользовательский интерфейс Приложения решает, будет ли пользователь использовать Приложение дальше или нет. BaseScreen является базовым классом для всех экранов https://deveducation.com/ в UI-тестах, который содержит общую логику взаимодействия с пользовательским интерфейсом.  Проверьте расположение элементов графического интерфейса для различного разрешения экрана.

Необходимость Тестирования Gui

Чем их больше, тем сложнее убедиться, что все они правильно отображаются на устройствах и в браузерах пользователей. Какова их стратегия тестирования, и какие методы они используют? Я исследовал десять команд из сообщества Storybook, чтобы узнать, что реально работает  — Twilio, Adobe, Peloton, Shopify и другие.

TC 09 — Убедитесь, что метка « Суперкласс » состоит из кнопки с меткой « Обзор », которая должна быть правильно выровнена. Кроме того, если пользователь изменяет размер экрана, ни изображения, ни содержимое не должны сжиматься, обрезаться или перекрываться. В приведенном выше примере, если нам нужно выполнить тестирование GUI, мы сначала проверяем, чтобы изображения были полностью видны в разных браузерах. При всех достоинствах метода интерактивные (кликабельные) прототипы дают более точные результаты, «ведут» себя почти так же, как реальный продукт. А в завершение статьи давайте рассмотрим практический пример  стандартного юзкейса тестирования GUI. Зеленые пометки на скриншоте — это ссылки на конкретные действия по тестированию, описанные ниже.

Существуют также ограничения ручного тестирования пользовательского интерфейса, которые следует учитывать перед принятием решения о выборе наилучшего подхода к тестированию для вашего приложения. — Ручное тестирование пользовательского интерфейса включает в тестирование человеческий интеллект для поиска ошибок или проблем. Этот тип тестирования пользовательского интерфейса направлен на поиск проблемных областей в приложении или узких мест в потоке данных. Три основные области, на которые он обращает внимание, — это скорость, масштабируемость и стабильность приложения. Тестирование пользовательского интерфейса сейчас важно как никогда раньше благодаря глобальному росту числа веб-сайтов и приложений.

Тестирование производительности оценивает, как быстро и эффективно интерфейс реагирует на действия пользователя. Например, проверка времени загрузки страниц и отклика на Методология программирования нажатия кнопок. Тестирование производительности помогает выявить проблемы, связанные с медленной работой интерфейса, и найти способы их устранения.

The post Тестирование Графического Интерфейса: Руководство И Примеры appeared first on premier mills.

]]>
https://www.premills.com/testirovanie-graficheskogo-interfejsa-rukovodstvo/feed/ 0