{"version":3,"file":"numberBox.obs.js","sources":["../../../Framework/Controls/numberBox.obs"],"sourcesContent":["<!-- Copyright by the Spark Development Network; Licensed under the Rock Community License -->\n<template>\n <RockFormField\n :modelValue=\"internalValue\"\n formGroupClasses=\"rock-number-box\"\n name=\"numberbox\"\n :validationTitle=\"validationTitle\"\n :rules=\"computedRules\">\n <template #default=\"{ uniqueId, field }\">\n <div class=\"control-wrapper\">\n <slot name=\"prepend\" />\n <div :class=\"controlContainerClass\">\n <slot name=\"inputGroupPrepend\" :isInputGroupSupported=\"true\" />\n <input\n :value=\"internalValue\"\n :id=\"uniqueId\"\n type=\"text\"\n class=\"form-control\"\n :class=\"inputClasses\"\n v-bind=\"field\"\n inputmode=\"decimal\"\n :placeholder=\"placeholder\"\n :step=\"internalStep\"\n :min=\"minimumValue\"\n :max=\"maximumValue\"\n @input=\"onInput\"\n @change=\"onChange\"\n @blur=\"formatInternalValue\" />\n <slot name=\"inputGroupAppend\" :isInputGroupSupported=\"true\" />\n </div>\n <slot name=\"append\" />\n </div>\n </template>\n </RockFormField>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, PropType, ref, useSlots, watch } from \"vue\";\n import { normalizeRules, rulesPropType, ValidationRule } from \"@Obsidian/ValidationRules\";\n import { asFormattedString, toNumberOrNull } from \"@Obsidian/Utility/numberUtils\";\n import RockFormField from \"./rockFormField.obs\";\n\n const props = defineProps({\n modelValue: {\n type: Number as PropType<number | null>,\n default: null\n },\n /** Internal use to track what modifier flags were applied to modelValue. */\n modelModifiers: {\n type: Object as PropType<Record<string, boolean>>,\n default: () => ({})\n },\n placeholder: {\n type: String as PropType<string>,\n default: \"\"\n },\n /** The minimum allowed value to be entered. */\n minimumValue: {\n type: Number as PropType<number | null>\n },\n maximumValue: {\n type: Number as PropType<number | null>\n },\n /** The number of decimal places allowed. */\n decimalCount: {\n type: Number as PropType<number | null>,\n default: null\n },\n inputClasses: {\n type: String as PropType<string>,\n default: \"\"\n },\n inputGroupClasses: {\n type: String as PropType<string>,\n default: \"\"\n },\n validationTitle: {\n type: String as PropType<string>,\n default: \"\"\n },\n rules: rulesPropType\n });\n\n const emit = defineEmits<{\n (e: \"update:modelValue\", value: number | null): void;\n }>();\n\n const slots = useSlots();\n const internalValue = ref(formatNumber(props.modelValue));\n\n const internalNumberValue = computed((): number | null => {\n return toNumberOrNull(internalValue.value);\n });\n\n const internalStep = computed((): string => {\n return props.decimalCount === null ? \"any\" : (1 / Math.pow(10, props.decimalCount)).toString();\n });\n\n const isInputGroup = computed((): boolean => {\n return !!slots.inputGroupPrepend || !!slots.inputGroupAppend;\n });\n\n const controlContainerClass = computed((): string => {\n return isInputGroup.value ? `input-group ${props.inputGroupClasses}` : \"\";\n });\n\n const computedRules = computed((): ValidationRule[] => {\n const rules = normalizeRules(props.rules);\n\n rules.push(\"number\");\n\n if (props.maximumValue != null) {\n rules.push(`lte:${props.maximumValue}`);\n }\n\n if (props.minimumValue != null) {\n rules.push(`gte:${props.minimumValue}`);\n }\n\n return rules;\n });\n\n function formatNumber(num: number | null): string {\n return asFormattedString(num, props.decimalCount ?? undefined, { useGrouping: false });\n }\n\n function formatInternalValue(): void {\n if (internalNumberValue.value !== null) {\n internalValue.value = formatNumber(internalNumberValue.value);\n }\n }\n\n /**\n * Event handler for the input field having any modification to the value\n * happen. This is basically called on every key press.\n *\n * @param e The object that describes the event.\n */\n function onInput(e: Event): void {\n if (e.target instanceof HTMLInputElement) {\n internalValue.value = e.target.value;\n }\n\n // Lazy models do not get every single key press.\n if (!props.modelModifiers.lazy) {\n emit(\"update:modelValue\", internalNumberValue.value);\n }\n }\n\n /**\n * Event handler for the input field when the changed value is \"committed\".\n * This is basically called when the focus leaves the input field.\n *\n * @param e The object that describes the event.\n */\n function onChange(e: Event): void {\n if (e.target instanceof HTMLInputElement) {\n internalValue.value = e.target.value;\n }\n\n formatInternalValue();\n\n // Only send the update if we didn't send it in the onInput handler.\n if (props.modelModifiers.lazy) {\n emit(\"update:modelValue\", internalNumberValue.value);\n }\n }\n\n watch(() => props.modelValue, () => {\n if (props.modelValue !== internalNumberValue.value) {\n internalValue.value = formatNumber(props.modelValue);\n }\n });\n\n watch(() => props.decimalCount, () => {\n formatInternalValue();\n });\n</script>\n"],"names":["props","__props","emit","__emit","slots","useSlots","internalValue","ref","formatNumber","modelValue","internalNumberValue","computed","toNumberOrNull","value","internalStep","decimalCount","Math","pow","toString","isInputGroup","inputGroupPrepend","inputGroupAppend","controlContainerClass","concat","inputGroupClasses","computedRules","rules","normalizeRules","push","maximumValue","minimumValue","num","_props$decimalCount","asFormattedString","undefined","useGrouping","formatInternalValue","onInput","e","target","HTMLInputElement","modelModifiers","lazy","onChange","watch"],"mappings":"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"}