UNPKG

@bitrix24/b24ui-nuxt

Version:

Bitrix24 UI-Kit for developing web applications REST API for NUXT & VUE

71 lines (70 loc) 2.97 kB
import { inject, computed, provide } from "vue"; import { useDebounceFn } from "@vueuse/core"; export const formOptionsInjectionKey = Symbol("bitrix24-ui.form-options"); export const formBusInjectionKey = Symbol("bitrix24-ui.form-events"); export const formFieldInjectionKey = Symbol("bitrix24-ui.form-field"); export const inputIdInjectionKey = Symbol("bitrix24-ui.input-id"); export const formInputsInjectionKey = Symbol("bitrix24-ui.form-inputs"); export const formLoadingInjectionKey = Symbol("bitrix24-ui.form-loading"); export const formErrorsInjectionKey = Symbol("bitrix24-ui.form-errors"); export function useFormField(props, opts) { const formOptions = inject(formOptionsInjectionKey, void 0); const formBus = inject(formBusInjectionKey, void 0); const formField = inject(formFieldInjectionKey, void 0); const formInputs = inject(formInputsInjectionKey, void 0); const inputId = inject(inputIdInjectionKey, void 0); provide(formFieldInjectionKey, void 0); if (formField && inputId) { if (opts?.bind === false) { inputId.value = void 0; } else if (props?.id) { inputId.value = props?.id; } if (formInputs && formField.value.name && inputId.value) { formInputs.value[formField.value.name] = { id: inputId.value, pattern: formField.value.errorPattern }; } } function emitFormEvent(type, name, eager) { if (formBus && formField && name) { formBus.emit({ type, name, eager }); } } function emitFormBlur() { emitFormEvent("blur", formField?.value.name); } function emitFormFocus() { emitFormEvent("focus", formField?.value.name); } function emitFormChange() { emitFormEvent("change", formField?.value.name); } const emitFormInput = useDebounceFn( () => { emitFormEvent("input", formField?.value.name, !opts?.deferInputValidation || formField?.value.eagerValidation); }, formField?.value.validateOnInputDelay ?? formOptions?.value.validateOnInputDelay ?? 0 ); return { id: computed(() => props?.id ?? inputId?.value), name: computed(() => props?.name ?? formField?.value.name), size: computed(() => props?.size ?? formField?.value.size), color: computed(() => formField?.value.error ? "air-primary-alert" : props?.color), highlight: computed(() => formField?.value.error ? true : props?.highlight), disabled: computed(() => formOptions?.value.disabled || props?.disabled), emitFormBlur, emitFormInput, emitFormChange, emitFormFocus, ariaAttrs: computed(() => { if (!formField?.value) return; const descriptiveAttrs = ["error", "hint", "description", "help"].filter((type) => formField?.value?.[type]).map((type) => `${formField?.value.ariaId}-${type}`) || []; const attrs = { "aria-invalid": !!formField?.value.error }; if (descriptiveAttrs.length > 0) { attrs["aria-describedby"] = descriptiveAttrs.join(" "); } return attrs; }) }; }