Merge remote-tracking branch 'origin/master' into #11/description-for-input-components

# Conflicts:
#	src/styles/clay/_base.scss
This commit is contained in:
Keegan
2016-03-03 10:45:20 +11:00
5 changed files with 174 additions and 35 deletions
+29 -8
View File
@@ -449,60 +449,75 @@ The submit button for the page. You **MUST** include this component somewhere in
## Manipulators ## Manipulators
Each component has a **manipulator**. This is a set of methods used to talk to the item on the page. At a minimum, manipulators must have a `.get()` and `.set(value)` method. When the config page is closed, the `.get()` method is run on all components registered with an `appKey` to construct the object sent to the C app. Many of these methods fire an event when the method is called. You can listen for these events with `ClayItem.on()`. Each component has a **manipulator**. This is a set of methods used to talk to the item on the page.
At a minimum, manipulators must have a `.get()` and `.set(value)` method however there are also methods to assist in interactivity such as `.hide()` and `.disable()`.
**NOTE:** There is currently no way to disable or hide an entire section. You must disable/hide each item in the section to achieve this effect.
When the config page is closed, the `.get()` method is run on all components registered with an `appKey` to construct the object sent to the C app.
Many of these methods fire an event when the method is called. You can listen for these events with `ClayItem.on()`.
#### html #### html
| Method | Returns | Event Fired | Description | | Method | Returns | Event Fired | Description |
|--------|---------|-------------| ------------| |--------|---------|-------------| ------------|
| `.set( [string\|HTML] value)` | `ClayItem` | `change` | Sets the content of this item. | | `.set( [string\|HTML] value)` | `ClayItem` | `change` | Sets the content of this item. |
| `.get()` | `string` | Gets the content of this item. | | `.get()` | `string` | | Gets the content of this item. |
| `.hide()` | `ClayItem` | `hide` | Hides the item |
| `.show()` | `ClayItem` | `show` | Shows the item |
#### val #### val
| Method | Returns | Event Fired | Description | | Method | Returns | Event Fired | Description |
|--------|---------|-------------| ------------| |--------|---------|-------------| ------------|
| `.set( [string] value)` | `ClayItem` | `change` | Sets the value of this item. | | `.set( [string] value)` | `ClayItem` | `change` | Sets the value of this item. |
| `.get()` | `string` | Gets the content of this item. | | `.get()` | `string` | | Gets the content of this item. |
| `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. | | `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. |
| `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. | | `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. |
| `.hide()` | `ClayItem` | `hide` | Hides the item |
| `.show()` | `ClayItem` | `show` | Shows the item |
#### checked #### checked
| Method | Returns | Event Fired | Description | | Method | Returns | Event Fired | Description |
|--------|---------|-------------| ------------| |--------|---------|-------------| ------------|
| `.set( [boolean\|int] value)` | `ClayItem` | `change` | Check/uncheck the state of this item. | | `.set( [boolean\|int] value)` | `ClayItem` | `change` | Check/uncheck the state of this item. |
| `.get()` | `int` | 1 if checked, 0 if not checked | | `.get()` | `int` | | 1 if checked, 0 if not checked |
| `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. | | `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. |
| `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. | | `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. |
| `.hide()` | `ClayItem` | `hide` | Hides the item |
| `.show()` | `ClayItem` | `show` | Shows the item |
#### color #### color
| Method | Returns | Event Fired | Description | | Method | Returns | Event Fired | Description |
|--------|---------|-------------| ------------| |--------|---------|-------------| ------------|
| `.set( [string\|int] value)` | `ClayItem` | `change` | Sets the color picker to the provided color. If the value is a string, it must be provided in hex notation eg `'FF0000'`. | | `.set( [string\|int] value)` | `ClayItem` | `change` | Sets the color picker to the provided color. If the value is a string, it must be provided in hex notation eg `'FF0000'`. |
| `.get()` | `int` | Get the chosen color. This is returned as a number in order to make it easy to use on the watch side using `GColorFromHEX()`. | | `.get()` | `int` | | Get the chosen color. This is returned as a number in order to make it easy to use on the watch side using `GColorFromHEX()`. |
| `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. | | `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. |
| `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. | | `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. |
| `.hide()` | `ClayItem` | `hide` | Hides the item |
| `.show()` | `ClayItem` | `show` | Shows the item |
#### radiogroup #### radiogroup
| Method | Returns | Event Fired | Description | | Method | Returns | Event Fired | Description |
|--------|---------|-------------| ------------| |--------|---------|-------------| ------------|
| `.set( [string] value)` | `ClayItem` | `change` | Checks the radio button that corresponds to the provided value. | | `.set( [string] value)` | `ClayItem` | `change` | Checks the radio button that corresponds to the provided value. |
| `.get()` | `string` | Gets the value of the checked radio button in the list. | | `.get()` | `string` | | Gets the value of the checked radio button in the list. |
| `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. | | `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. |
| `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. | | `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. |
| `.hide()` | `ClayItem` | `hide` | Hides the item |
| `.show()` | `ClayItem` | `show` | Shows the item |
#### checkboxgroup #### checkboxgroup
| Method | Returns | Event Fired | Description | | Method | Returns | Event Fired | Description |
|--------|---------|-------------| ------------| |--------|---------|-------------| ------------|
| `.set( [array] value)` | `ClayItem` | `change` | Checks the checkboxes that corresponds to the provided list of values. | | `.set( [array] value)` | `ClayItem` | `change` | Checks the checkboxes that corresponds to the provided list of values. |
| `.get()` | `Array.<string>` | Gets an array of strings representing the list of the values of the checked items | | `.get()` | `Array.<string>` | | Gets an array of strings representing the list of the values of the checked items |
| `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. | | `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. |
| `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. | | `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. |
| `.hide()` | `ClayItem` | `hide` | Hides the item |
| `.show()` | `ClayItem` | `show` | Shows the item |
# Extending Clay # Extending Clay
@@ -597,7 +612,13 @@ module.exports = function(minified) {
var coolStuffToggle = Clay.getItemByAppKey('cool_stuff'); var coolStuffToggle = Clay.getItemByAppKey('cool_stuff');
toggleBackground.call(coolStuffToggle); toggleBackground.call(coolStuffToggle);
coolStuffToggle.on('change', toggleBackground); coolStuffToggle.on('change', toggleBackground);
// Hide the color picker for aplite
if (Clay.meta.activeWatchInfo.platform === 'aplite') {
Clay.getItemByAppKey('background').hide();
}
}); });
}; };
``` ```
+34 -6
View File
@@ -18,6 +18,22 @@ function enable() {
return this.trigger('enabled'); return this.trigger('enabled');
} }
/**
* @returns {ClayEvents}
*/
function hide() {
this.$element.set('+hide');
return this.trigger('hide');
}
/**
* @returns {ClayEvents}
*/
function show() {
this.$element.set('-hide');
return this.trigger('show');
}
module.exports = { module.exports = {
html: { html: {
get: function() { get: function() {
@@ -26,7 +42,9 @@ module.exports = {
set: function(value) { set: function(value) {
this.$manipulatorTarget.set('innerHTML', value); this.$manipulatorTarget.set('innerHTML', value);
return this.trigger('change'); return this.trigger('change');
} },
hide: hide,
show: show
}, },
val: { val: {
get: function() { get: function() {
@@ -37,7 +55,9 @@ module.exports = {
return this.trigger('change'); return this.trigger('change');
}, },
disable: disable, disable: disable,
enable: enable enable: enable,
hide: hide,
show: show
}, },
checked: { checked: {
get: function() { get: function() {
@@ -48,7 +68,9 @@ module.exports = {
return this.trigger('change'); return this.trigger('change');
}, },
disable: disable, disable: disable,
enable: enable enable: enable,
hide: hide,
show: show
}, },
radiogroup: { radiogroup: {
get: function() { get: function() {
@@ -61,7 +83,9 @@ module.exports = {
return this.trigger('change'); return this.trigger('change');
}, },
disable: disable, disable: disable,
enable: enable enable: enable,
hide: hide,
show: show
}, },
checkboxgroup: { checkboxgroup: {
get: function() { get: function() {
@@ -83,7 +107,9 @@ module.exports = {
return self.trigger('change'); return self.trigger('change');
}, },
disable: disable, disable: disable,
enable: enable enable: enable,
hide: hide,
show: show
}, },
color: { color: {
get: function() { get: function() {
@@ -99,6 +125,8 @@ module.exports = {
return this.trigger('change'); return this.trigger('change');
}, },
disable: disable, disable: disable,
enable: enable enable: enable,
hide: hide,
show: show
} }
}; };
+42 -10
View File
@@ -17,7 +17,7 @@ html, body {
body { body {
background-color: $color-gray-2; background-color: $color-gray-2;
padding: $item-spacing-v $item-spacing-h; padding: 0 $item-spacing-h $item-spacing-v;
} }
em { em {
@@ -101,30 +101,47 @@ label {
} }
} }
.hide {
display: none !important;
}
.tap-highlight { .tap-highlight {
@include tap-highlight(); @include tap-highlight();
} }
.component { .component {
padding-bottom: $item-spacing-v; padding-top: $item-spacing-v;
&.disabled { &.disabled {
opacity: 0.25;
pointer-events: none; pointer-events: none;
> * {
opacity: 0.25;
}
} }
} }
.section { .section {
background: $color-gray-4; background: $color-gray-4;
border-radius: 0.25rem; border-radius: 0.25rem;
margin-bottom: 1rem;
box-shadow: $color-gray-1 0 0.15rem 0.25rem; box-shadow: $color-gray-1 0 0.15rem 0.25rem;
.component { > .component {
padding-bottom: $item-spacing-v;
padding-right: $item-spacing-h;
padding-left: $item-spacing-h;
position: relative; position: relative;
padding: $item-spacing-v $item-spacing-h; margin-top: 1rem;
&:last-child:after { &:not(.hide) ~ .component {
margin-top: 0;
}
&:last-child,
&:first-child {
padding-bottom: $item-spacing-v;
}
&:first-child:after {
display: none; display: none;
} }
@@ -133,7 +150,7 @@ label {
background: $color-gray-6; background: $color-gray-6;
display: block; display: block;
position: absolute; position: absolute;
bottom: 0; top: 0;
left: $item-spacing-h / 2; left: $item-spacing-h / 2;
right: $item-spacing-h / 2; right: $item-spacing-h / 2;
height: 1px; height: 1px;
@@ -141,13 +158,28 @@ label {
} }
} }
.component-heading:first-child { // don't show the separator for the first non-hidden item
> .component:not(.hide):after {
display: none;
}
> .component:not(.hide) ~ .component:not(.hide):after {
display: block;
}
> .component-heading:first-child {
background: $color-gray-3; background: $color-gray-3;
border-radius: $border-radius $border-radius 0 0; border-radius: $border-radius $border-radius 0 0;
&:after { // don't show the separator for the first non-hidden item after the heading
&:after,
~ .component:not(.hide):after {
display: none; display: none;
} }
~ .component:not(.hide) ~ .component:not(.hide):after {
display: block;
}
} }
} }
-7
View File
@@ -34,14 +34,7 @@ $color-gray-9: #a4a4a4 ;
$color-gray-10: #ececec; $color-gray-10: #ececec;
$color-gray-11: #f2f2f2; $color-gray-11: #f2f2f2;
$global-margin: 55px;
$form-margin: 25px;
$button-padding: 0.7rem; $button-padding: 0.7rem;
$button-padding-ios: 0.6rem; $button-padding-ios: 0.6rem;
$button-line-height: 13px;
$footer-height-large: 90px;
$box-shadow-small-components: $color-gray-1 0 0.1rem 0.1rem; $box-shadow-small-components: $color-gray-1 0 0.1rem 0.1rem;
+69 -4
View File
@@ -7,7 +7,7 @@ var fixture = require('../../fixture');
describe('manipulators', function() { describe('manipulators', function() {
/** /**
* @param {string|Clay~ConfigItem} itemType * @param {string|Object} itemType
* @param {*} value * @param {*} value
* @param {*} [expected] * @param {*} [expected]
* @return {void} * @return {void}
@@ -31,7 +31,7 @@ describe('manipulators', function() {
} }
/** /**
* @param {string|Clay~ConfigItem} itemType * @param {string|Object} itemType
* @return {void} * @return {void}
*/ */
function testDisable(itemType) { function testDisable(itemType) {
@@ -57,7 +57,7 @@ describe('manipulators', function() {
} }
/** /**
* @param {string} itemType * @param {string|Object} itemType
* @return {void} * @return {void}
*/ */
function testEnable(itemType) { function testEnable(itemType) {
@@ -84,14 +84,71 @@ describe('manipulators', function() {
}); });
} }
/**
* @param {string|Object} itemType
* @return {void}
*/
function testHide(itemType) {
describe('.hide()', function() {
it('hides the field then triggers a "hide" event', function() {
var handlerSpy = sinon.spy();
var clayItem = fixture.clayItem(itemType);
clayItem.on('hide', handlerSpy);
assert.strictEqual(
clayItem.$element[0].classList.contains('hide'),
false
);
clayItem.hide();
assert.strictEqual(
clayItem.$element[0].classList.contains('hide'),
true
);
assert.strictEqual(handlerSpy.callCount, 1, 'handler not called once');
assert(handlerSpy.calledOn(clayItem), 'handler not called on clayItem');
});
});
}
/**
* @param {string|Object} itemType
* @return {void}
*/
function testShow(itemType) {
describe('.show()', function() {
it('shows the field then triggers a "show" event', function() {
var handlerSpy = sinon.spy();
var clayItem = fixture.clayItem(itemType);
clayItem.on('show', handlerSpy);
clayItem.hide();
assert.strictEqual(
clayItem.$element[0].classList.contains('hide'),
true
);
clayItem.show();
assert.strictEqual(
clayItem.$element[0].classList.contains('hide'),
false
);
assert.strictEqual(handlerSpy.callCount, 1, 'handler not called once');
assert(handlerSpy.calledOn(clayItem), 'handler not called on clayItem');
});
});
}
describe('html', function() { describe('html', function() {
testSetGet('footer', 'test123'); testSetGet('text', 'test123');
testShow('text');
testHide('text');
}); });
describe('val', function() { describe('val', function() {
testSetGet('input', 'test321'); testSetGet('input', 'test321');
testDisable('input'); testDisable('input');
testEnable('input'); testEnable('input');
testShow('text');
testHide('text');
}); });
describe('checked', function() { describe('checked', function() {
@@ -101,6 +158,8 @@ describe('manipulators', function() {
testSetGet('toggle', 0); testSetGet('toggle', 0);
testDisable('toggle'); testDisable('toggle');
testEnable('toggle'); testEnable('toggle');
testShow('toggle');
testHide('toggle');
}); });
describe('radiogroup', function() { describe('radiogroup', function() {
@@ -118,6 +177,8 @@ describe('manipulators', function() {
testSetGet(item, 'three "quote'); testSetGet(item, 'three "quote');
testDisable(item); testDisable(item);
testEnable(item); testEnable(item);
testShow(item);
testHide(item);
}); });
describe('checkboxgroup', function() { describe('checkboxgroup', function() {
@@ -136,6 +197,8 @@ describe('manipulators', function() {
testSetGet(item, false, []); testSetGet(item, false, []);
testDisable(item); testDisable(item);
testEnable(item); testEnable(item);
testShow(item);
testHide(item);
}); });
describe('color', function() { describe('color', function() {
@@ -149,5 +212,7 @@ describe('manipulators', function() {
testSetGet('color', undefined, 0x000000); testSetGet('color', undefined, 0x000000);
testDisable('color'); testDisable('color');
testEnable('color'); testEnable('color');
testShow('color');
testHide('color');
}); });
}); });