From 7cec7228d9a5439ba16c31ad67525716bd78d06e Mon Sep 17 00:00:00 2001 From: Greg Ristow Date: Sun, 14 Mar 2021 23:21:22 -0400 Subject: [PATCH 1/9] feat(NumberField): New component Allows for HTML numeric validations, including min, max, step. Binds value as a number. --- .../@types/NumberField.d.ts | 63 +++++++ packages/svelte-materialify/@types/index.d.ts | 1 + .../components/NumberField/NumberField.svelte | 162 ++++++++++++++++++ .../src/components/NumberField/index.js | 1 + packages/svelte-materialify/src/index.js | 1 + 5 files changed, 228 insertions(+) create mode 100644 packages/svelte-materialify/@types/NumberField.d.ts create mode 100644 packages/svelte-materialify/src/components/NumberField/NumberField.svelte create mode 100644 packages/svelte-materialify/src/components/NumberField/index.js diff --git a/packages/svelte-materialify/@types/NumberField.d.ts b/packages/svelte-materialify/@types/NumberField.d.ts new file mode 100644 index 00000000..90f62e1e --- /dev/null +++ b/packages/svelte-materialify/@types/NumberField.d.ts @@ -0,0 +1,63 @@ +import { SvelteComponent } from './shared'; + +interface NumberFieldProps { + /** Classes to add to text field wrapper. */ + class?: string; + /** Value of the text field. */ + value?: number; + /** Minimum allowed number */ + min?: number; + /** Maximum allowed number */ + max?: number; + /** Amount by which to increment number, also used for validation */ + step?: number; + /** Color class of the text field when active. */ + color?: string; + /** Whether text field is the `filled` material design variant. */ + filled?: boolean; + /** Whether text field is outlined by elevation. */ + solo?: boolean; + /** Whether text field is the `outlined` material design variant. */ + outlined?: boolean; + /** Whether text field do not have elevation. */ + flat?: boolean; + /** Whether text field height is reduced. */ + dense?: boolean; + /** Whether text field has rounded corners. */ + rounded?: boolean; + /** Whether text field has a clear button. */ + clearable?: boolean; + /** Whether text field is read-only. */ + readonly?: boolean; + /** Whether text field is disabled. */ + disabled?: boolean; + /** Placeholder content for text field. */ + placeholder?: string; + /** Hint text. */ + hint?: string; + /** Error messages to display. */ + messages?: string[]; + /** + * A list of validator functions that take the text field value and return an error + * message, or `true` otherwise. + */ + rules?: ((value: string) => string | true)[]; + /** Number of error messages to display. Defaults to one. */ + errorCount?: number; + /** Whether to delay validation until blur. */ + validateOnBlur?: boolean; + /** Whether text field has error. */ + error?: boolean; + /** Whether text field has `success` class. */ + success?: boolean; + /** Id of the text field. Defaults to a random uid. */ + id?: string; + /** Styles to add to text field wrapper. */ + style?: string; + /** Reference to text field element in the DOM. */ + inputElement?: Element; +} + +declare class NumberField extends SvelteComponent {} + +export default NumberField; diff --git a/packages/svelte-materialify/@types/index.d.ts b/packages/svelte-materialify/@types/index.d.ts index e929400b..2d37aa9a 100644 --- a/packages/svelte-materialify/@types/index.d.ts +++ b/packages/svelte-materialify/@types/index.d.ts @@ -32,6 +32,7 @@ export { default as ListItemGroup } from './ListItemGroup'; export { default as MaterialApp } from './MaterialApp'; export { default as Menu } from './Menu'; export { default as NavigationDrawer } from './NavigationDrawer'; +export { default as NumberField } from './NumberField'; export { default as Overlay } from './Overlay'; export { default as ProgressCircular } from './ProgressCircular'; export { default as ProgressLinear } from './ProgressLinear'; diff --git a/packages/svelte-materialify/src/components/NumberField/NumberField.svelte b/packages/svelte-materialify/src/components/NumberField/NumberField.svelte new file mode 100644 index 00000000..237bef5b --- /dev/null +++ b/packages/svelte-materialify/src/components/NumberField/NumberField.svelte @@ -0,0 +1,162 @@ + + + + + +
+ + + +
+ + + + +
+ + {#if clearable && value !== ''} +
+ + + + +
+ {/if} + + + +
+ +
+
+ {hint} + {#each messages as message}{message}{/each} + {#each errorMessages.slice(0, errorCount) as message}{message}{/each} +
+
+ + + + \ No newline at end of file diff --git a/packages/svelte-materialify/src/components/NumberField/index.js b/packages/svelte-materialify/src/components/NumberField/index.js new file mode 100644 index 00000000..54978d09 --- /dev/null +++ b/packages/svelte-materialify/src/components/NumberField/index.js @@ -0,0 +1 @@ +export { default } from './NumberField.svelte'; diff --git a/packages/svelte-materialify/src/index.js b/packages/svelte-materialify/src/index.js index 2fd105b5..974c8e9d 100644 --- a/packages/svelte-materialify/src/index.js +++ b/packages/svelte-materialify/src/index.js @@ -10,6 +10,7 @@ export { default as Button } from './components/Button'; export { default as ButtonGroup, ButtonGroupItem } from './components/ButtonGroup'; export { default as Input } from './components/Input'; export { default as TextField } from './components/TextField'; +export { default as NumberField } from './components/NumberField'; export { default as Textarea } from './components/Textarea'; export { default as Slider } from './components/Slider'; export { default as Select } from './components/Select'; From 2d8fa0570a4375bc8b5f92c59518f33bce80520d Mon Sep 17 00:00:00 2001 From: Greg Ristow Date: Tue, 23 Mar 2021 22:41:56 -0400 Subject: [PATCH 2/9] feat(docs): Documentation for NumberField component --- .../src/examples/NumberField/clearable.svelte | 18 +++ .../NumberField/customValidation.svelte | 16 +++ .../src/examples/NumberField/dense.svelte | 20 +++ .../src/examples/NumberField/disabled.svelte | 18 +++ .../src/examples/NumberField/icons.svelte | 117 ++++++++++++++++++ .../src/examples/NumberField/label.svelte | 5 + .../examples/NumberField/validation.svelte | 14 +++ .../src/examples/NumberField/variants.svelte | 18 +++ .../src/routes/components/number-field.md | 76 ++++++++++++ 9 files changed, 302 insertions(+) create mode 100644 packages/docs/src/examples/NumberField/clearable.svelte create mode 100644 packages/docs/src/examples/NumberField/customValidation.svelte create mode 100644 packages/docs/src/examples/NumberField/dense.svelte create mode 100644 packages/docs/src/examples/NumberField/disabled.svelte create mode 100644 packages/docs/src/examples/NumberField/icons.svelte create mode 100644 packages/docs/src/examples/NumberField/label.svelte create mode 100644 packages/docs/src/examples/NumberField/validation.svelte create mode 100644 packages/docs/src/examples/NumberField/variants.svelte create mode 100644 packages/docs/src/routes/components/number-field.md diff --git a/packages/docs/src/examples/NumberField/clearable.svelte b/packages/docs/src/examples/NumberField/clearable.svelte new file mode 100644 index 00000000..8d8a2b7f --- /dev/null +++ b/packages/docs/src/examples/NumberField/clearable.svelte @@ -0,0 +1,18 @@ + + + + + Regular +
+ Filled + + + Outlined +
+ + +
diff --git a/packages/docs/src/examples/NumberField/customValidation.svelte b/packages/docs/src/examples/NumberField/customValidation.svelte new file mode 100644 index 00000000..50d4dd78 --- /dev/null +++ b/packages/docs/src/examples/NumberField/customValidation.svelte @@ -0,0 +1,16 @@ + + + + + Custom Rules + + diff --git a/packages/docs/src/examples/NumberField/dense.svelte b/packages/docs/src/examples/NumberField/dense.svelte new file mode 100644 index 00000000..5ce717ae --- /dev/null +++ b/packages/docs/src/examples/NumberField/dense.svelte @@ -0,0 +1,20 @@ + + + + + Filled +
+ Regular +
+ Filled + + + Outlined +
+ +
+ Outlined + +
diff --git a/packages/docs/src/examples/NumberField/disabled.svelte b/packages/docs/src/examples/NumberField/disabled.svelte new file mode 100644 index 00000000..39935d35 --- /dev/null +++ b/packages/docs/src/examples/NumberField/disabled.svelte @@ -0,0 +1,18 @@ + + + + + Regular + Filled + Outlined + + + + Regular + Filled + Outlined + + + diff --git a/packages/docs/src/examples/NumberField/icons.svelte b/packages/docs/src/examples/NumberField/icons.svelte new file mode 100644 index 00000000..2f1e7648 --- /dev/null +++ b/packages/docs/src/examples/NumberField/icons.svelte @@ -0,0 +1,117 @@ + + + + + +
+ +
+ Prepend Outer +
+
+ +
+ +
+ Prepend +
+
+ +
+ +
+ Append Outer +
+
+ +
+ +
+ Append +
+
+ +
+ +
+ Prepend Outer +
+
+ +
+ +
+ Prepend +
+
+ +
+ +
+ Append Outer +
+
+ +
+ +
+ Append +
+ + + +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ Prepend Outer +
+
+ +
+ +
+ Prepend +
+
+ +
+ +
+ Append Outer +
+
+ +
+ +
+ Append +
+ +
diff --git a/packages/docs/src/examples/NumberField/label.svelte b/packages/docs/src/examples/NumberField/label.svelte new file mode 100644 index 00000000..9244626b --- /dev/null +++ b/packages/docs/src/examples/NumberField/label.svelte @@ -0,0 +1,5 @@ + + +This is the bold label. diff --git a/packages/docs/src/examples/NumberField/validation.svelte b/packages/docs/src/examples/NumberField/validation.svelte new file mode 100644 index 00000000..f1e722c3 --- /dev/null +++ b/packages/docs/src/examples/NumberField/validation.svelte @@ -0,0 +1,14 @@ + + + + + min=3 + max=3 + + + step=10 + step=1.5 min=3 max=6 + + diff --git a/packages/docs/src/examples/NumberField/variants.svelte b/packages/docs/src/examples/NumberField/variants.svelte new file mode 100644 index 00000000..15136496 --- /dev/null +++ b/packages/docs/src/examples/NumberField/variants.svelte @@ -0,0 +1,18 @@ + + + + + Regular + Filled + Outlined + + + + Regular + Filled + Outlined + + + diff --git a/packages/docs/src/routes/components/number-field.md b/packages/docs/src/routes/components/number-field.md new file mode 100644 index 00000000..e286ac2e --- /dev/null +++ b/packages/docs/src/routes/components/number-field.md @@ -0,0 +1,76 @@ +--- +title: Number Field Component +description: The number field component accepts numeric input from users. +keywords: number fields, svelte materialify number field, svelte number field component, svelte number input component +related: + - components/selects + - components/sliders + - api/NumberField +--- + +# Number Fields + +Number fields components are used for collecting numerical input from users. + +The `value` property on a `NumberField` is a number, not a string. (This is unlike HTML ``, but is like Svelte's normal [numeric binding](https://svelte.dev/tutorial/numeric-inputs).) + + +Any property which is not in the API list will be directly forwarded to the input element. + + +## API + +- [NumberField](/api/NumberField/) + +## Usage + + + +## Examples + +### Built-In Validation + +Number fields accept the html `min`, `max`, and `step` properties and show validation hints as needed. + + +### Custom Validation + +In addition to the `min`, `max`, and `step` props, `NumberField` exposes validation through the `rules` prop. The prop accepts a array of callbacks with the input value as an arguement. The callback should return a string message if validation fails, or `false` if it passes. By default this runs a check whenever the user types something, to delay the validation till the input loses focus use `validateOnBlur`. + +```js +const rules = [ + (value) => { + if (condition) return 'Error Message'; + return false; + }, +]; +``` + + + +### Dense + +You can reduces the number field height with `dense` prop. + + +### Disabled and Readonly + +Number fields can be `disabled` or `readonly`. + + +### Icons + +You can add icons to the number field with `prepend`, `append`, `prepend-outer` and `append-outer` slots. + + +### Clearable + +When `clearable`, you can customize the clear icon with clear-icon. + + +### Label + +Number field label can be defined in the default slot. + + + From 1af2a163372b428c5edc119be6555e0e5d7c1619 Mon Sep 17 00:00:00 2001 From: Greg Ristow Date: Tue, 23 Mar 2021 22:42:13 -0400 Subject: [PATCH 3/9] lint(NumberField): Fix linting errors --- .../components/NumberField/NumberField.svelte | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/svelte-materialify/src/components/NumberField/NumberField.svelte b/packages/svelte-materialify/src/components/NumberField/NumberField.svelte index 237bef5b..2118cf63 100644 --- a/packages/svelte-materialify/src/components/NumberField/NumberField.svelte +++ b/packages/svelte-materialify/src/components/NumberField/NumberField.svelte @@ -40,21 +40,21 @@ errorMessages = rules.map((r) => r(value)).filter((r) => typeof r === 'string'); if (!inputElement.checkValidity()) { if (inputElement.badInput) { - errorMessages.push(`Please enter a number.`); - }; - if(inputElement.validity.rangeUnderflow) { + errorMessages.push('Please enter a number.'); + } + if (inputElement.validity.rangeUnderflow) { errorMessages.push(`Must be ${min} or greater.`); } - if(inputElement.validity.rangeOverflow) { + if (inputElement.validity.rangeOverflow) { errorMessages.push(`Must be ${max} or less.`); } - if(inputElement.validity.stepMismatch) { + if (inputElement.validity.stepMismatch) { errorMessages.push(`Must be an increment of ${step}`); } - if(inputElement.validity.tooLong) { + if (inputElement.validity.tooLong) { errorMessages.push('Too long.'); } - if(inputElement.validity.tooShort) { + if (inputElement.validity.tooShort) { errorMessages.push('Too short.'); } } @@ -65,8 +65,6 @@ return error; } - - function onFocus() { focused = true; } @@ -80,7 +78,7 @@ value = null; } - function onInput(e) { + function onInput() { if (!validateOnBlur) validate(); } From 5d2c7dc8684c0f24a556c04f0cfc0a193a211ff8 Mon Sep 17 00:00:00 2001 From: Greg Ristow Date: Tue, 23 Mar 2021 23:52:51 -0400 Subject: [PATCH 4/9] fix(docs): Include NumberField in doc routes --- packages/docs/src/util/routes.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/docs/src/util/routes.js b/packages/docs/src/util/routes.js index 7d4471e3..64f1ee12 100644 --- a/packages/docs/src/util/routes.js +++ b/packages/docs/src/util/routes.js @@ -63,6 +63,7 @@ export default [ text: 'Forms', items: [ { text: 'Text Field', href: '/components/text-field/' }, + { text: 'Number Field', href: '/components/number-field/' }, { text: 'Textarea', href: '/components/textarea/' }, { text: 'Selects', href: '/components/selects/' }, { text: 'Sliders', href: '/components/sliders/' }, From ca2824eb847828118f9f1cb12a9a3e21cdb5183b Mon Sep 17 00:00:00 2001 From: Greg Ristow Date: Tue, 23 Mar 2021 23:53:17 -0400 Subject: [PATCH 5/9] style(docs): Improve NumberField validation example layout --- packages/docs/src/examples/NumberField/validation.svelte | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/docs/src/examples/NumberField/validation.svelte b/packages/docs/src/examples/NumberField/validation.svelte index f1e722c3..dbaeeb9e 100644 --- a/packages/docs/src/examples/NumberField/validation.svelte +++ b/packages/docs/src/examples/NumberField/validation.svelte @@ -4,11 +4,11 @@ - min=3 - max=3 + min=3 + max=3 - step=10 - step=1.5 min=3 max=6 + step=10 + step=1.5 min=3 max=6 From e6af23e3b3cc239e0e7161a0f5a43a92f8c47035 Mon Sep 17 00:00:00 2001 From: Greg Ristow Date: Tue, 23 Mar 2021 23:53:49 -0400 Subject: [PATCH 6/9] feat(docs/NumberField): Move value to subheading of usage --- packages/docs/src/routes/components/number-field.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/docs/src/routes/components/number-field.md b/packages/docs/src/routes/components/number-field.md index e286ac2e..1efabc1e 100644 --- a/packages/docs/src/routes/components/number-field.md +++ b/packages/docs/src/routes/components/number-field.md @@ -12,8 +12,6 @@ related: Number fields components are used for collecting numerical input from users. -The `value` property on a `NumberField` is a number, not a string. (This is unlike HTML ``, but is like Svelte's normal [numeric binding](https://svelte.dev/tutorial/numeric-inputs).) - Any property which is not in the API list will be directly forwarded to the input element. @@ -24,8 +22,15 @@ Any property which is not in the API list will be directly forwarded to the inpu ## Usage +### Value + +The `value` property on a `NumberField` is a number, not a string. (This is unlike HTML ``, but is like Svelte's normal [numeric binding](https://svelte.dev/tutorial/numeric-inputs).) + +### Basic Use + + ## Examples ### Built-In Validation From efe80d4046c0f5aea0841d822327491aa910dc30 Mon Sep 17 00:00:00 2001 From: Greg Ristow Date: Tue, 23 Mar 2021 23:54:08 -0400 Subject: [PATCH 7/9] feat(NumberField): Add sveltedoc annotations to improve API refs --- .../components/NumberField/NumberField.svelte | 111 +++++++++++++++++- 1 file changed, 105 insertions(+), 6 deletions(-) diff --git a/packages/svelte-materialify/src/components/NumberField/NumberField.svelte b/packages/svelte-materialify/src/components/NumberField/NumberField.svelte index 2118cf63..2a92ecf8 100644 --- a/packages/svelte-materialify/src/components/NumberField/NumberField.svelte +++ b/packages/svelte-materialify/src/components/NumberField/NumberField.svelte @@ -1,39 +1,138 @@