diff options
Diffstat (limited to 'src/components/FormatTransformer.vue')
-rw-r--r-- | src/components/FormatTransformer.vue | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/components/FormatTransformer.vue b/src/components/FormatTransformer.vue new file mode 100644 index 0000000..dea5d56 --- /dev/null +++ b/src/components/FormatTransformer.vue @@ -0,0 +1,57 @@ +<template> + <n-form-item :label="inputLabel" v-bind="validationAttrs"> + <n-input + ref="inputElement" + v-model:value="input" + :placeholder="inputPlaceholder" + type="textarea" + rows="20" + autocomplete="off" + autocorrect="off" + autocapitalize="off" + spellcheck="false" + :input-props="{ 'data-test-id': 'input' }" + /> + </n-form-item> + <n-form-item :label="outputLabel"> + <textarea-copyable :value="output" :language="outputLanguage" :follow-height-of="inputElement" /> + </n-form-item> +</template> + +<script setup lang="ts"> +import { useValidation, type UseValidationRule } from '@/composable/validation'; +import _ from 'lodash'; + +const props = withDefaults( + defineProps<{ + transformer?: (v: string) => string; + inputValidationRules?: UseValidationRule<string>[]; + inputLabel?: string; + inputPlaceholder?: string; + inputDefault?: string; + outputLabel?: string; + outputLanguage?: string; + }>(), + { + transformer: _.identity, + inputValidationRules: () => [], + inputLabel: 'Input', + inputDefault: '', + inputPlaceholder: 'Input...', + outputLabel: 'Output', + outputLanguage: '', + }, +); + +const { transformer, inputValidationRules, inputLabel, outputLabel, outputLanguage, inputPlaceholder, inputDefault } = + toRefs(props); + +const inputElement = ref(); + +const input = ref(inputDefault.value); +const output = computed(() => transformer.value(input.value)); + +const { attrs: validationAttrs } = useValidation({ source: input, rules: inputValidationRules.value }); +</script> + +<style scoped></style> |