11import { Component , Part , Prop } from '@pictogrammers/element' ;
22
33import PgMenuItem from '../menuItem/menuItem' ;
4+ import PgIcon from '../icon/icon' ;
45import PgOverlayMenu from '../overlayMenu/overlayMenu' ;
56
67import '../button/button' ;
@@ -9,7 +10,8 @@ import PgButton from '../button/button';
910import template from './buttonMenu.html' ;
1011import style from './buttonMenu.css' ;
1112
12- const t = [ true , 'true' , '' ] ;
13+ const IconExpand = 'M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z' ;
14+ const IconCollapse = 'M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z' ;
1315
1416@Component ( {
1517 selector : 'pg-button-menu' ,
@@ -19,51 +21,48 @@ const t = [true, 'true', ''];
1921export default class PgButtonMenu extends HTMLElement {
2022 @Prop ( ) items : any [ ] = [ ] ;
2123 @Prop ( ) value : any = null ;
24+ @Prop ( ) label : string = '' ;
25+ @Prop ( ) default : any = null ;
2226
2327 @Part ( ) $button : PgButton ;
24- @Part ( ) $expand : HTMLSlotElement ;
25- @Part ( ) $collapse : HTMLSlotElement ;
28+ @Part ( ) $icon : PgIcon ;
29+ @Part ( ) $label : HTMLSpanElement ;
2630
2731 connectedCallback ( ) {
28- this . $button . addEventListener ( 'click' , ( e ) => {
29- e . stopPropagation ( ) ;
30- this . #handleClick( ) ;
31- // open menu
32- /*this.dispatchEvent(
33- new CustomEvent('click', {
34- detail: {
35- active: this.active
36- }
37- })
38- );*/
39- } ) ;
32+ this . $button . addEventListener ( 'click' , this . #handleClick. bind ( this ) ) ;
33+ }
34+
35+ render ( changes ) {
36+ if ( changes . label ) {
37+ this . $label . textContent = this . label ;
38+ }
4039 }
4140
4241 #menuOpen = false ;
4342 async #handleClick( ) {
44- if ( this . #menuOpen) { return ; }
43+ this . #menuOpen = ! this . #menuOpen;
44+ this . $icon . path = this . #menuOpen ? IconCollapse : IconExpand ;
45+ if ( ! this . #menuOpen) { return ; }
4546 const items = this . items . map ( ( item ) => {
4647 return {
4748 type : PgMenuItem ,
4849 label : item . label ,
4950 value : item . value
5051 } ;
5152 } ) ;
52- this . #menuOpen = true ;
53- /*
53+ // Create Menu
54+ const result = await PgOverlayMenu . open ( {
55+ source : this ,
56+ default : this . default ?? items [ 0 ] ,
57+ value : items . find ( x => x . value === this . value ) ?? null ,
58+ items : items
59+ } ) ;
5460 if ( result !== undefined ) {
55- this.#value = result;
56- }
57- this.$result.textContent = result;
58- */
59- this . #menuOpen = false ;
60- }
61-
62-
63- render ( changes ) {
64- if ( changes . active ) {
65- this . $expand . style . display = this . $button . active ? 'flex' : 'none' ;
66- this . $collapse . style . display = this . $button . active ? 'none' : 'flex' ;
61+ this . dispatchEvent ( new CustomEvent ( 'change' , {
62+ detail : {
63+ value : result . value
64+ }
65+ } ) ) ;
6766 }
6867 }
6968}
0 commit comments