1- // Inspired by https://codepen.io/giannisrig/pen/ywBWOV
21window . addEventListener ( 'load' , function ( ) {
3- document . querySelectorAll ( '.elbformat-icon-select' ) . forEach ( ( iconDropdown ) => {
4- // Hidden field to carry the form data
5- let hiddenField = document . createElement ( 'input' ) ;
6- hiddenField . setAttribute ( 'type' , 'hidden' ) ;
7- hiddenField . setAttribute ( 'name' , iconDropdown . getAttribute ( 'name' ) ) ;
8- let value = iconDropdown . value || '' ;
9- hiddenField . setAttribute ( 'value' , value ) ;
10- iconDropdown . after ( hiddenField ) ;
2+ // Find list entries
3+ document . querySelectorAll ( '.elbformat-icon-select' ) . forEach ( ( iconDropdownEntry ) => {
4+ let value = iconDropdownEntry . value || '' ;
5+ let iconMarkup = iconDropdownEntry . getAttribute ( 'data-markup' ) ;
6+ let li = iconDropdownEntry . closest ( '.ibexa-dropdown' ) . querySelector ( '.ibexa-dropdown__item[data-value="' + value + '"]' ) ;
117
12- // Wrapper for new widget
13- let wrapper = document . createElement ( 'div' ) ;
14- wrapper . classList . add ( 'icon-dropdown-wrapper' ) ;
15- iconDropdown . after ( wrapper ) ;
8+ // Create a span with icon
9+ let wrapper = document . createElement ( 'span' ) ;
10+ wrapper . classList . add ( 'ibexa-icon' ) ;
11+ wrapper . classList . add ( 'ibexa-icon--small' ) ;
12+ wrapper . innerHTML = iconMarkup ;
1613
17- let button = document . createElement ( 'button' ) ;
18- button . classList . add ( 'icon-dropdown-trigger' ) ;
19- wrapper . appendChild ( button ) ;
20- let iconList = document . createElement ( 'div' ) ;
21- iconList . classList . add ( 'icon-dropdown-list' ) ;
22- wrapper . appendChild ( iconList ) ;
14+ // Insert before the label
15+ let label = li . querySelector ( '.ibexa-dropdown__item-label' ) ;
16+ li . insertBefore ( wrapper , label ) ;
2317
24- // Extract icons
25- let items = JSON . parse ( iconDropdown . getAttribute ( 'data-choices' ) ) ;
26- for ( const [ key , tmpl ] of Object . entries ( items ) ) {
27- let container = document . createElement ( 'button' ) ;
28- container . setAttribute ( 'value' , key )
29- let iconContainer = document . createElement ( 'div' ) ;
30- iconContainer . classList . add ( 'icon-container' ) ;
31- iconContainer . innerHTML = tmpl ;
32- container . appendChild ( iconContainer ) ;
33- container . innerHTML += key
34- iconList . appendChild ( container ) ;
35- if ( value === key ) {
36- button . innerHTML = container . innerHTML ;
37- }
38- // Click on entry
39- container . addEventListener ( 'click' , ( e ) => {
40- button . innerHTML = container . innerHTML ;
41- hiddenField . value = key ;
42- wrapper . classList . remove ( 'open' ) ;
43- e . preventDefault ( ) ;
44- return false ;
45- } ) ;
46- } ;
47-
48- // Open/Close
49- button . addEventListener ( 'click' , ( e ) => {
50- if ( wrapper . classList . contains ( 'open' ) ) {
51- wrapper . classList . remove ( 'open' ) ;
52- } else {
53- wrapper . classList . add ( 'open' ) ;
54- }
55- e . preventDefault ( ) ;
56- return false ;
57- } ) ;
18+ // @todo also update the selected choice with an icon
5819 } ) ;
5920
6021} ) ;
0 commit comments