From 271c671448e0a04ab520fedb2f1901d163378e20 Mon Sep 17 00:00:00 2001 From: Susmitha Girumala Date: Wed, 6 May 2020 14:52:15 -0400 Subject: [PATCH 1/5] Add radio field rose component --- .../rose/addon/components/rose/form/radio.js | 20 +++ .../styles/rose/components/form/_index.scss | 1 + .../styles/rose/components/form/_radio.scss | 131 ++++++++++++++++++ .../templates/components/rose/form/radio.hbs | 16 +++ addons/rose/app/components/rose/form/radio.js | 1 + addons/rose/app/templates/index.hbs | 31 +++++ addons/rose/stories/form/radio.stories.js | 27 ++++ .../components/rose/form/radio-test.js | 49 +++++++ 8 files changed, 276 insertions(+) create mode 100644 addons/rose/addon/components/rose/form/radio.js create mode 100644 addons/rose/addon/styles/rose/components/form/_radio.scss create mode 100644 addons/rose/addon/templates/components/rose/form/radio.hbs create mode 100644 addons/rose/app/components/rose/form/radio.js create mode 100644 addons/rose/stories/form/radio.stories.js create mode 100644 addons/rose/tests/integration/components/rose/form/radio-test.js diff --git a/addons/rose/addon/components/rose/form/radio.js b/addons/rose/addon/components/rose/form/radio.js new file mode 100644 index 000000000..882c4eea2 --- /dev/null +++ b/addons/rose/addon/components/rose/form/radio.js @@ -0,0 +1,20 @@ +import Component from '@ember/component'; +import layout from '../../../templates/components/rose/form/radio'; + +/** + * A HTML `` element. + * + * @example + * + */ +export default Component.extend({ + layout, + tagName: '', +}); diff --git a/addons/rose/addon/styles/rose/components/form/_index.scss b/addons/rose/addon/styles/rose/components/form/_index.scss index 6bcb2c8de..c8c516f8c 100644 --- a/addons/rose/addon/styles/rose/components/form/_index.scss +++ b/addons/rose/addon/styles/rose/components/form/_index.scss @@ -1,3 +1,4 @@ @import 'input'; @import 'checkbox'; @import 'select'; +@import 'radio'; diff --git a/addons/rose/addon/styles/rose/components/form/_radio.scss b/addons/rose/addon/styles/rose/components/form/_radio.scss new file mode 100644 index 000000000..e86b33d1c --- /dev/null +++ b/addons/rose/addon/styles/rose/components/form/_radio.scss @@ -0,0 +1,131 @@ +@use '../../variables/sizing'; +@use '../../utilities/type'; + +$radio-svg: ( + 'default': "", + + 'hover': "", + + 'focus': "", + + 'checked': "", + + 'disabled': "", + + 'disabled-checked': "", + + 'error': "", + + 'error-checked': "", +); + +$data-svg-prefix: 'data:image/svg+xml;utf-8,'; + +.rose-form-radio { + position: relative; + margin-bottom: sizing.rems(xs); + color: var(--ui-gray); + + .rose-form-radio-label { + @include type.type(s, semibold); + color: currentColor; + padding-left: sizing.rems(l); + + &::before { + position: absolute; + left: 0; + display: block; + width: sizing.rems(m); + height: sizing.rems(m); + pointer-events: none; + content: ' '; + } + + &::after { + position: absolute; + top: -#{sizing.rems(xxs)}; + left: -#{sizing.rems(xxxs) + sizing.rems(xxxxs)}; + display: block; + width: sizing.rems(l); + height: sizing.rems(l); + transform: scale(2); + pointer-events: none; + content: ' '; + background: no-repeat 50%/50% 50%; + background-image: url($data-svg-prefix + map-get($radio-svg, 'default')); + } + } + + .rose-form-radio-field { + position: absolute; + left: 0; + z-index: -1; + width: sizing.rems(m); + height: sizing.rems(m); + opacity: 0; + + &:not(:disabled) { + &:hover { + ~ .rose-form-radio-label { + &::after { + background-image: url($data-svg-prefix + map-get($radio-svg, 'hover')); + } + } + } + + &:focus { + ~ .rose-form-radio-label { + &::after { + background-image: url($data-svg-prefix + map-get($radio-svg, 'focus')); + } + } + } + + &:checked { + ~ .rose-form-radio-label { + &::after { + background-image: url($data-svg-prefix + map-get($radio-svg, 'checked')); + } + } + } + } + + &:disabled { + ~ .rose-form-radio-label { + &::after { + background-image: url($data-svg-prefix + map-get($radio-svg, 'disabled')); + } + } + + &:checked { + ~ .rose-form-radio-label { + &::after { + background-image: url($data-svg-prefix + map-get($radio-svg, 'disabled-checked')); + } + } + } + } + } + + &.error { + color: var(--failure); + + .rose-form-radio-field { + &:not(:disabled):not(:focus) { + ~ .rose-form-radio-label { + &::after { + background-image: url($data-svg-prefix + map-get($radio-svg, 'error')); + } + } + + &:checked { + ~ .rose-form-radio-label { + &::after { + background-image: url($data-svg-prefix + map-get($radio-svg, 'error-checked')); + } + } + } + } + } + } +} diff --git a/addons/rose/addon/templates/components/rose/form/radio.hbs b/addons/rose/addon/templates/components/rose/form/radio.hbs new file mode 100644 index 000000000..f01831c6d --- /dev/null +++ b/addons/rose/addon/templates/components/rose/form/radio.hbs @@ -0,0 +1,16 @@ +
+ + + + + + {{yield}} + +
diff --git a/addons/rose/app/components/rose/form/radio.js b/addons/rose/app/components/rose/form/radio.js new file mode 100644 index 000000000..609e3db99 --- /dev/null +++ b/addons/rose/app/components/rose/form/radio.js @@ -0,0 +1 @@ +export { default } from 'rose/components/rose/form/radio'; \ No newline at end of file diff --git a/addons/rose/app/templates/index.hbs b/addons/rose/app/templates/index.hbs index 5ac78d798..47336ad5e 100644 --- a/addons/rose/app/templates/index.hbs +++ b/addons/rose/app/templates/index.hbs @@ -118,3 +118,34 @@ Dummy app index template @label="Disabled + Checked" disabled={{true}} /> + +

Radio

+ + + + + + diff --git a/addons/rose/stories/form/radio.stories.js b/addons/rose/stories/form/radio.stories.js new file mode 100644 index 000000000..68bcc04c6 --- /dev/null +++ b/addons/rose/stories/form/radio.stories.js @@ -0,0 +1,27 @@ +import { hbs } from 'ember-cli-htmlbars'; +import { text, boolean } from '@storybook/addon-knobs'; + +export default { + title: 'Rose::Form::Radio', +}; + +export const Normal = () => ({ + template: hbs` + + `, + context: { + label: text('text', 'Radiofield'), + id: text('id', 'radio-1'), + name: text('name', 'radio-1'), + checked: boolean('checked', false), + error: boolean('error', false), + disabled: boolean('disabled', false), + }, +}); diff --git a/addons/rose/tests/integration/components/rose/form/radio-test.js b/addons/rose/tests/integration/components/rose/form/radio-test.js new file mode 100644 index 000000000..88ac59173 --- /dev/null +++ b/addons/rose/tests/integration/components/rose/form/radio-test.js @@ -0,0 +1,49 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, find } from '@ember/test-helpers'; +import hbs from 'htmlbars-inline-precompile'; + +module('Integration | Component | rose/form/radio', function(hooks) { + setupRenderingTest(hooks); + + test('it renders', async function(assert) { + await render(hbs``); + assert.ok(await find('input')); + assert.equal(await find('input').type, 'radio'); + }); + + test('it renders with label', async function(assert) { + await render(hbs``); + assert.equal(await find('label').textContent.trim(), 'Label'); + }); + + test('it is not checked by default', async function(assert) { + await render(hbs``); + assert.equal(await find('input').checked, false); + }); + + test('it is not disabled by default', async function(assert) { + await render(hbs``); + assert.equal(await find('input').disabled, false); + }); + + test('it is not in error state by default', async function(assert) { + await render(hbs``); + assert.notOk(await find('.error')); + }); + + test('it is checked when @checked={{true}}', async function(assert) { + await render(hbs``); + assert.equal(await find('input').checked, true); + }); + + test('it is disabled when disabled={{true}}', async function(assert) { + await render(hbs``); + assert.equal(await find('input').disabled, true); + }); + + test('it is in error state when @error={{true}}', async function(assert) { + await render(hbs``); + assert.ok(await find('.error')); + }); +}); From a4b16bdddbb314132033836925e9fff5e0c7d699 Mon Sep 17 00:00:00 2001 From: Randall Morey Date: Thu, 7 May 2020 12:49:40 -0400 Subject: [PATCH 2/5] =?UTF-8?q?chore:=20=F0=9F=A4=96=20add=20contextual=20?= =?UTF-8?q?radio/radio=20group=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../addon/components/rose/form/radio/group.js | 8 ++++ .../addon/components/rose/form/radio/radio.js | 20 ++++++++++ .../components/rose/form/radio/group.hbs | 3 ++ .../components/rose/form/radio/radio.hbs | 18 +++++++++ .../app/components/rose/form/radio/group.js | 1 + .../app/components/rose/form/radio/radio.js | 1 + addons/rose/app/templates/index.hbs | 19 +++++++++ addons/rose/package.json | 1 + .../components/rose/form/radio/group-test.js | 26 +++++++++++++ .../components/rose/form/radio/radio-test.js | 26 +++++++++++++ yarn.lock | 39 +++++++++++++++++-- 11 files changed, 159 insertions(+), 3 deletions(-) create mode 100644 addons/rose/addon/components/rose/form/radio/group.js create mode 100644 addons/rose/addon/components/rose/form/radio/radio.js create mode 100644 addons/rose/addon/templates/components/rose/form/radio/group.hbs create mode 100644 addons/rose/addon/templates/components/rose/form/radio/radio.hbs create mode 100644 addons/rose/app/components/rose/form/radio/group.js create mode 100644 addons/rose/app/components/rose/form/radio/radio.js create mode 100644 addons/rose/tests/integration/components/rose/form/radio/group-test.js create mode 100644 addons/rose/tests/integration/components/rose/form/radio/radio-test.js diff --git a/addons/rose/addon/components/rose/form/radio/group.js b/addons/rose/addon/components/rose/form/radio/group.js new file mode 100644 index 000000000..5375e3cbf --- /dev/null +++ b/addons/rose/addon/components/rose/form/radio/group.js @@ -0,0 +1,8 @@ +import Component from '@ember/component'; +import layout from '../../../../templates/components/rose/form/radio/group'; + +export default Component.extend({ + layout, + + tagName: '' +}); diff --git a/addons/rose/addon/components/rose/form/radio/radio.js b/addons/rose/addon/components/rose/form/radio/radio.js new file mode 100644 index 000000000..853f3a58b --- /dev/null +++ b/addons/rose/addon/components/rose/form/radio/radio.js @@ -0,0 +1,20 @@ +import Component from '@ember/component'; +import layout from '../../../../templates/components/rose/form/radio/radio'; + +/** + * A HTML `` element. + * + * @example + * + */ +export default Component.extend({ + layout, + tagName: '', +}); diff --git a/addons/rose/addon/templates/components/rose/form/radio/group.hbs b/addons/rose/addon/templates/components/rose/form/radio/group.hbs new file mode 100644 index 000000000..4fa7ab5fa --- /dev/null +++ b/addons/rose/addon/templates/components/rose/form/radio/group.hbs @@ -0,0 +1,3 @@ +{{yield (hash + radio=(component 'rose/form/radio/radio' name=@name variable=@variable) +)}} diff --git a/addons/rose/addon/templates/components/rose/form/radio/radio.hbs b/addons/rose/addon/templates/components/rose/form/radio/radio.hbs new file mode 100644 index 000000000..84b155d26 --- /dev/null +++ b/addons/rose/addon/templates/components/rose/form/radio/radio.hbs @@ -0,0 +1,18 @@ +
+ + + + + + {{yield}} + +
diff --git a/addons/rose/app/components/rose/form/radio/group.js b/addons/rose/app/components/rose/form/radio/group.js new file mode 100644 index 000000000..0a106a8ce --- /dev/null +++ b/addons/rose/app/components/rose/form/radio/group.js @@ -0,0 +1 @@ +export { default } from 'rose/components/rose/form/radio/group'; \ No newline at end of file diff --git a/addons/rose/app/components/rose/form/radio/radio.js b/addons/rose/app/components/rose/form/radio/radio.js new file mode 100644 index 000000000..e2662158e --- /dev/null +++ b/addons/rose/app/components/rose/form/radio/radio.js @@ -0,0 +1 @@ +export { default } from 'rose/components/rose/form/radio/radio'; \ No newline at end of file diff --git a/addons/rose/app/templates/index.hbs b/addons/rose/app/templates/index.hbs index 47336ad5e..d4440212c 100644 --- a/addons/rose/app/templates/index.hbs +++ b/addons/rose/app/templates/index.hbs @@ -120,6 +120,25 @@ Dummy app index template />

Radio

+ + + + + + + Date: Thu, 7 May 2020 17:44:18 -0400 Subject: [PATCH 3/5] =?UTF-8?q?chore:=20=F0=9F=A4=96=20Add=20ember-radio-b?= =?UTF-8?q?utton=20as=20radiofield?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use ember-radio-button to wrap a radiofield. Introduce radiofield group --- .../rose/addon/components/rose/form/radio.js | 20 ------ .../addon/components/rose/form/radio/group.js | 25 ++++++- .../addon/components/rose/form/radio/radio.js | 26 +++---- .../styles/rose/components/form/_radio.scss | 67 +++++++++++++------ .../templates/components/rose/form/radio.hbs | 16 ----- .../components/rose/form/radio/radio.hbs | 3 +- addons/rose/app/components/rose/form/radio.js | 1 - .../app/components/rose/form/radio/group.js | 2 +- .../app/components/rose/form/radio/radio.js | 2 +- addons/rose/app/templates/index.hbs | 62 ++++++++--------- .../rose/stories/form/radio/group.stories.js | 41 ++++++++++++ .../stories/form/{ => radio}/radio.stories.js | 19 +++--- .../components/rose/form/radio-test.js | 49 -------------- .../components/rose/form/radio/group-test.js | 58 +++++++++++----- .../components/rose/form/radio/radio-test.js | 61 +++++++++++++---- 15 files changed, 260 insertions(+), 192 deletions(-) delete mode 100644 addons/rose/addon/components/rose/form/radio.js delete mode 100644 addons/rose/addon/templates/components/rose/form/radio.hbs delete mode 100644 addons/rose/app/components/rose/form/radio.js create mode 100644 addons/rose/stories/form/radio/group.stories.js rename addons/rose/stories/form/{ => radio}/radio.stories.js (55%) delete mode 100644 addons/rose/tests/integration/components/rose/form/radio-test.js diff --git a/addons/rose/addon/components/rose/form/radio.js b/addons/rose/addon/components/rose/form/radio.js deleted file mode 100644 index 882c4eea2..000000000 --- a/addons/rose/addon/components/rose/form/radio.js +++ /dev/null @@ -1,20 +0,0 @@ -import Component from '@ember/component'; -import layout from '../../../templates/components/rose/form/radio'; - -/** - * A HTML `` element. - * - * @example - * - */ -export default Component.extend({ - layout, - tagName: '', -}); diff --git a/addons/rose/addon/components/rose/form/radio/group.js b/addons/rose/addon/components/rose/form/radio/group.js index 5375e3cbf..9ad393cd2 100644 --- a/addons/rose/addon/components/rose/form/radio/group.js +++ b/addons/rose/addon/components/rose/form/radio/group.js @@ -1,8 +1,31 @@ import Component from '@ember/component'; import layout from '../../../../templates/components/rose/form/radio/group'; +/** + * A `` element. + * + * @example + * + * + * + * + * + */ + export default Component.extend({ layout, - tagName: '' + tagName: '', }); diff --git a/addons/rose/addon/components/rose/form/radio/radio.js b/addons/rose/addon/components/rose/form/radio/radio.js index 853f3a58b..6d0083cc2 100644 --- a/addons/rose/addon/components/rose/form/radio/radio.js +++ b/addons/rose/addon/components/rose/form/radio/radio.js @@ -2,18 +2,20 @@ import Component from '@ember/component'; import layout from '../../../../templates/components/rose/form/radio/radio'; /** - * A HTML `` element. - * - * @example - * - */ + * A `` element. + * `value` and `variable` must be equal to select + * radiofield. + * + * @example + * + */ export default Component.extend({ layout, tagName: '', diff --git a/addons/rose/addon/styles/rose/components/form/_radio.scss b/addons/rose/addon/styles/rose/components/form/_radio.scss index e86b33d1c..822505cf8 100644 --- a/addons/rose/addon/styles/rose/components/form/_radio.scss +++ b/addons/rose/addon/styles/rose/components/form/_radio.scss @@ -2,21 +2,22 @@ @use '../../utilities/type'; $radio-svg: ( - 'default': "", - - 'hover': "", - - 'focus': "", - - 'checked': "", - - 'disabled': "", - - 'disabled-checked': "", - - 'error': "", - - 'error-checked': "", + 'default': + "", + 'hover': + "", + 'focus': + "", + 'checked': + "", + 'disabled': + "", + 'disabled-checked': + "", + 'error': + "", + 'error-checked': + "", ); $data-svg-prefix: 'data:image/svg+xml;utf-8,'; @@ -33,6 +34,7 @@ $data-svg-prefix: 'data:image/svg+xml;utf-8,'; &::before { position: absolute; + top: sizing.rems(xs); left: 0; display: block; width: sizing.rems(m); @@ -68,7 +70,10 @@ $data-svg-prefix: 'data:image/svg+xml;utf-8,'; &:hover { ~ .rose-form-radio-label { &::after { - background-image: url($data-svg-prefix + map-get($radio-svg, 'hover')); + background-image: url($data-svg-prefix + map-get( + $radio-svg, + 'hover' + )); } } } @@ -76,7 +81,10 @@ $data-svg-prefix: 'data:image/svg+xml;utf-8,'; &:focus { ~ .rose-form-radio-label { &::after { - background-image: url($data-svg-prefix + map-get($radio-svg, 'focus')); + background-image: url($data-svg-prefix + map-get( + $radio-svg, + 'focus' + )); } } } @@ -84,7 +92,10 @@ $data-svg-prefix: 'data:image/svg+xml;utf-8,'; &:checked { ~ .rose-form-radio-label { &::after { - background-image: url($data-svg-prefix + map-get($radio-svg, 'checked')); + background-image: url($data-svg-prefix + map-get( + $radio-svg, + 'checked' + )); } } } @@ -93,14 +104,20 @@ $data-svg-prefix: 'data:image/svg+xml;utf-8,'; &:disabled { ~ .rose-form-radio-label { &::after { - background-image: url($data-svg-prefix + map-get($radio-svg, 'disabled')); + background-image: url($data-svg-prefix + map-get( + $radio-svg, + 'disabled' + )); } } &:checked { ~ .rose-form-radio-label { &::after { - background-image: url($data-svg-prefix + map-get($radio-svg, 'disabled-checked')); + background-image: url($data-svg-prefix + map-get( + $radio-svg, + 'disabled-checked' + )); } } } @@ -114,14 +131,20 @@ $data-svg-prefix: 'data:image/svg+xml;utf-8,'; &:not(:disabled):not(:focus) { ~ .rose-form-radio-label { &::after { - background-image: url($data-svg-prefix + map-get($radio-svg, 'error')); + background-image: url($data-svg-prefix + map-get( + $radio-svg, + 'error' + )); } } &:checked { ~ .rose-form-radio-label { &::after { - background-image: url($data-svg-prefix + map-get($radio-svg, 'error-checked')); + background-image: url($data-svg-prefix + map-get( + $radio-svg, + 'error-checked' + )); } } } diff --git a/addons/rose/addon/templates/components/rose/form/radio.hbs b/addons/rose/addon/templates/components/rose/form/radio.hbs deleted file mode 100644 index f01831c6d..000000000 --- a/addons/rose/addon/templates/components/rose/form/radio.hbs +++ /dev/null @@ -1,16 +0,0 @@ -
- - - - - - {{yield}} - -
diff --git a/addons/rose/addon/templates/components/rose/form/radio/radio.hbs b/addons/rose/addon/templates/components/rose/form/radio/radio.hbs index 84b155d26..09e492f7d 100644 --- a/addons/rose/addon/templates/components/rose/form/radio/radio.hbs +++ b/addons/rose/addon/templates/components/rose/form/radio/radio.hbs @@ -7,7 +7,8 @@ type="radio" @name={{@name}} @value={{@value}} - @groupValue={{@variable}} /> + @groupValue={{@variable}} + @disabled={{@disabled}}/>