mirror of
https://github.com/pebble-dev/clay.git
synced 2026-09-05 16:47:37 -04:00
add radio component
This commit is contained in:
+24
-3
@@ -36,7 +36,7 @@ module.exports = [
|
|||||||
"type": "toggle",
|
"type": "toggle",
|
||||||
"appKey": "cool_stuff",
|
"appKey": "cool_stuff",
|
||||||
"label": "Enable Cool Stuff",
|
"label": "Enable Cool Stuff",
|
||||||
"defaultValue": true
|
"defaultValue": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "color",
|
"type": "color",
|
||||||
@@ -62,13 +62,34 @@ module.exports = [
|
|||||||
"defaultValue": "More Settings"
|
"defaultValue": "More Settings"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "flavor",
|
"type": "radio",
|
||||||
|
"appKey": "radio-test",
|
||||||
|
"defaultValue": "quote' \"test",
|
||||||
|
"label": "Radio test",
|
||||||
|
"options": [
|
||||||
|
{ "label": "Test thing one", "value": "one" },
|
||||||
|
{ "label": "Another thing", "value": "two" },
|
||||||
|
{ "label": "One really long thing that would not fit", "value": "three" },
|
||||||
|
{ "label": "Small", "value": "quote' \"test" },
|
||||||
|
{ "label": "Final thing", "value": "three" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"appKey": "date",
|
||||||
|
"defaultValue": "",
|
||||||
|
"label": "Date",
|
||||||
|
"attributes": {
|
||||||
|
type: "date"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
"type": "select",
|
"type": "select",
|
||||||
"appKey": "flavor",
|
"appKey": "flavor",
|
||||||
"defaultValue": "grape",
|
"defaultValue": "grape",
|
||||||
"label": "Favorite Flavor",
|
"label": "Favorite Flavor",
|
||||||
"options": [
|
"options": [
|
||||||
{ "label": "Berry things", "value": "berry" },
|
{ "label": "Berry", "value": "berry" },
|
||||||
{ "label": "Grape", "value": "grape" },
|
{ "label": "Grape", "value": "grape" },
|
||||||
{ "label": "Banana", "value": "banana" }
|
{ "label": "Banana", "value": "banana" }
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,5 +8,6 @@ module.exports = {
|
|||||||
select: require('./select'),
|
select: require('./select'),
|
||||||
submit: require('./submit'),
|
submit: require('./submit'),
|
||||||
text: require('./text'),
|
text: require('./text'),
|
||||||
toggle: require('./toggle')
|
toggle: require('./toggle'),
|
||||||
|
radio: require('./radio')
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
name: 'radio',
|
||||||
|
template: require('../../templates/components/radio.tpl'),
|
||||||
|
style: require('../../styles/clay/components/radio.scss'),
|
||||||
|
manipulator: 'radio',
|
||||||
|
defaults: {
|
||||||
|
label: '',
|
||||||
|
options: [],
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -53,22 +53,25 @@ function ClayConfig(settings, config, $rootContainer) {
|
|||||||
$container.add($wrapper);
|
$container.add($wrapper);
|
||||||
_addItems(item.items, $wrapper);
|
_addItems(item.items, $wrapper);
|
||||||
} else {
|
} else {
|
||||||
var clayItem = new ClayItem(item).initialize();
|
var _item = _.copyObj(item);
|
||||||
|
_item.clayId = _items.length;
|
||||||
|
|
||||||
if (item.id) {
|
var clayItem = new ClayItem(_item).initialize();
|
||||||
_itemsById[item.id] = clayItem;
|
|
||||||
|
if (_item.id) {
|
||||||
|
_itemsById[_item.id] = clayItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.appKey) {
|
if (_item.appKey) {
|
||||||
_itemsByAppKey[item.appKey] = clayItem;
|
_itemsByAppKey[_item.appKey] = clayItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
_items.push(clayItem);
|
_items.push(clayItem);
|
||||||
|
|
||||||
// set the value of the item via the manipulator to ensure consistency
|
// set the value of the item via the manipulator to ensure consistency
|
||||||
var value = typeof _settings[item.appKey] !== 'undefined' ?
|
var value = typeof _settings[_item.appKey] !== 'undefined' ?
|
||||||
_settings[item.appKey] :
|
_settings[_item.appKey] :
|
||||||
(item.defaultValue || '');
|
(_item.defaultValue || '');
|
||||||
|
|
||||||
clayItem.set(value);
|
clayItem.set(value);
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ function ClayItem(config) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// attach event methods
|
// attach event methods
|
||||||
ClayEvents.call(self, self.$manipulatorTarget);
|
ClayEvents.call(self, self.$element);
|
||||||
|
|
||||||
// attach the manipulator methods to the clayItem
|
// attach the manipulator methods to the clayItem
|
||||||
_.eachObj(_component.manipulator, function(methodName, method) {
|
_.eachObj(_component.manipulator, function(methodName, method) {
|
||||||
|
|||||||
@@ -48,6 +48,19 @@ module.exports = {
|
|||||||
disable: disable,
|
disable: disable,
|
||||||
enable: enable
|
enable: enable
|
||||||
},
|
},
|
||||||
|
radio: {
|
||||||
|
get: function() {
|
||||||
|
return this.$element.select('input:checked').get('value');
|
||||||
|
},
|
||||||
|
set: function(value) {
|
||||||
|
this.$element
|
||||||
|
.select('input[value="' + value.replace('"', '\\"') + '"]')
|
||||||
|
.set('checked', true);
|
||||||
|
return this.trigger('change');
|
||||||
|
},
|
||||||
|
disable: disable,
|
||||||
|
enable: enable
|
||||||
|
},
|
||||||
color: {
|
color: {
|
||||||
get: function() {
|
get: function() {
|
||||||
return parseInt(this.$manipulatorTarget.get('value'), 16);
|
return parseInt(this.$manipulatorTarget.get('value'), 16);
|
||||||
|
|||||||
@@ -50,11 +50,10 @@ h6 {
|
|||||||
@include font-size(0.8);
|
@include font-size(0.8);
|
||||||
}
|
}
|
||||||
|
|
||||||
.component {
|
label {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding-bottom: $item-spacing-v;
|
|
||||||
|
|
||||||
.input {
|
.input {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
@@ -84,6 +83,10 @@ h6 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.component {
|
||||||
|
padding-bottom: $item-spacing-v;
|
||||||
|
@include tap-highlight();
|
||||||
|
}
|
||||||
|
|
||||||
.section {
|
.section {
|
||||||
background: $color-gray-4;
|
background: $color-gray-4;
|
||||||
@@ -126,14 +129,6 @@ h6 {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
label.component{
|
|
||||||
-webkit-tap-highlight-color: rgba(255, 255, 255, 0.1);
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
background-color: rgba(255, 255, 255, 0.1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
strong {
|
strong {
|
||||||
@include font-pfdin(medium);
|
@include font-pfdin(medium);
|
||||||
color: $color-orange;
|
color: $color-orange;
|
||||||
|
|||||||
@@ -33,3 +33,11 @@
|
|||||||
font-size:$font-size;
|
font-size:$font-size;
|
||||||
line-height: $base-line-height * ceil($font-size / $base-line-height);
|
line-height: $base-line-height * ceil($font-size / $base-line-height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@mixin tap-highlight($color: rgba(255, 255, 255, 0.1)) {
|
||||||
|
-webkit-tap-highlight-color: $color;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: $color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
@import "bourbon";
|
||||||
|
@import "clay";
|
||||||
|
|
||||||
|
.component-radio {
|
||||||
|
|
||||||
|
@include tap-highlight(rgba(0,0,0,0));
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
|
||||||
|
> .label {
|
||||||
|
display: block;
|
||||||
|
padding-bottom: $item-spacing-v / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.radio-group {
|
||||||
|
|
||||||
|
label {
|
||||||
|
padding: $item-spacing-v / 2 0;
|
||||||
|
@include tap-highlight();
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 0.9em;
|
||||||
|
padding: 0 $item-spacing-h / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
i {
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
border-radius: $base-height;
|
||||||
|
width: $base-height;
|
||||||
|
height: $base-height;
|
||||||
|
border: 2px solid $color-gray-7;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:checked ~ i {
|
||||||
|
border-color: $color-orange;
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
$padding: 15%;
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
left: $padding;
|
||||||
|
right: $padding;
|
||||||
|
top: $padding;
|
||||||
|
bottom: $padding;
|
||||||
|
border-radius: $base-height;
|
||||||
|
background: $color-orange;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Executable
+17
@@ -0,0 +1,17 @@
|
|||||||
|
<div class="component component-radio">
|
||||||
|
<span class="label">{{{label}}}</span>
|
||||||
|
<div class="radio-group">
|
||||||
|
{{each options}}
|
||||||
|
<label>
|
||||||
|
<span class="label">{{{this.label}}}</span>
|
||||||
|
<input
|
||||||
|
type="radio"
|
||||||
|
value="{{this.value}}"
|
||||||
|
name="clay-{{clayId}}"
|
||||||
|
data-manipulator-target
|
||||||
|
/>
|
||||||
|
<i></i>
|
||||||
|
</label>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -42,7 +42,11 @@ describe('ClayConfig', function() {
|
|||||||
|
|
||||||
describe('.getAllItems()', function() {
|
describe('.getAllItems()', function() {
|
||||||
it('returns an array of all the items', function() {
|
it('returns an array of all the items', function() {
|
||||||
var config = fixtures.config(['input', 'text', ['input']]);
|
var config = fixtures.config([
|
||||||
|
{type: 'input', clayId: 0},
|
||||||
|
{type: 'text', clayId: 1},
|
||||||
|
[{type: 'input', clayId: 2}]
|
||||||
|
]);
|
||||||
var clayConfig = fixtures.clayConfig(config);
|
var clayConfig = fixtures.clayConfig(config);
|
||||||
var allItems = clayConfig.getAllItems();
|
var allItems = clayConfig.getAllItems();
|
||||||
assert.strictEqual(allItems.length, 3);
|
assert.strictEqual(allItems.length, 3);
|
||||||
@@ -55,8 +59,8 @@ describe('ClayConfig', function() {
|
|||||||
describe('.getItemByAppKey()', function() {
|
describe('.getItemByAppKey()', function() {
|
||||||
it('it returns the correct item', function() {
|
it('it returns the correct item', function() {
|
||||||
var config = fixtures.config([
|
var config = fixtures.config([
|
||||||
{type: 'input', appKey: 'test-app-key'},
|
{type: 'input', appKey: 'test-app-key', clayId: 0},
|
||||||
{type: 'input', appKey: undefined}
|
{type: 'input', appKey: undefined, clayId: 1}
|
||||||
]);
|
]);
|
||||||
var clayConfig = fixtures.clayConfig(config);
|
var clayConfig = fixtures.clayConfig(config);
|
||||||
assert.deepEqual(clayConfig.getItemByAppKey('test-app-key').config, config[0]);
|
assert.deepEqual(clayConfig.getItemByAppKey('test-app-key').config, config[0]);
|
||||||
@@ -66,8 +70,8 @@ describe('ClayConfig', function() {
|
|||||||
describe('.getItemById()', function() {
|
describe('.getItemById()', function() {
|
||||||
it('it returns the correct item', function() {
|
it('it returns the correct item', function() {
|
||||||
var config = fixtures.config([
|
var config = fixtures.config([
|
||||||
{type: 'input', id: 'test-id'},
|
{type: 'input', id: 'test-id', clayId: 0},
|
||||||
{type: 'input', id: undefined}
|
{type: 'input', id: undefined, clayId: 1}
|
||||||
]);
|
]);
|
||||||
var clayConfig = fixtures.clayConfig(config);
|
var clayConfig = fixtures.clayConfig(config);
|
||||||
assert.deepEqual(clayConfig.getItemById('test-id').config, config[0]);
|
assert.deepEqual(clayConfig.getItemById('test-id').config, config[0]);
|
||||||
@@ -76,7 +80,11 @@ describe('ClayConfig', function() {
|
|||||||
|
|
||||||
describe('.getItemsByType()', function() {
|
describe('.getItemsByType()', function() {
|
||||||
it('it returns the correct items', function() {
|
it('it returns the correct items', function() {
|
||||||
var config = fixtures.config(['input', 'text', 'input']);
|
var config = fixtures.config([
|
||||||
|
{type: 'input', clayId: 0},
|
||||||
|
{type: 'text', clayId: 1},
|
||||||
|
{type: 'input', clayId: 2}
|
||||||
|
]);
|
||||||
var clayConfig = fixtures.clayConfig(config);
|
var clayConfig = fixtures.clayConfig(config);
|
||||||
assert.deepEqual(clayConfig.getItemsByType('input')[0].config, config[0]);
|
assert.deepEqual(clayConfig.getItemsByType('input')[0].config, config[0]);
|
||||||
assert.deepEqual(clayConfig.getItemsByType('input')[1].config, config[2]);
|
assert.deepEqual(clayConfig.getItemsByType('input')[1].config, config[2]);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ var fixture = require('../../fixture');
|
|||||||
describe('manipulators', function() {
|
describe('manipulators', function() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} itemType
|
* @param {string|Clay~ConfigItem} itemType
|
||||||
* @param {*} value
|
* @param {*} value
|
||||||
* @param {*} [expected]
|
* @param {*} [expected]
|
||||||
* @return {void}
|
* @return {void}
|
||||||
@@ -31,7 +31,7 @@ describe('manipulators', function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} itemType
|
* @param {string|Clay~ConfigItem} itemType
|
||||||
* @return {void}
|
* @return {void}
|
||||||
*/
|
*/
|
||||||
function testDisable(itemType) {
|
function testDisable(itemType) {
|
||||||
@@ -85,6 +85,23 @@ describe('manipulators', function() {
|
|||||||
testEnable('toggle');
|
testEnable('toggle');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('radio', function() {
|
||||||
|
var item = {
|
||||||
|
type: 'radio',
|
||||||
|
clayId: 1,
|
||||||
|
options: [
|
||||||
|
{ label: '1', value: 'one' },
|
||||||
|
{ label: '2', value: 'two' },
|
||||||
|
{ label: '3', value: 'three "quote' }
|
||||||
|
]
|
||||||
|
};
|
||||||
|
testSetGet(item, 'one');
|
||||||
|
testSetGet(item, 'two');
|
||||||
|
testSetGet(item, 'three "quote');
|
||||||
|
testDisable(item);
|
||||||
|
testEnable(item);
|
||||||
|
});
|
||||||
|
|
||||||
describe('color', function() {
|
describe('color', function() {
|
||||||
testSetGet('color', 'FF0000', 0xff0000);
|
testSetGet('color', 'FF0000', 0xff0000);
|
||||||
testSetGet('color', '#FF0000', 0xff0000);
|
testSetGet('color', '#FF0000', 0xff0000);
|
||||||
|
|||||||
Reference in New Issue
Block a user