{"version":3,"file":"textFieldComponents.js","sources":["../../../Framework/FieldTypes/textFieldComponents.ts"],"sourcesContent":["// <copyright>\n// Copyright by the Spark Development Network\n//\n// Licensed under the Rock Community License (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.rockrms.com/license\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// </copyright>\n//\nimport { computed, defineComponent, ref, watch } from \"vue\";\nimport { getFieldConfigurationProps, getFieldEditorProps } from \"./utils\";\nimport TextBox from \"@Obsidian/Controls/textBox.obs\";\nimport CheckBox from \"@Obsidian/Controls/checkBox.obs\";\nimport NumberBox from \"@Obsidian/Controls/numberBox.obs\";\nimport { asBoolean, asBooleanOrNull, asTrueFalseOrNull } from \"@Obsidian/Utility/booleanUtils\";\nimport { toNumberOrNull } from \"@Obsidian/Utility/numberUtils\";\nimport FirstNameTextBox from \"@Obsidian/Controls/firstNameTextBox.obs\";\n\n// We can't import the ConfigurationValueKey from textField.partial.ts\n// because it causes a recursive import back to this file by way of\n// the fieldType.ts import in textField.partial.ts.\nexport const enum ConfigurationValueKey {\n    /** Contains \"True\" if the text field is designed for password entry. */\n    IsPassword = \"ispassword\",\n\n    /** The maximum number of characters allowed in the text entry field. */\n    MaxCharacters = \"maxcharacters\",\n\n    /** Contains \"True\" if the text field should show the character countdown. */\n    ShowCountdown = \"showcountdown\",\n\n    /** Contains \"True\" if the text field is designed for first name entry. */\n    IsFirstName = \"isfirstname\",\n}\n\nexport const EditComponent = defineComponent({\n    name: \"TextField.Edit\",\n\n    components: {\n        TextBox,\n        FirstNameTextBox\n    },\n\n    props: getFieldEditorProps(),\n\n    setup(props, { emit }) {\n        // The internal value used by the text editor.\n        const internalValue = ref(\"\");\n\n        // Configuration attributes passed to the text editor.\n        const configAttributes = computed((): Record<string, number | boolean> => {\n            const attributes: Record<string, number | boolean> = {};\n\n            const maxCharsConfig = props.configurationValues[ConfigurationValueKey.MaxCharacters];\n            if (maxCharsConfig) {\n                const maxCharsValue = Number(maxCharsConfig);\n\n                if (maxCharsValue) {\n                    attributes.maxLength = maxCharsValue;\n                }\n            }\n\n            const showCountDownConfig = props.configurationValues[ConfigurationValueKey.ShowCountdown];\n            if (showCountDownConfig && showCountDownConfig) {\n                const showCountDownValue = asBooleanOrNull(showCountDownConfig) || false;\n\n                if (showCountDownValue) {\n                    attributes.showCountDown = showCountDownValue;\n                }\n            }\n\n            return attributes;\n        });\n\n        // The type of text input field to use on the text editor.\n        const textType = computed((): string => {\n            const isPasswordConfig = props.configurationValues[ConfigurationValueKey.IsPassword];\n            const isPassword = asBooleanOrNull(isPasswordConfig) ?? false;\n\n            return isPassword ? \"password\" : \"\";\n\n        });\n\n        const isFirstName = computed((): boolean => {\n            const isFirstNameConfig = props.configurationValues[ConfigurationValueKey.IsFirstName];\n            return asBooleanOrNull(isFirstNameConfig) ?? false;\n        });\n\n        // Watch for changes from the parent component and update the text editor.\n        watch(() => props.modelValue, () => {\n            internalValue.value = props.modelValue;\n        }, {\n            immediate: true\n        });\n\n        // Watch for changes from the text editor and update the parent component.\n        watch(internalValue, () => {\n            emit(\"update:modelValue\", internalValue.value);\n        });\n\n        return {\n            configAttributes,\n            internalValue,\n            textType,\n            isFirstName\n        };\n    },\n\n    template: `\n<FirstNameTextBox v-if=\"isFirstName\" v-model=\"internalValue\" v-bind=\"configAttributes\" :type=\"textType\" />\n<TextBox v-else v-model=\"internalValue\" v-bind=\"configAttributes\" :type=\"textType\" />\n`\n});\n\nexport const ConfigurationComponent = defineComponent({\n    name: \"TextField.Configuration\",\n\n    components: {\n        CheckBox,\n        NumberBox\n    },\n\n    props: getFieldConfigurationProps(),\n\n    emits: [\"update:modelValue\", \"updateConfiguration\", \"updateConfigurationValue\"],\n\n    setup(props, { emit }) {\n        // Define the properties that will hold the current selections.\n        const passwordField = ref(false);\n        const maxCharacters = ref<number | null>(null);\n        const showCountdown = ref(false);\n        const firstNameField = ref(false);\n\n        /**\n         * Update the modelValue property if any value of the dictionary has\n         * actually changed. This helps prevent unwanted postbacks if the value\n         * didn't really change - which can happen if multiple values get updated\n         * at the same time.\n         *\n         * @returns true if a new modelValue was emitted to the parent component.\n         */\n        const maybeUpdateModelValue = (): boolean => {\n            const newValue: Record<string, string> = {};\n\n            // Construct the new value that will be emitted if it is different\n            // than the current value.\n            newValue[ConfigurationValueKey.IsPassword] = asTrueFalseOrNull(passwordField.value) ?? \"False\";\n            newValue[ConfigurationValueKey.MaxCharacters] = maxCharacters.value?.toString() ?? \"\";\n            newValue[ConfigurationValueKey.ShowCountdown] = asTrueFalseOrNull(showCountdown.value) ?? \"False\";\n            newValue[ConfigurationValueKey.IsFirstName] = asTrueFalseOrNull(firstNameField.value) ?? \"False\";\n\n            // Compare the new value and the old value.\n            const anyValueChanged = newValue[ConfigurationValueKey.IsPassword] !== (props.modelValue[ConfigurationValueKey.IsPassword] ?? \"False\")\n                || newValue[ConfigurationValueKey.MaxCharacters] !== (props.modelValue[ConfigurationValueKey.MaxCharacters] ?? \"\")\n                || newValue[ConfigurationValueKey.ShowCountdown] !== (props.modelValue[ConfigurationValueKey.ShowCountdown] ?? \"False\")\n                || newValue[ConfigurationValueKey.IsFirstName] !== (props.modelValue[ConfigurationValueKey.IsFirstName] ?? \"False\");\n\n            // If any value changed then emit the new model value.\n            if (anyValueChanged) {\n                emit(\"update:modelValue\", newValue);\n                return true;\n            }\n            else {\n                return false;\n            }\n        };\n\n        /**\n         * Emits the updateConfigurationValue if the value has actually changed.\n         *\n         * @param key The key that was possibly modified.\n         * @param value The new value.\n         */\n        const maybeUpdateConfiguration = (key: string, value: string): void => {\n            if (maybeUpdateModelValue()) {\n                emit(\"updateConfigurationValue\", key, value);\n            }\n        };\n\n        // Watch for changes coming in from the parent component and update our\n        // data to match the new information.\n        watch(() => [props.modelValue, props.configurationProperties], () => {\n            passwordField.value = asBoolean(props.modelValue[ConfigurationValueKey.IsPassword]);\n            maxCharacters.value = toNumberOrNull(props.modelValue[ConfigurationValueKey.MaxCharacters]);\n            showCountdown.value = asBoolean(props.modelValue[ConfigurationValueKey.ShowCountdown]);\n            firstNameField.value = asBoolean(props.modelValue[ConfigurationValueKey.IsFirstName]);\n        }, {\n            immediate: true\n        });\n\n        // Watch for changes in properties that require new configuration\n        // properties to be retrieved from the server.\n        // THIS IS JUST A PLACEHOLDER FOR COPYING TO NEW FIELDS THAT MIGHT NEED IT.\n        // THIS FIELD DOES NOT NEED THIS\n        watch([], () => {\n            if (maybeUpdateModelValue()) {\n                emit(\"updateConfiguration\");\n            }\n        });\n\n        // Watch for changes in properties that only require a local UI update.\n        watch(passwordField, () => maybeUpdateConfiguration(ConfigurationValueKey.IsPassword, asTrueFalseOrNull(passwordField.value) ?? \"False\"));\n        watch(maxCharacters, () => maybeUpdateConfiguration(ConfigurationValueKey.MaxCharacters, maxCharacters.value?.toString() ?? \"\"));\n        watch(showCountdown, () => maybeUpdateConfiguration(ConfigurationValueKey.ShowCountdown, asTrueFalseOrNull(showCountdown.value) ?? \"False\"));\n        watch(firstNameField, () => maybeUpdateConfiguration(ConfigurationValueKey.IsFirstName, asTrueFalseOrNull(firstNameField.value) ?? \"False\"));\n\n        return {\n            maxCharacters,\n            passwordField,\n            showCountdown,\n            firstNameField\n        };\n    },\n\n    template: `\n<div>\n    <CheckBox v-model=\"passwordField\" label=\"Password Field\" help=\"When set, edit field will be masked.\" />\n    <NumberBox v-model=\"maxCharacters\" label=\"Max Characters\" help=\"The maximum number of characters to allow. Leave this field empty to allow for an unlimited amount of text.\" />\n    <CheckBox v-model=\"showCountdown\" label=\"Show Character Limit Countdown\" help=\"When set, displays a countdown showing how many characters remain (for the Max Characters setting).\" />\n    <CheckBox v-model=\"firstNameField\" label=\"FirstName Field\" help=\"When set, edit field will be validated as a first name.\" />\n</div>\n`\n});\n"],"names":["ConfigurationValueKey","EditComponent","defineComponent","name","components","TextBox","FirstNameTextBox","props","getFieldEditorProps","setup","_ref","emit","internalValue","ref","configAttributes","computed","attributes","maxCharsConfig","configurationValues","MaxCharacters","maxCharsValue","Number","maxLength","showCountDownConfig","ShowCountdown","showCountDownValue","asBooleanOrNull","showCountDown","textType","_asBooleanOrNull","isPasswordConfig","IsPassword","isPassword","isFirstName","_asBooleanOrNull2","isFirstNameConfig","IsFirstName","watch","modelValue","value","immediate","template","ConfigurationComponent","CheckBox","NumberBox","getFieldConfigurationProps","emits","_ref2","passwordField","maxCharacters","showCountdown","firstNameField","maybeUpdateModelValue","_asTrueFalseOrNull","_maxCharacters$value$","_maxCharacters$value","_asTrueFalseOrNull2","_asTrueFalseOrNull3","_props$modelValue$Con","_props$modelValue$Con2","_props$modelValue$Con3","_props$modelValue$Con4","newValue","asTrueFalseOrNull","toString","anyValueChanged","maybeUpdateConfiguration","key","configurationProperties","asBoolean","toNumberOrNull","_asTrueFalseOrNull4","_maxCharacters$value$2","_maxCharacters$value2","_asTrueFalseOrNull5","_asTrueFalseOrNull6"],"mappings":"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"}