PluginProbe
The Innovative Form Builder – IvyForms / 1.0
The Innovative Form Builder – IvyForms v1.0
1.5.1 1.5 1.4.1 1.4 trunk 0.1.2 0.2 0.2.1 0.3 0.3.1 0.4 0.5 0.6 0.6.1 0.6.1-backup 0.6.1.1 0.7 0.8 0.8.1 0.8.2 0.9 0.9.1 1.0 1.1 1.1.1 All 27 releases
ivyforms / frontend / src / views / public / fields / ParagraphFormField.vue

ParagraphFormField.vue in The Innovative Form Builder – IvyForms 1.0, at frontend/src/views/public/fields/ParagraphFormField.vue

116 lines 2.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <template>
2 <div
3 :class="[
4 'ivyforms-field ivyforms-field__textarea',
5 'ivyforms-field__textarea_' + field.id,
6 field.cssClasses,
7 { 'is-readonly': !!field.readOnly },
8 ]"
9 >
10 <IvyFormItem
11 :label="field.hideLabel ? '' : field.label"
12 :required="field.required"
13 :error="error"
14 :prop="field.type + '_' + field.fieldIndex"
15 :show-info="!!field.description"
16 :info-text="field.description || ''"
17 :label-position="field.labelPosition"
18 :show-info-icon="false"
19 >
20 <IvyTextInput
21 :id="fieldID"
22 v-model="localModelValue"
23 class="ivyforms-field__textarea-input"
24 type="textarea"
25 :aria-label="field.label"
26 :placeholder="field.placeholder"
27 :disabled="isDisabled"
28 :readonly="field.readOnly"
29 :required="field.required"
30 :rows="field.rows || 3"
31 :maxlength="field.limitMaxLength ? field.maxLength : undefined"
32 />
33 </IvyFormItem>
34 </div>
35 </template>
36
37 <script setup lang="ts">
38 import { computed, inject } from 'vue'
39
40 interface Field {
41 id: number
42 formId: number
43 fieldIndex: number
44 type: string
45 label: string
46 placeholder?: string
47 required?: boolean
48 hideLabel?: boolean
49 readOnly?: boolean
50 description?: string
51 cssClasses?: string
52 rows?: number
53 limitMaxLength?: boolean
54 maxLength?: number
55 labelPosition?: string
56 noDuplicates?: boolean
57 // Any other field properties from your data
58 }
59 interface FieldProps {
60 modelValue: string | number | null | undefined
61 field: Field
62 disabled?: boolean
63 error?: string
64 }
65
66 const props = withDefaults(defineProps<FieldProps>(), {
67 modelValue: '',
68 disabled: false,
69 error: '',
70 })
71
72 const emit = defineEmits(['update:modelValue'])
73
74 const isDisabled = computed(() => !!props.disabled || !!props.field.readOnly)
75
76 // Inject clearFieldError function from parent
77 const clearFieldError = inject<(fieldKey: string) => void>('clearFieldError', () => {})
78
79 // Generate field key for clearing errors
80 const fieldKey = computed(() => {
81 return props.field.type + '_' + props.field.fieldIndex
82 })
83
84 // Handle input event to clear errors when user starts typing
85 const handleInput = (value: string | number | null | undefined) => {
86 emit('update:modelValue', value)
87 clearFieldError(fieldKey.value)
88 }
89
90 const localModelValue = computed({
91 get() {
92 return props.modelValue
93 },
94 set(value) {
95 handleInput(value)
96 },
97 })
98 // Generate unique field ID as a string
99 const fieldID = computed(() => {
100 return `ivyforms-field__paragraph-input_${props.field.formId || ''}_${props.field.fieldIndex || ''}`
101 })
102 </script>
103
104 <style scoped lang="scss">
105 .ivyforms-field__textarea {
106 &.is-readonly {
107 :deep(.el-textarea__inner),
108 :deep(.el-textarea__inner:hover),
109 :deep(.el-textarea__inner.is-focus) {
110 border-color: var(--map-base-dusk-stroke--2) !important;
111 box-shadow: none !important;
112 }
113 }
114 }
115 </style>
116