@veritree/ui 0.19.2-21 → 0.19.2-23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/components/Alert/VTAlert.vue +55 -14
- package/src/components/Dialog/VTDialog.vue +13 -17
- package/src/components/Dialog/VTDialogClose.vue +13 -19
- package/src/components/Dialog/VTDialogContent.vue +17 -12
- package/src/components/Dialog/VTDialogFooter.vue +9 -14
- package/src/components/Dialog/VTDialogHeader.vue +11 -13
- package/src/components/Dialog/VTDialogMain.vue +6 -13
- package/src/components/Dialog/VTDialogOverlay.vue +9 -13
- package/src/components/Dialog/VTDialogTitle.vue +8 -5
- package/src/components/Disclosure/VTDisclosureHeader.vue +1 -1
- package/src/components/DropdownMenu/VTDropdownMenu.vue +19 -0
- package/src/components/DropdownMenu/VTDropdownMenuContent.vue +14 -6
- package/src/components/DropdownMenu/VTDropdownMenuDivider.vue +7 -16
- package/src/components/DropdownMenu/VTDropdownMenuItem.vue +3 -7
- package/src/components/DropdownMenu/VTDropdownMenuLabel.vue +1 -10
- package/src/components/DropdownMenu/VTDropdownMenuTrigger.vue +4 -9
- package/src/components/Listbox/VTListboxItem.vue +0 -1
- package/src/components/Popover/VTPopover.vue +19 -0
- package/src/components/ProgressBar/VTProgressBar.vue +21 -3
- package/src/components/Skeleton/VTSkeleton.vue +11 -0
- package/src/components/Skeleton/VTSkeletonItem.vue +9 -0
- package/src/components/Tabs/VTTab.vue +13 -11
- package/src/components/Tooltip/VTTooltip.vue +65 -0
- package/src/components/Tooltip/VTTooltipContent.vue +59 -0
- package/src/components/Tooltip/VTTooltipTrigger.vue +98 -0
- package/src/components/Utils/FloatingUi.vue +6 -0
- package/src/components/Input/VTInput.vue +0 -82
- package/src/components/Input/VTInputDate.vue +0 -36
- package/src/components/Input/VTInputFile.vue +0 -60
- package/src/components/Input/VTInputUpload.vue +0 -54
|
@@ -24,14 +24,13 @@ export default {
|
|
|
24
24
|
hasPopup: false,
|
|
25
25
|
controls: null,
|
|
26
26
|
trigger: null,
|
|
27
|
-
id: null,
|
|
28
27
|
};
|
|
29
28
|
},
|
|
30
29
|
|
|
31
30
|
computed: {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
id() {
|
|
32
|
+
return `dropdown-menu-trigger-${this.apiDropdownMenu().id}`;
|
|
33
|
+
},
|
|
35
34
|
|
|
36
35
|
componentContent() {
|
|
37
36
|
return this.apiDropdownMenu().componentContent;
|
|
@@ -57,8 +56,6 @@ export default {
|
|
|
57
56
|
},
|
|
58
57
|
|
|
59
58
|
mounted() {
|
|
60
|
-
this.id = `dropdown-menu-trigger-${this.apiDropdownMenu().id}`;
|
|
61
|
-
|
|
62
59
|
const trigger = {
|
|
63
60
|
id: this.id,
|
|
64
61
|
el: this.$el,
|
|
@@ -92,9 +89,7 @@ export default {
|
|
|
92
89
|
* errors related to adding the event listener.
|
|
93
90
|
*/
|
|
94
91
|
addTriggerEvents() {
|
|
95
|
-
this.trigger.addEventListener('click',
|
|
96
|
-
this.onClick(e);
|
|
97
|
-
});
|
|
92
|
+
this.trigger.addEventListener('click', this.onClick);
|
|
98
93
|
},
|
|
99
94
|
|
|
100
95
|
init(e) {
|
|
@@ -48,11 +48,30 @@ export default {
|
|
|
48
48
|
type: Boolean,
|
|
49
49
|
default: false,
|
|
50
50
|
},
|
|
51
|
+
placement: {
|
|
52
|
+
type: String,
|
|
53
|
+
default: 'bottom-start',
|
|
54
|
+
},
|
|
51
55
|
},
|
|
52
56
|
|
|
53
57
|
data() {
|
|
54
58
|
return {
|
|
55
59
|
componentId: genId(),
|
|
60
|
+
/**
|
|
61
|
+
* Explaining the need for the floatingUiMinWidth data
|
|
62
|
+
*
|
|
63
|
+
* The floating ui is a result of two items:
|
|
64
|
+
*
|
|
65
|
+
* 1. Trigger: the action button
|
|
66
|
+
* 2. Content: the popper/wrapper that appears after triggering the action button
|
|
67
|
+
*
|
|
68
|
+
* By default, the content will match the triggers width.
|
|
69
|
+
* The problem with this is that the trigger width
|
|
70
|
+
* might be too small causing the content to not fit
|
|
71
|
+
* what is inside it properly. So, to avoid this,
|
|
72
|
+
* a min width is needed.
|
|
73
|
+
*/
|
|
74
|
+
floatingUiMinWidth: 200,
|
|
56
75
|
};
|
|
57
76
|
},
|
|
58
77
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
]"
|
|
8
8
|
role="progressbar"
|
|
9
9
|
aria-valuemin="0"
|
|
10
|
-
aria-valuemax="
|
|
10
|
+
:aria-valuemax="max"
|
|
11
11
|
:aria-valuenow="value"
|
|
12
12
|
:aria-label="label"
|
|
13
13
|
>
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
:class="[
|
|
16
16
|
headless
|
|
17
17
|
? 'progress-bar__indicator'
|
|
18
|
-
: 'absolute left-0 h-full
|
|
18
|
+
: 'bg-secondary-200 absolute left-0 h-full transition-all',
|
|
19
19
|
]"
|
|
20
|
-
:style="{ width: `${
|
|
20
|
+
:style="{ width: `${percentageComputed}%` }"
|
|
21
21
|
></div>
|
|
22
22
|
</div>
|
|
23
23
|
</template>
|
|
@@ -37,6 +37,24 @@ export default {
|
|
|
37
37
|
type: [String, Number],
|
|
38
38
|
default: 0,
|
|
39
39
|
},
|
|
40
|
+
max: {
|
|
41
|
+
type: [String, Number],
|
|
42
|
+
default: 100,
|
|
43
|
+
},
|
|
44
|
+
percentage: {
|
|
45
|
+
type: [String, Number],
|
|
46
|
+
default: null,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
computed: {
|
|
51
|
+
percentageComputed() {
|
|
52
|
+
if (typeof this.percentage !== 'undefined' && this.percentage !== null) {
|
|
53
|
+
return this.percentage;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return (this.value / this.max) * 100;
|
|
57
|
+
},
|
|
40
58
|
},
|
|
41
59
|
};
|
|
42
60
|
</script>
|
|
@@ -18,11 +18,11 @@
|
|
|
18
18
|
]"
|
|
19
19
|
role="tab"
|
|
20
20
|
type="button"
|
|
21
|
-
@click.stop="onClick"
|
|
21
|
+
@click.prevent.stop="onClick"
|
|
22
22
|
@keydown="onKeyDown"
|
|
23
23
|
@blur="onBlur"
|
|
24
24
|
>
|
|
25
|
-
<slot></slot>
|
|
25
|
+
<slot :selected="selected"></slot>
|
|
26
26
|
</button>
|
|
27
27
|
</template>
|
|
28
28
|
|
|
@@ -32,7 +32,7 @@ import { keys } from '../../utils/keyboard';
|
|
|
32
32
|
export default {
|
|
33
33
|
name: 'VTTabItem',
|
|
34
34
|
|
|
35
|
-
inject: ['
|
|
35
|
+
inject: ['api'],
|
|
36
36
|
|
|
37
37
|
props: {
|
|
38
38
|
headless: {
|
|
@@ -43,6 +43,7 @@ export default {
|
|
|
43
43
|
|
|
44
44
|
data() {
|
|
45
45
|
return {
|
|
46
|
+
api: this.api(),
|
|
46
47
|
index: null,
|
|
47
48
|
indexFocus: null,
|
|
48
49
|
selected: false,
|
|
@@ -56,11 +57,11 @@ export default {
|
|
|
56
57
|
},
|
|
57
58
|
|
|
58
59
|
mounted() {
|
|
59
|
-
this.
|
|
60
|
+
this.api.registerTab(this);
|
|
60
61
|
},
|
|
61
62
|
|
|
62
63
|
beforeUnmount() {
|
|
63
|
-
this.
|
|
64
|
+
this.api.unregisterTab(this.index);
|
|
64
65
|
},
|
|
65
66
|
|
|
66
67
|
methods: {
|
|
@@ -77,11 +78,11 @@ export default {
|
|
|
77
78
|
},
|
|
78
79
|
|
|
79
80
|
focusFirstTab() {
|
|
80
|
-
this.
|
|
81
|
+
this.api.focusTab(0);
|
|
81
82
|
},
|
|
82
83
|
|
|
83
84
|
focusLastTab(lastTabIndex) {
|
|
84
|
-
this.
|
|
85
|
+
this.api.focusTab(lastTabIndex);
|
|
85
86
|
},
|
|
86
87
|
|
|
87
88
|
focusPreviousTab(lastTabIndex) {
|
|
@@ -90,7 +91,7 @@ export default {
|
|
|
90
91
|
return;
|
|
91
92
|
}
|
|
92
93
|
|
|
93
|
-
this.
|
|
94
|
+
this.api.focusTab(this.indexFocus - 1);
|
|
94
95
|
},
|
|
95
96
|
|
|
96
97
|
focusNextTab(lastTabIndex) {
|
|
@@ -99,17 +100,18 @@ export default {
|
|
|
99
100
|
return;
|
|
100
101
|
}
|
|
101
102
|
|
|
102
|
-
this.
|
|
103
|
+
this.api.focusTab(this.indexFocus + 1);
|
|
103
104
|
},
|
|
104
105
|
|
|
105
106
|
onClick() {
|
|
106
|
-
this.
|
|
107
|
+
this.api.selectTab(this.index);
|
|
107
108
|
this.$emit('change');
|
|
109
|
+
this.$emit('click');
|
|
108
110
|
},
|
|
109
111
|
|
|
110
112
|
onKeyDown(event) {
|
|
111
113
|
const key = event.key;
|
|
112
|
-
const lastTabIndex = this.
|
|
114
|
+
const lastTabIndex = this.api.getTabsLength() - 1;
|
|
113
115
|
|
|
114
116
|
if (this.indexFocus === null) {
|
|
115
117
|
this.indexFocus = this.index;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div>
|
|
3
|
+
<slot />
|
|
4
|
+
</div>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script>
|
|
8
|
+
import { floatingUiMixin } from '../../../mixins/floating-ui';
|
|
9
|
+
import { genId } from '../../utils/ids';
|
|
10
|
+
|
|
11
|
+
export default {
|
|
12
|
+
name: 'VTTooltip',
|
|
13
|
+
|
|
14
|
+
mixins: [floatingUiMixin],
|
|
15
|
+
|
|
16
|
+
props: {
|
|
17
|
+
delayDuration: {
|
|
18
|
+
type: [String, Number],
|
|
19
|
+
default: 500,
|
|
20
|
+
},
|
|
21
|
+
placement: {
|
|
22
|
+
type: String,
|
|
23
|
+
default: 'bottom',
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
data() {
|
|
28
|
+
return {
|
|
29
|
+
floatingUiMinWidth: 0,
|
|
30
|
+
};
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
provide() {
|
|
34
|
+
return {
|
|
35
|
+
apiTooltip: () => {
|
|
36
|
+
const registerTrigger = (trigger) => {
|
|
37
|
+
if (!trigger) return;
|
|
38
|
+
this.componentTrigger = trigger;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const registerContent = (content) => {
|
|
42
|
+
if (!content) return;
|
|
43
|
+
this.componentContent = content;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
id: this.componentId,
|
|
48
|
+
component: this.component,
|
|
49
|
+
componentTrigger: this.componentTrigger,
|
|
50
|
+
componentContent: this.componentContent,
|
|
51
|
+
delayDuration: this.delayDuration,
|
|
52
|
+
registerTrigger,
|
|
53
|
+
registerContent,
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
data() {
|
|
60
|
+
return {
|
|
61
|
+
componentId: genId(),
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
</script>
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<FloatingUi
|
|
3
|
+
:id="id"
|
|
4
|
+
:visible="visible"
|
|
5
|
+
:headless="headless"
|
|
6
|
+
component="tooltip"
|
|
7
|
+
>
|
|
8
|
+
<slot></slot>
|
|
9
|
+
</FloatingUi>
|
|
10
|
+
</template>
|
|
11
|
+
|
|
12
|
+
<script>
|
|
13
|
+
import { floatingUiContentMixin } from '../../../mixins/floating-ui-content';
|
|
14
|
+
|
|
15
|
+
export default {
|
|
16
|
+
name: 'VTTooltipContent',
|
|
17
|
+
|
|
18
|
+
inheritAttrs: false,
|
|
19
|
+
|
|
20
|
+
mixins: [floatingUiContentMixin],
|
|
21
|
+
|
|
22
|
+
inject: ['apiTooltip'],
|
|
23
|
+
|
|
24
|
+
data() {
|
|
25
|
+
return {
|
|
26
|
+
visible: false,
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
computed: {
|
|
31
|
+
id() {
|
|
32
|
+
return `tooltip-content-${this.apiTooltip().id}`;
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
component() {
|
|
36
|
+
return this.apiTooltip().component;
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
componentTrigger() {
|
|
40
|
+
return this.apiTooltip().componentTrigger;
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
ariaLabelledby() {
|
|
44
|
+
if (!this.componentTrigger) return null;
|
|
45
|
+
return this.visible ? this.componentTrigger.id : null;
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
mounted() {
|
|
50
|
+
const content = {
|
|
51
|
+
id: this.id,
|
|
52
|
+
hide: this.hide,
|
|
53
|
+
show: this.show,
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
this.apiTooltip().registerContent(content);
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
</script>
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div
|
|
3
|
+
:id="id"
|
|
4
|
+
:aria-describedby="ariaDescribedBy"
|
|
5
|
+
@mouseenter="onMouseenter"
|
|
6
|
+
@mouseleave="onmouseout"
|
|
7
|
+
>
|
|
8
|
+
<slot />
|
|
9
|
+
</div>
|
|
10
|
+
</template>
|
|
11
|
+
|
|
12
|
+
<script>
|
|
13
|
+
let tooltipTriggerTimeout = null;
|
|
14
|
+
|
|
15
|
+
export default {
|
|
16
|
+
name: 'VTTooltipTrigger',
|
|
17
|
+
|
|
18
|
+
inject: ['apiTooltip'],
|
|
19
|
+
|
|
20
|
+
data() {
|
|
21
|
+
return {
|
|
22
|
+
expanded: false,
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
computed: {
|
|
27
|
+
id() {
|
|
28
|
+
return `tooltip-trigger-${this.apiTooltip().id}`;
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
componentContent() {
|
|
32
|
+
return this.apiTooltip().componentContent;
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
ariaDescribedBy() {
|
|
36
|
+
if (!this.componentContent) return null;
|
|
37
|
+
return this.expanded ? this.componentContent.id : null;
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
mounted() {
|
|
42
|
+
const trigger = {
|
|
43
|
+
cancel: this.cancel,
|
|
44
|
+
id: this.id,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
this.apiTooltip().registerTrigger(trigger);
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
methods: {
|
|
51
|
+
onMouseenter(e) {
|
|
52
|
+
tooltipTriggerTimeout = setTimeout(() => {
|
|
53
|
+
this.init(e);
|
|
54
|
+
}, this.apiTooltip().delayDuration);
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
onmouseout() {
|
|
58
|
+
clearTimeout(tooltipTriggerTimeout);
|
|
59
|
+
this.cancel();
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
init(e) {
|
|
63
|
+
if (!this.componentContent) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (this.expanded) {
|
|
68
|
+
this.cancel();
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
this.expanded = true;
|
|
73
|
+
|
|
74
|
+
// delay stop propagation to close other visible
|
|
75
|
+
// dropdowns and delay click event to control
|
|
76
|
+
// this dropdown visibility
|
|
77
|
+
this.showComponentContent();
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
cancel() {
|
|
81
|
+
if (!this.componentContent) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
this.expanded = false;
|
|
86
|
+
this.hideComponentContent();
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
showComponentContent() {
|
|
90
|
+
this.componentContent.show();
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
hideComponentContent() {
|
|
94
|
+
this.componentContent.hide();
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
</script>
|
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
|
|
28
28
|
<script>
|
|
29
29
|
export default {
|
|
30
|
+
inheritAttrs: false,
|
|
31
|
+
|
|
30
32
|
props: {
|
|
31
33
|
component: {
|
|
32
34
|
type: String,
|
|
@@ -40,6 +42,10 @@ export default {
|
|
|
40
42
|
type: Boolean,
|
|
41
43
|
default: false,
|
|
42
44
|
},
|
|
45
|
+
ariaActivedescendant: {
|
|
46
|
+
type: String,
|
|
47
|
+
default: null,
|
|
48
|
+
},
|
|
43
49
|
portalClass: {
|
|
44
50
|
type: [String, Function],
|
|
45
51
|
default: null,
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<input
|
|
3
|
-
:class="classes"
|
|
4
|
-
class="form-control"
|
|
5
|
-
:data-theme="theme"
|
|
6
|
-
:type="type"
|
|
7
|
-
:value="value"
|
|
8
|
-
v-on="listeners"
|
|
9
|
-
/>
|
|
10
|
-
</template>
|
|
11
|
-
|
|
12
|
-
<script>
|
|
13
|
-
export default {
|
|
14
|
-
name: 'VTInput',
|
|
15
|
-
|
|
16
|
-
props: {
|
|
17
|
-
lazy: {
|
|
18
|
-
type: Boolean,
|
|
19
|
-
default: false,
|
|
20
|
-
},
|
|
21
|
-
type: {
|
|
22
|
-
type: String,
|
|
23
|
-
default: 'text',
|
|
24
|
-
},
|
|
25
|
-
theme: {
|
|
26
|
-
type: String,
|
|
27
|
-
default: null,
|
|
28
|
-
validator(value) {
|
|
29
|
-
return ['dark'].includes(value);
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
variant: {
|
|
33
|
-
type: [String, Object],
|
|
34
|
-
default: '',
|
|
35
|
-
validator(value) {
|
|
36
|
-
if (value === '' || typeof value === 'object') {
|
|
37
|
-
return true;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return ['success', 'warning', 'error'].includes(value);
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
value: {
|
|
44
|
-
type: [String, Number, Object, Array],
|
|
45
|
-
default: null,
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
|
|
49
|
-
computed: {
|
|
50
|
-
classes() {
|
|
51
|
-
const classes = {};
|
|
52
|
-
|
|
53
|
-
if (this.variant) {
|
|
54
|
-
classes[`form-control--${this.variant}`] = true;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return classes;
|
|
58
|
-
},
|
|
59
|
-
|
|
60
|
-
listeners() {
|
|
61
|
-
// `Object.assign` merges objects together to form a new object
|
|
62
|
-
return Object.assign(
|
|
63
|
-
{},
|
|
64
|
-
// We add all the listeners from the parent
|
|
65
|
-
this.$listeners,
|
|
66
|
-
// Then we can add custom listeners or override the
|
|
67
|
-
// behavior of some listeners.
|
|
68
|
-
{
|
|
69
|
-
// This ensures that the component works with v-model
|
|
70
|
-
input: (event) => {
|
|
71
|
-
if (this.lazy) return;
|
|
72
|
-
this.$emit('input', event.target.value);
|
|
73
|
-
},
|
|
74
|
-
blur: (event) => {
|
|
75
|
-
this.$emit('blur', event);
|
|
76
|
-
},
|
|
77
|
-
}
|
|
78
|
-
);
|
|
79
|
-
},
|
|
80
|
-
},
|
|
81
|
-
};
|
|
82
|
-
</script>
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<VTInput v-model="date" type="date" />
|
|
3
|
-
</template>
|
|
4
|
-
|
|
5
|
-
<script>
|
|
6
|
-
import VTInput from './VTInput.vue';
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
name: 'VTInputDate',
|
|
10
|
-
|
|
11
|
-
components: { VTInput },
|
|
12
|
-
|
|
13
|
-
model: {
|
|
14
|
-
prop: 'value',
|
|
15
|
-
event: 'input',
|
|
16
|
-
},
|
|
17
|
-
|
|
18
|
-
props: {
|
|
19
|
-
value: {
|
|
20
|
-
type: String,
|
|
21
|
-
default: '',
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
|
|
25
|
-
computed: {
|
|
26
|
-
date: {
|
|
27
|
-
get() {
|
|
28
|
-
return this.$date.format(this.value, 'YYYY-MM-DD');
|
|
29
|
-
},
|
|
30
|
-
set(newDate) {
|
|
31
|
-
this.$emit('input', newDate);
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
};
|
|
36
|
-
</script>
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="flex items-stretch gap-2">
|
|
3
|
-
<VTInput
|
|
4
|
-
ref="input"
|
|
5
|
-
type="file"
|
|
6
|
-
:value="value"
|
|
7
|
-
:theme="theme"
|
|
8
|
-
v-bind="$attrs"
|
|
9
|
-
@change="onChange"
|
|
10
|
-
/>
|
|
11
|
-
<VTButton :theme="theme" @click.stop="onButtonClick">Browse</VTButton>
|
|
12
|
-
</div>
|
|
13
|
-
</template>
|
|
14
|
-
|
|
15
|
-
<script>
|
|
16
|
-
import VTButton from '../Button/VTButton.vue';
|
|
17
|
-
import VTInput from './VTInput.vue';
|
|
18
|
-
|
|
19
|
-
export default {
|
|
20
|
-
name: 'VTInputFile',
|
|
21
|
-
|
|
22
|
-
components: {
|
|
23
|
-
VTInput,
|
|
24
|
-
VTButton,
|
|
25
|
-
},
|
|
26
|
-
|
|
27
|
-
inheritAttrs: false,
|
|
28
|
-
|
|
29
|
-
props: {
|
|
30
|
-
theme: {
|
|
31
|
-
type: String,
|
|
32
|
-
default: null,
|
|
33
|
-
validator(value) {
|
|
34
|
-
return ['dark'].includes(value);
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
multiple: {
|
|
38
|
-
type: Boolean,
|
|
39
|
-
default: false,
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
|
|
43
|
-
data() {
|
|
44
|
-
return {
|
|
45
|
-
value: null,
|
|
46
|
-
};
|
|
47
|
-
},
|
|
48
|
-
|
|
49
|
-
methods: {
|
|
50
|
-
onChange(event) {
|
|
51
|
-
this.value = this.$refs.input.$el.value;
|
|
52
|
-
this.$emit('change', event);
|
|
53
|
-
},
|
|
54
|
-
|
|
55
|
-
onButtonClick() {
|
|
56
|
-
this.$refs.input.$el.click();
|
|
57
|
-
},
|
|
58
|
-
},
|
|
59
|
-
};
|
|
60
|
-
</script>
|