@@ -79,35 +79,30 @@ export class SegmentedButton {
7979 showHelperText = false ;
8080 @Listen ( 'scaleClick' )
8181 scaleClickHandler ( ev : { detail : { id : string ; selected : boolean } } ) {
82- let tempState : SegmentStatus [ ] ;
82+ if ( this . status . length === 0 ) {
83+ return ;
84+ }
85+ let tempState = this . getAllSegments ( ) . map ( ( segment ) => {
86+ return {
87+ id : segment . getAttribute ( 'segment-id' ) || segment . segmentId ,
88+ selected :
89+ segment . hasAttribute ( 'selected' ) && segment . selected ? true : false ,
90+ } ;
91+ } ) ;
8392 if ( ! this . multiSelect ) {
8493 if ( ! ev . detail . selected ) {
85- tempState = this . status . map ( ( obj ) =>
94+ tempState = tempState . map ( ( obj ) =>
8695 ev . detail . id === obj . id ? ev . detail : { ...obj }
8796 ) ;
88- /* clicked button has now selected state */
8997 } else {
90- tempState = this . status . map ( ( obj ) =>
98+ tempState = tempState . map ( ( obj ) =>
9199 ev . detail . id === obj . id ? ev . detail : { ...obj , selected : false }
92100 ) ;
93101 }
94- } else {
95- tempState = this . status . map ( ( obj ) =>
96- ev . detail . id === obj . id ? ev . detail : { ...obj }
97- ) ;
98102 }
99103 this . setState ( tempState ) ;
100104 }
101105
102- @Listen ( 'scaleSelectionChanged' )
103- selectionChangedHandler ( ) {
104- this . selectedIndex = this . getSelectedIndex ( ) ;
105- if ( typeof ( this . selectedIndex ) !== 'number' ) { return }
106- this . getAllSegments ( ) . forEach ( ( segment ) => {
107- segment . setAttribute ( 'selected-index' , this . selectedIndex . toString ( ) ) ;
108- } )
109- }
110-
111106 @Watch ( 'disabled' )
112107 @Watch ( 'size' )
113108 @Watch ( 'selectedIndex' )
@@ -135,15 +130,16 @@ export class SegmentedButton {
135130 segments . forEach ( ( segment , i ) => {
136131 tempState . push ( {
137132 id : segment . getAttribute ( 'segment-id' ) || segment . segmentId ,
138- selected : segment . hasAttribute ( 'selected' ) || segment . selected ,
133+ selected :
134+ segment . hasAttribute ( 'selected' ) && segment . selected ? true : false ,
139135 } ) ;
140- segment . setAttribute ( 'position' , `${ i + 1 } ` ) ;
136+ segment . setAttribute ( 'position' , `${ i } ` ) ;
141137 segment . setAttribute (
142138 'aria-description-translation' ,
143139 '$position $selected'
144140 ) ;
145141 } ) ;
146- this . setState ( tempState ) ;
142+ this . setState ( tempState , true ) ;
147143 this . selectedIndex = this . getSelectedIndex ( ) ;
148144 this . showHelperText = this . shouldShowHelperText ( ) ;
149145 }
@@ -185,7 +181,8 @@ export class SegmentedButton {
185181 const selectedIndex = allSegments . findIndex (
186182 ( el : HTMLScaleSegmentElement ) => el . selected === true
187183 ) ;
188- return selectedIndex ;
184+ // we need to return -2 if no segment is selected
185+ return selectedIndex >= 0 ? selectedIndex : - 2 ;
189186 }
190187 }
191188
@@ -235,7 +232,7 @@ export class SegmentedButton {
235232 return tempWidth ;
236233 }
237234
238- setState ( tempState : SegmentStatus [ ] ) {
235+ setState ( tempState : SegmentStatus [ ] , isInitial : boolean = false ) {
239236 const segments = Array . from (
240237 this . hostElement . querySelectorAll ( 'scale-segment' )
241238 ) ;
@@ -250,7 +247,9 @@ export class SegmentedButton {
250247 ) ;
251248 } ) ;
252249 this . status = tempState ;
253- emitEvent ( this , 'scaleChange' , this . status ) ;
250+ if ( ! isInitial ) {
251+ emitEvent ( this , 'scaleChange' , { status : this . status , segments } ) ;
252+ }
254253 }
255254
256255 getAllSegments ( ) {
0 commit comments