{"version":3,"file":"codeBox.obs.js","sources":["../../src/Security/codeBoxCharacter.partial.obs","../../../Rock.JavaScript.Obsidian/node_modules/style-inject/dist/style-inject.es.js","../../src/Security/codeBox.obs"],"sourcesContent":["<!-- Copyright by the Spark Development Network; Licensed under the Rock Community License -->\n<template>\n <input :value=\"modelValue\"\n autocomplete=\"one-time-code\"\n :autofocus=\"boxIndex === 0\"\n :class=\"`rock-code-box-${boxIndex + 1} form-control flex-grow-1 flex-sm-grow-0 flex-shrink-1 ${boxIndex > 0 ? 'ml-1' : ''}`\"\n :disabled=\"disabled\"\n :id=\"`${uniqueId}-${boxIndex + 1}`\"\n :maxlength=\"maxLength\"\n ref=\"inputElement\"\n type=\"text\"\n @paste=\"onPaste\"\n @keydown=\"onKeydown\" />\n</template>\n\n<style scoped>\n.rock-code-box input {\n width: 47px;\n height: 64px;\n text-align: center;\n font-size: 24px;\n}\n</style>\n\n<script setup lang=\"ts\">\n import { ref, PropType, onMounted } from \"vue\";\n import { CodeBoxCharacterController } from \"./types.partial\";\n\n const props = defineProps({\n modelValue: {\n type: String as PropType<string>,\n required: false,\n default: null\n },\n\n boxIndex: {\n type: Number as PropType<number>,\n required: true\n },\n\n uniqueId: {\n type: String as PropType<string>,\n required: true\n },\n\n allowedChars: {\n type: Object as PropType<RegExp>,\n required: false,\n default: /^[a-zA-Z0-9]$/\n },\n\n disabled: {\n type: Boolean as PropType<boolean>,\n required: false,\n default: false\n },\n\n maxLength: {\n type: Number as PropType<number>,\n required: true\n }\n });\n\n const emit = defineEmits<{\n (e: \"update:modelValue\", value: string): void,\n (e: \"pasteValues\", value: string): void,\n (e: \"clear\", boxIndex: number): void,\n (e: \"move\", boxIndex: number): void,\n (e: \"complete\"): void,\n (e: \"ready\", value: CodeBoxCharacterController): void\n }>();\n\n //#region Values\n\n const inputElement = ref();\n\n //#endregion\n\n //#region Event Handlers\n\n /** Event handler for the \"paste\" event. */\n function onPaste(_event: Event): void {\n // The \"paste\" event is handled before the input is updated with the pasted value.\n // Temporarily store the original input value\n // and clear it so the pasted content overwrites the previous content.\n const originalValue = inputElement.value.value;\n inputElement.value.value = \"\";\n\n // Wait for the \"paste\" event to result in an input change,\n // then process the pasted value.\n onNextInput((event: InputEvent): void => {\n // Revert the pasted value to the original value (stored above),\n // and let the parent codeBox handle the pasted value\n // so it can update the individual codeBoxCharacter components.\n const pastedValue: string = inputElement.value.value;\n inputElement.value.value = originalValue;\n\n // If the full code was pasted into any code box,\n // and if the characters are all valid,\n // then paste the values across all code boxes.\n if (pastedValue.length === props.maxLength && pastedValue.split(\"\").every(pastedCharacter => props.allowedChars.test(pastedCharacter))) {\n // This will leave the pasted value in the current text box.\n emit(\"pasteValues\", pastedValue);\n emit(\"complete\");\n }\n\n // If an invalid or incomplete code is pasted into the field,\n // then prevent the event from bubbling up.\n event.preventDefault();\n return;\n });\n }\n\n /** Event handler for the \"keydown\" event. */\n function onKeydown(event: KeyboardEvent): void {\n const value = inputElement.value.value;\n // KeyboardEvent.key values can be found at - https://www.w3.org/TR/uievents-key/#named-key-attribute-values.\n const key = {\n backspace: \"Backspace\",\n delete: \"Delete\",\n enter: \"Enter\"\n } as const;\n // Legacy KeyboardEvent.keyCode documentation can be found at - https://www.w3.org/TR/uievents/#dom-keyboardevent-keycode.\n // Some KeyboardEvent.keyCode values can be found at - https://www.w3.org/TR/uievents/#fixed-virtual-key-codes.\n const keyCode = {\n backspace: 8,\n delete: 46,\n enter: 13\n } as const;\n\n // First check the `key` property.\n // If this is an older supported browser,\n // then fallback to checking the `keyCode` then `charCode` properties.\n const isBackspace = event.key === key.backspace || event.keyCode === keyCode.backspace || event.charCode === keyCode.backspace;\n const isDelete = event.key === key.delete || event.keyCode === keyCode.delete || event.charCode === keyCode.delete;\n const isEnter = event.key === key.enter || event.keyCode === keyCode.enter || event.charCode === keyCode.enter;\n\n // Allow Backspace and Delete if the input has a value.\n if ((isBackspace || isDelete) && value.length >= 1) {\n // Update the model value on the next \"input\" event.\n onNextInput(() => {\n emit(\"update:modelValue\", inputElement.value.value);\n });\n\n return;\n }\n\n // If Backspace was pressed and this input is empty,\n // then clear the previous code box and set focus to it.\n if (isBackspace) {\n if (props.boxIndex > 0) {\n emit(\"clear\", props.boxIndex - 1);\n emit(\"move\", props.boxIndex - 1);\n }\n\n event.preventDefault();\n return;\n }\n\n // Allow the Enter key to submit a form if this is a child element of a form with a submit button.\n if (isEnter) {\n return;\n }\n\n // Prevent more than one character from being entered manually into the box.\n if (value.length >= 1 && !event.ctrlKey) {\n event.preventDefault();\n return;\n }\n\n // If the input is empty and a valid key was pressed,\n // then update the input and either move to the next input\n // or emit a \"complete\" event.\n if (!event.ctrlKey) {\n // Process the value after the keypress results in an input change.\n onNextInput(() => {\n // Emit the \"update:modelValue\" update event before the \"complete\" event below.\n emit(\"update:modelValue\", inputElement.value.value);\n\n // Move to the next box if this isn't the last one.\n if (props.boxIndex < props.maxLength - 1) {\n emit(\"move\", props.boxIndex + 1);\n }\n // Complete if this is the last one.\n else if (props.boxIndex === props.maxLength - 1) {\n emit(\"complete\");\n }\n });\n }\n }\n\n /**\n * Event handler when for when the input value changes.\n * @param event\n */\n function onInputChanged(event): void {\n const pastedValue: string = event.target.value;\n\n // If the full code was pasted into any code box,\n // and if the characters are all valid,\n // then paste the values across all code boxes.\n if (pastedValue.length === props.maxLength && pastedValue.split(\"\").every(pastedCharacter => props.allowedChars.test(pastedCharacter))) {\n // This will leave the pasted value in the current text box.\n emit(\"pasteValues\", pastedValue);\n emit(\"complete\");\n }\n }\n\n //#endregion\n\n //#region Functions\n\n /** Adds a one-time \"input\" event handler that will be executed before the `onInputChanged` event handler. */\n function onNextInput(inputEventListener: (event: InputEvent) => void): void {\n function deregisteringInputEventHandler(event: InputEvent): void {\n inputElement.value.removeEventListener(\"input\", deregisteringInputEventHandler);\n inputEventListener(event);\n }\n\n // Configure the callback to preprocess the \"input\" event.\n inputElement.value.removeEventListener(\"input\", onInputChanged);\n inputElement.value.addEventListener(\"input\", deregisteringInputEventHandler);\n inputElement.value.addEventListener(\"input\", onInputChanged);\n }\n\n //#endregion\n\n onMounted(() => {\n // Add the \"input\" event handler here instead of in the template\n // so that it is clear that we manually manage the \"input\" event handlers.\n inputElement.value.addEventListener(\"input\", onInputChanged);\n\n // Emit the codeBoxCharacter controller object once this component is ready.\n emit(\"ready\", {\n focus(): void {\n inputElement.value.focus();\n },\n clear(): void {\n emit(\"update:modelValue\", \"\");\n },\n boxIndex: props.boxIndex\n });\n });\n</script>\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","<!-- Copyright by the Spark Development Network; Licensed under the Rock Community License -->\n<template>\n <RockFormField v-model=\"internalModelValue\"\n name=\"codebox\"\n :rules=\"rules\">\n <template #default=\"{uniqueId, field}\">\n <div :class=\"['form-group rock-code-box', isRequired ? 'required' : '']\">\n <div class=\"control-wrapper\">\n <div class=\"d-flex\">\n <CodeBoxCharacter v-for=\"(character, index) of characters\"\n :modelValue=\"character\"\n :allowedChars=\"allowedChars\"\n :boxIndex=\"index\"\n :disabled=\"disabled\"\n :key=\"index\"\n :maxLength=\"maxLength\"\n :modelModifiers=\"modelModifiers\"\n :uniqueId=\"uniqueId\"\n @clear=\"onClear\"\n @complete=\"onComplete\"\n @move=\"onMove\"\n @pasteValues=\"onPasteValues\"\n @ready=\"onReady\"\n @update:modelValue=\"value => onCodeBoxCharacterUpdated(value, index)\" />\n </div>\n </div>\n </div>\n </template>\n </RockFormField>\n</template>\n\n<style scoped>\n.rock-code-box input {\n width: 47px;\n height: 64px;\n text-align: center;\n font-size: 24px;\n}\n</style>\n\n<script setup lang=\"ts\">\n import { computed, onMounted, PropType, ref } from \"vue\";\n import CodeBoxCharacter from \"./codeBoxCharacter.partial.obs\";\n import { CodeBoxCharacterController } from \"./types.partial\";\n import RockFormField from \"@Obsidian/Controls/rockFormField.obs\";\n import { useVModelPassthrough } from \"@Obsidian/Utility/component\";\n import { normalizeRules, rulesPropType } from \"@Obsidian/ValidationRules\";\n\n type CodeBoxModelModifiers = {\n capitalize?: unknown\n };\n\n const props = defineProps({\n modelValue: {\n type: String as PropType<string>,\n required: false,\n default: null\n },\n\n allowedChars: {\n type: Object as PropType<RegExp>,\n required: false,\n default: /^[a-zA-Z0-9]$/\n },\n\n disabled: {\n type: Boolean as PropType<boolean>,\n required: false,\n default: false\n },\n\n maxLength: {\n type: Number as PropType<number>,\n required: true\n },\n\n modelModifiers: {\n type: Object as PropType<CodeBoxModelModifiers>,\n required: false,\n default: null\n },\n\n rules: rulesPropType\n });\n\n const emit = defineEmits<{\n (e: \"update:modelValue\", value: string): void,\n (e: \"complete\", value: string): void\n }>();\n\n /** Controllers for each codeBoxCharacter component. */\n const codeBoxCharacterControllers: Record<number, CodeBoxCharacterController> = {};\n\n //#region Values\n\n const internalModelValue = useVModelPassthrough(props, \"modelValue\", emit);\n const characters = ref<string[]>(getMaxLengthCharacters(props.modelValue.split(\"\")));\n\n //#endregion\n\n //#region Computed Values\n\n /** The internal rules we will be used for calculations. */\n const internalRules = computed(() => normalizeRules(props.rules));\n\n /** Determines if this field is marked as required. */\n const isRequired = computed(() => internalRules.value.includes(\"required\"));\n\n //#endregion\n\n //#region Event Handlers\n\n /** Event handler for a codeBoxCharacter component being updated. */\n function onCodeBoxCharacterUpdated(value: string, boxIndex: number): void {\n // Modify the value if there are any modifiers present.\n if (props.modelModifiers?.capitalize) {\n value = value?.toLocaleUpperCase();\n }\n\n // Update the character associated with the codeBoxCharacter component.\n characters.value[boxIndex] = value;\n\n // Update the model value (which is the code combined from all the characters).\n internalModelValue.value = characters.value.join(\"\");\n }\n\n /** Event handler for a codeBoxCharacter component being cleared. */\n function onClear(boxIndex: number): void {\n codeBoxCharacterControllers[boxIndex].clear();\n }\n\n /** Event handler for moving focus to a codeBoxCharacter component. */\n function onMove(boxIndex: number): void {\n codeBoxCharacterControllers[boxIndex].focus();\n }\n\n /** Event handler for a value being pasted into a codeBoxCharacter component. */\n function onPasteValues(value: string): void {\n // Modify the value if there are any modifiers present.\n if (props.modelModifiers?.capitalize) {\n value = value?.toLocaleUpperCase();\n }\n\n // Set all the characters to the pasted value after splitting it.\n characters.value = getMaxLengthCharacters(value.split(\"\"));\n }\n\n /**\n * Event handler for a codeBoxCharacter component completing.\n *\n * This can be sent from any of the codeBoxCharacter components if\n * it recognizes that the entire code has been entered.\n */\n function onComplete(): void {\n const code = characters.value.join(\"\");\n internalModelValue.value = code;\n emit(\"complete\", code);\n }\n\n /**\n * Event handler for a codeBoxCharacter component being ready.\n *\n * The codeBoxCharacter component will provide an object that can be used to control it.\n */\n function onReady(event: CodeBoxCharacterController): void {\n codeBoxCharacterControllers[event.boxIndex] = event;\n }\n\n //#endregion\n\n //#region Functions\n\n /**\n * Copies a source array and ensures the resulting array has `length === props.maxLength`.\n *\n * If the `source.length < props.maxLength`, then `\"\"` elements will be added.\n *\n * If the `source.length > props.maxLength`, then excess elements will be removed.\n */\n function getMaxLengthCharacters(source: string[]): string[] {\n if (source.length > props.maxLength) {\n // Truncate to match the max length of the code box.\n return source.slice(0, props.maxLength);\n }\n else if (source.length < props.maxLength) {\n const result = [...source];\n\n // Pad the array to match the maxLength of the code box.\n const charactersToInsert = props.maxLength - result.length;\n for (let i = 0; i < charactersToInsert; i++) {\n result.push(\"\");\n }\n\n return result;\n }\n else {\n return [...source];\n }\n }\n\n //#endregion\n\n //#region Watchers\n\n //#endregion\n\n onMounted(() => {\n // Try to focus on the first codeBoxCharacter component when this component is mounted.\n codeBoxCharacterControllers[0]?.focus();\n });\n</script>\n"],"names":["props","__props","emit","__emit","inputElement","ref","onPaste","_event","originalValue","value","onNextInput","event","pastedValue","length","maxLength","split","every","pastedCharacter","allowedChars","test","preventDefault","onKeydown","key","backspace","delete","enter","keyCode","isBackspace","charCode","isDelete","isEnter","boxIndex","ctrlKey","onInputChanged","target","inputEventListener","deregisteringInputEventHandler","removeEventListener","addEventListener","onMounted","focus","clear","styleInject","css","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","codeBoxCharacterControllers","internalModelValue","useVModelPassthrough","characters","getMaxLengthCharacters","modelValue","internalRules","computed","normalizeRules","rules","isRequired","includes","onCodeBoxCharacterUpdated","_props$modelModifiers","modelModifiers","capitalize","_value","toLocaleUpperCase","join","onClear","onMove","onPasteValues","_props$modelModifiers2","_value2","onComplete","code","onReady","source","slice","result","charactersToInsert","i","push","_codeBoxCharacterCont"],"mappings":"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","x_google_ignoreList":[1]}