UNPKG

@vue-interface/form-control

Version:
1 lines 32.2 kB
{"version":3,"file":"form-control.umd.cjs","sources":["../src/config.ts","../src/FormControlErrors.vue","../src/FormControl.vue","../src/FormControlLegacy.ts"],"sourcesContent":["const global = {};\n\nexport default function config(...args: any[]) {\n // config() returns the global object.\n if(!args.length) {\n return global;\n }\n \n // Destruct the key/value from the args.\n const [ key, value ] = args;\n \n // config('key') returns value assigned to the key\n if(typeof key === 'string') {\n //@ts-ignore\n return typeof global[key] !== 'undefined' ? global[key] : value;\n }\n\n // config(['a', 'b']) returns an object of key/value pairs\n if(Array.isArray(key)) {\n return key.reduce((carry, key) => {\n return Object.assign(carry, {\n //@ts-ignore\n [key]: global[key]\n });\n }, {});\n }\n\n // config({a: 1}, {b: 2}) assigns the args and returns the global object.\n return Object.assign(global, ...args);\n}","<script lang=\"ts\" setup>\nimport { isPlainObject } from 'lodash-es';\nimport { computed } from 'vue';\n\nconst props = defineProps<{\n error?: Error|string,\n errors: (Error|string)[]|Record<string,Error|string[]>,\n name?: string,\n id?: string\n}>();\n\nconst key = String(props?.id || props?.name);\n\nconst map = computed(() => {\n // First check if an `error` prop was passed. This is a single error.\n if(props.error) {\n return new Map<string, (string|Error)[]>(\n [[key, [props.error]]]\n );\n }\n\n // Next check if props.errors is a plain object. \n if(isPlainObject(props.errors)) {\n return new Map<string, (string | Error)[]>(\n Object.entries(props.errors)\n );\n }\n\n // Finally check to see if an error of errors was passed.\n if(Array.isArray(props.errors)) {\n return new Map<string, (string | Error)[]>(\n [[key, props.errors]]\n );\n }\n\n return new Map();\n});\n</script>\n\n<template>\n <slot\n v-for=\"item of map.get(key)\"\n v-bind=\"{ key, error: item }\" />\n</template>","<script lang=\"ts\">\nimport { Shadowable } from '@vue-interface/shadowable';\nimport { isNil, isObject, kebabCase } from 'lodash-es';\nimport { defineComponent, DirectiveBinding } from 'vue';\nimport config from './config';\nimport FormControlErrors from './FormControlErrors.vue';\nimport FormControlFeedback from './FormControlFeedback.vue';\n\nfunction prefix(key: string, value: any, delimeter = '-') {\n const string = String(value).replace(new RegExp(`^${key}${delimeter}?`), '');\n\n return [\n kebabCase(string), key\n ].filter(value => !!value).join(delimeter);\n}\n\nexport default defineComponent({\n components: {\n FormControlErrors,\n FormControlFeedback\n },\n directives: {\n bindEvents: {\n created(el: HTMLElement, binding: DirectiveBinding) {\n // @ts-ignore\n binding.instance?.bindEvents?.(el);\n }\n }\n },\n mixins: [\n Shadowable\n ],\n inheritAttrs: false,\n props: {\n /**\n * Show type activity indicator.\n */\n activity: {\n type: Boolean,\n default: false\n },\n \n /**\n * Animate floating labels inside the input.\n */\n animated: {\n type: Boolean,\n default: () => config('animated', false)\n },\n\n\n /**\n * An inline field validation error.\n */\n error: {\n type: [String, Array, Boolean],\n default: undefined\n },\n\n /**\n * An inline field validation errors passed as object with key/value\n * pairs. If errors passed as an object, the form name will be used for\n * the key.\n */\n errors: {\n type: [Array, Object, Boolean],\n default: undefined\n },\n\n /**\n * Some feedback to add to the field once the field is successfully\n * valid.\n */\n feedback: {\n type: [String, Array],\n default: undefined\n },\n\n /**\n * The primary class assigned to the form control.\n */\n formControlClass: {\n type: [Array, Object, String],\n default: () => config('controlClass', 'form-control')\n },\n \n /**\n * Add form-group wrapper to input.\n */\n group: {\n type: Boolean,\n default: () => config('group', true)\n },\n \n /**\n * Some instructions to appear under the field label.\n */\n helpText: {\n type: [Number, String],\n default: undefined\n },\n \n /**\n * The activity indicator type.\n */\n indicator: {\n type: [Object, String, Boolean],\n default: () => config('indicator', 'spinner')\n },\n\n /**\n * The activity indicator size.\n */\n indicatorSize: {\n type: String,\n default: undefined\n },\n\n /**\n * Force the input to be invalid.\n */\n invalid: Boolean,\n \n /**\n * The value of label element. If no value, no label will appear.\n */\n label: {\n type: [Number, String],\n default: undefined\n },\n \n /**\n * The default label class assigned to the label element.\n */\n labelClass: {\n type: [Object, String],\n default: () => config('labelClass', 'form-label')\n },\n\n /**\n * The model default value.\n */\n modelValue: {\n type: [String, Number, Boolean, Array, Object],\n default: () => undefined\n },\n\n /**\n * Should the control look like plaintext.\n */\n plaintext: Boolean,\n\n /**\n * The size of the form control.\n */\n size: {\n type: String,\n default: undefined\n },\n\n /**\n * Force the input to be valid.\n */\n valid: Boolean\n },\n emits: [\n 'focus',\n 'blur',\n 'change',\n 'click',\n 'keypress',\n 'keyup',\n 'keydown',\n 'progress',\n 'paste',\n 'update:modelValue'\n ],\n data() {\n return {\n currentValue: undefined,\n hasChanged: false,\n hasFocus: false,\n isDirty: this,\n };\n },\n computed: {\n model: {\n get() {\n return this.getModelValue();\n },\n set(value: any) {\n this.setModelValue(value);\n }\n },\n id(): string|undefined {\n return this.$attrs.id\n || Math.random().toString(36).slice(2);\n },\n isEmpty() {\n return isNil(this.model);\n },\n isInvalid() {\n return !!(this.invalid || this.error || this.errors && (\n Array.isArray(this.errors)\n ? this.errors.length\n : this.errors[this.$attrs.id || this.$attrs.name]\n ));\n },\n isValid() {\n return !!(this.valid || this.feedback);\n },\n componentName() {\n return this.$options.name;\n },\n controlClass() {\n return this.formControlClass;\n },\n controlAttributes() {\n const attrs = Object.assign({}, this.$attrs, {\n id: this.id,\n class: this.controlClasses\n });\n \n // Delete value from attrs because we dont want it to rebind\n // the static attribute every time the computed re-renders.\n // The currentValue is set from $attrs.value in created().\n delete attrs.value;\n\n return attrs;\n },\n controlClasses() {\n return Object.assign({\n [this.controlClass]: !!this.controlClass,\n [this.controlSizeClass]: !!this.controlSizeClass,\n [this.plaintextClass]: this.plaintext,\n 'form-control-icon': !!this.$slots.icon,\n 'is-valid': this.isValid,\n 'is-invalid': this.isInvalid,\n }, this.shadowableClass);\n },\n controlSizeClass() {\n return prefix(this.size, this.controlClass);\n },\n formGroupClasses() {\n return Object.assign({\n 'animated': this.animated,\n 'form-group': this.group,\n 'has-activity': this.activity,\n 'has-changed': this.hasChanged,\n 'has-focus': this.hasFocus,\n 'has-icon': !!this.$slots.icon,\n 'is-dirty': this.isDirty,\n 'is-empty': this.isEmpty,\n 'is-invalid': this.isInvalid,\n 'is-valid': this.isValid,\n [this.$attrs.class]: !!this.$attrs.class,\n [this.size && prefix(this.size, 'form-group')]: !!this.size,\n [this.size && prefix(this.size, this.componentName)]: !!this.size,\n }, !!this.componentName && {\n [kebabCase(this.componentName)]: true\n });\n },\n plaintextClass() {\n return 'form-control-plaintext';\n }\n },\n created() {\n // Set the current value before checking the dirty status.\n this.currentValue = this.$attrs.value;\n this.isDirty = !isNil(this.model);\n },\n methods: {\n bindEvents(el: HTMLElement) {\n for(const event of this.$options.emits) {\n el.addEventListener(event, (e: Event) => {\n this.$emit(event, e);\n });\n }\n\n el.addEventListener('focus', () => {\n this.isDirty = true;\n this.hasFocus = true;\n });\n\n el.addEventListener('blur', () => {\n this.hasFocus = false;\n });\n },\n blur() {\n this.$refs.field?.blur();\n },\n focus() {\n this.$refs.field?.focus();\n },\n getFieldErrors() {\n let errors = this.error || this.errors;\n\n if(this.errors && !Array.isArray(this.errors)) {\n errors = this.errors[this.$attrs.name || this.$attrs.id];\n }\n\n return !errors || Array.isArray(errors) || isObject(errors) ? errors : [errors];\n },\n getModelValue(): any {\n if(this.modelValue === undefined) {\n return this.currentValue;\n }\n\n return this.modelValue;\n },\n setModelValue(value: any): void {\n this.hasChanged = true;\n this.currentValue = value;\n this.$emit('update:modelValue', value);\n }\n }\n});\n</script>","import { Shadowable } from '@vue-interface/shadowable';\nimport { kebabCase } from 'lodash-es';\nimport { defineComponent, DirectiveBinding } from 'vue';\nimport config from './config';\n\nfunction prefix(key: string, value: any, delimeter = '-') {\n const string = String(value).replace(new RegExp(`^${key}${delimeter}?`), '');\n\n return [\n kebabCase(string), key\n ].filter(value => !!value).join(delimeter);\n}\n\nfunction isObject(subject: any) {\n return !Array.isArray(subject) && typeof subject === 'object';\n}\n\n// function isUndefined(value: any) {\n// return value === undefined;\n// }\n\n\nexport default defineComponent({\n\n directives: {\n bindEvents: {\n beforeMount(el: HTMLElement, binding: DirectiveBinding) {\n // @ts-ignore\n binding.instance?.bindEvents?.(el);\n }\n }\n },\n\n mixins: [\n Shadowable\n ],\n\n inheritAttrs: false,\n\n props: {\n\n modelValue: {\n default: undefined\n },\n\n /**\n * Show type activity indicator.\n */\n activity: {\n type: Boolean,\n default: false\n },\n\n /**\n * Animate floating labels inside the input.\n */\n animated: {\n type: Boolean,\n default: () => config('animated', false)\n },\n\n /**\n * An array of event names that correlate with callback functions.\n */\n nativeEvents: {\n type: Array,\n default() {\n return ['focus', 'blur', 'change', 'click', 'keypress', 'keyup', 'keydown', 'progress', 'paste'];\n }\n },\n\n /**\n * The default class name assigned to the control element.\n */\n defaultControlClass: {\n type: String,\n default: () => config('defaultControlClass', 'form-control')\n },\n\n /**\n * An inline field validation error.\n */\n error: {\n type: [String, Array, Boolean],\n default: undefined\n },\n\n /**\n * An inline field validation errors passed as object with key/value\n * pairs. If errors passed as an object, the form name will be used for\n * the key.\n */\n errors: {\n type: [Array, Object, Boolean],\n default() {\n return {};\n }\n },\n\n /**\n * Some feedback to add to the field once the field is successfully\n * valid.\n */\n feedback: {\n type: [String, Array],\n default: undefined\n },\n\n /**\n * Add form-group wrapper to input.\n */\n group: {\n type: Boolean,\n default: () => config('group', true)\n },\n\n /**\n * Some instructions to appear under the field label.\n */\n helpText: {\n type: [Number, String],\n default: undefined\n },\n\n /**\n * Hide the label for browsers, but leave it for screen readers.\n */\n hideLabel: Boolean,\n\n /**\n * The activity indicator type.\n */\n indicator: {\n type: [String, Boolean],\n default: () => config('indicator', 'spinner')\n },\n\n /**\n * The activity indicator size.\n */\n indicatorSize: {\n type: String,\n default: undefined\n },\n\n /**\n * Display the form field inline.\n */\n inline: Boolean,\n\n /**\n * The invalid property.\n */\n invalid: Boolean,\n\n /**\n * The value of label element. If no value, no label will appear.\n */\n label: {\n type: [Number, String],\n default: undefined\n },\n\n /**\n * The default label class assigned to the label element.\n */\n labelClass: {\n type: [Object, String],\n default: () => config('labelClass', 'form-label')\n },\n\n /**\n * Should the control look like a pill.\n */\n pill: Boolean,\n\n /**\n * Should the control look like plaintext.\n */\n plaintext: Boolean,\n\n /**\n * The size of the form control.\n */\n size: {\n type: String,\n default: undefined\n },\n\n /**\n * Additional margin/padding classes for fine control of spacing.\n */\n spacing: {\n type: String,\n default: undefined\n },\n\n /**\n * The valid property.\n */\n valid: Boolean\n\n },\n\n emits: [\n 'blur',\n 'change',\n 'click',\n 'focus',\n 'keydown',\n 'keypress',\n 'keyup',\n 'update:modelValue'\n ],\n\n data() {\n return {\n defaultEmpty: false,\n hasChanged: false,\n hasFocus: false,\n isEmpty: true,\n };\n },\n\n computed: {\n\n id() {\n return this.$attrs.id || this.$attrs.name || (Math.random() + 1).toString(36).substring(7);\n },\n\n componentName() {\n return this.$options.name;\n },\n\n controlAttributes() {\n return Object.fromEntries(\n Object.entries(this.$attrs).concat([\n ['id', this.id],\n ['class', this.controlClasses],\n ['value', this.modelValue]\n ])\n );\n },\n\n controlClass() {\n return this.defaultControlClass;\n },\n\n controlSizeClass() {\n return prefix(this.size, this.controlClass);\n },\n\n formGroupClasses() {\n return Object.assign({\n [this.size && prefix(this.size, this.componentName)]: !!this.size,\n 'animated': this.animated,\n 'default-empty': this.defaultEmpty,\n 'form-group': this.group,\n [this.size && prefix(this.size, 'form-group')]: !!this.size,\n 'has-activity': this.activity,\n 'has-changed': this.hasChanged,\n 'has-focus': this.hasFocus,\n 'has-icon': !!this.$slots.icon,\n 'is-empty': this.isEmpty,\n 'is-invalid': !!(this.invalid || this.invalidFeedback),\n 'is-valid': !!(this.valid || this.validFeedback),\n [this.$attrs.class]: !!this.$attrs.class,\n [this.$attrs.id]: !!this.$attrs.id\n }, !!this.componentName && {\n [kebabCase(this.componentName)]: true\n });\n },\n\n controlClasses() {\n return Object.assign({\n [this.controlClass]: !!this.controlClass,\n [this.controlSizeClass]: !!this.controlSizeClass,\n 'form-control-icon': !!this.$slots.icon,\n 'is-valid': !!(this.valid || this.validFeedback),\n 'is-invalid': !!(this.invalid || this.invalidFeedback),\n [this.pillClasses]: this.pill,\n [this.plaintextClass]: this.plaintext,\n [this.spacing]: !!this.spacing,\n }, this.shadowableClass);\n },\n\n hasDefaultSlot() {\n return !!this.$slots.default;\n },\n\n invalidFeedback() {\n if(this.error === '') {\n return null;\n }\n\n if(this.error) {\n return this.error;\n }\n\n const errors = this.getFieldErrors();\n\n return Array.isArray(errors) ? errors.filter(error => {\n return error && typeof error === 'string';\n }).join('<br>') : errors;\n },\n\n pillClasses() {\n return 'rounded rounded-pill';\n },\n\n plaintextClass() {\n return 'form-control-plaintext';\n },\n\n validFeedback() {\n return Array.isArray(this.feedback) ? this.feedback.join('<br>') : this.feedback;\n }\n\n },\n\n watch: {\n hasFocus() {\n if(this.shouldChangeOnFocus()) {\n this.hasChanged = true;\n }\n },\n defaultEmpty() {\n this.hasChanged = true;\n }\n },\n\n methods: {\n\n bindEvents(el: HTMLOptionElement | HTMLSelectElement, fn: Function) {\n // If no function is defined, the use the default onInput callback.\n if(!fn) {\n fn = this.onInput;\n }\n\n // Get the option from the selected index.\n const selected = el instanceof HTMLSelectElement\n ? el.querySelectorAll('option')?.[el.selectedIndex]\n : null;\n\n // // Set the element value is the modelValue is not undefined.\n // if(!isUndefined(this.modelValue)) {\n // el.value = this.modelValue;\n // }\n\n // If an option is selected, force the default value.\n if(selected) {\n el.value = selected?.value;\n }\n\n // If the el has a value, trigger the model update.\n if(el.value) {\n fn(el.value);\n }\n\n // Set the default has changed value\n this.hasChanged = !!el.value;\n\n // Set the default has changed value\n this.isEmpty = !el.value;\n\n // Add the has-focus class from the form control\n el.addEventListener('focus', () => {\n this.hasFocus = true;\n });\n\n // Remove the has-focus class from the form control\n el.addEventListener('blur', () => {\n this.hasFocus = false;\n });\n\n // Watch for input changes.\n el.addEventListener('input', () => {\n this.isEmpty = false;\n this.hasChanged = true;\n });\n\n // Trigger the onInput method.\n el.addEventListener(\n el.tagName === 'SELECT' ? 'change' : 'input', () => fn(el.value)\n );\n\n // Bubble the native events up to the vue component.\n this.nativeEvents.forEach((name: string) => {\n el.addEventListener(name, event => {\n this.$emit(name, event);\n });\n });\n },\n\n blur() {\n if(this.getInputField()) {\n this.getInputField().blur();\n }\n },\n\n focus() {\n if(this.getInputField()) {\n this.getInputField().focus();\n }\n },\n\n getInputField() {\n return this.$el.querySelector(\n '.form-control, input, select, textarea'\n );\n },\n\n getFieldErrors() {\n let errors = this.error || this.errors;\n\n if(this.errors && isObject(this.errors)) {\n errors = this.errors[this.$attrs.name || this.$attrs.id];\n }\n\n return !errors || Array.isArray(errors) || isObject(errors) ? errors : [errors];\n },\n\n shouldChangeOnFocus() {\n return !this.getInputField().readOnly;\n },\n\n onInput(value: any) {\n this.$emit('update:modelValue', value);\n }\n\n }\n\n});"],"names":["global","config","args","key","value","carry","props","map","computed","isPlainObject","prefix","delimeter","string","kebabCase","_sfc_main","defineComponent","FormControlErrors","FormControlFeedback","el","binding","_b","_a","Shadowable","isNil","attrs","event","e","errors","isObject","subject","FormControlLegacy","error","fn","selected","name"],"mappings":"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"}