@@ -80,15 +80,11 @@ export class SliderWebcomponent extends BaseCustomWebComponentConstructorAppend
80
80
81
81
private _rangeInputs : HTMLInputElement [ ] ;
82
82
private _valuesGap : number = 1 ;
83
- private _suppressAttributeChange : boolean = false ;
84
- private _currentMinVal : number ;
85
- private _currentMaxVal : number ;
86
83
87
84
attributeChangedCallback ( name : string , oldValue : string , newValue : string ) {
88
- if ( this . _suppressAttributeChange ) return ;
89
-
85
+ if ( newValue === 'undefined' ) return ;
90
86
if ( name === "value-min" || name === "value-max" ) {
91
- this . _validateValues ( name , newValue ) ;
87
+ this . _validateMinMaxValuesAfterAttributeChangedCallback ( name , newValue ) ;
92
88
}
93
89
94
90
if ( name === "min" || name === "max" ) {
@@ -108,60 +104,55 @@ export class SliderWebcomponent extends BaseCustomWebComponentConstructorAppend
108
104
109
105
this . _parseAttributesToProperties ( ) ;
110
106
111
- // Initialize current values
112
- this . _currentMinVal = parseInt ( this . getAttribute ( 'value-min' ) ) ;
113
- this . _currentMaxVal = parseInt ( this . getAttribute ( 'value-max' ) ) ;
114
-
115
107
// Add event listeners to range input elements
116
108
for ( let i = 0 ; i < this . _rangeInputs . length ; i ++ ) {
117
109
this . _rangeInputs [ i ] . addEventListener ( "input" , e => {
118
- this . _handleRangeInput ( e ) ;
110
+ this . _handleRangeInputInputEvent ( e ) ;
119
111
} ) ;
120
112
121
113
this . _rangeInputs [ i ] . addEventListener ( "change" , e => {
122
- this . _handleRangeChange ( e ) ;
114
+ this . _handleRangeInputChangeEvent ( e ) ;
123
115
} ) ;
124
116
}
125
117
126
118
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 ) ;
130
123
}
131
124
132
- private _validateValues ( changedAttr : string , newValue : string ) {
125
+ private _validateMinMaxValuesAfterAttributeChangedCallback ( changedAttr : string , newValue : string ) {
133
126
let min = parseInt ( this . getAttribute ( 'min' ) ) ;
134
127
let max = parseInt ( this . getAttribute ( 'max' ) ) ;
135
128
let valueMin = parseInt ( this . getAttribute ( 'value-min' ) ) ;
136
129
let valueMax = parseInt ( this . getAttribute ( 'value-max' ) ) ;
137
130
138
131
if ( changedAttr === 'value-min' ) {
132
+ if ( parseInt ( newValue ) < min ) {
133
+ this . _overwriteOutOfRangeAttributeValue ( 'value-min' , min . toString ( ) ) ;
134
+ return ;
135
+ }
139
136
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
+ }
140
141
} else if ( changedAttr === 'value-max' ) {
142
+ if ( parseInt ( newValue ) > max ) {
143
+ this . _overwriteOutOfRangeAttributeValue ( 'value-max' , max . toString ( ) ) ;
144
+ return ;
145
+ }
141
146
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
+ }
142
151
}
152
+ }
143
153
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 ) ;
165
156
}
166
157
167
158
private _updateRangeInputsMinMax ( ) {
@@ -170,60 +161,47 @@ export class SliderWebcomponent extends BaseCustomWebComponentConstructorAppend
170
161
rangeInput . min = this . getAttribute ( 'min' ) ;
171
162
rangeInput . max = this . getAttribute ( 'max' ) ;
172
163
} ) ;
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 ) ;
173
166
}
174
167
}
175
168
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 ) ;
186
172
187
- let diff = maxVal - minVal ;
173
+ let diff = maxRangeInputMaxVal - minRangeInputMinVal ;
188
174
189
175
// Check if the values gap is exceeded
190
176
if ( diff < this . _valuesGap ) {
191
- // Check if the input is the min range input
192
177
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 ( ) ;
194
179
} else {
195
- this . _rangeInputs [ 1 ] . value = ( minVal + this . _valuesGap ) . toString ( ) ;
180
+ this . _rangeInputs [ 1 ] . value = ( minRangeInputMinVal + this . _valuesGap ) . toString ( ) ;
196
181
}
197
182
} 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
+ }
209
189
}
210
190
}
211
191
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
+ }
215
195
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 ) ;
220
199
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 ) ;
227
205
}
228
206
}
229
207
0 commit comments