{"version":3,"file":"phoneNumberBox.obs.js","sources":["../../../Framework/Controls/phoneNumberBox.obs"],"sourcesContent":["<!-- Copyright by the Spark Development Network; Licensed under the Rock Community License -->\r\n<template>\r\n    <RockFormField v-model=\"internalValue\"\r\n                   v-bind=\"formFieldProps\"\r\n                   @change=\"onChange\"\r\n                   formGroupClasses=\"rock-phonenumber-box\"\r\n                   :rules=\"rules\"\r\n                   name=\"phonenumberbox\">\r\n        <template #default=\"{ uniqueId, field }\">\r\n            <div class=\"control-wrapper\">\r\n                <div class=\"input-group phone-number-box\" :class=\"inputGroupClasses\">\r\n                    <span v-if=\"availableCountryCodeOptions.length < 2\" class=\"input-group-addon\">\r\n                        <i class=\"fa fa-phone-square\"></i>\r\n                    </span>\r\n                    <InputGroupDropDown v-else :items=\"availableCountryCodeOptions\" v-model=\"countryCode\" inputGroupClasses=\"input-group-addon\" />\r\n                    <input v-model=\"internalValue\" :id=\"uniqueId\" type=\"text\" class=\"form-control\" v-bind=\"field\" />\r\n                </div>\r\n            </div>\r\n        </template>\r\n    </RockFormField>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\n    import { computed, PropType, ref, watch } from \"vue\";\r\n    import RockFormField from \"./rockFormField.obs\";\r\n    import { PhoneNumberBoxGetConfigurationResultsBag } from \"@Obsidian/ViewModels/Rest/Controls/phoneNumberBoxGetConfigurationResultsBag\";\r\n    import { PhoneNumberCountryCodeRulesConfigurationBag } from \"@Obsidian/ViewModels/Rest/Controls/phoneNumberCountryCodeRulesConfigurationBag\";\r\n    import { standardRockFormFieldProps, useStandardRockFormFieldProps, useVModelPassthrough } from \"@Obsidian/Utility/component\";\r\n    import { normalizeRules } from \"@Obsidian/ValidationRules\";\r\n    import { getPhoneNumberConfiguration, formatPhoneNumber, stripPhoneNumber } from \"@Obsidian/Utility/phone\";\r\n    import { ListItemBag } from \"@Obsidian/ViewModels/Utility/listItemBag\";\r\n    import InputGroupDropDown from \"./inputGroupDropDown.obs\";\r\n\r\n    const props = defineProps({\r\n        /** v-model of Phone Number */\r\n        modelValue: {\r\n            type: String as PropType<string>,\r\n            default: \"\"\r\n        },\r\n\r\n        /** v-model of Country Code */\r\n        countryCode: {\r\n            type: String as PropType<string>,\r\n            default: \"\"\r\n        },\r\n\r\n        inputGroupClasses: {\r\n            type: String as PropType<string>,\r\n            default: \"\"\r\n        },\r\n\r\n        ...standardRockFormFieldProps\r\n    });\r\n\r\n    const emit = defineEmits<{\r\n        (e: \"update:modelValue\", value: string): void\r\n        (e: \"update:countryCode\", value: string): void\r\n    }>();\r\n\r\n\r\n    // #region Values\r\n\r\n    const internalValue = useVModelPassthrough(props, \"modelValue\", emit);\r\n    const countryCode = useVModelPassthrough(props, \"countryCode\", emit);\r\n    const formFieldProps = useStandardRockFormFieldProps(props);\r\n    const configuration = ref<PhoneNumberBoxGetConfigurationResultsBag | null>(null);\r\n\r\n    // #endregion\r\n\r\n    // #region Computed Values\r\n\r\n    const strippedValue = computed((): string => {\r\n        return stripPhoneNumber(internalValue.value);\r\n    });\r\n\r\n    const formattedValue = computed((): string => {\r\n        return formatPhoneNumber(strippedValue.value, getConfiguredRules());\r\n    });\r\n\r\n    const rules = computed(() => {\r\n        const rules = normalizeRules(props.rules);\r\n        rules.push(validatePhoneNumber);\r\n        return rules;\r\n    });\r\n\r\n    const availableCountryCodes = computed<string[]>(() => {\r\n        return Object.keys(configuration.value?.rules ?? {});\r\n    });\r\n\r\n    const availableCountryCodeOptions = computed<ListItemBag[]>(() => {\r\n        if (availableCountryCodes.value.length == 0) {\r\n            return [{ value: \"1\", text: \"1\" }];\r\n        }\r\n\r\n        return availableCountryCodes.value.map((val) => ({ value: val, text: val }));\r\n    });\r\n\r\n    // #endregion\r\n\r\n    // #region Functions\r\n\r\n    /** Uses the configuration we received from the server to determine whether the entered number is valid */\r\n    function validatePhoneNumber(value: unknown): string | boolean {\r\n        const rules = getConfiguredRules();\r\n\r\n        if (!value) {\r\n            return true;\r\n        }\r\n\r\n        if (rules.length == 0) {\r\n            return true;\r\n        }\r\n\r\n        for (let rule of rules) {\r\n            const regex = new RegExp(rule.match ?? \"\");\r\n\r\n            if (regex.test(strippedValue.value)) {\r\n                return true;\r\n            }\r\n        }\r\n\r\n        return `The phone number '${value}' is not a valid phone number.`;\r\n    }\r\n\r\n    /** Retrieve the country code data, validation data, and formatting data from the server */\r\n    async function loadConfiguration(): Promise<void> {\r\n        try {\r\n            const result = await getPhoneNumberConfiguration();\r\n\r\n            if (result) {\r\n                configuration.value = result;\r\n            }\r\n            else {\r\n                console.error(\"Unknown error while loading phone number configuration.\");\r\n            }\r\n        }\r\n        catch (e) {\r\n            console.error(e ?? \"Unknown error while loading phone number configuration.\");\r\n        }\r\n    }\r\n\r\n    /** Get the rules for the selected countryCode */\r\n    function getConfiguredRules(): PhoneNumberCountryCodeRulesConfigurationBag[] {\r\n        return configuration.value?.rules?.[countryCode.value] ?? [];\r\n    }\r\n\r\n    // #endregion\r\n\r\n    // #region Event Handlers\r\n\r\n    function onChange(): void {\r\n        internalValue.value = formattedValue.value;\r\n    }\r\n\r\n    // #endregion\r\n\r\n    // #region Watchers\r\n\r\n    watch(formattedValue, (): void => {\r\n        // The value that should be stored for phone number attribute values is the formatted version.\r\n        // This seems backwards, but actually keeps parity with the web forms functionality.\r\n        emit(\"update:modelValue\", formattedValue.value);\r\n    }, { immediate: true });\r\n\r\n    watch(() => props.modelValue, (): void => {\r\n        internalValue.value = formattedValue.value;\r\n    }, {\r\n        immediate: true\r\n    });\r\n\r\n    watch([configuration, availableCountryCodes], (): void => {\r\n        // If we don't have any country codes from the server, ignore\r\n        if (configuration.value == null || availableCountryCodes.value.length == 0) return;\r\n\r\n        // If no country code set or the set country code isn't in the list of available codes, then change it to the default\r\n        if (countryCode.value == null || !availableCountryCodes.value.includes(countryCode.value)) {\r\n            countryCode.value = availableCountryCodes.value[0];\r\n        }\r\n    });\r\n\r\n    // #endregion\r\n\r\n    loadConfiguration();\r\n\r\n</script>"],"names":["internalValue","useVModelPassthrough","props","emit","countryCode","formFieldProps","useStandardRockFormFieldProps","configuration","ref","strippedValue","computed","stripPhoneNumber","value","formattedValue","formatPhoneNumber","getConfiguredRules","rules","normalizeRules","push","validatePhoneNumber","availableCountryCodes","_configuration$value$","_configuration$value","Object","keys","availableCountryCodeOptions","length","text","map","val","_i","_rules","_rule$match","rule","regex","RegExp","match","test","concat","loadConfiguration","_loadConfiguration","apply","arguments","_asyncToGenerator","result","getPhoneNumberConfiguration","console","error","e","_configuration$value$2","_configuration$value2","_configuration$value3","onChange","watch","immediate","modelValue","includes"],"mappings":"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"}