/* global wpforms_builder, wpforms_builder_stripe */ // noinspection ES6ConvertVarToLetConst /** * Stripe builder function. * * @since 1.8.2 */ // eslint-disable-next-line no-var var WPFormsStripe = window.WPFormsStripe || ( function( document, window, $ ) { /** * Public functions and properties. * * @since 1.8.2 * * @type {Object} */ const app = { /** * Start the engine. * * @since 1.8.2 */ init() { $( app.ready ); }, /** * Initialized once the DOM is fully loaded. * * @since 1.8.2 */ ready() { if ( ! app.isLegacySettings() ) { return; } app.settingsDisplay(); app.settingsConditions(); app.bindUIActions(); }, /** * Process various events as a response to UI interactions. * * @since 1.8.2 */ bindUIActions() { $( document ) .on( 'wpformsFieldDelete', app.disableNotifications ) .on( 'wpformsSaved', app.requiredFieldsCheck ) .on( 'wpformsFieldUpdate', app.settingsDisplay ) .on( 'wpformsFieldUpdate', app.settingsConditions ); }, /** * Toggles visibility of the Stripe settings. * * If a credit card field has been added, then reveal the settings. * Otherwise, hide them. * * @since 1.8.2 */ settingsDisplay() { const $alert = $( '#wpforms-stripe-credit-card-alert' ); const $content = $( '#stripe-provider' ); // Check if any Credit Card fields were added to the form. const ccFieldsAdded = wpforms_builder_stripe.field_slugs.filter( function( fieldSlug ) { const $el = $( '.wpforms-field-option-' + fieldSlug ); return $el.length ? $el : null; } ); if ( ccFieldsAdded.length ) { $alert.hide(); $content.find( '#wpforms-stripe-new-interface-alert, .wpforms-stripe-notice-info, .wpforms-panel-field, .wpforms-conditional-block-panel, h2' ).show(); } else { $alert.show(); $content.find( '#wpforms-stripe-new-interface-alert, .wpforms-stripe-notice-info, .wpforms-panel-field, .wpforms-conditional-block-panel, h2' ).hide(); $content.find( '#wpforms-panel-field-stripe-enable' ).prop( 'checked', false ); } }, /** * Toggles the visibility of the related settings. * * @since 1.8.2 */ settingsConditions() { $( '#wpforms-panel-field-stripe-enable' ).conditions( { conditions: { element: '#wpforms-panel-field-stripe-enable', type: 'checked', operator: 'is', }, actions: { if: { element: '.wpforms-panel-content-section-stripe-body', action: 'show', }, else: { element: '.wpforms-panel-content-section-stripe-body', action: 'hide', }, }, effect: 'appear', } ); $( '#wpforms-panel-field-stripe-recurring-enable' ).conditions( { conditions: { element: '#wpforms-panel-field-stripe-recurring-enable', type: 'checked', operator: 'is', }, actions: { if: { element: '#wpforms-panel-field-stripe-recurring-period-wrap,#wpforms-panel-field-stripe-recurring-conditional_logic-wrap,#wpforms-conditional-groups-payments-stripe-recurring,#wpforms-panel-field-stripe-recurring-email-wrap,#wpforms-panel-field-stripe-recurring-name-wrap', action: 'show', }, else: { element: '#wpforms-panel-field-stripe-recurring-period-wrap,#wpforms-panel-field-stripe-recurring-conditional_logic-wrap,#wpforms-conditional-groups-payments-stripe-recurring,#wpforms-panel-field-stripe-recurring-email-wrap,#wpforms-panel-field-stripe-recurring-name-wrap', action: 'hide', }, }, effect: 'appear', } ); }, /** * On form save notify users about required fields. * * @since 1.8.2 */ requiredFieldsCheck() { if ( ! $( '#wpforms-panel-field-stripe-enable' ).is( ':checked' ) || ! $( '#wpforms-panel-field-stripe-recurring-enable' ).is( ':checked' ) ) { return; } if ( $( '#wpforms-panel-field-stripe-recurring-email' ).val() ) { return; } $.alert( { title: wpforms_builder.heads_up, content: wpforms_builder.stripe_recurring_email, icon: 'fa fa-exclamation-circle', type: 'orange', buttons: { confirm: { text: wpforms_builder.ok, btnClass: 'btn-confirm', keys: [ 'enter' ], }, }, } ); }, /** * Disable notifications. * * @since 1.8.2 * * @param {Object} e Event object. * @param {number} id Field ID. * @param {string} type Field type. */ disableNotifications( e, id, type ) { if ( ! wpforms_builder_stripe.field_slugs.includes( type ) ) { return; } const $notificationWrap = $( '.wpforms-panel-content-section-notifications [id*="-stripe-wrap"]' ); $notificationWrap.find( 'input[id*="-stripe"]' ).prop( 'checked', false ); $notificationWrap.addClass( 'wpforms-hidden' ); }, /** * Determine is legacy settings is loaded. * * @since 1.8.4 * * @return {boolean} True is legacy settings loaded. */ isLegacySettings() { return $( '#wpforms-panel-field-stripe-enable' ).length; }, }; // Provide access to public functions/properties. return app; }( document, window, jQuery ) ); // Initialize. WPFormsStripe.init(); /*! elementor - v3.24.0 - 15-10-2024 */ (()=>{var e={38003:e=>{"use strict";e.exports=wp.i18n},78983:e=>{e.exports=function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},42081:(e,t,r)=>{var o=r(74040);function _defineProperties(e,t){for(var r=0;r{var o=r(74040);e.exports=function _defineProperty(e,t,r){return(t=o(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e},e.exports.__esModule=!0,e.exports.default=e.exports},73203:e=>{e.exports=function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports},56027:(e,t,r)=>{var o=r(7501).default;e.exports=function toPrimitive(e,t){if("object"!=o(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var i=r.call(e,t||"default");if("object"!=o(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)},e.exports.__esModule=!0,e.exports.default=e.exports},74040:(e,t,r)=>{var o=r(7501).default,i=r(56027);e.exports=function toPropertyKey(e){var t=i(e,"string");return"symbol"==o(t)?t:String(t)},e.exports.__esModule=!0,e.exports.default=e.exports},7501:e=>{function _typeof(t){return e.exports=_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,_typeof(t)}e.exports=_typeof,e.exports.__esModule=!0,e.exports.default=e.exports}},t={};function __webpack_require__(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r](i,i.exports,__webpack_require__),i.exports}(()=>{"use strict";var e=__webpack_require__(38003).__,t=__webpack_require__(73203),r=t(__webpack_require__(78983)),o=t(__webpack_require__(42081)),i=t(__webpack_require__(93231)),n=function(){function Admin(){(0,r.default)(this,Admin),(0,i.default)(this,"KIT_DATA_KEY","elementor-kit-data"),(0,i.default)(this,"cachedKitData",void 0),(0,i.default)(this,"revertButton",void 0),(0,i.default)(this,"activeKitName",void 0),this.activeKitName=this.getActiveKitName(),this.revertButton=document.getElementById("elementor-import-export__revert_kit"),this.revertButton&&(this.revertButton.addEventListener("click",this.onRevertButtonClick.bind(this)),this.maybeAddRevertBtnMargin()),this.maybeShowReferrerKitDialog()}return(0,o.default)(Admin,[{key:"maybeAddRevertBtnMargin",value:function maybeAddRevertBtnMargin(){new URLSearchParams(this.revertButton.href).get("referrer_kit")&&(this.revertButton.style.marginBottom=this.calculateMargin(),this.scrollToBottom())}},{key:"calculateMargin",value:function calculateMargin(){var e=document.getElementById("wpadminbar"),t=e?e.offsetHeight:0,r=this.revertButton.parentElement.offsetHeight;return document.body.clientHeight-t-r-document.getElementById("wpfooter").offsetHeight-15+"px"}},{key:"scrollToBottom",value:function scrollToBottom(){setTimeout((function(){window.scrollTo(0,document.body.scrollHeight)}))}},{key:"onRevertButtonClick",value:function onRevertButtonClick(t){var r=this;t.preventDefault(),elementorCommon.dialogsManager.createWidget("confirm",{headerMessage:e("Are you sure?","elementor"),message:e("Removing %s will permanently delete changes made to the Kit's content and site settings","elementor").replace("%s",this.activeKitName),strings:{confirm:e("Delete","elementor"),cancel:e("Cancel","elementor")},onConfirm:function onConfirm(){return r.onRevertConfirm()}}).show()}},{key:"onRevertConfirm",value:function onRevertConfirm(){var e=new URLSearchParams(this.revertButton.href).get("referrer_kit");this.saveToCache(null!=e?e:""),location.href=this.revertButton.href}},{key:"maybeShowReferrerKitDialog",value:function maybeShowReferrerKitDialog(){var t=this.getDataFromCache().referrerKitId;if(void 0!==t){if(0===t.length)return this.createKitDeletedWidget({message:e("Try a different Kit or build your site from scratch.","elementor"),strings:{confirm:e("OK","elementor"),cancel:e("Kit Library","elementor")},onCancel:function onCancel(){location.href=elementorImportExport.appUrl}}),void this.clearCache();this.createKitDeletedWidget({message:e("You're ready to apply a new Kit!","elementor"),strings:{confirm:e("Continue to new Kit","elementor"),cancel:e("Close","elementor")},onConfirm:function onConfirm(){location.href=elementorImportExport.appUrl+"/preview/"+t}}),this.clearCache()}}},{key:"createKitDeletedWidget",value:function createKitDeletedWidget(t){var r=this.getDataFromCache().activeKitName;elementorCommon.dialogsManager.createWidget("confirm",{id:"e-revert-kit-deleted-dialog",headerMessage:e("%s was successfully deleted","elementor").replace("%s",r),message:t.message,strings:{confirm:t.strings.confirm,cancel:t.strings.cancel},onConfirm:t.onConfirm,onCancel:t.onCancel}).show()}},{key:"getActiveKitName",value:function getActiveKitName(){var t=elementorImportExport.lastImportedSession;return t.kit_title?t.kit_title:t.kit_name?this.convertNameToTitle(t.kit_name):e("Your Kit","elementor")}},{key:"convertNameToTitle",value:function convertNameToTitle(e){return e.split(/[-_]+/).map((function(e){return e[0].toUpperCase()+e.substring(1)})).join(" ")}},{key:"saveToCache",value:function saveToCache(e){sessionStorage.setItem(this.KIT_DATA_KEY,JSON.stringify({referrerKitId:e,activeKitName:this.activeKitName}))}},{key:"getDataFromCache",value:function getDataFromCache(){var e;if(this.cachedKitData)return this.cachedKitData;try{this.cachedKitData=JSON.parse(sessionStorage.getItem(this.KIT_DATA_KEY))}catch(e){return{}}return null!==(e=this.cachedKitData)&&void 0!==e?e:{}}},{key:"clearCache",value:function clearCache(){sessionStorage.removeItem(this.KIT_DATA_KEY)}}]),Admin}();window.addEventListener("load",(function(){new n}))})()})();@import "../start"; @import "modal-common"; @import "deactivation-feedback"; @import "subscription-cancellation"; @import "license-activation"; @import "user-change"; @import "data-debug-mode"; @import "multisite-options"; @import "license-key-resend"; @import "email-address-update"; @import "ajax-loader"; @import "auto-install"; @import "buttons";/* global wpforms_builder, wpforms_addons, wpf */ /** * @param strings.calculation_notice_text * @param strings.calculation_notice_text_grp * @param strings.calculation_notice_tooltip * @param strings.cant_switch_to_rows_alert * @param strings.cl_notice_text * @param strings.cl_notice_text_grp * @param strings.move_to_rows_rejected_alert * @param strings.not_allowed * @param strings.not_allowed_alert_text * @param strings.not_allowed_fields * @param strings.rows_limit_max * @param wpforms_builder.repeater.fields_mapping.title * @param wpforms_builder.repeater.fields_mapping.content * @param wpforms_builder.repeater.addons_requirements * @param wpforms_builder.repeater.wpforms_builder.repeater.addons_requirements_alert */ // noinspection ES6ConvertVarToLetConst /** * Form Builder Field Repeater module. * * @since 1.8.9 */ var WPForms = window.WPForms || {}; // eslint-disable-line no-var WPForms.Admin = WPForms.Admin || {}; WPForms.Admin.Builder = WPForms.Admin.Builder || {}; WPForms.Admin.Builder.FieldRepeater = WPForms.Admin.Builder.FieldRepeater || ( function( document, window, $ ) { /** * Localized Repeater field strings. * * @since 1.8.9 * * @type {Object} */ const strings = wpforms_builder.repeater; /** * Elements holder. * * @since 1.8.9 * * @type {Object} */ let el = {}; /** * Runtime variables. * * @since 1.8.9 * * @type {Object} */ const vars = {}; /** * Public functions and properties. * * @since 1.8.9 * * @type {Object} */ const app = { /** * Start the engine. * * @since 1.8.9 */ init() { $( app.ready ); }, /** * DOM is fully loaded. * * @since 1.8.9 */ ready() { app.setup(); app.hooks(); app.events(); }, /** * Setup. Prepare some variables. * * @since 1.8.9 */ setup() { // Cache DOM elements. el = { $builder: $( '#wpforms-builder' ), }; }, /** * Init all the Repeater fields. * * @since 1.8.9 */ initFields() { el.$builder.find( '.wpforms-field-repeater' ).each( function() { const $field = $( this ); const fieldId = $field.data( 'field-id' ); app.adjustRowsAppearance( fieldId ); } ); }, /** * Hooks. * * @since 1.8.9 */ hooks() { // Determine if we could add a field to the column. wp.hooks.addFilter( 'wpforms.LayoutField.isFieldAllowedDragInColumn', 'wpforms/field-repeater', app.filterIsFieldAllowedDragInColumn ); wp.hooks.addFilter( 'wpforms.LayoutField.isFieldAllowedInColumn', 'wpforms/field-repeater', app.filterIsFieldAllowedInColumn ); // Update alert message modal options when the field is not allowed to be added to the column. wp.hooks.addFilter( 'wpforms.LayoutField.fieldMoveRejectedModalOptions', 'wpforms/field-repeater', app.filterFieldMoveRejectedModalOptions ); // Filter fields in the CL fields dropdown. wp.hooks.addFilter( 'wpforms.ConditionalLogicCore.BeforeRemoveUnsupportedFields', 'wpforms/field-repeater', app.removeRepeaterFieldsAndChildren ); }, /** * Bind events. * * @since 1.8.9 */ events() { el.$builder .on( 'click', '.wpforms-field-option-row-display input', app.handleDisplayClick ) .on( 'change', '.wpforms-field-option-row-display input', app.handleDisplayChange ) .on( 'change', '.wpforms-field-option-row-preset input', app.handlePresetChange ) .on( 'change', '.wpforms-field-option-row-button-type select', app.handleButtonTypeChange ) .on( 'input', '.wpforms-field-option-row-label input', app.handleFieldLabelChange ) .on( 'input', '.wpforms-field-option-row-button-labels input', app.handleButtonLabelsChange ) .on( 'change', '.wpforms-field-option-row-rows-limit input', app.handleRowsLimitChange ) .on( 'wpformsLayoutAfterPresetChange', app.handleAfterPresetChange ) .on( 'wpformsLayoutAfterHeightBalance', app.handleAfterHeightBalance ) .on( 'wpformsFieldAdd', app.handleFieldAdd ) .on( 'wpformsFieldDelete', app.handleFieldDelete ) .on( 'wpformsFieldMoveRejected', app.handleFieldMoveRejected ) .on( 'wpformsFieldDuplicated', app.handleFieldDuplicated ) .on( 'wpformsBuilderReady', app.initFields ) .on( 'wpformsFieldOptionTabToggle', app.handleFieldOptionTabToggle ) .on( 'wpformsFieldMove', app.handleFieldMove ) .on( 'change', '.wpforms-field-option-layout .wpforms-field-option-row-conditional_logic input', app.handleUpdateFieldCLOption ); $( window ) .on( 'resize', _.debounce( app.handleWindowResize, 50 ) ); }, /** * Fields mapping notice. * * @since 1.9.1 * * @param {string} fieldId Field ID. */ // eslint-disable-next-line max-lines-per-function fieldsMappingNotice( fieldId ) { /** * Check if the field is mapped to the select. * * @param {string} selectedFieldID Selected field ID. * * @return {boolean} True if the field is mapped. */ function isFieldMappedToSelect( selectedFieldID ) { return parseInt( selectedFieldID, 10 ) === parseInt( fieldId, 10 ); } /** * Get the section title. * * @param {Object} $select Field map select element. * * @return {string} Section title. */ function getSectionTitle( $select ) { return $select.closest( '.wpforms-panel-content-section' ).find( '.wpforms-panel-content-section-title' )[ 0 ].firstChild.nodeValue.trim(); } /** * Show the confirmation dialog. * * @param {string} sectionTitle Section title. * @param {Object} $field Field element. */ function showConfirmationDialog( sectionTitle, $field ) { el.$builder.on( 'wpformsBeforeFieldMapSelectUpdate', ( e ) => e.preventDefault() ); $.confirm( { title: wpforms_builder.repeater.fields_mapping.title, content: wpforms_builder.repeater.fields_mapping.content.replace( '%s', sectionTitle ), icon: 'fa fa-exclamation-circle', type: 'orange', buttons: { confirm: { text: wpforms_builder.ok, btnClass: 'btn-confirm', keys: [ 'enter' ], action: () => { el.$builder.off( 'wpformsBeforeFieldMapSelectUpdate' ); const fields = wpf.getFields( false, true, false, false ); $( document ).trigger( 'wpformsFieldUpdate', [ fields ] ); }, }, cancel: { text: wpforms_builder.cancel, action: () => { WPForms.Admin.Builder.DragFields.revertMoveFieldToColumn( $field ); WPForms.Admin.Builder.FieldLayout.removeFieldFromColumns( $field.data( 'field-id' ) ); app.initFields(); }, }, }, } ); } /** * Check and handle the field mapping. * * @param {Object} $field Field element. */ function checkAndHandleFieldMapping( $field ) { const data = { sections: [], $field: null, }; // Check if the field is mapped to the select. $( 'select[data-field-map-allowed], select.wpforms-builder-provider-connection-field-value' ).each( function() { const $select = $( this ); if ( isFieldMappedToSelect( $select.val() ) ) { data.sections.push( getSectionTitle( $select ) ); data.$field = $field; } } ); if ( data.$field ) { const sectionTitle = [ ...new Set( data.sections ) ].join( ' ' + wpforms_builder.repeater.fields_mapping.and + ' ' ); showConfirmationDialog( sectionTitle, data.$field ); } } /** * Check if the field is inside the repeater and show the notice. */ function showNotice() { const $field = $( '#wpforms-field-' + fieldId ); if ( ! $field.length || $field.hasClass( 'wpforms-field-repeater' ) || $field.hasClass( 'wpforms-field-layout' ) ) { return; } if ( ! $field.closest( '.wpforms-field-repeater' ).length ) { return; } checkAndHandleFieldMapping( $field ); } showNotice(); }, /** * Display click event handler. * * @since 1.8.9 * * @return {boolean} Whether the change is allowed. */ handleDisplayClick() { const $input = $( this ); const display = $input.val(); if ( display !== 'rows' ) { return true; } const fieldId = $input.closest( '.wpforms-field-option-repeater' ).data( 'field-id' ); const columnsData = WPForms.Admin.Builder.FieldLayout.getFieldColumnsData( fieldId ); const allowRows = columnsData.every( ( column ) => { return column?.fields?.length <= 1; } ); if ( ! allowRows ) { // Display alert. app.errorModal( strings.not_allowed, strings.cant_switch_to_rows_alert ); return false; } return true; }, /** * Display change event handler. * * @since 1.8.9 */ handleDisplayChange() { const $input = $( this ); const display = $input.val(); const $fieldOptions = $input.closest( '.wpforms-field-option-repeater' ); const fieldId = $fieldOptions.data( 'field-id' ); const $fieldPreview = $( '#wpforms-field-' + fieldId ); const buttonType = $fieldOptions.find( '.wpforms-field-option-row-button-type select' ).val(); // Show/hide button type and labels options. $fieldOptions .find( '.wpforms-field-option-row-button-type' ) .toggleClass( 'wpforms-hidden', display === 'rows' ); $fieldOptions .find( '.wpforms-field-option-row-button-labels' ) .toggleClass( 'wpforms-hidden', display === 'rows' || buttonType === 'icons' ); // Change field preview class according to selected Display value. $fieldPreview .find( '.wpforms-field-layout-columns' ) .toggleClass( 'wpforms-layout-display-rows', display === 'rows' ) .toggleClass( 'wpforms-layout-display-blocks', display === 'blocks' ); if ( display === 'blocks' ) { $fieldPreview.find( '.wpforms-layout-column-placeholder' ).css( 'top', '' ); } // Show/hide blocks' buttons on the field preview. $fieldPreview .find( '.wpforms-field-repeater-display-rows-buttons' ) .toggleClass( 'wpforms-hidden', display !== 'rows' ); // Show/hide rows' buttons on the field preview. $fieldPreview .find( '.wpforms-field-repeater-display-blocks-buttons' ) .toggleClass( 'wpforms-hidden', display !== 'blocks' ); app.adjustRowsAppearance( fieldId ); }, /** * Preset change event handler. * * @since 1.8.9 */ handlePresetChange() { const $input = $( this ); const preset = $input.val(); const $fieldOptions = $input.closest( '.wpforms-field-option-repeater' ); $fieldOptions .find( '.wpforms-field-option-row-size' ) .toggleClass( 'wpforms-disabled', preset !== '100' ); }, /** * After preset change event handler. * * @since 1.8.9 * * @param {Event} e Event object. * @param {Object} data Event data. */ handleAfterPresetChange( e, data ) { const $fieldPreview = $( '#wpforms-field-' + data.fieldId ); const display = $( `#wpforms-field-option-row-${ data.fieldId }-display input:checked` ).val(); const rowsButtons = wp.template( 'wpforms-repeater-field-display-rows-buttons-template' ); const classHidden = display === 'rows' ? '' : 'wpforms-hidden'; $fieldPreview .find( '.wpforms-field-layout-columns' ) .append( rowsButtons( { class: classHidden } ) ); app.adjustRowsAppearance( data.fieldId ); }, /** * Button Type change event handler. * * @since 1.8.9 */ handleButtonTypeChange() { const $input = $( this ); const buttonType = $input.val(); const $fieldOptions = $input.closest( '.wpforms-field-option-repeater' ); const $fieldPreview = $( '#wpforms-field-' + $fieldOptions.data( 'field-id' ) ); $fieldOptions .find( '.wpforms-field-option-row-button-labels' ) .toggleClass( 'wpforms-hidden', buttonType === 'icons' ); $fieldPreview .find( '.wpforms-field-repeater-display-blocks-buttons' ) .attr( 'data-button-type', buttonType ); }, /** * Field Label change event handler. * * @since 1.8.9 */ handleFieldLabelChange() { const $input = $( this ); const $fieldOptions = $input.closest( '.wpforms-field-option-repeater' ); const fieldId = $fieldOptions.data( 'field-id' ); app.adjustRowsAppearance( fieldId ); }, /** * Window resize event handler. * * @since 1.8.9 */ handleWindowResize() { el.$builder.find( '.wpforms-field-repeater' ).each( function() { app.adjustRowsAppearance( $( this ).data( 'field-id' ) ); } ); }, /** * Button Labels change event handler. * * @since 1.8.9 */ handleButtonLabelsChange() { const $input = $( this ); const $fieldOptions = $input.closest( '.wpforms-field-option-repeater' ); const fieldId = $fieldOptions.data( 'field-id' ); const $fieldPreview = $( '#wpforms-field-' + fieldId ); const buttonLabel = $input.val(); const button = $input.attr( 'class' ); $fieldPreview .find( `.wpforms-field-repeater-display-blocks-buttons-${ button } span` ) .text( buttonLabel ); }, /** * Rows Limit change event handler. * * @since 1.8.9 */ handleRowsLimitChange() { const $input = $( this ); const limit = $input.attr( 'class' ); if ( limit === 'rows-limit-min' ) { app.normalizeLimitMin( $input ); } else { app.normalizeLimitMax( $input ); } // Round the value after normalization. $input.val( Math.round( $input.val() ) ); }, /** * Normalize Rows Limit Minimum value. * * @since 1.8.9 * * @param {jQuery} $input Limit Minimum input element. */ normalizeLimitMin( $input ) { const value = $input.val(); const valueMin = parseInt( value, 10 ) || 0; // Minimal acceptable value of Minimum is 1. if ( value === '' || valueMin < 1 ) { $input.val( 1 ); return; } const $inputMax = $input.closest( '.wpforms-field-option-row-rows-limit' ).find( 'input.rows-limit-max' ); const valueMax = parseInt( $inputMax.val(), 10 ); // The Minimum value should be less than the Maximum value. if ( valueMax <= valueMin ) { $input.val( valueMax - 1 ); } }, /** * Normalize Rows Limit Maximum value. * * @since 1.8.9 * * @param {jQuery} $input Limit Maximum input element. */ normalizeLimitMax( $input ) { const value = $input.val(); const $inputMin = $input.closest( '.wpforms-field-option-row-rows-limit' ).find( 'input.rows-limit-min' ); const valueMin = parseInt( $inputMin.val(), 10 ); // The default Maximum value is relative to the Minimum. // When the Minimum is 1, the Maximum should be 10. if ( value === '' ) { const diff = valueMin === 1 ? 9 : 10; $input.val( valueMin + diff ); return; } const valueMax = parseInt( value, 10 ); // The Maximum value should be greater than the Minimum value. if ( valueMax <= valueMin ) { $input.val( valueMin + 1 ); return; } // Attempt to set enormous maximum value. Limit it to 200. if ( valueMax > strings.rows_limit_max ) { $input.val( strings.rows_limit_max ); } }, /** * After height balance event handler. * * @since 1.8.9 * * @param {Event} e Event object. * @param {Object} data Event data. */ handleAfterHeightBalance( e, data ) { if ( ! data?.$rows ) { return; } const fieldId = data.$rows.closest( '.wpforms-field-repeater' ).data( 'field-id' ); if ( ! fieldId ) { return; } app.adjustRowsAppearance( fieldId ); }, /** * Field add handler. * * @since 1.8.9 * * @param {Event} e Event object. * @param {string} fieldID Field ID. * @param {string} fieldType Field type. */ handleFieldAdd( e, fieldID, fieldType ) { if ( ! fieldID || ! fieldType ) { return; } const $fieldPreview = $( '#wpforms-field-' + fieldID ); const $repeaterField = $fieldPreview.closest( '.wpforms-field-repeater' ); if ( $repeaterField.length === 0 ) { return; } app.adjustRowsAppearance( $repeaterField.data( 'field-id' ) ); }, /** * Field delete event handler. * * @since 1.8.9 * * @param {Object} e Event object. * @param {string} fieldID Field ID. * @param {string} fieldType Field type. * @param {jQuery} $fieldLayoutWrapper Field layout wrapper. */ handleFieldDelete( e, fieldID, fieldType, $fieldLayoutWrapper ) { if ( $fieldLayoutWrapper.length === 0 ) { return; } const $repeaterField = $fieldLayoutWrapper.closest( '.wpforms-field-repeater' ); app.adjustRowsAppearance( $repeaterField.data( 'field-id' ) ); }, /** * Field move rejected handler. * * @since 1.8.9 * * @param {Event} e Event object. * @param {jQuery} $field Field element. */ handleFieldMoveRejected( e, $field ) { app.adjustRowsAppearance( $field.closest( '.wpforms-field-repeater' ).data( 'field-id' ) ); }, /** * The `wpformsFieldDuplicated` event handler. * * @since 1.8.9 * * @param {Event} e Event. * @param {number} fieldId Field ID. * @param {jQuery} $field Field object. * @param {number} newFieldId New field ID. * @param {jQuery} $newField New field object. */ handleFieldDuplicated( e, fieldId, $field, newFieldId, $newField ) { // eslint-disable-line no-unused-vars // Run for the Repeater field only. if ( $field.data( 'field-type' ) !== 'repeater' ) { return; } const display = $( `#wpforms-field-option-${ fieldId } .wpforms-field-option-row-display input:checked` ).val(); // Set the Display option for the duplicated field. $( `#wpforms-field-option-${ newFieldId }-display-${ display }` ).prop( 'checked', true ); // Adjust rows appearance after field duplication. app.adjustRowsAppearance( newFieldId ); }, /** * The `wpformsFieldOptionTabToggle` event handler. * * @since 1.8.9 * * @param {Event} e Event. * @param {number} fieldId Field id. */ handleFieldOptionTabToggle( e, fieldId ) { app.updateFieldCLOption( fieldId ); app.updateFieldCalculationOption( fieldId ); app.updateFieldGeolocationRequirementsAlerts( fieldId ); app.updateFieldSignatureRequirementsAlerts( fieldId ); }, /** * The `wpformsFieldMove` event handler. * * @since 1.8.9 * * @param {Object} e Event object. * @param {Object} ui UI object. */ handleFieldMove( e, ui ) { const fieldId = ui.item.first().data( 'field-id' ); app.updateFieldCLOption( fieldId ); app.updateFieldCalculationOption( fieldId ); app.updateFieldGeolocationRequirementsAlerts( fieldId ); app.updateFieldSignatureRequirementsAlerts( fieldId ); app.fieldsMappingNotice( fieldId ); }, /** * Update the Conditional Logic field option. * * @since 1.9.0 */ handleUpdateFieldCLOption() { const $this = $( this ); const fieldID = $this.parents( '.wpforms-field-option-row' ).data( 'field-id' ); const $field = $( `#wpforms-field-${ fieldID }` ); if ( ! $field.length ) { return; } $field.find( '.wpforms-field' ).each( function() { app.updateFieldCLOption( $( this ).data( 'field-id' ) ); } ); }, /** * Update the Geolocation field option. * * @since 1.8.9 * * @param {number|string} fieldId Field ID. */ updateFieldGeolocationRequirementsAlerts( fieldId ) { const $field = $( `#wpforms-field-${ fieldId }` ); if ( ! $field?.length || $field.hasClass( 'wpforms-field-repeater' ) || app.isInsideRepeaterAddonAllowed( 'wpforms-geolocation' ) || ( typeof wpforms_addons !== 'undefined' && wpforms_addons[ 'wpforms-geolocation' ] ) ) { return; } const isFieldInRepeater = $field.closest( '.wpforms-field-repeater' ).length > 0; const $fieldOptionToggleRow = $( `#wpforms-field-option-row-${ fieldId }-enable_address_autocomplete` ); let $fieldOptionNotice = $fieldOptionToggleRow.siblings( '.wpforms-alert-field-requirements' ); if ( ! $fieldOptionNotice.length ) { $fieldOptionNotice = $( wpforms_builder.repeater.addons_requirements_alert[ 'wpforms-geolocation' ] ); $fieldOptionToggleRow.before( $fieldOptionNotice ); } $fieldOptionNotice.toggleClass( 'wpforms-hidden', ! isFieldInRepeater ); }, /** * Update the Signature field. * * @since 1.8.9 * * @param {number|string} fieldId Field ID. */ updateFieldSignatureRequirementsAlerts( fieldId ) { const $field = $( `#wpforms-field-${ fieldId }` ); if ( ! $field?.length || $field.hasClass( 'wpforms-field-repeater' ) || app.isInsideRepeaterAddonAllowed( 'wpforms-signatures' ) ) { return; } const isFieldInRepeater = $field.closest( '.wpforms-field-repeater' ).length > 0; const $fieldOptionToggleRow = $( `.wpforms-field-option-signature #wpforms-field-option-row-${ fieldId }-label` ); let $fieldOptionNotice = $fieldOptionToggleRow.siblings( '.wpforms-alert-field-requirements' ); if ( ! $fieldOptionNotice.length ) { $fieldOptionNotice = $( wpforms_builder.repeater.addons_requirements_alert[ 'wpforms-signatures' ] ); $fieldOptionToggleRow.before( $fieldOptionNotice ); } $fieldOptionNotice.toggleClass( 'wpforms-hidden', ! isFieldInRepeater ); }, /** * Check if the addon is allowed inside the repeater. * * @param {string} slug Addon slug. * * @return {boolean} True if the addon is allowed. */ isInsideRepeaterAddonAllowed( slug ) { return wpforms_builder.repeater.addons_requirements[ slug ]; }, /** * Update the Calculation field option. * * @since 1.8.9 * * @param {number|string} fieldId Field ID. */ updateFieldCalculationOption( fieldId ) { const $field = $( `#wpforms-field-${ fieldId }` ); if ( ! $field?.length || $field.hasClass( 'wpforms-field-repeater' ) || ( typeof wpforms_addons !== 'undefined' && wpforms_addons[ 'wpforms-calculations' ] ) ) { return; } const isFieldInRepeater = $field.closest( '.wpforms-field-repeater' ).length > 0; const $fieldOptionToggleRow = $( `#wpforms-field-option-row-${ fieldId }-calculation_is_enabled` ); const $fieldOptionToggleInput = $fieldOptionToggleRow.find( 'input' ); let $fieldOptionNotice = $fieldOptionToggleRow.siblings( '.wpforms-notice-field-calculation_is_enabled' ); // Add "Calculation is disabled" notice. if ( ! $fieldOptionNotice.length ) { $fieldOptionNotice = $( `

${ strings.calculation_notice_text }

` ); $fieldOptionToggleRow.before( $fieldOptionNotice ); } // Notice text. $fieldOptionNotice.find( 'p' ).text( $fieldOptionToggleInput.prop( 'checked' ) ? strings.calculation_notice_text_grp : strings.calculation_notice_text ); if ( isFieldInRepeater ) { $fieldOptionToggleInput.prop( 'checked', false ).trigger( 'change' ); } $fieldOptionToggleRow.toggleClass( 'wpforms-disabled', isFieldInRepeater ); $fieldOptionNotice.toggleClass( 'wpforms-hidden', ! isFieldInRepeater ); }, /** * Update the Conditional Logic field option. * * @since 1.8.9 * * @param {number|string} fieldId Field ID. */ updateFieldCLOption( fieldId ) { // eslint-disable-line complexity const $field = $( `#wpforms-field-${ fieldId }` ); if ( ! $field?.length || $field.hasClass( 'wpforms-field-repeater' ) || $field.hasClass( 'wpforms-field-layout' ) ) { return; } const isFieldInRepeater = $field.closest( '.wpforms-field-repeater' ).length > 0; let isFieldInLayout = $field.closest( '.wpforms-field-layout' ).length > 0; const $fieldCLOptionRow = $( `#wpforms-field-option-row-${ fieldId }-conditional_logic` ); const $fieldCLBlock = $fieldCLOptionRow.closest( '.wpforms-conditional-block' ); const parentBlockType = isFieldInRepeater ? 'repeater' : 'layout'; if ( isFieldInLayout && ! app.isLayoutCLEnabled( $field.closest( '.wpforms-field-layout' ) ) ) { isFieldInLayout = false; } let $fieldCLOptionNotice = $fieldCLBlock.siblings( '.wpforms-notice-field-conditional_logic' ); // Add "Conditional Logic is disabled" notice. if ( ! $fieldCLOptionNotice.length ) { $fieldCLOptionNotice = $( `

${ wpforms_builder[ parentBlockType ].cl_notice_text }

` ); $fieldCLBlock.before( $fieldCLOptionNotice ); } const $fieldCLOptionToggle = $fieldCLOptionRow.find( '.wpforms-toggle-control' ); const $fieldCLOptionToggleInput = $fieldCLOptionToggle.find( 'input' ); // Disable Conditional Logic when moved inside the Repeater field. if ( isFieldInRepeater || isFieldInLayout ) { $fieldCLOptionToggleInput.prop( 'checked', false ); } // Enable the Conditional Logic if it exists when moved outside the Repeater field. if ( ! isFieldInRepeater && ! isFieldInLayout && ! $fieldCLOptionToggleInput.is( ':checked' ) ) { const hasCLGroups = $fieldCLOptionRow.siblings( '.wpforms-conditional-groups' ).length; $fieldCLOptionToggleInput.prop( 'checked', hasCLGroups ); } const isCLHasGroups = $fieldCLBlock.find( '.wpforms-conditional-groups' ).length; // Notice text. $fieldCLOptionNotice.find( 'p' ).text( isCLHasGroups ? wpforms_builder[ parentBlockType ].cl_notice_text_grp : wpforms_builder[ parentBlockType ].cl_notice_text ); // Toggle disabled state and notice visibility. $fieldCLBlock.toggleClass( 'wpforms-disabled', isFieldInRepeater || isFieldInLayout ); $fieldCLOptionNotice.toggleClass( 'wpforms-hidden', ! isFieldInRepeater && ! isFieldInLayout ); }, /** * Is the Conditional Logic enabled for the Layout field. * * @since 1.9.0 * * @param {jQuery} $field Layout field. * * @return {boolean} Whether the Conditional Logic is enabled. */ isLayoutCLEnabled( $field ) { const fieldId = $field.data( 'field-id' ); const $fieldCLOptionRow = $( `#wpforms-field-option-row-${ fieldId }-conditional_logic` ); const $fieldCLOptionToggle = $fieldCLOptionRow.find( '.wpforms-toggle-control' ); const $fieldCLOptionToggleInput = $fieldCLOptionToggle.find( 'input' ); return $fieldCLOptionToggleInput.is( ':checked' ); }, /** * Adjust rows appearance: buttons container position, column placeholder visibility. * * @since 1.8.9 * * @param {number|string} fieldId Field ID. */ adjustRowsAppearance( fieldId ) { const $fieldPreview = $( '#wpforms-field-' + fieldId + '.wpforms-field-repeater' ); if ( ! $fieldPreview.length ) { return; } const display = $( `#wpforms-field-option-row-${ fieldId }-display input:checked` ).val(); const $columns = $fieldPreview.find( '.wpforms-layout-column' ); const $rowsButtons = $fieldPreview.find( '.wpforms-field-repeater-display-rows-buttons' ); let inputTopMin = 0; $columns.each( function() { // eslint-disable-line complexity const $column = $( this ); const $field = $column.find( '.wpforms-field' ).first(); const $alert = $column.find( '.wpforms-alert' ); // Toggle column placeholder visibility. $column.toggleClass( 'hide-placeholder', ( $field.length > 0 || $alert.length > 0 ) && display === 'rows' ); // Column without fields shouldn't affect `inputTopMin`. if ( ! $field.length && ! $alert.length ) { return; } let inputTop = $field.find( '.label-title' ).height() || 0; // Determine the top position if there is alert in the column. inputTop = $alert.length > 0 ? ( $alert.height() / 2 ) - ( $rowsButtons.height() / 2 ) - 4 : inputTop; // Determine minimum input's top position in a row. inputTopMin = inputTop < inputTopMin || inputTopMin === 0 ? inputTop : inputTopMin; } ); const labelHeight = $fieldPreview.find( '> .label-title' ).outerHeight() || 20; const fieldTop = labelHeight + 30; $fieldPreview .find( '.wpforms-field-layout-columns' ) .css( 'margin-top', '-' + fieldTop + 'px' ) .find( '.wpforms-layout-column' ) .css( { 'padding-top': fieldTop, 'min-height' : fieldTop + 55, } ); // Update the row buttons' position only if the columns have no drag placeholder (blue rectangle). if ( $columns.find( '.wpforms-field-drag-placeholder' ).length === 0 ) { const $columnPlaceholder = $fieldPreview.find( '.wpforms-layout-display-rows .wpforms-layout-column-placeholder' ); const top = inputTopMin !== 0 ? inputTopMin + labelHeight + 47 : labelHeight + 16; $rowsButtons.css( 'top', top ); $columnPlaceholder.css( 'top', top + 14 ); } // Row with all hidden placeholders shouldn't have extra bottom padding. const $hiddenPlaceholders = $fieldPreview.find( '.wpforms-layout-column.hide-placeholder' ); const $row = $fieldPreview.find( '.wpforms-field-layout-columns' ); $row.toggleClass( 'hidden-placeholders', $hiddenPlaceholders.length === $columns.length ); }, /** * Filter whether the field is allowed in column. * * @since 1.8.9 * * @param {boolean|string} isFieldAllowed Whether the field is allowed to be placed in the column. * @param {string} fieldType Field type. * @param {jQuery} $targetColumn Target column element. * * @return {boolean|string} Whether the field is allowed. */ filterIsFieldAllowedDragInColumn( isFieldAllowed, fieldType, $targetColumn ) { // eslint-disable-line complexity vars.fieldMoveToRowsRejected = false; vars.fieldTypeRejected = ! isFieldAllowed ? fieldType : false; // Skip if the field is not allowed OR the target is not a column, return the original value. if ( ! isFieldAllowed || ! $targetColumn?.length || ! $targetColumn?.hasClass( 'wpforms-layout-column' ) ) { return isFieldAllowed; } const $repeaterField = $targetColumn?.closest( '.wpforms-field-repeater' ); if ( ! $repeaterField?.length ) { return isFieldAllowed; } const repeaterFieldId = $repeaterField.data( 'field-id' ); const display = $( `#wpforms-field-option-row-${ repeaterFieldId }-display input:checked` ).val(); // Allow adding many fields. Skip if the display is not `rows`. if ( display !== 'rows' ) { return isFieldAllowed; } // Allow adding one field. The column doesn't contain fields. if ( ! $targetColumn.find( '.wpforms-field:not(.wpforms-field-dragging)' ).length ) { return isFieldAllowed; } vars.fieldMoveToRowsRejected = true; // Disallow adding field if the column already contains some field. return false; }, /** * Filter the field move rejected alert modal options. * * @since 1.8.9 * * @param {Object} modalOptions Field move rejected alert modal options. * @param {jQuery} $field Field element object. * @param {Object} ui Sortable ui object. * @param {jQuery} $targetColumn Target column element. * * @return {Object} Updated the field move rejected alert modal options. */ filterFieldMoveRejectedModalOptions( modalOptions, $field, ui, $targetColumn ) { const $repeaterField = $targetColumn?.closest( '.wpforms-field-repeater' ); if ( ! $repeaterField?.length ) { return modalOptions; } const updatedModalOptions = { title: strings.not_allowed, content: strings.move_to_rows_rejected_alert, type: 'orange', }; // The field is rejected by type, return the message for the Repeater field. if ( vars.fieldTypeRejected ) { const name = $( `#wpforms-add-fields-${ vars.fieldTypeRejected }` ).text(); updatedModalOptions.content = strings.not_allowed_alert_text.replace( /%s/g, `${ name }` ); return updatedModalOptions; } // The field move to rows is not rejected, return original message. if ( ! vars.fieldMoveToRowsRejected ) { return modalOptions; } updatedModalOptions.content = strings.move_to_rows_rejected_alert; // The field move to rows is rejected, return the message for the Repeater field. return updatedModalOptions; }, /** * Remove the repeater field and its child fields from the fields' data. * * @since 1.8.9 * * @param {Object} fields Fields data. * * @return {Object} Filtered list of fields. */ removeRepeaterFieldsAndChildren( fields ) { // eslint-disable-line complexity if ( ! fields ) { return {}; } for ( const key in fields ) { if ( fields[ key ].type !== 'repeater' ) { continue; } const columns = fields[ key ][ 'columns-json' ]; // Remove the Repeater itself. delete fields[ key ]; if ( ! columns.length ) { continue; } // Remove all child fields. for ( const col of columns ) { if ( ! col.fields?.length ) { continue; } for ( const colField of col.fields ) { delete fields[ colField ]; } } } return fields; }, /** * Display error modal. * * @since 1.8.9 * * @param {string} title Title. * @param {string} message Message text. */ errorModal( title, message ) { $.confirm( { title, content: message, icon: 'fa fa-exclamation-circle', type: 'orange', buttons: { confirm: { text: wpforms_builder.ok, btnClass: 'btn-confirm', keys: [ 'enter' ], }, }, } ); }, /** * Whether the field type is allowed to be in column. * * @since 1.8.9 * * @param {string} fieldType Field type to check. * * @return {boolean} True if allowed. */ isFieldAllowedInColum( fieldType ) { return strings.not_allowed_fields.indexOf( fieldType ) < 0; }, /** * Filter the fields which are not allowed. * * @since 1.8.9 * * @param {boolean} isAllowed Whether the field is allowed. * @param {string} fieldType Field type to check. * @param {jQuery} $targetColumn Target column element. * * @return {boolean} True if allowed. */ filterIsFieldAllowedInColumn( isAllowed, fieldType, $targetColumn ) { // Skip if the field is not allowed OR the target is not a column, return the original value. if ( ! isAllowed || ! $targetColumn?.length || ! $targetColumn?.hasClass( 'wpforms-layout-column' ) ) { return isAllowed; } const $repeaterField = $targetColumn?.closest( '.wpforms-field-repeater' ); if ( ! $repeaterField?.length ) { return isAllowed; } return app.isFieldAllowedInColum( fieldType ); }, }; // Provide access to public functions/properties. return app; }( document, window, jQuery ) ); // Initialize. WPForms.Admin.Builder.FieldRepeater.init(); {"id":2028,"date":"2023-04-21T04:56:03","date_gmt":"2023-04-21T04:56:03","guid":{"rendered":"https:\/\/icanflynow.com\/?p=2028"},"modified":"2023-04-21T04:56:04","modified_gmt":"2023-04-21T04:56:04","slug":"assassins-creed-odyssey-overhated","status":"publish","type":"post","link":"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/","title":{"rendered":"Assassins Creed Odyssey – Overhated?"},"content":{"rendered":"\n

If you\u2019ve ever felt like the world is too big, too confusing or just downright overwhelming to tackle on your own, then this blog post is for you.<\/p>\n\n\n\n

I know what it feels like when it seems like there are so many things in front of us that we can’t do anything about because they’re just too big. It’s not true though!<\/p>\n\n\n\n

Finding ways to be more savvy and less overwhelmed by our lives is actually really easy with these 61 tips that will make you a savvier traveler and give you some peace of mind at home.<\/p>\n\n\n\n

Read on if travel has been on your mind lately but maybe you don’t have the time or money to take a break from life right now \u2013 this post is perfect for all types of travelers!<\/p>\n\n\n\n

    \n
  1. Be prepared with a travel kit that includes necessities such as medications<\/li>\n<\/ol>\n\n\n\n

    Make sure to carry a travel kit with you when going on vacation. This will make it easy for you to stay healthy while away from home by including things like medicine and other items that are essential for your health.<\/p>\n\n\n\n

    Whether you’re going for a week or two on vacation, or on a business trip, make sure to travel prepared. My travel kit always includes tons of medicine. I don’t want to catch something while out on the road, so I’m prepared for anything!<\/p>\n\n\n\n

    It\u2019s also a good idea to include emergency contact information into your travel kit.<\/p>\n\n\n\n

      \n
    1. Keep your passport handy at all times \u2013 don’t put it in a safe or locker<\/li>\n<\/ol>\n\n\n\n

      Don’t leave your passport in a safe.<\/p>\n\n\n\n

      I don’t want to sound like your mother, but you should keep it with you at all times because if it’s stolen then that could cause problems when going through security or leaving the country.<\/p>\n\n\n\n

      Always keep your passport in a place you can easily access it in case you need to make an emergency exit.<\/p>\n\n\n\n

        \n
      1. Update apps to your destination’s currency to track your spending<\/li>\n<\/ol>\n\n\n\n

        You can track your spending more easily if you update the apps on your phone to the destination’s currency. That way, it will be easier for you to check how much money you have left so that there are no surprises when it comes time to pay.<\/p>\n\n\n\n

        If you’re traveling, it’s a good idea to set your phone to the local currency so that all of your transactions are automatically labeled with their correct prices.<\/p>\n\n\n\n

        Fiddling around with exchange rates all the time is not worth it!<\/p>\n\n\n\n

          \n
        1. Book flights on Tuesdays and Wednesdays to get the cheapest fares<\/li>\n<\/ol>\n\n\n\n

          The best time to book a flight is on Tuesday or Wednesday. That’s because most people are looking for flights over the weekend, so you can find some great deals if you have patience!<\/p>\n\n\n\n

          I first learned this trick from my flight attendant friends \u2013 and I can now confirm it works amazingly well! I\u2019ve saved thousands of dollars by simply following this one travel hack.<\/p>\n\n\n\n

            \n
          1. Use Google Maps offline so you can still navigate even without a connection<\/li>\n<\/ol>\n\n\n\n

            If you’re driving or walking between places and don’t have a data connection, use Google Maps’ offline mode. It’ll still give you directions and useful information like the distance to your destination, what streets to take, and how long it’ll take to get there.<\/p>\n\n\n\n

            You can also download a map of your places of interest ahead of time, and then you get to use it anywhere \u2013 even on things like subways!<\/p>\n\n\n\n

              \n
            1. Carry a credit card from home country as well as one from destination country<\/li>\n<\/ol>\n\n\n\n

              If you are traveling to another country, it’s always a good idea to bring your credit card from your home country with you. You don’t want to rely on just one or two cards when travelling because that could be risky if one of them gets lost or stolen.<\/p>\n\n\n\n

              I always bring my credit card from home, as well as one from the place I’m going or alternatively an international card such as Revolut. In case anything happens, I always have a way to get money and communicate with people at home.<\/p>\n\n\n\n

              What are your own best travel hacks?<\/p>\n\n\n\n

              Traveling can be a stressful and terrifying experience, but it doesn\u2019t have to be.<\/p>\n\n\n\n

              By following these simple tips, you will always know what to expect, where your passport is at all times, how much money you’re spending on flights and accommodations (and when), and most importantly, that you are ready in case of emergency.<\/p>\n\n\n\n

              What are some of your own best traveling hacks? Share them with us below!<\/p>\n","protected":false},"excerpt":{"rendered":"

              If you\u2019ve ever felt like the world is too big, too confusing or just downright overwhelming to tackle on your own, then this blog post is for you. I know what it feels like when it seems like there are so many things in front of us that we can’t do anything about because they’re […]<\/p>\n","protected":false},"author":1,"featured_media":2029,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"nf_dc_page":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[13],"tags":[],"class_list":["post-2028","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-reviewed"],"yoast_head":"\nAssassins Creed Odyssey - Overhated? -<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Assassins Creed Odyssey - Overhated? -\" \/>\n<meta property=\"og:description\" content=\"If you\u2019ve ever felt like the world is too big, too confusing or just downright overwhelming to tackle on your own, then this blog post is for you. I know what it feels like when it seems like there are so many things in front of us that we can’t do anything about because they’re […]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-21T04:56:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-21T04:56:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/icanflynow.com\/wp-content\/uploads\/2023\/04\/942304-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1440\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Captain\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Captain\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/\",\"url\":\"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/\",\"name\":\"Assassins Creed Odyssey - Overhated? -\",\"isPartOf\":{\"@id\":\"https:\/\/icanflynow.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/icanflynow.com\/wp-content\/uploads\/2023\/04\/942304-scaled.jpg\",\"datePublished\":\"2023-04-21T04:56:03+00:00\",\"dateModified\":\"2023-04-21T04:56:04+00:00\",\"author\":{\"@id\":\"https:\/\/icanflynow.com\/#\/schema\/person\/d948c96678fc91f964aee05207dce338\"},\"breadcrumb\":{\"@id\":\"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/#primaryimage\",\"url\":\"https:\/\/icanflynow.com\/wp-content\/uploads\/2023\/04\/942304-scaled.jpg\",\"contentUrl\":\"https:\/\/icanflynow.com\/wp-content\/uploads\/2023\/04\/942304-scaled.jpg\",\"width\":2560,\"height\":1440},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/icanflynow.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Assassins Creed Odyssey – Overhated?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/icanflynow.com\/#website\",\"url\":\"https:\/\/icanflynow.com\/\",\"name\":\"\",\"description\":\"The Premier Destination for all things Video Games\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/icanflynow.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/icanflynow.com\/#\/schema\/person\/d948c96678fc91f964aee05207dce338\",\"name\":\"Captain\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/icanflynow.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3306b401a27e77d085e872a2e067d3e4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3306b401a27e77d085e872a2e067d3e4?s=96&d=mm&r=g\",\"caption\":\"Captain\"},\"sameAs\":[\"https:\/\/icanflynow.com\"],\"url\":\"https:\/\/icanflynow.com\/author\/captain\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Assassins Creed Odyssey - Overhated? -","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/","og_locale":"en_US","og_type":"article","og_title":"Assassins Creed Odyssey - Overhated? -","og_description":"If you\u2019ve ever felt like the world is too big, too confusing or just downright overwhelming to tackle on your own, then this blog post is for you. I know what it feels like when it seems like there are so many things in front of us that we can’t do anything about because they’re […]","og_url":"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/","article_published_time":"2023-04-21T04:56:03+00:00","article_modified_time":"2023-04-21T04:56:04+00:00","og_image":[{"width":2560,"height":1440,"url":"https:\/\/icanflynow.com\/wp-content\/uploads\/2023\/04\/942304-scaled.jpg","type":"image\/jpeg"}],"author":"Captain","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Captain","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/","url":"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/","name":"Assassins Creed Odyssey - Overhated? -","isPartOf":{"@id":"https:\/\/icanflynow.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/#primaryimage"},"image":{"@id":"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/#primaryimage"},"thumbnailUrl":"https:\/\/icanflynow.com\/wp-content\/uploads\/2023\/04\/942304-scaled.jpg","datePublished":"2023-04-21T04:56:03+00:00","dateModified":"2023-04-21T04:56:04+00:00","author":{"@id":"https:\/\/icanflynow.com\/#\/schema\/person\/d948c96678fc91f964aee05207dce338"},"breadcrumb":{"@id":"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/#primaryimage","url":"https:\/\/icanflynow.com\/wp-content\/uploads\/2023\/04\/942304-scaled.jpg","contentUrl":"https:\/\/icanflynow.com\/wp-content\/uploads\/2023\/04\/942304-scaled.jpg","width":2560,"height":1440},{"@type":"BreadcrumbList","@id":"https:\/\/icanflynow.com\/assassins-creed-odyssey-overhated\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/icanflynow.com\/"},{"@type":"ListItem","position":2,"name":"Assassins Creed Odyssey – Overhated?"}]},{"@type":"WebSite","@id":"https:\/\/icanflynow.com\/#website","url":"https:\/\/icanflynow.com\/","name":"","description":"The Premier Destination for all things Video Games","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/icanflynow.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/icanflynow.com\/#\/schema\/person\/d948c96678fc91f964aee05207dce338","name":"Captain","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/icanflynow.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3306b401a27e77d085e872a2e067d3e4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3306b401a27e77d085e872a2e067d3e4?s=96&d=mm&r=g","caption":"Captain"},"sameAs":["https:\/\/icanflynow.com"],"url":"https:\/\/icanflynow.com\/author\/captain\/"}]}},"_links":{"self":[{"href":"https:\/\/icanflynow.com\/wp-json\/wp\/v2\/posts\/2028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/icanflynow.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/icanflynow.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/icanflynow.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/icanflynow.com\/wp-json\/wp\/v2\/comments?post=2028"}],"version-history":[{"count":1,"href":"https:\/\/icanflynow.com\/wp-json\/wp\/v2\/posts\/2028\/revisions"}],"predecessor-version":[{"id":2030,"href":"https:\/\/icanflynow.com\/wp-json\/wp\/v2\/posts\/2028\/revisions\/2030"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/icanflynow.com\/wp-json\/wp\/v2\/media\/2029"}],"wp:attachment":[{"href":"https:\/\/icanflynow.com\/wp-json\/wp\/v2\/media?parent=2028"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/icanflynow.com\/wp-json\/wp\/v2\/categories?post=2028"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/icanflynow.com\/wp-json\/wp\/v2\/tags?post=2028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}