@@ -80,15 +80,11 @@ export class SliderWebcomponent extends BaseCustomWebComponentConstructorAppend
8080
8181 private _rangeInputs : HTMLInputElement [ ] ;
8282 private _valuesGap : number = 1 ;
83- private _suppressAttributeChange : boolean = false ;
84- private _currentMinVal : number ;
85- private _currentMaxVal : number ;
8683
8784 attributeChangedCallback ( name : string , oldValue : string , newValue : string ) {
88- if ( this . _suppressAttributeChange ) return ;
89-
85+ if ( newValue === 'undefined' ) return ;
9086 if ( name === "value-min" || name === "value-max" ) {
91- this . _validateValues ( name , newValue ) ;
87+ this . _validateMinMaxValuesAfterAttributeChangedCallback ( name , newValue ) ;
9288 }
9389
9490 if ( name === "min" || name === "max" ) {
@@ -108,60 +104,55 @@ export class SliderWebcomponent extends BaseCustomWebComponentConstructorAppend
108104
109105 this . _parseAttributesToProperties ( ) ;
110106
111- // Initialize current values
112- this . _currentMinVal = parseInt ( this . getAttribute ( 'value-min' ) ) ;
113- this . _currentMaxVal = parseInt ( this . getAttribute ( 'value-max' ) ) ;
114-
115107 // Add event listeners to range input elements
116108 for ( let i = 0 ; i < this . _rangeInputs . length ; i ++ ) {
117109 this . _rangeInputs [ i ] . addEventListener ( "input" , e => {
118- this . _handleRangeInput ( e ) ;
110+ this . _handleRangeInputInputEvent ( e ) ;
119111 } ) ;
120112
121113 this . _rangeInputs [ i ] . addEventListener ( "change" , e => {
122- this . _handleRangeChange ( e ) ;
114+ this . _handleRangeInputChangeEvent ( e ) ;
123115 } ) ;
124116 }
125117
126118 this . _updateRangeInputsMinMax ( ) ;
127- this . _updateRangeInputsValues ( ) ;
128- this . _updateSliderPosition ( this . _currentMinVal , parseInt ( this . getAttribute ( 'max' ) ) , true ) ;
129- this . _updateSliderPosition ( this . _currentMaxVal , parseInt ( this . getAttribute ( 'max' ) ) , false ) ;
119+ this . _rangeInputs [ 0 ] . value = this . getAttribute ( 'value-min' ) ;
120+ this . _rangeInputs [ 1 ] . value = this . getAttribute ( 'value-max' ) ;
121+ this . _updateSliderPosition ( parseInt ( this . getAttribute ( 'value-min' ) ) , parseInt ( this . getAttribute ( 'max' ) ) , true ) ;
122+ this . _updateSliderPosition ( parseInt ( this . getAttribute ( 'value-max' ) ) , parseInt ( this . getAttribute ( 'max' ) ) , false ) ;
130123 }
131124
132- private _validateValues ( changedAttr : string , newValue : string ) {
125+ private _validateMinMaxValuesAfterAttributeChangedCallback ( changedAttr : string , newValue : string ) {
133126 let min = parseInt ( this . getAttribute ( 'min' ) ) ;
134127 let max = parseInt ( this . getAttribute ( 'max' ) ) ;
135128 let valueMin = parseInt ( this . getAttribute ( 'value-min' ) ) ;
136129 let valueMax = parseInt ( this . getAttribute ( 'value-max' ) ) ;
137130
138131 if ( changedAttr === 'value-min' ) {
132+ if ( parseInt ( newValue ) < min ) {
133+ this . _overwriteOutOfRangeAttributeValue ( 'value-min' , min . toString ( ) ) ;
134+ return ;
135+ }
139136 valueMin = Math . max ( min , Math . min ( parseInt ( newValue ) , valueMax - this . _valuesGap ) ) ;
137+ this . _updateSliderPosition ( valueMin , max , true ) ;
138+ if ( this . _rangeInputs ) {
139+ this . _rangeInputs [ 0 ] . value = valueMin . toString ( ) ;
140+ }
140141 } else if ( changedAttr === 'value-max' ) {
142+ if ( parseInt ( newValue ) > max ) {
143+ this . _overwriteOutOfRangeAttributeValue ( 'value-max' , max . toString ( ) ) ;
144+ return ;
145+ }
141146 valueMax = Math . min ( max , Math . max ( parseInt ( newValue ) , valueMin + this . _valuesGap ) ) ;
147+ this . _updateSliderPosition ( valueMax , max , false ) ;
148+ if ( this . _rangeInputs ) {
149+ this . _rangeInputs [ 1 ] . value = valueMax . toString ( ) ;
150+ }
142151 }
152+ }
143153
144- const oldValueMin = parseInt ( this . getAttribute ( 'value-min' ) ) ;
145- const oldValueMax = parseInt ( this . getAttribute ( 'value-max' ) ) ;
146-
147- this . _suppressAttributeChange = true ;
148- if ( valueMin !== oldValueMin ) {
149- this . setAttribute ( 'value-min' , valueMin . toString ( ) ) ;
150- }
151- if ( valueMax !== oldValueMax ) {
152- this . setAttribute ( 'value-max' , valueMax . toString ( ) ) ;
153- }
154- this . _suppressAttributeChange = false ;
155-
156- this . _updateRangeInputsValues ( ) ;
157- this . _updateSliderPosition ( valueMin , max , true ) ;
158- this . _updateSliderPosition ( valueMax , max , false ) ;
159-
160- if ( changedAttr === 'value-min' && valueMin !== oldValueMin ) {
161- this . _dispatchChangeEvent ( 'value-min-changed' , valueMin ) ;
162- } else if ( changedAttr === 'value-max' && valueMax !== oldValueMax ) {
163- this . _dispatchChangeEvent ( 'value-max-changed' , valueMax ) ;
164- }
154+ private _overwriteOutOfRangeAttributeValue ( name : string , value : string ) {
155+ this . _setAttributeFromInternal ( name , value ) ;
165156 }
166157
167158 private _updateRangeInputsMinMax ( ) {
@@ -170,60 +161,47 @@ export class SliderWebcomponent extends BaseCustomWebComponentConstructorAppend
170161 rangeInput . min = this . getAttribute ( 'min' ) ;
171162 rangeInput . max = this . getAttribute ( 'max' ) ;
172163 } ) ;
164+ this . _updateSliderPosition ( parseInt ( this . getAttribute ( 'value-min' ) ) , parseInt ( this . getAttribute ( 'max' ) ) , true ) ;
165+ this . _updateSliderPosition ( parseInt ( this . getAttribute ( 'value-max' ) ) , parseInt ( this . getAttribute ( 'max' ) ) , false ) ;
173166 }
174167 }
175168
176- private _updateRangeInputsValues ( ) {
177- if ( this . _rangeInputs ) {
178- this . _rangeInputs [ 0 ] . value = this . getAttribute ( 'value-min' ) ;
179- this . _rangeInputs [ 1 ] . value = this . getAttribute ( 'value-max' ) ;
180- }
181- }
182-
183- private _handleRangeInput ( e : Event ) {
184- let minVal = parseInt ( this . _rangeInputs [ 0 ] . value ) ;
185- let maxVal = parseInt ( this . _rangeInputs [ 1 ] . value ) ;
169+ private _handleRangeInputInputEvent ( e : Event ) {
170+ let minRangeInputMinVal = parseInt ( this . _rangeInputs [ 0 ] . value ) ;
171+ let maxRangeInputMaxVal = parseInt ( this . _rangeInputs [ 1 ] . value ) ;
186172
187- let diff = maxVal - minVal ;
173+ let diff = maxRangeInputMaxVal - minRangeInputMinVal ;
188174
189175 // Check if the values gap is exceeded
190176 if ( diff < this . _valuesGap ) {
191- // Check if the input is the min range input
192177 if ( ( e . target as HTMLInputElement ) . className === "min-range" ) {
193- this . _rangeInputs [ 0 ] . value = ( maxVal - this . _valuesGap ) . toString ( ) ;
178+ this . _rangeInputs [ 0 ] . value = ( maxRangeInputMaxVal - this . _valuesGap ) . toString ( ) ;
194179 } else {
195- this . _rangeInputs [ 1 ] . value = ( minVal + this . _valuesGap ) . toString ( ) ;
180+ this . _rangeInputs [ 1 ] . value = ( minRangeInputMinVal + this . _valuesGap ) . toString ( ) ;
196181 }
197182 } else {
198- // Update input values and range progress
199- this . _suppressAttributeChange = true ;
200- if ( parseInt ( this . getAttribute ( 'value-min' ) ) !== minVal ) {
201- this . setAttribute ( 'value-min' , minVal . toString ( ) ) ;
202- }
203- if ( parseInt ( this . getAttribute ( 'value-max' ) ) !== maxVal ) {
204- this . setAttribute ( 'value-max' , maxVal . toString ( ) ) ;
205- }
206- this . _suppressAttributeChange = false ;
207- this . _updateSliderPosition ( minVal , parseInt ( this . getAttribute ( 'max' ) ) , true ) ;
208- this . _updateSliderPosition ( maxVal , parseInt ( this . getAttribute ( 'max' ) ) , false ) ;
183+ if ( ( e . target as HTMLInputElement ) . className === "min-range" ) {
184+ this . _setAttributeFromInternal ( 'value-min' , minRangeInputMinVal . toString ( ) ) ;
185+
186+ } else if ( ( e . target as HTMLInputElement ) . className === "max-range" ) {
187+ this . _setAttributeFromInternal ( 'value-max' , maxRangeInputMaxVal . toString ( ) ) ;
188+ }
209189 }
210190 }
211191
212- private _handleRangeChange ( e : Event ) {
213- let minVal = parseInt ( this . _rangeInputs [ 0 ] . value ) ;
214- let maxVal = parseInt ( this . _rangeInputs [ 1 ] . value ) ;
192+ private _setAttributeFromInternal ( name : string , value : string ) {
193+ this . setAttribute ( name , value ) ;
194+ }
215195
216- // Check if values actually changed
217- if ( minVal !== this . _currentMinVal || maxVal !== this . _currentMaxVal ) {
218- this . _currentMinVal = minVal ;
219- this . _currentMaxVal = maxVal ;
196+ private _handleRangeInputChangeEvent ( e : Event ) {
197+ let minRangeInputMinVal = parseInt ( this . _rangeInputs [ 0 ] . value ) ;
198+ let maxRangeInputMaxVal = parseInt ( this . _rangeInputs [ 1 ] . value ) ;
220199
221- // Dispatch the appropriate event
222- if ( ( e . target as HTMLInputElement ) . className === "min-range" ) {
223- this . _dispatchChangeEvent ( 'value-min-changed' , minVal ) ;
224- } else {
225- this . _dispatchChangeEvent ( 'value-max-changed' , maxVal ) ;
226- }
200+ // Dispatch the appropriate event
201+ if ( ( e . target as HTMLInputElement ) . className === "min-range" ) {
202+ this . _dispatchChangeEvent ( 'value-min-changed' , minRangeInputMinVal ) ;
203+ } else if ( ( e . target as HTMLInputElement ) . className === "max-range" ) {
204+ this . _dispatchChangeEvent ( 'value-max-changed' , maxRangeInputMaxVal ) ;
227205 }
228206 }
229207
0 commit comments