Merge branch 'master' into #52/custom-color-picker-layout

This commit is contained in:
keegan-lillo
2016-03-16 08:25:59 +11:00
18 changed files with 697 additions and 194 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

After

Width:  |  Height:  |  Size: 135 KiB

+2 -1
View File
@@ -11,5 +11,6 @@ module.exports = {
toggle: require('./toggle'),
radiogroup: require('./radiogroup'),
checkboxgroup: require('./checkboxgroup'),
button: require('./button')
button: require('./button'),
slider: require('./slider')
};
+50
View File
@@ -0,0 +1,50 @@
'use strict';
module.exports = {
name: 'slider',
template: require('../../templates/components/slider.tpl'),
style: require('../../styles/clay/components/slider.scss'),
manipulator: 'slider',
defaults: {
label: '',
description: '',
min: 0,
max: 100,
step: 1,
attributes: {}
},
initialize: function() {
var self = this;
var $value = self.$element.select('.value');
var $valuePad = self.$element.select('.value-pad');
var $slider = self.$manipulatorTarget;
/**
* Sets the value display
* @return {void}
*/
function setValueDisplay() {
var value = self.get();
$value.set('value', value);
$valuePad.set('innerHTML', value);
}
var step = $slider.get('step');
step = step.toString(10).split('.')[1];
self.precision = step ? step.length : 0;
self.on('change', setValueDisplay);
$slider.on('|input', setValueDisplay);
setValueDisplay();
$value.on('|input', function() {
$valuePad.set('innerHTML', this.get('value'));
});
$value.on('|change', function() {
self.set(this.get('value'));
setValueDisplay();
});
}
};
+1 -1
View File
@@ -28,7 +28,7 @@ var clayConfig = new ClayConfig(settings, config, $mainForm, clayMeta);
$mainForm.on('submit', function() {
// Set the return URL depending on the runtime environment
location.href = returnTo +
encodeURIComponent(JSON.stringify(clayConfig.getSettings()));
encodeURIComponent(JSON.stringify(clayConfig.serialize()));
});
// Run the custom function in the context of the ClayConfig
+9 -3
View File
@@ -155,10 +155,16 @@ function ClayConfig(settings, config, $rootContainer, meta) {
/**
* @returns {Object}
*/
self.getSettings = function() {
_checkBuilt('getSettings');
self.serialize = function() {
_checkBuilt('serialize');
_.eachObj(_itemsByAppKey, function(appKey, item) {
_settings[appKey] = item.get();
_settings[appKey] = {
value: item.get()
};
if (item.precision) {
_settings[appKey].precision = item.precision;
}
});
return _settings;
};
+15
View File
@@ -85,6 +85,21 @@ module.exports = {
hide: hide,
show: show
},
slider: {
get: function() {
return parseFloat(this.$manipulatorTarget.get('value'));
},
set: function(value) {
var initVal = this.get();
this.$manipulatorTarget.set('value', value);
if (this.get() === initVal) { return this; }
return this.trigger('change');
},
disable: disable,
enable: enable,
hide: hide,
show: show
},
checked: {
get: function() {
return this.$manipulatorTarget.get('checked');
-51
View File
@@ -17,54 +17,3 @@ module.exports.updateProperties = function(obj, descriptor) {
Object.defineProperty(obj, prop, descriptor);
});
};
/**
* Converts the val into a type compatible with Pebble.sendAppMessage().
* - Strings will be returned without modification
* - Numbers will be returned without modification
* - Booleans will be converted to a 0 or 1
* - Arrays that contain strings will be split with a zero.
* eg: ['one', 'two'] becomes ['one', 0, 'two', 0]
* - Arrays that contain numbers will be returned without modification
* eg: [1, 2] becomes [1, 2]
* - Arrays that contain booleans will be converted to a 0 or 1
* eg: [true, false] becomes [1, 0]
* - Arrays must be single dimensional
* @param {number|string|boolean|Array} val
* @returns {number|string|Array}
*/
module.exports.prepareForAppMessage = function(val) {
var result;
if (typeof val === 'boolean') {
result = val ? 1 : 0;
} else if (Array.isArray(val)) {
result = [];
val.forEach(function(item) {
var itemConverted = module.exports.prepareForAppMessage(item);
result.push(itemConverted);
if (typeof itemConverted === 'string') {
result.push(0);
}
});
} else {
result = val;
}
return result;
};
/**
* Converts a Clay settings dict into one that is compatible with
* Pebble.sendAppMessage();
* @see {prepareForAppMessage}
* @param {Object} settings
* @returns {{}}
*/
module.exports.prepareSettingsForAppMessage = function(settings) {
var result = {};
Object.keys(settings).forEach(function(key) {
result[key] = module.exports.prepareForAppMessage(settings[key]);
});
return result;
};
+6
View File
@@ -67,6 +67,12 @@ h6 {
@include font-size(0.8);
}
input {
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
label {
display: flex;
justify-content: space-between;
+127
View File
@@ -0,0 +1,127 @@
@import "clay";
.component-slider {
.section & {
padding: 0;
}
label {
display: block;
}
.label-container {
display: flex;
align-items: center;
width: 100%;
padding-bottom: $item-spacing-v;
}
.label {
flex: 1;
min-width: 1rem;
display: block;
padding-right: $item-spacing-h;
}
.value-wrap {
display: block;
position: relative;
}
.value,
.value-pad {
display: block;
background: $color-gray-2;
border-radius: $border-radius;
padding: $item-spacing-v / 2 $item-spacing-h / 2;
border: none;
vertical-align: baseline;
color: $color-white;
text-align: right;
margin: 0;
min-width: 1rem;
}
.value-pad {
visibility: hidden;
&:before {
content: ' ';
display: inline-block;
}
}
.value {
max-width: 100%;
position: absolute;
left:0;
top:0
}
.input-wrap {
padding: 0 $item-spacing-h $item-spacing-v;
}
.input {
$track-height: rem(3px);
display: block;
position: relative;
min-width: 100%;
height: $base-height;
overflow: hidden;
margin-left: 0;
&:before {
content: '';
display: block;
position: absolute;
height: $track-height;
background: $color-gray-6;
width: 100%;
top: $base-height / 2 - $track-height / 2;
}
.slider {
display: block;
width: 100%;
appearance: none;
position: relative;
height: $base-height;
margin: 0;
background-color: transparent;
&:focus {
outline: none;
}
&::-webkit-slider-runnable-track {
border: none;
height: $base-height;
width: 100%;
background-color: transparent;
}
&::-webkit-slider-thumb {
appearance: none;
position: relative;
height: $base-height;
width: $base-height;
background-color: $color-orange;
border-radius: 50%;
&:before {
content: "";
position: absolute;
left: -1000px;
top: $base-height / 2 - $track-height / 2;
height: $track-height;
width: 1001px;
background: $color-orange;
}
}
}
}
}
+25
View File
@@ -0,0 +1,25 @@
<div class="component component-slider">
<label class="tap-highlight">
<span class="label-container">
<span class="label">{{{label}}}</span>
<span class="value-wrap">
<span class="value-pad"></span>
<input type="text" class="value" />
</span>
</span>
<span class="input">
<input
data-manipulator-target
class="slider"
type="range"
min="{{min}}"
max="{{max}}"
step="{{step}}"
{{each key: attributes}}{{key}}="{{this}}"{{/each}}
/>
</span>
</label>
{{if description}}
<div class="description">{{{description}}}</div>
{{/if}}
</div>