Browse Source
Merge pull request #101 from Conor-Mack/feature/radiobutton-checkradiogroups-label
Completed radiobutton, radiobutton group and checkbox group
gh-pages
Martin McKeaveney
7 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with
314 additions and
13 deletions
-
packages/materialdesign-components/package.json
-
packages/materialdesign-components/src/Checkbox/Checkbox.svelte
-
packages/materialdesign-components/src/Checkbox/CheckboxGroup.svelte
-
packages/materialdesign-components/src/Checkbox/index.js
-
packages/materialdesign-components/src/Common/Label.svelte
-
packages/materialdesign-components/src/Radiobutton/Radiobutton.svelte
-
packages/materialdesign-components/src/Radiobutton/RadiobuttonGroup.svelte
-
packages/materialdesign-components/src/Radiobutton/_style.scss
-
packages/materialdesign-components/src/Radiobutton/index.js
-
packages/materialdesign-components/src/Test/TestApp.svelte
-
packages/materialdesign-components/src/Test/props.js
-
packages/materialdesign-components/src/Test/testComponents.js
-
packages/materialdesign-components/src/index.js
|
|
@ -42,6 +42,7 @@ |
|
|
"dependencies": { |
|
|
"dependencies": { |
|
|
"@material/checkbox": "^4.0.0", |
|
|
"@material/checkbox": "^4.0.0", |
|
|
"@material/form-field": "^4.0.0", |
|
|
"@material/form-field": "^4.0.0", |
|
|
|
|
|
"@material/radio": "^4.0.0", |
|
|
"@material/textfield": "^4.0.0" |
|
|
"@material/textfield": "^4.0.0" |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
@ -5,11 +5,14 @@ |
|
|
import ClassBuilder from "../ClassBuilder.js"; |
|
|
import ClassBuilder from "../ClassBuilder.js"; |
|
|
import { MDCCheckbox } from "@material/checkbox"; |
|
|
import { MDCCheckbox } from "@material/checkbox"; |
|
|
|
|
|
|
|
|
|
|
|
export let onClick = item => {}; |
|
|
|
|
|
|
|
|
export let id = ""; |
|
|
export let id = ""; |
|
|
export let label = ""; |
|
|
export let label = ""; |
|
|
export let disabled = false; |
|
|
export let disabled = false; |
|
|
export let alignEnd = false; |
|
|
export let alignEnd = false; |
|
|
export let indeterminate = false; |
|
|
export let indeterminate = false; |
|
|
|
|
|
export let checked = false; |
|
|
|
|
|
|
|
|
let instance = null; |
|
|
let instance = null; |
|
|
let checkbox = null; |
|
|
let checkbox = null; |
|
|
@ -34,7 +37,13 @@ |
|
|
|
|
|
|
|
|
<Formfield {label} {id} {alignEnd}> |
|
|
<Formfield {label} {id} {alignEnd}> |
|
|
<div bind:this={checkbox} class={blockClass}> |
|
|
<div bind:this={checkbox} class={blockClass}> |
|
|
<input type="checkbox" class={cb.elem`native-control`} {id} {disabled} /> |
|
|
<input |
|
|
|
|
|
type="checkbox" |
|
|
|
|
|
class={cb.elem`native-control`} |
|
|
|
|
|
{id} |
|
|
|
|
|
{disabled} |
|
|
|
|
|
{checked} |
|
|
|
|
|
on:click={onClick} /> |
|
|
<div class={cb.elem`background`}> |
|
|
<div class={cb.elem`background`}> |
|
|
<svg class={cb.elem`checkmark`} viewBox="0 0 24 24"> |
|
|
<svg class={cb.elem`checkmark`} viewBox="0 0 24 24"> |
|
|
<path |
|
|
<path |
|
|
|
|
|
@ -0,0 +1,77 @@ |
|
|
|
|
|
<script> |
|
|
|
|
|
import Checkbox from "./Checkbox.svelte"; |
|
|
|
|
|
import Label from "../Common/Label.svelte"; |
|
|
|
|
|
|
|
|
|
|
|
export let label = ""; |
|
|
|
|
|
export let orientation = "row"; |
|
|
|
|
|
export let fullwidth = false; |
|
|
|
|
|
export let onChange = selectedItems => {}; |
|
|
|
|
|
|
|
|
|
|
|
export let items = []; |
|
|
|
|
|
|
|
|
|
|
|
export let disabled = false; |
|
|
|
|
|
export let alignEnd = false; |
|
|
|
|
|
let selectedItems = []; |
|
|
|
|
|
|
|
|
|
|
|
function handleonChange(item) { |
|
|
|
|
|
if (!!item.checked) { |
|
|
|
|
|
item.checked = !item.checked; |
|
|
|
|
|
} else { |
|
|
|
|
|
item.checked = true; |
|
|
|
|
|
} |
|
|
|
|
|
onChange(items.filter(i => i.checked)); |
|
|
|
|
|
} |
|
|
|
|
|
</script> |
|
|
|
|
|
|
|
|
|
|
|
<style> |
|
|
|
|
|
.checkbox-group { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: column; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.checkbox-group__boxes.row > div:not(:first-child) { |
|
|
|
|
|
padding-left: 10px; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.checkbox-group > div { |
|
|
|
|
|
text-align: left; |
|
|
|
|
|
flex: 1; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.row { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-flow: row wrap; |
|
|
|
|
|
align-items: flex-start; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.column { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-flow: column wrap; |
|
|
|
|
|
align-items: flex-start; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.fullwidth { |
|
|
|
|
|
flex: 1; |
|
|
|
|
|
text-align: left; |
|
|
|
|
|
} |
|
|
|
|
|
</style> |
|
|
|
|
|
|
|
|
|
|
|
<div class="checkbox-group"> |
|
|
|
|
|
<div class="checkbox-group__label"> |
|
|
|
|
|
<Label text={label} bold /> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div class={`checkbox-group__boxes ${orientation}`}> |
|
|
|
|
|
{#each items as item, i} |
|
|
|
|
|
<div class:fullwidth> |
|
|
|
|
|
<Checkbox |
|
|
|
|
|
id={`${item.label}-${i}`} |
|
|
|
|
|
{disabled} |
|
|
|
|
|
{alignEnd} |
|
|
|
|
|
indeterminate={item.indeterminate || false} |
|
|
|
|
|
label={item.label} |
|
|
|
|
|
checked={item.checked || false} |
|
|
|
|
|
onClick={() => handleonChange(item)} /> |
|
|
|
|
|
</div> |
|
|
|
|
|
{/each} |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
@ -1,2 +1,4 @@ |
|
|
import "./_style.scss"; |
|
|
import "./_style.scss"; |
|
|
export { default as checkbox } from "./Checkbox.svelte"; |
|
|
export { default as checkbox } from "./Checkbox.svelte"; |
|
|
|
|
|
export { default as checkboxgroup } from "./CheckboxGroup.svelte"; |
|
|
|
|
|
|
|
|
|
|
|
@ -0,0 +1,12 @@ |
|
|
|
|
|
<script> |
|
|
|
|
|
export let bold = false; |
|
|
|
|
|
export let text = ""; |
|
|
|
|
|
</script> |
|
|
|
|
|
|
|
|
|
|
|
<style> |
|
|
|
|
|
.bold { |
|
|
|
|
|
font-weight: 500; |
|
|
|
|
|
} |
|
|
|
|
|
</style> |
|
|
|
|
|
|
|
|
|
|
|
<span class="mdc-typography" class:bold>{text}</span> |
|
|
@ -0,0 +1,50 @@ |
|
|
|
|
|
<script> |
|
|
|
|
|
import { onMount, onDestroy, getContext } from "svelte" |
|
|
|
|
|
import Formfield from "../Common/Formfield.svelte" |
|
|
|
|
|
import ClassBuilder from "../ClassBuilder.js" |
|
|
|
|
|
import { MDCRadio } from "@material/radio" |
|
|
|
|
|
|
|
|
|
|
|
export let onClick = item => {} |
|
|
|
|
|
|
|
|
|
|
|
export let id = "" |
|
|
|
|
|
export let label = "" |
|
|
|
|
|
export let names = "radios" |
|
|
|
|
|
export let checked = false |
|
|
|
|
|
export let disabled = false |
|
|
|
|
|
export let alignEnd = false |
|
|
|
|
|
|
|
|
|
|
|
let instance = null |
|
|
|
|
|
let radiobtn = null |
|
|
|
|
|
|
|
|
|
|
|
onMount(() => { |
|
|
|
|
|
if (!!radiobtn) { |
|
|
|
|
|
instance = new MDCRadio(radiobtn) |
|
|
|
|
|
let fieldStore = getContext("BBMD:field-element") |
|
|
|
|
|
fieldStore.setInput(instance) |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
const cb = new ClassBuilder("radio") |
|
|
|
|
|
let modifiers = { disabled } |
|
|
|
|
|
let props = { modifiers } |
|
|
|
|
|
|
|
|
|
|
|
const blockClass = cb.build({ props }) |
|
|
|
|
|
</script> |
|
|
|
|
|
|
|
|
|
|
|
<Formfield {id} {label} {alignEnd}> |
|
|
|
|
|
<div class={blockClass}> |
|
|
|
|
|
<input |
|
|
|
|
|
{id} |
|
|
|
|
|
class={cb.elem`native-control`} |
|
|
|
|
|
type="radio" |
|
|
|
|
|
{names} |
|
|
|
|
|
{checked} |
|
|
|
|
|
{disabled} |
|
|
|
|
|
on:click={onClick} /> |
|
|
|
|
|
<div class={cb.elem`background`}> |
|
|
|
|
|
<div class={cb.elem`outer-circle`} /> |
|
|
|
|
|
<div class={cb.elem`inner-circle`} /> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div class={cb.elem`ripple`} /> |
|
|
|
|
|
</div> |
|
|
|
|
|
</Formfield> |
|
|
@ -0,0 +1,80 @@ |
|
|
|
|
|
<script> |
|
|
|
|
|
import Radiobutton from "./Radiobutton.svelte" |
|
|
|
|
|
import Label from "../Common/Label.svelte" |
|
|
|
|
|
|
|
|
|
|
|
export let name = "radio-group" |
|
|
|
|
|
export let label = "" |
|
|
|
|
|
export let orientation = "row" |
|
|
|
|
|
export let fullwidth = false |
|
|
|
|
|
export let alignEnd = false |
|
|
|
|
|
|
|
|
|
|
|
export let onChange = selected => {} |
|
|
|
|
|
|
|
|
|
|
|
export let items = [] |
|
|
|
|
|
|
|
|
|
|
|
let selected = null |
|
|
|
|
|
|
|
|
|
|
|
$: alignRight = orientation === "column" && alignEnd |
|
|
|
|
|
|
|
|
|
|
|
function handleOnClick(item) { |
|
|
|
|
|
if (!!selected) selected.checked = false |
|
|
|
|
|
item.checked = true |
|
|
|
|
|
selected = item |
|
|
|
|
|
items = items |
|
|
|
|
|
onChange(selected) |
|
|
|
|
|
} |
|
|
|
|
|
</script> |
|
|
|
|
|
|
|
|
|
|
|
<div class="radiobutton-group"> |
|
|
|
|
|
<div class="radiobutton-group__label"> |
|
|
|
|
|
<Label text={label} bold /> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div class={`radiobutton-group__radios ${orientation}`} class:alignRight> |
|
|
|
|
|
{#each items as item, i} |
|
|
|
|
|
<div class:fullwidth> |
|
|
|
|
|
<Radiobutton |
|
|
|
|
|
id={`${item.label}-${i}`} |
|
|
|
|
|
{name} |
|
|
|
|
|
{alignEnd} |
|
|
|
|
|
label={item.label} |
|
|
|
|
|
checked={item.checked} |
|
|
|
|
|
onClick={() => handleOnClick(item)} /> |
|
|
|
|
|
</div> |
|
|
|
|
|
{/each} |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
<style> |
|
|
|
|
|
.radiobutton-group { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: column; |
|
|
|
|
|
align-items: flex-start; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.radiobutton-group__radios.row > div:not(:first-child) { |
|
|
|
|
|
padding-left: 10px; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.radiobutton-group > div { |
|
|
|
|
|
flex: 1; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.alignRight { |
|
|
|
|
|
text-align: right; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.row { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-flow: row wrap; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.column { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-flow: column wrap; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.fullwidth { |
|
|
|
|
|
flex: 1; |
|
|
|
|
|
text-align: left; |
|
|
|
|
|
} |
|
|
|
|
|
</style> |
|
|
@ -0,0 +1,2 @@ |
|
|
|
|
|
@import "@material/form-field/mdc-form-field"; |
|
|
|
|
|
@import "@material/radio/mdc-radio.scss"; |
|
|
@ -0,0 +1,3 @@ |
|
|
|
|
|
import "./_style.scss"; |
|
|
|
|
|
export { default as radiobutton } from "./Radiobutton.svelte"; |
|
|
|
|
|
export { default as radiobuttongroup } from "./RadiobuttonGroup.svelte"; |
|
|
@ -2,7 +2,17 @@ |
|
|
import createApp from "./createApp" |
|
|
import createApp from "./createApp" |
|
|
import { props } from "./props" |
|
|
import { props } from "./props" |
|
|
let _bb |
|
|
let _bb |
|
|
const { h1, overline, button, textfield, checkbox } = props |
|
|
const { |
|
|
|
|
|
h1, |
|
|
|
|
|
overline, |
|
|
|
|
|
button, |
|
|
|
|
|
textfield, |
|
|
|
|
|
checkbox, |
|
|
|
|
|
checkboxgroup, |
|
|
|
|
|
radiobutton, |
|
|
|
|
|
radiobuttongroup, |
|
|
|
|
|
} = props |
|
|
|
|
|
|
|
|
let currentComponent |
|
|
let currentComponent |
|
|
let _appPromise |
|
|
let _appPromise |
|
|
$: { |
|
|
$: { |
|
|
@ -11,11 +21,20 @@ |
|
|
const page = { |
|
|
const page = { |
|
|
props: { |
|
|
props: { |
|
|
_component: "testcomponents/rootComponent", |
|
|
_component: "testcomponents/rootComponent", |
|
|
_children: [h1, overline, button, textfield, checkbox], |
|
|
_children: [ |
|
|
|
|
|
h1, |
|
|
|
|
|
overline, |
|
|
|
|
|
button, |
|
|
|
|
|
textfield, |
|
|
|
|
|
checkbox, |
|
|
|
|
|
checkboxgroup, |
|
|
|
|
|
radiobutton, |
|
|
|
|
|
radiobuttongroup, |
|
|
|
|
|
], |
|
|
}, |
|
|
}, |
|
|
} |
|
|
} |
|
|
_appPromise.then(initialise => { |
|
|
_appPromise.then(initialise => { |
|
|
initialise(page, window.document.body, "") |
|
|
initialise(page, currentComponent, "") |
|
|
}) |
|
|
}) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
@ -43,5 +43,36 @@ export const props = { |
|
|
_children: [], |
|
|
_children: [], |
|
|
id: "test-check", |
|
|
id: "test-check", |
|
|
label: "Check Yo Self", |
|
|
label: "Check Yo Self", |
|
|
|
|
|
onClick: () => alert`Before ya reck yo'self`, |
|
|
|
|
|
}, |
|
|
|
|
|
checkboxgroup: { |
|
|
|
|
|
_component: "@budibase/materialdesign-components/checkboxgroup", |
|
|
|
|
|
_children: [], |
|
|
|
|
|
label: "Whats your favourite?", |
|
|
|
|
|
items: [ |
|
|
|
|
|
{ label: "Currys", indeterminate: true }, |
|
|
|
|
|
{ label: "Chips", checked: true }, |
|
|
|
|
|
{ label: "Pasties" }, |
|
|
|
|
|
], |
|
|
|
|
|
onChange: selectedItems => console.log(selectedItems), |
|
|
|
|
|
}, |
|
|
|
|
|
radiobutton: { |
|
|
|
|
|
_component: "@budibase/materialdesign-components/radiobutton", |
|
|
|
|
|
_children: [], |
|
|
|
|
|
label: "Hi radio", |
|
|
|
|
|
alignEnd: true, |
|
|
|
|
|
onClick: () => alert`Roger That`, |
|
|
|
|
|
}, |
|
|
|
|
|
radiobuttongroup: { |
|
|
|
|
|
_component: "@budibase/materialdesign-components/radiobuttongroup", |
|
|
|
|
|
_children: [], |
|
|
|
|
|
label: "Preferred method of contact: ", |
|
|
|
|
|
orientation: "column", |
|
|
|
|
|
items: [ |
|
|
|
|
|
{ label: "Email", value: 1 }, |
|
|
|
|
|
{ label: "Phone", value: 2 }, |
|
|
|
|
|
{ label: "Social Media", value: 3 }, |
|
|
|
|
|
], |
|
|
|
|
|
onChange: selected => console.log(selected), |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
@ -1,3 +1,23 @@ |
|
|
import { H1, Overline, button, icon, checkbox, textfield } from "@BBMD" |
|
|
import { |
|
|
|
|
|
H1, |
|
|
|
|
|
Overline, |
|
|
|
|
|
button, |
|
|
|
|
|
icon, |
|
|
|
|
|
textfield, |
|
|
|
|
|
checkbox, |
|
|
|
|
|
checkboxgroup, |
|
|
|
|
|
radiobutton, |
|
|
|
|
|
radiobuttongroup, |
|
|
|
|
|
} from "@BBMD" |
|
|
|
|
|
|
|
|
export default {H1, Overline, button, icon, checkbox, textfield } |
|
|
export default { |
|
|
|
|
|
H1, |
|
|
|
|
|
Overline, |
|
|
|
|
|
button, |
|
|
|
|
|
icon, |
|
|
|
|
|
textfield, |
|
|
|
|
|
checkbox, |
|
|
|
|
|
checkboxgroup, |
|
|
|
|
|
radiobutton, |
|
|
|
|
|
radiobuttongroup, |
|
|
|
|
|
} |
|
|
|
|
|
@ -4,11 +4,6 @@ export { button } from "./Button" |
|
|
export { default as icon } from "./Icon.svelte" |
|
|
export { default as icon } from "./Icon.svelte" |
|
|
export { textfield } from "./Textfield" |
|
|
export { textfield } from "./Textfield" |
|
|
export * from "./Typography" |
|
|
export * from "./Typography" |
|
|
export { checkbox } from "./Checkbox" |
|
|
export { checkbox, checkboxgroup } from "./Checkbox" |
|
|
|
|
|
export { radiobutton, radiobuttongroup } from "./Radiobutton" |
|
|
|
|
|
|
|
|
// import { Button } from "./Button";
|
|
|
|
|
|
// import Icon from "./Icon.svelte";
|
|
|
|
|
|
// import { Textfield } from "./Textfield";
|
|
|
|
|
|
// export { Button, Icon, Textfield };
|
|
|
|
|
|
// export * from "./Typography";
|
|
|
|
|
|
// export { Checkbox } from "./Checkbox";
|
|
|
|
|
|
|