@@ -10,8 +10,10 @@ export default class Dropdown extends ZephyrJS {
1010 this . state = {
1111 options : [ ] ,
1212 selectedOption : null ,
13+ isOpen : false ,
1314 placeholder : 'Select an option'
1415 } ;
16+ console . log ( 'Dropdown constructor called' ) ;
1517 }
1618
1719 async connectedCallback ( ) {
@@ -24,9 +26,22 @@ export default class Dropdown extends ZephyrJS {
2426 await this . renderAndAddListeners ( ) ;
2527 }
2628
29+ setState ( newState ) {
30+ super . setState ( newState ) ;
31+ this . render ( ) ;
32+ }
33+
2734 setOptions ( options ) {
2835 this . setState ( { options } ) ;
29- this . renderAndAddListeners ( ) ;
36+ }
37+
38+ toggleDropdown ( ) {
39+ this . setState ( { isOpen : ! this . state . isOpen } ) ;
40+ }
41+
42+ selectOption ( option ) {
43+ this . setState ( { selectedOption : option , isOpen : false } ) ;
44+ this . dispatchCustomEvent ( 'optionSelected' , { option } ) ;
3045 }
3146
3247 async renderAndAddListeners ( ) {
@@ -40,58 +55,68 @@ export default class Dropdown extends ZephyrJS {
4055 return ;
4156 }
4257
43- let select = this . shadowRoot . querySelector ( 'select ' ) ;
44- if ( ! select ) {
58+ let dropdownContainer = this . shadowRoot . querySelector ( '.dropdown-container ' ) ;
59+ if ( ! dropdownContainer ) {
4560 if ( this . template && this . template . content ) {
4661 const templateContent = this . template . content . cloneNode ( true ) ;
4762 this . shadowRoot . appendChild ( templateContent ) ;
48- select = this . shadowRoot . querySelector ( 'select ' ) ;
63+ dropdownContainer = this . shadowRoot . querySelector ( '.dropdown-container ' ) ;
4964 } else {
5065 console . error ( 'Template content not available' ) ;
5166 return ;
5267 }
5368 }
5469
55- if ( ! select ) {
56- console . error ( 'Select element still not found after inserting template' ) ;
57- console . log ( 'Shadow root content:' , this . shadowRoot . innerHTML ) ;
70+ if ( ! dropdownContainer ) {
71+ console . error ( 'Dropdown container still not found after inserting template' ) ;
5872 return ;
5973 }
6074
61- // Clear existing options
62- select . innerHTML = '' ;
63-
64- // Add placeholder option if needed
65- if ( this . state . placeholder ) {
66- const placeholderOption = document . createElement ( 'option' ) ;
67- placeholderOption . value = '' ;
68- placeholderOption . textContent = this . state . placeholder ;
69- placeholderOption . disabled = true ;
70- placeholderOption . selected = ! this . state . selectedOption ;
71- select . appendChild ( placeholderOption ) ;
72- }
75+ const dropdownToggle = dropdownContainer . querySelector ( '.dropdown-toggle' ) ;
76+ const dropdownOptions = dropdownContainer . querySelector ( '.dropdown-options' ) ;
7377
74- // Add options
75- this . state . options . forEach ( option => {
76- const optionElement = document . createElement ( 'option' ) ;
77- optionElement . value = option . value ;
78- optionElement . textContent = option . label ;
79- optionElement . selected = option . value === this . state . selectedOption ;
80- select . appendChild ( optionElement ) ;
81- } ) ;
78+ const selectedOption = this . state . options . find ( opt => opt . value === this . state . selectedOption ) ;
79+ dropdownToggle . textContent = selectedOption ? selectedOption . label : this . state . placeholder ;
80+
81+ dropdownOptions . innerHTML = this . state . options . map ( option => `
82+ <li class="dropdown-option" data-value="${ option . value } ">${ option . label } </li>
83+ ` ) . join ( '' ) ;
84+
85+ dropdownOptions . style . display = this . state . isOpen ? 'block' : 'none' ;
86+ // Set background color using CSS variable
87+ dropdownOptions . style . backgroundColor = 'var(--primary-color)' ;
8288 }
8389
8490 addEventListeners ( ) {
85- const select = this . shadowRoot . querySelector ( 'select' ) ;
91+ const dropdownToggle = this . shadowRoot . querySelector ( '.dropdown-toggle' ) ;
92+ const optionsList = this . shadowRoot . querySelector ( '.dropdown-options' ) ;
93+
94+ if ( dropdownToggle ) {
95+ dropdownToggle . addEventListener ( 'click' , ( e ) => {
96+ e . stopPropagation ( ) ;
97+ this . toggleDropdown ( ) ;
98+ } ) ;
99+ } else {
100+ console . error ( 'Dropdown toggle not found' ) ;
101+ }
86102
87- if ( select ) {
88- select . addEventListener ( 'change' , ( e ) => {
89- this . state . selectedOption = e . target . value ;
90- this . dispatchCustomEvent ( 'optionSelected' , { option : this . state . selectedOption } ) ;
103+ if ( optionsList ) {
104+ optionsList . addEventListener ( 'click' , ( e ) => {
105+ if ( e . target . classList . contains ( 'dropdown-option' ) ) {
106+ const selectedValue = e . target . dataset . value ;
107+ this . selectOption ( selectedValue ) ;
108+ }
91109 } ) ;
92110 } else {
93- console . error ( 'Select element not found' ) ;
111+ console . error ( 'Options list not found' ) ;
94112 }
113+
114+ // Close dropdown when clicking outside
115+ document . addEventListener ( 'click' , ( ) => {
116+ if ( this . state . isOpen ) {
117+ this . setState ( { isOpen : false } ) ;
118+ }
119+ } ) ;
95120 }
96121
97122 disconnectedCallback ( ) {
0 commit comments