Skip to content
This repository was archived by the owner on Sep 5, 2024. It is now read-only.

Commit 302f9dc

Browse files
EladBezalelThomasBurleson
authored andcommitted
fix(slider-rtl): added rtl support for slider
- added bidi-property function to set a property by direction - fixed slider in rtl Closes #7434
1 parent cb59b08 commit 302f9dc

File tree

3 files changed

+52
-20
lines changed

3 files changed

+52
-20
lines changed

src/components/slider/slider.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ function SliderContainerDirective() {
2727
controller: function () {},
2828
compile: function (elem) {
2929
var slider = elem.find('md-slider');
30+
3031
if (!slider) {
3132
return;
3233
}
@@ -457,7 +458,13 @@ function SliderDirective($$rAF, $window, $mdAria, $mdUtil, $mdConstant, $mdThemi
457458
var thumbPosition = (percent * 100) + '%';
458459
var activeTrackPercent = invert ? (1 - percent) * 100 + '%' : thumbPosition;
459460

460-
thumbContainer.css(vertical ? 'bottom' : 'left', thumbPosition);
461+
if (vertical) {
462+
thumbContainer.css('bottom', thumbPosition);
463+
}
464+
else {
465+
$mdUtil.bidiProperty(thumbContainer, 'left', 'right', thumbPosition);
466+
}
467+
461468

462469
activeTrack.css(vertical ? 'height' : 'width', activeTrackPercent);
463470

@@ -563,6 +570,10 @@ function SliderDirective($$rAF, $window, $mdAria, $mdUtil, $mdConstant, $mdThemi
563570
var size = vertical ? sliderDimensions.height : sliderDimensions.width;
564571
var calc = (position - offset) / size;
565572

573+
if (!vertical && $mdUtil.bidi() === 'rtl') {
574+
calc = 1 - calc;
575+
}
576+
566577
return Math.max(0, Math.min(1, vertical ? 1 - calc : calc));
567578
}
568579

src/components/slider/slider.scss

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ $slider-sign-top: ($slider-size / 2) - ($slider-thumb-default-scale * $slider-th
6464

6565
@mixin slider-thumb-position($width: $slider-thumb-width, $height: $slider-thumb-height) {
6666
position: absolute;
67-
left: -$width / 2;
67+
@include rtl-prop(left, right, (-$width / 2));
6868
top: ($slider-size / 2) - ($height / 2);
6969
width: $width;
7070
height: $height;
@@ -133,11 +133,11 @@ md-slider {
133133
*/
134134
._md-thumb-container {
135135
position: absolute;
136-
left: 0;
136+
@include rtl-prop(left, right, 0);
137137
top: 50%;
138138
transform: translate3d(-50%,-50%,0);
139139
transition: all .4s cubic-bezier(.25,.8,.25,1);
140-
transition-property: left, bottom;
140+
transition-property: left, right, bottom;
141141
}
142142
._md-thumb {
143143
z-index: 1;
@@ -184,7 +184,7 @@ md-slider {
184184
&:after {
185185
position: absolute;
186186
content: '';
187-
left: -($slider-sign-width / 2 - $slider-arrow-width / 2);
187+
@include rtl-prop(left, right, -($slider-sign-width / 2 - $slider-arrow-width / 2));
188188
border-radius: $slider-arrow-height;
189189
top: 19px;
190190
border-left: $slider-arrow-width / 2 solid transparent;
@@ -427,8 +427,8 @@ md-slider {
427427
}
428428
&[md-invert] {
429429
&:not([md-vertical]) ._md-track-fill {
430-
left: auto;
431-
right: 0;
430+
@include rtl-prop(left, right, auto);
431+
@include rtl-prop(right, left, 0);
432432
}
433433
&[md-vertical] {
434434
._md-track-fill {
@@ -460,11 +460,11 @@ md-slider-container {
460460
}
461461

462462
& > *:first-child:not(md-slider) {
463-
margin-right: $items-margin;
463+
@include rtl-prop(margin-right, margin-left, $items-margin);
464464
}
465465

466466
& > *:last-child:not(md-slider) {
467-
margin-left: $items-margin;
467+
@include rtl-prop(margin-left, margin-right, $items-margin);
468468
}
469469

470470
&[md-vertical] {
@@ -481,7 +481,7 @@ md-slider-container {
481481
md-input-container {
482482
input[type="number"] {
483483
text-align: center;
484-
padding-left: 15px; // size of arrows
484+
@include rtl-prop(padding-left, padding-right, 15px); // size of arrows
485485
height: $items-height * 2;
486486
margin-top: -$items-height;
487487
}

src/core/util/util.js

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,20 @@ function UtilFactory($document, $timeout, $compile, $rootScope, $$mdAnimate, $in
4343
return hasValue;
4444
};
4545

46+
function validateCssValue(value) {
47+
return !value ? '0' :
48+
hasPx(value) || hasPercent(value) ? value : value + 'px';
49+
}
50+
51+
function hasPx(value) {
52+
return String(value).indexOf('px') > -1;
53+
}
54+
55+
function hasPercent(value) {
56+
return String(value).indexOf('%') > -1;
57+
58+
}
59+
4660
var $mdUtil = {
4761
dom: {},
4862
now: window.performance ?
@@ -61,22 +75,29 @@ function UtilFactory($document, $timeout, $compile, $rootScope, $$mdAnimate, $in
6175
if ( arguments.length == 0 ) return ltr ? 'ltr' : 'rtl';
6276

6377
// If mutator
78+
var elem = angular.element(element);
79+
6480
if ( ltr && angular.isDefined(lValue)) {
65-
angular.element(element).css(property, validate(lValue));
81+
elem.css(property, validateCssValue(lValue));
6682
}
6783
else if ( !ltr && angular.isDefined(rValue)) {
68-
angular.element(element).css(property, validate(rValue) );
84+
elem.css(property, validateCssValue(rValue) );
6985
}
86+
},
7087

71-
// Internal utils
88+
bidiProperty: function (element, lProperty, rProperty, value) {
89+
var ltr = !($document[0].dir == 'rtl' || $document[0].body.dir == 'rtl');
7290

73-
function validate(value) {
74-
return !value ? '0' :
75-
hasPx(value) ? value : value + 'px';
76-
}
77-
function hasPx(value) {
78-
return String(value).indexOf('px') > -1;
79-
}
91+
var elem = angular.element(element);
92+
93+
if ( ltr && angular.isDefined(lProperty)) {
94+
elem.css(lProperty, validateCssValue(value));
95+
elem.css(rProperty, '');
96+
}
97+
else if ( !ltr && angular.isDefined(rProperty)) {
98+
elem.css(rProperty, validateCssValue(value) );
99+
elem.css(lProperty, '');
100+
}
80101
},
81102

82103
clientRect: function(element, offsetParent, isOffsetRect) {

0 commit comments

Comments
 (0)