Remove textarea+ & Form.send()

Add $clearValidationForName()
This commit is contained in:
cgfhtw
2024-02-01 08:58:32 +01:00
parent 2dbdf41086
commit 51e556a731
2 changed files with 17 additions and 53 deletions
+5 -43
View File
@@ -9,7 +9,8 @@ export default {
$registerToForm: component => {
if (this.inputs.indexOf(component) < 0)
this.inputs.push(component);
}
},
$clearValidationForName: this.clearValidationForName
};
},
props: {
@@ -110,48 +111,9 @@ export default {
clearValidation() {
this.inputs.forEach(input => input.clearValidation());
},
send(promise) {
return new Promise((resolve, reject) => {
promise.then(result => {
if (result?.status == 200 && result.data) {
if (typeof result.data !== 'object' || !result.data.hasOwnProperty('retval'))
// TODO(chris): IMPLEMENT! Error in API
return reject(result);
if (result.data.error)
// TODO(chris): IMPLEMENT! Error in API
return reject(result);
const data = result.data.retval;
// TODO(chris): check for something better/add new standardized return value
if (result.data.code == 1)
this.setFeedback(true, data);
return resolve(data);
}
// TODO(chris): IMPLEMENT! Wrong result object
reject(result);
}).catch(result => {
if (result?.response?.status == 400 && result.response.data) {
if (typeof result.response.data !== 'object' || !result.response.data.hasOwnProperty('retval'))
// TODO(chris): IMPLEMENT! Error in API
return reject(result);
this.clearValidation();
const remaining = this.setFeedback(
false,
result.response.data.retval
);
if (remaining) {
result.response.data.retval = remaining;
return reject(result);
}
} else if (result?.response?.status == 500) {
if (this.$fhcAlert)
this.$fhcAlert.handleSystemError(result);
else
return reject(result);
} else {
return reject(result);
}
});
});
clearValidationForName(name) {
(this.sortedInputs[name.split('.')[0] + name.split('.').slice(1).map(p => `[${p}]`).join("")] || this.sortedInputs['_default'] || [])
.forEach(input => input.clearValidation());
}
},
template: `
+12 -10
View File
@@ -8,7 +8,8 @@ export default {
FhcFragment
},
inject: [
'$registerToForm'
'$registerToForm',
'$clearValidationForName'
],
props: {
bsFeedback: Boolean,
@@ -126,7 +127,6 @@ export default {
case 'number':
case 'password':
case 'textarea':
case 'textarea+':
if (!c.includes('form-control'))
classes.push('form-control');
break;
@@ -180,6 +180,9 @@ export default {
this.valid = undefined;
this.feedback = [];
},
clearValidationForThisName() {
this.$clearValidationForName(this.name);
},
setFeedback(valid, feedback) {
if (!feedback)
feedback = [];
@@ -213,9 +216,9 @@ export default {
template: `
<component :is="!hasContainer ? 'FhcFragment' : 'div'" class="position-relative" :class="autoContainerClass">
<label v-if="$attrs.label && lcType != 'radio' && lcType != 'checkbox'" :for="idCmp">{{$attrs.label}}</label>
<input v-if="tag == 'input'" :type="lcType" ref="input" v-model="modelValueCmp" v-bind="$attrs" :id="idCmp" :name="name" :class="validationClass" :modelValue="undefined" @input="clearValidation(); $emit('input', $event)">
<textarea v-else-if="tag == 'textarea'" ref="input" v-model="modelValueCmp" v-bind="$attrs" :id="idCmp" :name="name" :class="validationClass" :modelValue="undefined" @input="clearValidation(); $emit('input', $event)"></textarea>
<select v-else-if="tag == 'select'" ref="input" v-model="modelValueCmp" v-bind="$attrs" :id="idCmp" :name="name" :class="validationClass" :modelValue="undefined" @input="clearValidation(); $emit('input', $event)">
<input v-if="tag == 'input'" :type="lcType" ref="input" v-model="modelValueCmp" v-bind="$attrs" :id="idCmp" :name="name" :class="validationClass" :modelValue="undefined" @input="clearValidationForThisName(); $emit('input', $event)">
<textarea v-else-if="tag == 'textarea'" ref="input" v-model="modelValueCmp" v-bind="$attrs" :id="idCmp" :name="name" :class="validationClass" :modelValue="undefined" @input="clearValidationForThisName(); $emit('input', $event)"></textarea>
<select v-else-if="tag == 'select'" ref="input" v-model="modelValueCmp" v-bind="$attrs" :id="idCmp" :name="name" :class="validationClass" :modelValue="undefined" @input="clearValidationForThisName(); $emit('input', $event)">
<slot></slot>
</select>
<component
@@ -230,7 +233,7 @@ export default {
:class="validationClass"
:input-class-name=
"[...Object.entries({'form-control': !noAutoClass, 'is-valid': valid === true, 'is-invalid': valid === false}).reduce((a,[k,v]) => {if(v) a.push(k);return a}, []), ...($attrs['input-class-name'] ? $attrs['input-class-name'].split(' ') : [])].join(' ')"
@update:model-value="clearValidation"
@update:model-value="clearValidationForThisName"
>
<slot></slot>
</component>
@@ -245,7 +248,7 @@ export default {
:input-props="{name}"
:class="validationClass"
:input-class="[...Object.entries({'form-control': !noAutoClass, 'is-valid': valid === true, 'is-invalid': valid === false}).reduce((a,[k,v]) => {if(v) a.push(k);return a}, []), ...($attrs['input-class'] ? $attrs['input-class'].split(' ') : [])].join(' ')"
@update:model-value="clearValidation"
@update:model-value="clearValidationForThisName"
>
<slot></slot>
</component>
@@ -261,7 +264,7 @@ export default {
:class="validationClass"
:input-class="validationClass"
:no-list="inputGroup"
@update:model-value="clearValidation"
@update:model-value="clearValidationForThisName"
>
<slot></slot>
</component>
@@ -275,12 +278,11 @@ export default {
:id="idCmp"
:name="name"
:class="validationClass"
@update:model-value="clearValidation"
@update:model-value="clearValidationForThisName"
>
<slot></slot>
</component>
<label v-if="$attrs.label && (lcType == 'radio' || lcType == 'checkbox')" :for="idCmp" :class="!noAutoClass && 'form-check-label'">{{$attrs.label}}</label>
<div v-if="lcType == 'textarea' && $attrs.maxlength" class="form-text text-end">{{ modelValueCmp?.length || 0 }} / {{ $attrs.maxlength }}</div>
<div v-if="valid !== undefined && feedback.length && !noFeedback" :class="feedbackClass">
<template v-for="(msg, i) in feedback" :key="i">
<hr v-if="i" class="m-0">