@al00x/forms
Version:
Angular Forms, the way it should be!
1 lines • 32.8 kB
Source Map (JSON)
{"version":3,"file":"al00x-forms.mjs","sources":["../../../../libs/base/src/utils.ts","../../../../libs/base/src/validators.ts","../../../../libs/base/src/errors.ts","../../../../libs/base/src/form-control.ts","../../../../libs/base/src/form-group.ts","../../../../libs/base/src/providers.ts","../../../../libs/base/src/al00x-forms.ts"],"sourcesContent":["import { ProviderToken, inject } from '@angular/core';\n\nexport function injectOptional<T>(token: ProviderToken<T>): T | undefined {\n try {\n return inject(token);\n } catch {\n return undefined;\n }\n}\n","import { AbstractControl, Validators as AngularValidators } from '@angular/forms';\r\nimport { debounceTime, Subscription, take } from 'rxjs';\r\nimport { InjectionToken } from '@angular/core';\r\nimport { injectOptional } from './utils';\r\n\r\nconst RegexIP = new RegExp(`^((25[0-5]|(2[0-4]|1\\\\d|[1-9]|)\\\\d)\\\\.?\\\\b){4}$`);\r\nconst RegexPassword = new RegExp(`^(?=.*\\\\d)(?=.*[A-Za-z])(?=.*[a-zA-Z]).*$`);\r\n\r\nconst VALIDATORS_DEFAULTS = {\r\n phone: {\r\n min: 11,\r\n max: 11,\r\n },\r\n nationalCode: {\r\n min: 10,\r\n max: 10,\r\n },\r\n password: {\r\n regex: RegexPassword,\r\n min: 8,\r\n },\r\n};\r\n\r\nexport const VALIDATORS_CONFIG = new InjectionToken<Partial<typeof VALIDATORS_DEFAULTS>>('Validators');\r\n\r\nfunction withDefault<T>(input: T | undefined, defaultValue: T) {\r\n return input !== undefined ? input : defaultValue;\r\n}\r\n\r\nexport class Validators extends AngularValidators {\r\n private static config() {\r\n const value = injectOptional(VALIDATORS_CONFIG);\r\n return {\r\n ...VALIDATORS_DEFAULTS,\r\n ...value,\r\n };\r\n }\r\n\r\n static nationalCode(min?: number, max?: number) {\r\n const config = this.config();\r\n const minValue = withDefault(min, config.nationalCode.min);\r\n const maxValue = withDefault(max, config.nationalCode.max);\r\n\r\n return (control: AbstractControl) => {\r\n return Validators.number(minValue, maxValue)(control) !== null ? { codeMelli: { value: control.value } } : null;\r\n };\r\n }\r\n\r\n static clone(controller: AbstractControl) {\r\n return () => {\r\n return controller.invalid ? { clone: true } : null;\r\n };\r\n }\r\n\r\n static ip(control: AbstractControl) {\r\n const value = control?.value?.toString() ?? '';\r\n return !RegexIP.test(value) ? { ip: { value: control.value } } : null;\r\n }\r\n\r\n static alphabet(lang?: 'en') {\r\n return (control: AbstractControl) => {\r\n const value = control?.value?.toString() ?? '';\r\n const regex = new RegExp(\r\n lang === 'en' ? '^[A-Za-z0-9\\\\s!@#$%^&*()_+={}\\\\[\\\\]:;\"\\'<>,.?/\\\\\\\\|-]+$' : /^(\\p{L}|\\p{N}|\\p{S}|\\s)+$/u,\r\n );\r\n return !regex.test(value) ? { alphabet: { value: control.value } } : null;\r\n };\r\n }\r\n\r\n static match(secondControl: AbstractControl) {\r\n let sub = new Subscription();\r\n return (control: AbstractControl) => {\r\n sub.unsubscribe();\r\n sub = secondControl.valueChanges.pipe(take(1), debounceTime(100)).subscribe(() => {\r\n control.updateValueAndValidity();\r\n });\r\n const v1 = secondControl?.value ?? '';\r\n const v2 = control?.value ?? '';\r\n return v1 !== v2 ? { unmatched: { value: control.value } } : null;\r\n };\r\n }\r\n\r\n static number(minLength = 0, maxLength?: number) {\r\n return (control: AbstractControl) => {\r\n const value = control?.value?.toString() ?? '';\r\n const regex = new RegExp(`\\\\b(\\\\d){${minLength},${maxLength ?? ''}}\\\\b`);\r\n return !regex.test(value) ? { number: { value: control.value } } : null;\r\n };\r\n }\r\n\r\n static password(minLength?: number, regex?: RegExp) {\r\n const config = this.config();\r\n const minValue = withDefault(minLength, config.password.min);\r\n const regexValue = withDefault(regex, config.password.regex);\r\n\r\n return (control: AbstractControl) => {\r\n const value = control?.value ?? '';\r\n if (!value || value === '') return null;\r\n\r\n const tested = regexValue.test(value);\r\n const length = (value.length ?? 0) >= minValue;\r\n return !tested\r\n ? { passwordChars: { value: control.value } }\r\n : !length\r\n ? { passwordLength: { value: control.value } }\r\n : null;\r\n };\r\n }\r\n\r\n static phone(min?: number, max?: number) {\r\n const config = this.config();\r\n const minValue = withDefault(min, config.phone.min);\r\n const maxValue = withDefault(max, config.phone.max);\r\n\r\n return (control: AbstractControl) => {\r\n return Validators.number(minValue, maxValue)(control) !== null ? { phoneNumber: { value: control.value } } : null;\r\n };\r\n }\r\n\r\n static requiredNullable(control: AbstractControl) {\r\n const value = control.value;\r\n const isEmpty = value === undefined || ((typeof value === 'string' || Array.isArray(value)) && value.length === 0);\r\n return isEmpty ? { required: true } : null;\r\n }\r\n}\r\n","import { AbstractControl } from '@angular/forms';\r\nimport { provideAppInitializer } from '@angular/core';\r\n\r\nconst DEFAULT_CONTROL_ERROR = {\r\n default: `This field is incorrect.`,\r\n required: `This field is required.`,\r\n email: `Email format is incorrect.`,\r\n codeMelli: `National code format is incorrect.`,\r\n unmatched: `This field does not match.`,\r\n passwordLength: `Password should at least be 8 characters long.`,\r\n passwordChars: `Password should contain both numbers and letters.`,\r\n} as const;\r\n\r\nlet CONTROL_ERRORS: {[p: string]: string} = {\r\n ...DEFAULT_CONTROL_ERROR\r\n};\r\n\r\nexport function setControlErrors(errors: typeof CONTROL_ERRORS) {\r\n CONTROL_ERRORS = {\r\n ...DEFAULT_CONTROL_ERROR,\r\n ...errors,\r\n }\r\n}\r\n\r\nexport function getControlErrorMessage(control: AbstractControl, customMessage?: string) {\r\n if (control.status !== 'INVALID') return undefined;\r\n if (customMessage) {\r\n return customMessage;\r\n }\r\n const errorKeys = Object.keys(control.errors ?? {});\r\n const firstKey = errorKeys.length > 0 ? errorKeys[0] : undefined;\r\n\r\n let error: string | undefined;\r\n if (firstKey) {\r\n error = CONTROL_ERRORS[firstKey as never];\r\n if (!error) {\r\n error = !customMessage ? CONTROL_ERRORS['default'] : customMessage;\r\n }\r\n }\r\n return error;\r\n}\r\n","import {\r\n AbstractControl,\r\n FormControl,\r\n FormControlState,\r\n FormControlStatus,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\nimport { BehaviorSubject, debounceTime, map, Observable, startWith, Subject, merge, combineLatest } from 'rxjs';\r\nimport { Validators } from './validators';\r\nimport { getControlErrorMessage } from './errors';\r\n\r\nexport interface FormControlExtended<TValue = any, DATA = any> extends FormControl<TValue> {\r\n extended: true;\r\n\r\n status$: Observable<FormControlStatus>;\r\n invalid$: Observable<boolean>;\r\n valid$: Observable<boolean>;\r\n value$: Observable<TValue | undefined>;\r\n error$: Observable<string | undefined>;\r\n\r\n hasValue$: Observable<boolean>;\r\n empty$: Observable<boolean>;\r\n\r\n selectedItems$: Observable<any[] | undefined>;\r\n selectedItems: any[] | undefined;\r\n\r\n readonly$: Observable<boolean>;\r\n readonly: boolean;\r\n\r\n disabled$: Observable<boolean>;\r\n enabled$: Observable<boolean>;\r\n touched$: Observable<boolean>;\r\n dirty$: Observable<boolean>;\r\n // Returns true whenever a control is touched & is invalid in order to show error in the UI\r\n showError$: Observable<boolean>;\r\n\r\n displayText$: Observable<string | undefined>;\r\n displayText: string | undefined;\r\n displayControl: FormControl<string | undefined | null>;\r\n\r\n // data is being used as extra information that is carried by the formControl\r\n data$: Observable<DATA | undefined>;\r\n // data is being used as extra information that is carried by the formControl\r\n data: DATA | undefined;\r\n\r\n customError?: string;\r\n\r\n setReadonly: (value: boolean) => FormControlExtended<TValue, DATA>;\r\n // if value is typeof string or number, it will be set in the display text, otherwise, undefined\r\n setDisplayText: (value: any | undefined) => FormControlExtended<TValue>;\r\n setSelectedItems: (value: any[] | undefined) => FormControlExtended<TValue, DATA>;\r\n setCustomError: (value: string | undefined) => FormControlExtended<TValue, DATA>;\r\n setDisabled: (value: boolean) => FormControlExtended<TValue, DATA>;\r\n // get value if valid, else, return null\r\n getValue: () => TValue | null;\r\n // data is being used as extra information that is carried by the formControl\r\n setData: (value: DATA | undefined) => FormControlExtended<TValue, DATA>;\r\n emitStatus: () => void;\r\n}\r\n\r\nexport function formControl<T, DATA = any>(\r\n value?: FormControlState<T> | T | null,\r\n validators?: ValidatorFn | ValidatorFn[],\r\n nullable = true,\r\n) {\r\n const control = new FormControl(value, {\r\n validators: validators,\r\n nonNullable: nullable,\r\n }) as FormControlExtended<T, DATA>;\r\n\r\n const statusTrigger = new Subject<FormControlStatus>();\r\n const disableTrigger = new BehaviorSubject<boolean>(control.disabled);\r\n const dirtyTrigger = new BehaviorSubject<boolean>(control.dirty);\r\n const touchedTrigger = new BehaviorSubject<boolean>(control.touched);\r\n const valueSubject = new BehaviorSubject<T | undefined>(control.value);\r\n const selectedItemsTrigger = new BehaviorSubject<any>(undefined);\r\n const readonlyTrigger = new BehaviorSubject<boolean>(false);\r\n const displayTextTrigger = new BehaviorSubject<string | undefined>(undefined);\r\n const dataTrigger = new BehaviorSubject<DATA | undefined>(undefined);\r\n const subControls: AbstractControl[] = [];\r\n\r\n // Extended new properties!\r\n\r\n control.extended = true;\r\n\r\n control.status$ = merge(control.statusChanges, statusTrigger).pipe(startWith(control.status));\r\n control.invalid$ = control.status$.pipe(map((t) => t === 'INVALID'));\r\n control.valid$ = control.status$.pipe(map((t) => t === 'VALID'));\r\n control.value$ = valueSubject.pipe();\r\n\r\n control.hasValue$ = valueSubject.pipe(map((v) => {\r\n if (value === null || value === undefined) return false;\r\n if (typeof value === 'string' && value.length === 0) return false;\r\n if (value instanceof Array && value.length === 0) return false;\r\n return true;\r\n }));\r\n control.empty$ = control.hasValue$.pipe(map(v => !v))\r\n\r\n control.selectedItems$ = selectedItemsTrigger.asObservable();\r\n control.selectedItems = selectedItemsTrigger.value;\r\n\r\n control.readonly$ = readonlyTrigger.asObservable();\r\n control.readonly = false;\r\n\r\n control.disabled$ = disableTrigger.asObservable();\r\n control.enabled$ = control.disabled$.pipe(map((t) => !t));\r\n control.dirty$ = combineLatest({ trigger: dirtyTrigger, status: control.status$ }).pipe(\r\n map((t) => (t.status === 'DISABLED' ? false : t.trigger)),\r\n );\r\n control.touched$ = combineLatest({ trigger: touchedTrigger, status: control.status$ }).pipe(\r\n map((t) => (t.status === 'DISABLED' ? false : t.trigger)),\r\n );\r\n control.showError$ = combineLatest({ invalid: control.invalid$, touched: control.touched$ }).pipe(\r\n map((t) => t.invalid && t.touched),\r\n );\r\n\r\n control.displayText$ = displayTextTrigger.asObservable();\r\n control.displayText = undefined;\r\n control.displayControl = new FormControl<string | undefined>(undefined, [Validators.clone(control)]);\r\n\r\n control.data$ = dataTrigger.asObservable();\r\n control.data = undefined as any;\r\n\r\n control.error$ = control.status$.pipe(\r\n debounceTime(1),\r\n map(() => {\r\n if (control.status === 'INVALID') {\r\n return getControlErrorMessage(control, control.customError);\r\n }\r\n return undefined;\r\n }),\r\n );\r\n control.customError = undefined;\r\n\r\n control.setReadonly = (value) => {\r\n control.readonly = value;\r\n readonlyTrigger.next(value);\r\n return control;\r\n };\r\n control.setDisplayText = (value) => {\r\n let newValue: string | undefined = undefined;\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n newValue = typeof value === 'number' ? value.toString() : value;\r\n }\r\n control.displayText = newValue;\r\n displayTextTrigger.next(newValue);\r\n control.displayControl.setValue(newValue);\r\n\r\n return control;\r\n };\r\n control.setSelectedItems = (value) => {\r\n control.selectedItems = value;\r\n selectedItemsTrigger.next(value);\r\n return control;\r\n };\r\n control.setCustomError = (value) => {\r\n control.customError = value;\r\n return control;\r\n };\r\n control.setData = (value) => {\r\n control.data = value;\r\n dataTrigger.next(value)\r\n return control;\r\n };\r\n control.setDisabled = (value) => {\r\n if (value) {\r\n control.disable();\r\n } else {\r\n control.enable();\r\n }\r\n return control;\r\n };\r\n control.getValue = () => {\r\n return control.valid ? control.value : null;\r\n };\r\n control.emitStatus = () => {\r\n statusTrigger.next(control.status);\r\n };\r\n\r\n subControls.push(control.displayControl);\r\n\r\n // Override original functions\r\n\r\n // @ts-ignore\r\n // control._forEachChild = function (cb: (c: AbstractControl, index: number) => void) {\r\n // subControls.forEach((control: AbstractControl, index: number) => {\r\n // cb(control, index);\r\n // });\r\n // }\r\n //\r\n // // @ts-ignore\r\n // const _runValidatorFn = control._runValidator\r\n // // @ts-ignore\r\n // control._runValidator = function () {\r\n // const errors = _runValidatorFn.apply(this);\r\n // subControls.forEach(c => {\r\n // c.setErrors(errors);\r\n // });\r\n // return errors;\r\n // }\r\n\r\n const { setValue, patchValue, reset, disable, enable, markAsTouched, markAsUntouched, markAsDirty, markAsPristine } =\r\n control;\r\n\r\n control.setValue = function (value, options) {\r\n setValue.apply(this, [value, options]);\r\n valueSubject.next(value);\r\n // control.setDisplayText(value);\r\n };\r\n control.patchValue = function (value, options) {\r\n patchValue.apply(this, [value, options]);\r\n valueSubject.next(value);\r\n // control.setDisplayText(value);\r\n };\r\n control.reset = function (value, options) {\r\n reset.apply(this, [value, options]);\r\n valueSubject.next(value && typeof value === 'object' && 'value' in value ? value.value : value);\r\n control.setData(undefined);\r\n control.setSelectedItems(undefined);\r\n control.setDisplayText(undefined);\r\n dirtyTrigger.next(control.dirty);\r\n touchedTrigger.next(control.touched);\r\n };\r\n control.disable = function (e) {\r\n disable.apply(this, [e]);\r\n disableTrigger.next(true);\r\n };\r\n control.enable = function (e) {\r\n enable.apply(this, [e]);\r\n disableTrigger.next(false);\r\n };\r\n control.markAsTouched = function (opts) {\r\n markAsTouched.apply(this, [opts]);\r\n touchedTrigger.next(true);\r\n };\r\n control.markAsDirty = function (opts) {\r\n markAsDirty.apply(this, [opts]);\r\n dirtyTrigger.next(true);\r\n };\r\n control.markAsUntouched = function (opts) {\r\n markAsUntouched.apply(this, [opts]);\r\n touchedTrigger.next(false);\r\n };\r\n control.markAsPristine = function (opts) {\r\n markAsPristine.apply(this, [opts]);\r\n dirtyTrigger.next(false);\r\n };\r\n\r\n // Initialize\r\n\r\n control.setDisplayText(value);\r\n\r\n return control;\r\n}\r\n\r\nexport function isFormControlExtended(\r\n control: AbstractControl | FormControl | FormControlExtended,\r\n): control is FormControlExtended {\r\n return 'extended' in control;\r\n}\r\n","import { AbstractControl, FormControlStatus, FormGroup } from '@angular/forms';\r\nimport { BehaviorSubject, map, merge, Observable, startWith } from 'rxjs';\r\nimport { isFormControlExtended } from './form-control';\r\n\r\nexport interface FormGroupExtended<TValue extends { [K in keyof TValue]: AbstractControl<any, any> } = any, DATA = any>\r\n extends FormGroup<TValue> {\r\n extended: true;\r\n\r\n status$: Observable<FormControlStatus>;\r\n invalid$: Observable<boolean>;\r\n valid$: Observable<boolean>;\r\n\r\n // data is being used as extra information that is carried by the formControl\r\n data$: Observable<DATA | undefined>;\r\n // data is being used as extra information that is carried by the formControl\r\n data: DATA | undefined;\r\n\r\n markAllAsDirty: () => void;\r\n\r\n setReadonly: (value: boolean, ...keys: (keyof TValue)[]) => FormGroupExtended<TValue, DATA>;\r\n setDisabled: (value: boolean, ...keys: (keyof TValue)[]) => FormGroupExtended<TValue, DATA>;\r\n // data is being used as extra information that is carried by the formControl\r\n setData: (value: DATA | undefined) => FormGroupExtended<TValue, DATA>;\r\n}\r\n\r\nexport function formGroup<T extends { [K in keyof T]: AbstractControl<any, any> }, DATA = any>(inputs: T) {\r\n const group = new FormGroup<T>(inputs) as FormGroupExtended<T>;\r\n\r\n const dataTrigger = new BehaviorSubject<DATA | undefined>(undefined);\r\n\r\n group.extended = true;\r\n\r\n group.status$ = merge(group.statusChanges).pipe(startWith(group.status));\r\n group.invalid$ = group.status$.pipe(map((t) => t === 'INVALID'));\r\n group.valid$ = group.status$.pipe(map((t) => t === 'VALID'));\r\n\r\n group.data$ = dataTrigger.asObservable();\r\n group.data = undefined as any;\r\n\r\n const forEachControl = (fn: (key: keyof T, control: AbstractControl) => void) => {\r\n Object.entries(group.controls).forEach(([key, control]) => fn(key as never, control));\r\n };\r\n\r\n group.setReadonly = (value, ...keys) => {\r\n forEachControl((key, control) => {\r\n if (isFormControlExtended(control) && (keys?.length ? keys.includes(key) : true)) {\r\n control.setReadonly(value);\r\n }\r\n });\r\n return group;\r\n };\r\n\r\n group.setDisabled = (value, ...keys) => {\r\n forEachControl((key, control) => {\r\n if ((keys?.length ? keys.includes(key) : true)) {\r\n value ? control.disable() : control.enable();\r\n }\r\n });\r\n return group;\r\n };\r\n\r\n group.markAllAsDirty = () => {\r\n forEachControl((key, control) => {\r\n control.markAsDirty();\r\n control.markAsTouched();\r\n })\r\n }\r\n\r\n group.setData = (value) => {\r\n group.data = value;\r\n dataTrigger.next(value)\r\n return group;\r\n };\r\n\r\n return group;\r\n}\r\n\r\nexport function isFormGroupExtended(group: FormGroup | FormGroupExtended): group is FormGroupExtended {\r\n return 'extended' in group;\r\n}\r\n","import { provideAppInitializer } from '@angular/core';\r\nimport { setControlErrors } from './errors';\r\n\r\nexport function provideFormErrors(errorsObject: {[p: string]: string}) {\r\n return provideAppInitializer(() => {\r\n setControlErrors(errorsObject);\r\n })\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AngularValidators"],"mappings":"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"}