use rangeslider.js polyfill to ensure cross browser compatibility
authorymh <ymh.work@gmail.com>
Tue, 20 Dec 2016 18:12:12 +0100
changeset 480 814468b0fc69
parent 479 e7df0b5b09b6
child 481 002a05cd849f
use rangeslider.js polyfill to ensure cross browser compatibility
cms/app-client/app/components/player-sound-control.js
cms/app-client/app/styles/components/player-sound-control.scss
cms/app-client/app/templates/components/player-sound-control.hbs
cms/app-client/bower.json
cms/app-client/ember-cli-build.js
--- a/cms/app-client/app/components/player-sound-control.js	Tue Dec 20 01:50:35 2016 +0100
+++ b/cms/app-client/app/components/player-sound-control.js	Tue Dec 20 18:12:12 2016 +0100
@@ -53,6 +53,23 @@
 
   }),
 
+  mutedObserver: Ember.observer('muted', function() {
+    const rangeslider = this.$("#sound-control-range-slider");
+    if(!rangeslider) {
+      return;
+    }
+    rangeslider.rangeslider('update', true);
+  }),
+
+  volumeObserver: Ember.observer('volume', function() {
+    const rangeslider = this.$("#sound-control-range-slider");
+    const volume = this.get('volume');
+    if(!rangeslider) {
+      return;
+    }
+    rangeslider.val(volume).change();
+  }),
+
   popcornObserver: Ember.observer('popcorn', function() {
     let popcorn = this.get('popcorn');
     if(!popcorn) {
@@ -85,18 +102,31 @@
   },
 
   didInsertElement: function() {
-    this.set('volumeSliderHandler', this.$(".volume-slider").on("input change", (event) => { this.set('volume',Ember.$(event.target).val()); }));
+    const volume = this.get('volume');
+    let rangeslider = this.$('#sound-control-range-slider');
+    rangeslider.rangeslider({
+      polyfill: false,
+      onSlide: (pos, value) => {
+        this.set('volume', value);
+      },
+      onSlideEnd: (pos, value) => {
+        this.set('volume', value);
+      },
+      onInit: function() {
+        Ember.$(this).value = volume;
+      }
+    });
   },
 
   willDestroyElement: function() {
-    let volumeSliderHandler = this.get('volumeSliderHandler');
-    if(volumeSliderHandler) {
-      this.$(".volume-slider").off({"input change": volumeSliderHandler});
-    }
+    this.$('#sound-control-range-slider').rangeslider('destroy');
   },
 
   actions: {
     muteToggle() {
+      if(!this.get('volume')) {
+        return;
+      }
       this.set('muted', !this.get('muted'));
     },
     clickMinus() {
--- a/cms/app-client/app/styles/components/player-sound-control.scss	Tue Dec 20 01:50:35 2016 +0100
+++ b/cms/app-client/app/styles/components/player-sound-control.scss	Tue Dec 20 18:12:12 2016 +0100
@@ -64,103 +64,40 @@
     pointer-events: none;
   }
 
-  // taken from http://brennaobrien.com/blog/2014/05/style-input-type-range-in-every-browser.html
-  // http://danielstern.ca/range.css/#/
   #sound-control-range-wrapper {
-    width: 50px;
-    transform: rotate(270deg) translate(-10px, -12px);
-    -webkit-transform: rotate(270deg) translate(-15px, -19px);
-    -moz-transform: rotate(270deg) translate(-15px, -12px);
-    -ms-transform: rotate(270deg) translate(2px, -8px);
-    transform-origin: 50% 50%;
+    height: 50px;
+    margin-left: 8px;
+  }
+
+
+  .rangeslider--vertical {
+    width: 5px;
+    height: 50px;
+    min-height: 50px;
+    max-height: 100%;
   }
 
-  input[type=range] {
-    -webkit-appearance: none;
-    width: 100%;
-    margin: 3px 3px;
-  }
-  input[type=range]:focus {
-    outline: none;
-  }
-  input[type=range]::-webkit-slider-runnable-track {
-    width: 100%;
-    height: 5px;
-    cursor: pointer;
-    box-shadow: 0px 0px px rgba(0, 0, 0, 0), 0px 0px 0px rgba(13, 13, 13, 0);
-    background: rgba(48, 113, 169, 0.78);
-    border-radius: 1.3px;
-    border: 0.2px solid #010101;
-  }
-  input[type=range]::-webkit-slider-thumb {
-    box-shadow: 0px 0px 0px #000031, 0px 0px 0px #00004b;
-    border: 1px solid #00001e;
+  .rangeslider__handle {
+    width: 11px;
     height: 11px;
-    width: 11px;
-    border-radius: 11px;
-    background: #ffffff;
-    cursor: pointer;
-    -webkit-appearance: none;
-    margin-top: -3.5px;
-    //margin-top: -2px;
-  }
-  input[type=range]:focus::-webkit-slider-runnable-track {
-    background: rgba(106, 163, 213, 0.78);
-  }
-  input[type=range]::-moz-range-track {
-    width: 100%;
-    height: 5px;
-    cursor: pointer;
-    box-shadow: 0px 0px px rgba(0, 0, 0, 0), 0px 0px 0px rgba(13, 13, 13, 0);
-    background: rgba(48, 113, 169, 0.78);
-    border-radius: 1.3px;
-    border: 0.2px solid #010101;
   }
-  input[type=range]::-moz-range-thumb {
-    box-shadow: 0px 0px 0px #000031, 0px 0px 0px #00004b;
-    border: 1px solid #00001e;
-    height: 11px;
-    width: 11px;
-    border-radius: 11px;
-    background: #ffffff;
-    cursor: pointer;
-  }
-  input[type=range]::-ms-track {
-    width: 100%;
+
+  .rangeslider__handle:after {
+    width: 5px;
     height: 5px;
-    cursor: pointer;
-    background: transparent;
-    border-color: transparent;
-    color: transparent;
-  }
-  input[type=range]::-ms-fill-lower {
-    background: rgba(25, 60, 90, 0.78);
-    border: 0.2px solid #010101;
-    border-radius: 2.6px;
-    box-shadow: 0px 0px px rgba(0, 0, 0, 0), 0px 0px 0px rgba(13, 13, 13, 0);
-  }
-  input[type=range]::-ms-fill-upper {
-    background: rgba(48, 113, 169, 0.78);
-    border: 0.2px solid #010101;
-    border-radius: 2.6px;
-    box-shadow: 0px 0px px rgba(0, 0, 0, 0), 0px 0px 0px rgba(13, 13, 13, 0);
-  }
-  input[type=range]::-ms-thumb {
-    box-shadow: 0px 0px 0px #000031, 0px 0px 0px #00004b;
-    border: 1px solid #00001e;
-    height: 11px;
-    width: 11px;
-    border-radius: 11px;
-    background: #ffffff;
-    cursor: pointer;
-  }
-  input[type=range]:focus::-ms-fill-lower {
-    background: rgba(48, 113, 169, 0.78);
-  }
-  input[type=range]:focus::-ms-fill-upper {
-    background: rgba(106, 163, 213, 0.78);
   }
 
+  .rangeslider--vertical .rangeslider__handle {
+    left: -4px
+  }
+
+  .rangeslider__fill {
+    background: $corpus-blue;
+  }
+
+  .rangeslider--disabled {
+    pointer-events: none;
+  }
 
   #sound-control-scale-minus {
     position: absolute;
--- a/cms/app-client/app/templates/components/player-sound-control.hbs	Tue Dec 20 01:50:35 2016 +0100
+++ b/cms/app-client/app/templates/components/player-sound-control.hbs	Tue Dec 20 18:12:12 2016 +0100
@@ -1,17 +1,17 @@
-{{!--<span id="sound-control-speaker" class="fa {{speakerClass}}" {{action 'muteToggle'}} aria-hidden="true"></span>--}}
-<div id="sound-control-speaker" aria-hidden="true"><i class="fa {{speakerClass}}" {{action 'muteToggle'}}></i><i class="fa fa-times" {{action 'muteToggle'}}></i></div>
+<div id="sound-control-speaker" title='mute/unmute'><i class="fa {{speakerClass}}" {{action 'muteToggle'}}></i><i class="fa fa-times" {{action 'muteToggle'}}></i></div>
 <div id="sound-control-scale">
   <div id="sound-control-scale-plus" class="sound-control-scale-indicator" {{ action 'clickPlus' }} disabled={{muted}}>+</div>
-  <div id="sound-control-range-wrapper">
-  {{input
+  <div id="sound-control-range-wrapper" title="volume" >
+  <input
+    id="sound-control-range-slider"
     type="range"
     min="0"
     max="1"
-    step="0.05"
+    step="0.01"
     class="volume-slider"
-    value=volume
-    disabled=muted
-  }}
+    disabled={{ mut muted }}
+    data-orientation="vertical"
+  >
   </div>
   <div id="sound-control-scale-minus" class="sound-control-scale-indicator" {{ action 'clickMinus' }} disabled={{muted}}>-</div>
 </div>
--- a/cms/app-client/bower.json	Tue Dec 20 01:50:35 2016 +0100
+++ b/cms/app-client/bower.json	Tue Dec 20 18:12:12 2016 +0100
@@ -17,6 +17,7 @@
     "urijs": "^1.18.2",
     "leaflet": "^1.0.0",
     "social-share-kit": "^1.0.13",
-    "interval-tree2": "IRI-Research/interval-tree2"
+    "interval-tree2": "IRI-Research/interval-tree2",
+    "rangeslider.js": "^2.3.0"
   }
 }
--- a/cms/app-client/ember-cli-build.js	Tue Dec 20 01:50:35 2016 +0100
+++ b/cms/app-client/ember-cli-build.js	Tue Dec 20 18:12:12 2016 +0100
@@ -49,6 +49,12 @@
       production:  'bower_components/urijs/src/URI.min.js'
     });
     app.import('bower_components/interval-tree2/dist/interval-tree.js');
+    app.import({
+      development: 'bower_components/rangeslider.js/dist/rangeslider.js',
+      production:  'bower_components/rangeslider.js/dist/rangeslider.min.js'
+    });
+    app.import('bower_components/rangeslider.js/dist/rangeslider.css');
+
 
     //shims
     app.import('vendor/shims/ammaps.js', {