/var/www/html_us/wp-content/plugins/woocommerce/src/Blocks/InteractivityComponents/Dropdown.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?php

namespace Automattic\WooCommerce\Blocks\InteractivityComponents;

/**
 * Dropdown class. This is a component for reuse with interactivity API.
 *
 * @package Automattic\WooCommerce\Blocks\InteractivityComponents
 */
class Dropdown {
    
/**
     * Render the dropdown.
     *
     * @param mixed $props The properties to render the dropdown with.
     * @return string|false
     */
    
public static function render$props ) {
        
wp_enqueue_script'wc-interactivity-dropdown' );
        
wp_enqueue_style'wc-interactivity-dropdown' );

        
$select_type    $props['select_type'] ?? 'single';
        
$selected_items $props['selected_items'] ?? array();

        
// Items should be an array of objects with a label and value property.
        
$items $props['items'] ?? array();

        
$default_placeholder 'single' === $select_type __'Select an option''woocommerce' ) : __'Select options''woocommerce' );
        
$placeholder         $props['placeholder'] ?? $default_placeholder;

        
$dropdown_context = array(
            
'selectedItems'      => $selected_items,
            
'isOpen'             => false,
            
'selectType'         => $select_type,
            
'defaultPlaceholder' => $placeholder,
        );

        
$action    $props['action'] ?? '';
        
$namespace wp_json_encode( array( 'namespace' => 'woocommerce/interactivity-dropdown' ), JSON_HEX_TAG JSON_HEX_APOS JSON_HEX_QUOT JSON_HEX_AMP );

        
ob_start();
        
?>
        <div data-wc-interactive='<?php echo esc_attr$namespace ); ?>'>
            <div class="wc-interactivity-dropdown" data-wc-on--click="actions.toggleIsOpen" data-wc-context='<?php echo wp_json_encode$dropdown_contextJSON_HEX_TAG JSON_HEX_APOS JSON_HEX_QUOT JSON_HEX_AMP ); ?>' >
                <div class="wc-interactivity-dropdown__dropdown" tabindex="-1" >
                    <div class="wc-interactivity-dropdown__dropdown-selection" id="options-dropdown" tabindex="0" aria-haspopup="listbox">
                        <span class="wc-interactivity-dropdown__placeholder" data-wc-text="state.placeholderText">
                            <?php echo empty( $selected_items ) ? esc_html$placeholder ) : ''?>
                        </span>
                        <?php if ( 'multiple' === $select_type ) { ?>
                            <div class="selected-options">
                                <template
                                        data-wc-each="context.selectedItems"
                                        data-wc-each-key="context.item.value"
                                    >
                                        <div class="wc-interactivity-dropdown__selected-badge">
                                            <span class="wc-interactivity-dropdown__badge-text" data-wc-text="context.item.label"></span>
                                            <svg
                                                data-wc-on--click="actions.unselectDropdownItem"
                                                data-wc-on--click--parent-action="<?php echo esc_attr$action ); ?>"
                                                class="wc-interactivity-dropdown__badge-remove"
                                                width="24"
                                                height="24"
                                                xmlns="http://www.w3.org/2000/svg"
                                                viewBox="0 0 24 24"
                                                aria-hidden="true"
                                            >
                                                <path d="M12 13.06l3.712 3.713 1.061-1.06L13.061 12l3.712-3.712-1.06-1.06L12 10.938 8.288 7.227l-1.061 1.06L10.939 12l-3.712 3.712 1.06 1.061L12 13.061z"></path>
                                            </svg>
                                        </div>
                                </template>

                                <?php foreach ( $selected_items as $selected ) { ?>
                                    <div
                                        class="wc-interactivity-dropdown__selected-badge"
                                        data-wc-key="<?php echo esc_attr$selected['value'] ); ?>"
                                        data-wc-each-child
                                    >
                                            <span class="wc-interactivity-dropdown__badge-text"><?php echo esc_html$selected['label'] ); ?></span>
                                            <svg
                                                data-wc-on--click="actions.unselectDropdownItem"
                                                data-wc-on--click--parent-action="<?php echo esc_attr$action ); ?>"
                                                class="wc-interactivity-dropdown__badge-remove"
                                                width="24"
                                                height="24"
                                                xmlns="http://www.w3.org/2000/svg"
                                                viewBox="0 0 24 24"
                                                aria-hidden="true"
                                            >
                                                <path d="M12 13.06l3.712 3.713 1.061-1.06L13.061 12l3.712-3.712-1.06-1.06L12 10.938 8.288 7.227l-1.061 1.06L10.939 12l-3.712 3.712 1.06 1.061L12 13.061z"></path>
                                            </svg>
                                    </div>
                                <?php ?>
                            </div>
                        <?php ?>
                        <span class="wc-interactivity-dropdown__svg-container">
                            <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="30" height="30" >
                                <path d="M17.5 11.6L12 16l-5.5-4.4.9-1.2L12 14l4.5-3.6 1 1.2z" ></path>
                            </svg>
                        </span>
                    </div>
                    <div
                        class="wc-interactivity-dropdown__dropdown-list"
                        aria-labelledby="options-dropdown"
                        role="listbox"
                        data-wc-bind--hidden="!context.isOpen"
                        <?php echo esc_attr$dropdown_context['isOpen'] ? '' 'hidden' ); ?>
                    >
                        <?php
                        
foreach ( $items as $item ) :
                            
$context = array( 'item' => $item );
                            
?>
                            <div
                                class="wc-interactivity-dropdown__dropdown-option"
                                role="option"
                                tabindex="0"
                                data-wc-on--click--select-item="actions.selectDropdownItem"
                                data-wc-on--click--parent-action="<?php echo esc_attr$action ); ?>"
                                data-wc-class--is-selected="state.isSelected"
                                class="components-form-token-field__suggestion"
                                data-wc-bind--aria-selected="state.isSelected"
                                data-wc-context='<?php echo wp_json_encode$contextJSON_HEX_TAG JSON_HEX_APOS JSON_HEX_QUOT JSON_HEX_AMP ); ?>'
                            >
                                <?php echo $item['label']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
                            </div>
                        <?php endforeach; ?>
                    </div>
                </div>
            </div>
        </div>
        <?php
        
return ob_get_clean();
    }
}