Skip to content

Commit

Permalink
0.5.0 (#4)
Browse files Browse the repository at this point in the history
* Removed placeholder application

* Reorganized exports

* Fixed undefined helper message

* requireTouched true as default

* Fixed imports

* Fixed demo

* Removed requirement of type Record

* Added defaultState and errorState custom configurations

* Removed unused imports

* Updated demo
  • Loading branch information
luistabotelho authored Nov 21, 2024
1 parent d73f6ba commit 0a23c16
Show file tree
Hide file tree
Showing 16 changed files with 66 additions and 369 deletions.
3 changes: 0 additions & 3 deletions projects/signal-forms/src/lib/helpers/index.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Signal, computed } from "@angular/core"
import { SignalForm } from "../interfaces"
import { SignalForm } from "../interfaces/signal-forms.interface"

/**
* Creates a signal representing the SignalForm validity
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { SignalForm } from "../interfaces"
import { SignalForm } from "../interfaces/signal-forms.interface"

/**
* Resets a SignalForm to it's initial values
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import { ValidatorFunction } from "../interfaces/validator-function.interface"

/**
* Private helper. Runs all validators and returns the validation message if any fail
* @param validators the list of validators
* @param currentValue the currentValue signal value
* @returns The validation message of the failed validator
*/
export function runValidators(validators: Array<Function>, currentValue: any): string | null {
export function runValidators<T>(validators: Array<ValidatorFunction<T>>, currentValue: T): string | null {
for (let validator of validators) {
let validationResult = validator(currentValue)
if (validationResult) {
return validationResult
return validationResult.message
}
}
return null
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { computed } from "@angular/core"
import { SignalForm } from "../interfaces"
import { SignalForm } from "../interfaces/signal-forms.interface"

export function signalFormValue<T extends Record<string | number | symbol, unknown>>(signalForm: SignalForm<T>) {
return computed(() => {
Expand Down

This file was deleted.

4 changes: 0 additions & 4 deletions projects/signal-forms/src/lib/interfaces/index.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { BaseType } from "./base-type.interface"
import { ValidatorFunction } from "./validator-function.interface"

export type SignalFormDefinition<T extends BaseType> = {
export type SignalFormDefinition<T> = {
[K in keyof T]: {
initialValue: T[K],
validators?: Array<(value: T[K]) => Error | null>
validators?: Array<ValidatorFunction<T[K]>>
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
export type SignalFormOptions = {
requireTouched: boolean
requireTouched: boolean,
defaultState: string,
errorState: string
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { Signal, WritableSignal } from "@angular/core"
import { BaseType } from "./base-type.interface"
import { State } from "./state.interface"

export type SignalForm<T extends BaseType> = {
export type SignalForm<T> = {
[K in keyof T]: {
initialValue: T[K],
currentValue: WritableSignal<T[K]>,
touched: WritableSignal<boolean>,
state: Signal<['error' | 'default', string | null]>,
state: Signal<State>,
valid: Signal<boolean>
}
}
Expand Down
4 changes: 4 additions & 0 deletions projects/signal-forms/src/lib/interfaces/state.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export type State = {
state: string,
message: string | null
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export type ValidatorFunction<T> = (value: T) => Error | null
16 changes: 10 additions & 6 deletions projects/signal-forms/src/lib/signal-forms.module.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import { signal, computed } from "@angular/core"
import { runValidators } from "./helpers/run-validators.helper"
import { SignalFormOptions, SignalFormDefinition, SignalForm } from "./interfaces"
import { SignalFormOptions } from "./interfaces/signal-forms-options.interface"
import { SignalFormDefinition } from "./interfaces/signal-forms-definition.interface"
import { SignalForm } from "./interfaces/signal-forms.interface"


const signalFormOptionsDefaults: SignalFormOptions = {
requireTouched: false
requireTouched: true,
defaultState: 'default',
errorState: 'error'
}

/**
Expand All @@ -13,7 +17,7 @@ const signalFormOptionsDefaults: SignalFormOptions = {
* @param options An optional SignalFormOptions object
* @returns a SignalForm
*/
export function signalForm<T extends Record<string | number | symbol, unknown>>(
export function signalForm<T>(
initialValue: SignalFormDefinition<T>,
options: SignalFormOptions = signalFormOptionsDefaults
) {
Expand All @@ -26,13 +30,13 @@ export function signalForm<T extends Record<string | number | symbol, unknown>>(
touched: signal(false),
state: computed(() => {
if (options.requireTouched && !signalForm[key].touched()) {
return ['default', null]
return {state: options.defaultState, message: null}
}
let validationResult = runValidators(value.validators ?? [], signalForm[key].currentValue())
if (validationResult) {
return ['error', validationResult]
return {state: options.errorState, message: validationResult}
}
return ['default', null]
return {state: options.defaultState, message: null}
}),
valid: computed(() => !runValidators(value.validators ?? [], signalForm[key].currentValue()))
}
Expand Down
10 changes: 8 additions & 2 deletions projects/signal-forms/src/public-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,11 @@
*/

export * from './lib/signal-forms.module'
export * from './lib/helpers'
export * from './lib/interfaces'

export * from './lib/helpers/is-signal-form-valid.helper'
export * from './lib/helpers/reset-signal-form.helper'
export * from './lib/helpers/signal-form-value.helper'

export * from './lib/interfaces/signal-forms.interface'
export * from './lib/interfaces/signal-forms-options.interface'
export * from './lib/interfaces/signal-forms-definition.interface'
Loading

0 comments on commit 0a23c16

Please sign in to comment.