|
6 | 6 | <!-- add field label -->
|
7 | 7 | <label class="label has-text-dark">{{ field.label }} <span v-if="field.required" class="has-text-danger">*</span></label>
|
8 | 8 | <!-- type = checkbox -->
|
9 |
| - <BulmaCheckRadio v-if="field.type=='checkbox'" checktype="checkbox" :disabled="action=='Edit' && readonlyColumns.includes(field.name)" v-model="editedItem[field.name]" :name="field.name" :label="field.placeholder"/> |
| 9 | + <BulmaCheckRadio v-if="field.type=='checkbox'" checktype="checkbox" :disabled="action=='Edit' && readonlyColumns.includes(field.name)" :type="{'is-danger is-block':v$.editedItem[field.name].$invalid}" v-model="editedItem[field.name]" :name="field.name" :label="field.placeholder"/> |
10 | 10 | <!-- <label v-if="field.type=='checkbox'" class="checkbox">
|
11 | 11 | <input v-if="field.type=='checkbox'" :disabled="readonlyColumns.includes(field.name)" :autofocus="index==0" :checked="editedItem[field.name]" v-model="editedItem[field.name]" :name="field.name" type="checkbox">
|
12 | 12 | {{ field.placeholder }}
|
13 | 13 | </label> -->
|
14 | 14 | <date-picker v-if="field.type=='datetime'"
|
15 | 15 | :type="field.dateType"
|
16 | 16 | value-type="format"
|
17 |
| - v-model="$v.editedItem[field.name].$model" |
| 17 | + v-model="v$.editedItem[field.name].$model" |
18 | 18 | >
|
19 | 19 | <template #input>
|
20 | 20 | <div :class="{'has-icons-left':!!field.icon}" class="control">
|
21 | 21 | <input
|
22 |
| - :class="{'is-danger':$v.editedItem[field.name].$invalid}" |
| 22 | + :class="{'is-danger':v$.editedItem[field.name].$invalid}" |
23 | 23 | class="input"
|
24 | 24 | :name="field.name"
|
25 |
| - v-model="$v.editedItem[field.name].$model" |
| 25 | + v-model="v$.editedItem[field.name].$model" |
26 | 26 | @change="evaluateDynamicFields(field.name)"
|
27 | 27 | :required="field.required"
|
28 | 28 | type="text"
|
|
36 | 36 |
|
37 | 37 | <BulmaAdvancedSelect
|
38 | 38 | v-if="field.type=='query' || field.type=='enum'"
|
39 |
| - :defaultValue="stringify($v.editedItem[field.name].$model,field)||field.default||''" |
| 39 | + :defaultValue="stringify(v$.editedItem[field.name].$model,field)||field.default||''" |
40 | 40 | :required="field.required||false"
|
41 | 41 | :multiple="false"
|
42 | 42 | :name="field.name"
|
43 | 43 | :placeholder="field.placeholder||'Select...'"
|
44 | 44 | :values="field.values||form[field.from]||[]"
|
45 |
| - :hasError="$v.editedItem[field.name].$invalid" |
| 45 | + :hasError="v$.editedItem[field.name].$invalid" |
46 | 46 | :isLoading="!field.values && !['fixed','variable'].includes(dynamicFieldStatus[field.from])"
|
47 |
| - v-model="$v.editedItem[field.name].$model" |
| 47 | + v-model="v$.editedItem[field.name].$model" |
48 | 48 | :icon="field.icon"
|
49 | 49 | :columns="field.columns||[]"
|
50 | 50 | :pctColumns="field.pctColumns||[]"
|
|
58 | 58 | </BulmaAdvancedSelect>
|
59 | 59 |
|
60 | 60 | <div v-if="!['datetime','checkbox','query','enum'].includes(field.type)" :class="{'has-icons-left':!!field.icon}" class="control">
|
61 |
| - <input v-if="field.type=='text' || field.type=='password'" :disabled="action=='Edit' && readonlyColumns.includes(field.name)" :autofocus="index==0" :class="{'is-danger':$v.editedItem[field.name].$invalid}" class="input" :type="field.type" v-model="$v.editedItem[field.name].$model" :placeholder="field.placeholder" :name="field.name"> |
| 61 | + <input v-if="field.type=='text' || field.type=='password'" :disabled="action=='Edit' && readonlyColumns.includes(field.name)" :autofocus="index==0" :class="{'is-danger':v$.editedItem[field.name].$invalid}" class="input" :type="field.type" v-model="v$.editedItem[field.name].$model" :placeholder="field.placeholder" :name="field.name"> |
62 | 62 | <input v-if="field.type=='number'" :disabled="action=='Edit' && readonlyColumns.includes(field.name)" :autofocus="index==0" class="input" type="number" v-model="editedItem[field.name]" :placeholder="field.placeholder" :name="field.name">
|
63 | 63 |
|
64 | 64 | <!-- add left icon, but not for query, because that's a component with icon builtin -->
|
|
67 | 67 | </span>
|
68 | 68 | </div>
|
69 | 69 |
|
70 |
| - <p class="has-text-danger" v-if="!$v.editedItem[field.name].required">This field is required</p> |
71 |
| - <p class="has-text-danger" v-if="'minLength' in $v.editedItem[field.name] && !$v.editedItem[field.name].minLength">Must be at least {{$v.editedItem[field.name].$params.minLength.min}} characters long</p> |
72 |
| - <p class="has-text-danger" v-if="'maxLength' in $v.editedItem[field.name] && !$v.editedItem[field.name].maxLength">Can not be more than {{$v.editedItem[field.name].$params.maxLength.max}} characters long</p> |
73 |
| - <p class="has-text-danger" v-if="'minValue' in $v.editedItem[field.name] && !$v.editedItem[field.name].minValue">Value cannot be lower than {{$v.editedItem[field.name].$params.minValue.min}}</p> |
74 |
| - <p class="has-text-danger" v-if="'maxValue' in $v.editedItem[field.name] && !$v.editedItem[field.name].maxValue">Value cannot be higher than {{$v.editedItem[field.name].$params.maxValue.max}}</p> |
75 |
| - <p class="has-text-danger" v-if="'regex' in $v.editedItem[field.name] && !$v.editedItem[field.name].regex">{{$v.editedItem[field.name].$params.regex.description}}</p> |
76 |
| - <p class="has-text-danger" v-if="'notIn' in $v.editedItem[field.name] && !$v.editedItem[field.name].notIn">{{$v.editedItem[field.name].$params.notIn.description}}</p> |
77 |
| - <p class="has-text-danger" v-if="'in' in $v.editedItem[field.name] && !$v.editedItem[field.name].in">{{$v.editedItem[field.name].$params.in.description}}</p> |
| 70 | + <p class="has-text-danger" v-if="field.required && v$.editedItem[field.name].required.$invalid && v$.editedItem[field.name].$errors.length>0">This field is required</p> |
| 71 | + <p class="has-text-danger" v-if="'minLength' in v$.editedItem[field.name] && v$.editedItem[field.name].minLength.$invalid">Must be at least {{v$.editedItem[field.name].minLength.$params.min}} characters long</p> |
| 72 | + <p class="has-text-danger" v-if="'maxLength' in v$.editedItem[field.name] && v$.editedItem[field.name].maxLength.$invalid">Can not be more than {{v$.editedItem[field.name].maxLength.$params.max}} characters long</p> |
| 73 | + <p class="has-text-danger" v-if="'minValue' in v$.editedItem[field.name] && v$.editedItem[field.name].minValue.$invalid">Value cannot be lower than {{v$.editedItem[field.name].minValue.$params.min}}</p> |
| 74 | + <p class="has-text-danger" v-if="'maxValue' in v$.editedItem[field.name] && v$.editedItem[field.name].maxValue.$invalid">Value cannot be higher than {{v$.editedItem[field.name].maxValue.$params.max}}</p> |
| 75 | + <p class="has-text-danger" v-if="'regex' in v$.editedItem[field.name] && v$.editedItem[field.name].regex.$invalid">{{v$.editedItem[field.name].regex.$params.description}}</p> |
| 76 | + <p class="has-text-danger" v-if="'notIn' in v$.editedItem[field.name] && v$.editedItem[field.name].notIn.$invalid">{{v$.editedItem[field.name].notIn.$params.description}}</p> |
| 77 | + <p class="has-text-danger" v-if="'in' in v$.editedItem[field.name] && v$.editedItem[field.name].in.$invalid">{{v$.editedItem[field.name].in.$params.description}}</p> |
78 | 78 |
|
79 | 79 | </div>
|
80 | 80 | </BulmaModal>
|
|
168 | 168 | <script>
|
169 | 169 | import Vue from 'vue'
|
170 | 170 | import BulmaModal from './BulmaModal.vue'
|
171 |
| - import Vuelidate from 'vuelidate' |
172 | 171 | import BulmaAdvancedSelect from './BulmaAdvancedSelect'
|
173 | 172 | import Helpers from './../lib/Helpers.js'
|
174 | 173 | import BulmaCheckRadio from './BulmaCheckRadio'
|
175 | 174 | import DatePicker from 'vue2-datepicker';
|
176 |
| - import 'vue2-datepicker/index.css'; |
177 |
| - import { required,minValue,maxValue,minLength,maxLength, helpers,requiredIf } from 'vuelidate/lib/validators' |
| 175 | + import 'vue2-datepicker/index.css'; |
| 176 | + import { useVuelidate } from '@vuelidate/core' |
| 177 | + import { minValue,maxValue,minLength,maxLength, helpers,requiredIf } from '@vuelidate/validators' |
178 | 178 |
|
179 |
| - Vue.use(Vuelidate) |
180 | 179 | export default{
|
181 | 180 | name:'BulmaEditTable',
|
182 | 181 | components:{BulmaModal,BulmaAdvancedSelect,BulmaCheckRadio,DatePicker},
|
|
213 | 212 | insertColumns:{type: Array},
|
214 | 213 | hasError:{type: Boolean}
|
215 | 214 | },
|
| 215 | + setup(){ |
| 216 | + return { v$: useVuelidate() } |
| 217 | + }, |
216 | 218 | data: function(){
|
217 | 219 | return {
|
218 | 220 | sort: {
|
|
238 | 240 | var attrs = {}
|
239 | 241 | var regexObj
|
240 | 242 | var description
|
241 |
| - attrs.required=requiredIf(function(){ |
242 |
| - return !!ff.required |
243 |
| - }) |
| 243 | + // required validation for simple fields |
| 244 | + if(ff.type!='checkbox' && ff.type!='enum'){ |
| 245 | + attrs.required=requiredIf(function(){ |
| 246 | + return !!ff.required |
| 247 | + }) |
| 248 | + } |
| 249 | + // required validation for expression field |
| 250 | + if((ff.type=="enum") && ff.required){ |
| 251 | + attrs.required=helpers.withParams( |
| 252 | + {description: "This field is required"}, |
| 253 | + (value) => (value!=undefined && value!=null && value!='__auto__' && value!='__none__' && value!='__all__') |
| 254 | + ) |
| 255 | + } |
| 256 | + // required validation for checkbox (MUST be true) |
| 257 | + if(ff.type=='checkbox' && ff.required){ |
| 258 | + attrs.required=helpers.withParams( |
| 259 | + {description: "This field is required"}, |
| 260 | + (value) => (value==true) |
| 261 | + ) |
| 262 | + } |
244 | 263 | if("minValue" in ff){ attrs.minValue=minValue(ff.minValue)}
|
245 | 264 | if("maxValue" in ff){ attrs.maxValue=maxValue(ff.maxValue)}
|
246 | 265 | if("minLength" in ff){ attrs.minLength=minLength(ff.minLength)}
|
|
395 | 414 | },
|
396 | 415 | saveItem:function(){
|
397 | 416 | var ref=this
|
| 417 | + this.v$.editedItem.$touch() |
398 | 418 | this.tableFields.forEach((item)=>{
|
399 | 419 | if(item.type=="query" || item.type=="enum"){
|
400 | 420 | if(!item.outputObject){
|
|
407 | 427 | }
|
408 | 428 | }
|
409 | 429 | })
|
410 |
| - if(!this.$v.editedItem.$invalid){ |
| 430 | + if(!this.v$.editedItem.$invalid){ |
411 | 431 | if(this.action=="Add"){
|
412 | 432 | if(this.insert_marker){
|
413 | 433 | Vue.set(this.editedItem,this.insert_marker,true)
|
|
0 commit comments