@globalbrain/sefirot
Advanced tools
Comparing version 0.46.0 to 0.47.0
@@ -0,1 +1,7 @@ | ||
# [0.47.0](https://github.com/globalbrain/sefirot/compare/v0.46.0...v0.47.0) (2021-04-05) | ||
### Features | ||
* **form:** update form apis ([#54](https://github.com/globalbrain/sefirot/issues/54)) ([0497a1a](https://github.com/globalbrain/sefirot/commit/0497a1ad0440986bdf2043e9a4f5f4ae9857e920)) | ||
# [0.46.0](https://github.com/globalbrain/sefirot/compare/v0.45.0...v0.46.0) (2021-03-26) | ||
@@ -2,0 +8,0 @@ |
@@ -1,5 +0,50 @@ | ||
export * from './FormData' | ||
import { UnwrapRef, reactive } from '@vue/composition-api' | ||
import { Validation, Rules, useFormValidation } from './FormValidation' | ||
export * from './FormValidation' | ||
export { useFormData as useData } from './FormData' | ||
export { useFormValidation as useValidation } from './FormValidation' | ||
export interface Form<T extends Record<string, any>> { | ||
data: Data<T> | ||
validation?: Validation | ||
init(): void | ||
update: UpdateFunction<T> | ||
} | ||
export type Data<T extends Record<string, any>> = UnwrapRef<T> | ||
export type UpdateFunction< | ||
T extends Record<string, any> | ||
> = (model: keyof Data<T>, value: any) => void | ||
export interface UseFormOptions<T extends Record<string, any>> { | ||
data: T | (() => T) | ||
rules?: Rules | ||
} | ||
export function useForm<T extends Record<string, any>>(options: UseFormOptions<T>): Form<T> { | ||
const initialData = getData(options.data) | ||
const rules = options.rules | ||
const data = reactive(initialData) | ||
const validation = rules ? useFormValidation(data, rules) : undefined | ||
function init(): void { | ||
Object.assign(data, initialData) | ||
validation?.$reset() | ||
} | ||
function update(model: keyof Data<T>, value: any): void { | ||
data[model] = value | ||
} | ||
return { | ||
data, | ||
validation, | ||
init, | ||
update | ||
} | ||
} | ||
function getData<T extends Record<string, any>>(data: T | (() => T)): T { | ||
return data instanceof Function ? data() : data | ||
} |
import { Ref, ComputedRef, ref, computed } from '@vue/composition-api' | ||
import { required } from '../validation/validators' | ||
import { Rule } from '../validation/rules' | ||
import { State } from './FormData' | ||
@@ -29,3 +28,3 @@ export interface Validation { | ||
export function useFormValidation<T extends State>(data: T, rules: Rules, rootData?: T): Validation { | ||
export function useFormValidation<T extends Record<string, any>>(data: T, rules: Rules, rootData?: T): Validation { | ||
const validation = {} as Validation | ||
@@ -40,3 +39,3 @@ | ||
function setValidations<T extends State>(validation: Validation, data: T, rules: Rules, rootData: T): void { | ||
function setValidations<T extends Record<string, any>>(validation: Validation, data: T, rules: Rules, rootData: T): void { | ||
for (const name in rules) { | ||
@@ -59,3 +58,3 @@ const rule = rules[name] | ||
function createValidation<T extends State>(name: string, data: T, rules: Rule[], rootData: T): Validation { | ||
function createValidation<T extends Record<string, any>>(name: string, data: T, rules: Rule[], rootData: T): Validation { | ||
const isDirty = ref(false) | ||
@@ -129,3 +128,3 @@ const isValid = computed(() => errors.value.length === 0) | ||
function getErrors<T extends State>(name: string, data: T, rules: Rule[], rootData: T): Error[] { | ||
function getErrors<T extends Record<string, any>>(name: string, data: T, rules: Rule[], rootData: T): Error[] { | ||
return rules.reduce<Error[]>((errors, rule) => { | ||
@@ -132,0 +131,0 @@ const value = data[name] |
{ | ||
"name": "@globalbrain/sefirot", | ||
"version": "0.46.0", | ||
"version": "0.47.0", | ||
"description": "Vue Components for Global Brain Design System.", | ||
@@ -5,0 +5,0 @@ "files": [ |
1771
259545
189