2323 }"
2424 />
2525 <span v-if =" result.firstName.$invalid" class =" form-item--message" >
26- {{ result.firstName.$messages[0] }}
26+ {{ result.firstName.$messages.join(' | ') }}
2727 </span >
2828 </div >
2929
4747 }"
4848 />
4949 <span v-if =" result.lastName.$invalid" class =" form-item--message" >
50- {{ result.lastName.$messages[0] }}
50+ {{ result.lastName.$messages.join(' | ') }}
5151 </span >
5252 </div >
5353
7171 }"
7272 />
7373 <span v-if =" result.email.$invalid" class =" form-item--message" >
74- {{ result.email.$messages[0] }}
74+ {{ result.email.$messages.join(' | ') }}
7575 </span >
7676 </div >
7777
103103 v-if =" result.address.country.$invalid"
104104 class =" form-item--message"
105105 >
106- {{ result.address.country.$messages[0] }}
106+ {{ result.address.country.$messages.join(' | ') }}
107107 </span >
108108 </div >
109109
131131 v-if =" result.address.street.$invalid"
132132 class =" form-item--message"
133133 >
134- {{ result.address.street.$messages[0] }}
134+ {{ result.address.street.$messages.join(' | ') }}
135135 </span >
136136 </div >
137137
154154 v-if =" result.address.city.$invalid"
155155 class =" form-item--message"
156156 >
157- {{ result.firstName. $messages[0] }}
157+ {{ result.address.city. $messages.join(' | ') }}
158158 </span >
159159 </div >
160160
177177 v-if =" result.address.state.$invalid"
178178 class =" form-item--message"
179179 >
180- {{ result.address.state.$messages[0] }}
180+ {{ result.address.state.$messages.join(' | ') }}
181181 </span >
182182 </div >
183183
201201 }"
202202 />
203203 <span v-if =" result.address.zip.$invalid" class =" form-item--message" >
204- {{ result.address.zip.$messages[0] }}
204+ {{ result.address.zip.$messages.join(' | ') }}
205205 </span >
206206 </div >
207207
225225 }"
226226 />
227227 <span v-if =" result.password.p1.$invalid" class =" form-item--message" >
228- {{ result.password.p1.$messages[0] }}
228+ {{ result.password.p1.$messages.join(' | ') }}
229229 </span >
230230 </div >
231231
249249 }"
250250 />
251251 <span v-if =" result.password.p2.$invalid" class =" form-item--message" >
252- {{ result.password.p2.$messages[0] }}
252+ {{ result.password.p2.$messages.join(' | ') }}
253253 </span >
254254 </div >
255255 </div >
256256 </div >
257- <div class =" px-4 py-3 bg-gray-100 text-right sm:px-6 form-item" >
258- <button class =" base-button text-blue-600 !shadow-none" @click =" reset" >
259- Reset
260- </button >
261- <button
262- @click =" validate"
263- class ="
264- base-button
265- text-white
266- bg-blue-600
267- hover:bg-blue-700
268- focus:ring-blue-500
269- "
270- >
271- Validate
272- </button >
257+ <div
258+ class ="
259+ px-4
260+ py-3
261+ bg-gray-100
262+ form-item
263+ gap-4
264+ flex flex-col
265+ sm:px-6
266+ md:flex-row
267+ md:justify-between
268+ md:items-center
269+ "
270+ >
271+ <div class =" flex flex-col md:flex-row gap-4" >
272+ <div class =" flex items-center" >
273+ <input
274+ type =" checkbox"
275+ id =" autoTest"
276+ class =" mr-1"
277+ v-model =" options.autoTest"
278+ />
279+ <label
280+ for =" autoTest"
281+ class =" block text-sm font-medium text-gray-700"
282+ >
283+ Auto test
284+ </label >
285+ </div >
286+ <div class =" flex items-center" >
287+ <input
288+ type =" checkbox"
289+ id =" autoTouch"
290+ class =" mr-1"
291+ v-model =" options.autoTouch"
292+ />
293+ <label
294+ for =" autoTouch"
295+ class =" block text-sm font-medium text-gray-700"
296+ >
297+ Auto touch
298+ </label >
299+ </div >
300+ <div class =" flex items-center" >
301+ <input
302+ type =" checkbox"
303+ id =" lazy"
304+ class =" mr-1"
305+ v-model =" options.lazy"
306+ />
307+ <label for =" lazy" class =" block text-sm font-medium text-gray-700" >
308+ Lazy
309+ </label >
310+ </div >
311+ <div class =" flex items-center" >
312+ <input
313+ type =" checkbox"
314+ id =" firstError"
315+ class =" mr-1"
316+ v-model =" options.firstError"
317+ />
318+ <label
319+ for =" firstError"
320+ class =" block text-sm font-medium text-gray-700"
321+ >
322+ First error
323+ </label >
324+ </div >
325+ <div class =" flex items-center" >
326+ <input
327+ type =" checkbox"
328+ id =" touchOnTest"
329+ class =" mr-1"
330+ v-model =" options.touchOnTest"
331+ />
332+ <label
333+ for =" touchOnTest"
334+ class =" block text-sm font-medium text-gray-700"
335+ >
336+ Touch on test
337+ </label >
338+ </div >
339+ </div >
340+ <div class =" text-right" >
341+ <button class =" base-button text-blue-600 !shadow-none" @click =" reset" >
342+ Reset
343+ </button >
344+ <button
345+ @click =" validate"
346+ class ="
347+ base-button
348+ text-white
349+ bg-blue-600
350+ hover:bg-blue-700
351+ focus:ring-blue-500
352+ "
353+ >
354+ Validate
355+ </button >
356+ </div >
273357 </div >
274358 </div >
275359 <div class =" shadow bg-white rounded px-4 py-5" >
291375</template >
292376
293377<script lang="ts">
294- import { ref , reactive , defineComponent , computed } from ' vue' ;
378+ import { ref , reactive , defineComponent , computed , watch } from ' vue' ;
295379import { JsonTreeView } from ' json-tree-view-vue3' ;
296380import useValidate from ' vue-tiny-validate' ;
297381import cloneDeep from ' lodash/cloneDeep' ;
@@ -321,6 +405,14 @@ export default defineComponent({
321405
322406 const info = ref (cloneDeep (defaultInfo ));
323407
408+ const options = reactive ({
409+ autoTest: false ,
410+ autoTouch: false ,
411+ lazy: false ,
412+ firstError: false ,
413+ touchOnTest: false ,
414+ });
415+
324416 const rules = computed (() => {
325417 const requiredCheck = (value : string ): boolean => value !== ' ' ;
326418
@@ -332,15 +424,15 @@ export default defineComponent({
332424 const cityCheck = (value : string ): Promise <boolean > => {
333425 return new Promise (resolve => {
334426 return setTimeout (() => {
335- resolve (true );
427+ resolve (/ [ a-z ] / . test ( value ) );
336428 }, 2000 );
337429 });
338430 };
339431
340432 const stateCheck = async (value : string ): Promise <boolean > => {
341433 const result: boolean = await new Promise (resolve =>
342434 setTimeout (() => {
343- resolve (true );
435+ resolve (/ [ a-z ] / . test ( value ) );
344436 }, 2000 ),
345437 );
346438
@@ -363,13 +455,13 @@ export default defineComponent({
363455
364456 const city = {
365457 test: cityCheck ,
366- message: ' City is not correct ' ,
458+ message: ' City must be a string ' ,
367459 name: ' city' ,
368460 };
369461
370462 const state = {
371463 test: stateCheck ,
372- message: ' State is not correct ' ,
464+ message: ' State must be a string ' ,
373465 name: ' state' ,
374466 };
375467
@@ -404,7 +496,7 @@ export default defineComponent({
404496 };
405497 });
406498
407- const { result } = useValidate (info , rules );
499+ const { result } = useValidate (info , rules , options );
408500
409501 const validate = async () => {
410502 await result .value .$test ();
@@ -417,7 +509,11 @@ export default defineComponent({
417509 console .log (' Resetted!' );
418510 };
419511
420- return { info , result , validate , reset };
512+ watch (options , () => {
513+ info .value = cloneDeep (defaultInfo );
514+ });
515+
516+ return { info , options , result , validate , reset };
421517 },
422518});
423519 </script >
0 commit comments