aboutsummaryrefslogtreecommitdiff
path: root/src/components/FormatTransformer.vue
blob: dea5d56ae02d97a72d2aed2438d852758ad73c73 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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>