/** * External dependencies */ import { __, _n, sprintf } from '@wordpress/i18n'; import { Fragment } from '@wordpress/element'; import { find } from 'lodash'; import PropTypes from 'prop-types'; import { SearchListControl, SearchListItem } from '@woocommerce/components'; import { SelectControl, Spinner } from '@wordpress/components'; import { withAttributes } from '@woocommerce/block-hocs'; import ErrorMessage from '@woocommerce/block-components/error-placeholder/error-message.js'; /** * Internal dependencies */ import './style.scss'; const ProductAttributeTermControl = ( { attributes, error, expandedAttribute, onChange, onExpandAttribute, onOperatorChange, isLoading, operator, selected, termsAreLoading, termsList, } ) => { const onSelectAttribute = ( item ) => { return () => { onChange( [] ); onExpandAttribute( item.id ); }; }; const renderItem = ( args ) => { const { item, search, depth = 0 } = args; const classes = [ 'woocommerce-product-attributes__item', 'woocommerce-search-list__item', ]; if ( search.length ) { classes.push( 'is-searching' ); } if ( depth === 0 && item.parent ) { classes.push( 'is-skip-level' ); } if ( ! item.breadcrumbs.length ) { return [ , expandedAttribute === item.id && termsAreLoading && (
), ]; } return ( ); }; const currentTerms = termsList[ expandedAttribute ] || []; const currentList = [ ...attributes, ...currentTerms ]; const messages = { clear: __( 'Clear all product attributes', 'woocommerce' ), list: __( 'Product Attributes', 'woocommerce' ), noItems: __( "Your store doesn't have any product attributes.", 'woocommerce' ), search: __( 'Search for product attributes', 'woocommerce' ), selected: ( n ) => sprintf( _n( '%d attribute selected', '%d attributes selected', n, 'woocommerce' ), n ), updated: __( 'Product attribute search results updated.', 'woocommerce' ), }; if ( error ) { return ; } return ( find( currentList, { id } ) ) .filter( Boolean ) } onChange={ onChange } renderItem={ renderItem } messages={ messages } isHierarchical /> { !! onOperatorChange && (
) }
); }; ProductAttributeTermControl.propTypes = { /** * Callback to update the selected product attributes. */ onChange: PropTypes.func.isRequired, /** * Callback to update the category operator. If not passed in, setting is not used. */ onOperatorChange: PropTypes.func, /** * Setting for whether products should match all or any selected categories. */ operator: PropTypes.oneOf( [ 'all', 'any' ] ), /** * The list of currently selected attribute slug/ID pairs. */ selected: PropTypes.array.isRequired, // from withAttributes attributes: PropTypes.array, error: PropTypes.object, expandedAttribute: PropTypes.number, onExpandAttribute: PropTypes.func, isLoading: PropTypes.bool, termsAreLoading: PropTypes.bool, termsList: PropTypes.object, }; ProductAttributeTermControl.defaultProps = { operator: 'any', }; export default withAttributes( ProductAttributeTermControl ); Book Your Tailor-Made Machu Picchu Adventure Today!
Embark on a Journey to the Heart of the Inca Empire
A once-in-a-lifetime journey through Peru's most iconic treasure
Explore Machu Picchu with Noa Adventures
Expert guides and personalized itineraries for your ultimate adventure
Walk the Paths of the Incas
Unveil the secrets of Machu Picchu with our tailor-made tours

Reserve Your Machu Picchu Adventure Today

Welcome to Noa Adventures!

At Noa Adventures, we specialize in creating unforgettable journeys to the breathtaking Machu Picchu. Whether you’re seeking a cultural exploration, a scenic adventure, or a deep connection with Peru’s heritage, we tailor each trip to meet your needs and exceed your expectations. Our experienced guides and personalized service ensure that every aspect of your visit is seamlessly crafted, allowing you to fully immerse yourself in the wonders of the Inca citadel and the beautiful landscapes surrounding it.

Join us and discover the magic of Machu Picchu with Noa Adventures!