Skip to content

Commit 12f2f7f

Browse files
author
Anh Le
authored
Merge pull request #8 from FrontLabsOfficial/next
0.2.3
2 parents 0660d1a + 21efadf commit 12f2f7f

File tree

10 files changed

+251
-2743
lines changed

10 files changed

+251
-2743
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ That's why `vue-tiny-validate` was born.
1818
## Features
1919

2020
- Easy. Come with familiar API and coherent documentation.
21-
- Tiny. No dependencies. Only **3KB** minified. **1.3KB** gzipped.
21+
- Tiny. Only **3.4KB** minified. **1.4KB** gzipped.
2222
- Flexible. Full control over everything.
2323
- Fully functional. Sync validation, async validation, etc supported.\
2424
- Compatible. Works with both Vue 2.6 and Vue 3.

docs/.vitepress/config.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
module.exports = {
22
title: 'vue-tiny-validate',
3-
description: 'Tiny (1KB gzipped) Vue 3 Validate Composition',
3+
description: 'Tiny Vue Validate Composition',
44
head: [
55
['meta', { property: 'og:title', content: 'vue-tiny-validate' }],
66
[
77
'meta',
88
{
99
property: 'og:description',
10-
content: 'Tiny (1KB gzipped) Vue 3 Validate Composition',
10+
content: 'Tiny Vue Validate Composition',
1111
},
1212
],
1313
],

docs/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ That's why `vue-tiny-validate` was born.
1818
## Features
1919

2020
- Easy. Come with familiar API and coherent documentation.
21-
- Tiny. No dependencies. Only **3KB** minified. **1.3KB** gzipped.
21+
- Tiny. Only **3.4KB** minified. **1.4KB** gzipped.
2222
- Flexible. Full control over everything.
2323
- Fully functional. Sync validation, async validation, etc supported.
2424
- Compatible. Works with both Vue 2.6 and Vue 3.

example/src/App.vue

Lines changed: 129 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
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

@@ -47,7 +47,7 @@
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

@@ -71,7 +71,7 @@
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

@@ -103,7 +103,7 @@
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

@@ -131,7 +131,7 @@
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

@@ -154,7 +154,7 @@
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

@@ -177,7 +177,7 @@
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

@@ -201,7 +201,7 @@
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

@@ -225,7 +225,7 @@
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

@@ -249,27 +249,111 @@
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">
@@ -291,7 +375,7 @@
291375
</template>
292376

293377
<script lang="ts">
294-
import { ref, reactive, defineComponent, computed } from 'vue';
378+
import { ref, reactive, defineComponent, computed, watch } from 'vue';
295379
import { JsonTreeView } from 'json-tree-view-vue3';
296380
import useValidate from 'vue-tiny-validate';
297381
import 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>

example/src/main.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createApp } from 'vue';
1+
import { createApp } from 'vue-demi';
22
import 'virtual:windi.css';
33
import './style.css';
44

example/src/style.css

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
input,
2-
select,
3-
textarea {
4-
@apply bg-white border px-3 py-2 leading-6 appearance-none mt-1 block w-full shadow-sm border-gray-300
1+
input[type='text'],
2+
select {
3+
@apply bg-white border px-3 py-2 leading-6 mt-1 block w-full shadow-sm border-gray-300
54
rounded-md sm:text-sm focus:ring-blue-500 focus:border-blue-500;
65
}
76

@@ -10,7 +9,7 @@ select {
109
background-position: right 0.5rem center;
1110
background-size: 1.5em 1.5em;
1211

13-
@apply bg-no-repeat pr-10;
12+
@apply bg-no-repeat pr-10 appearance-none;
1413
}
1514

1615
.base-button {
@@ -26,11 +25,11 @@ select {
2625
@apply text-xs absolute mt-0.5 block text-red-600;
2726
}
2827

29-
.form-input__error {
28+
.form-input__error[type='text'] {
3029
@apply border-red-500;
3130
}
3231

33-
.form-input__success {
32+
.form-input__success[type='text'] {
3433
@apply border-green-500;
3534
}
3635

0 commit comments

Comments
 (0)