2
2
import {
3
3
type ButtonProps ,
4
4
NButton ,
5
+ NDatePicker ,
5
6
NIcon ,
7
+ NModal ,
6
8
NPopselect ,
7
9
type PopselectProps ,
8
10
type SelectOption ,
@@ -57,13 +59,39 @@ const props = defineProps({
57
59
},
58
60
});
59
61
62
+ const emit = defineEmits <{
63
+ (o : ' onSelect' , value : string | number | (string | number )[], date ? : number ): void ;
64
+ }>();
65
+
60
66
const { percentage } = toRefs (props );
61
67
68
+ const root = ref ();
69
+ const trigger = ref ();
70
+
62
71
const progressBackground = computed (() => {
63
72
if (percentage ?.value === undefined ) return false ;
64
73
return percentage .value > 0 && percentage .value < 100 ;
65
74
});
66
75
76
+ const showPicker = ref (false );
77
+
78
+ const onSelect = (value : string | number | (string | number )[]) => {
79
+ if (value === ' custom' ) {
80
+ showPicker .value = true ;
81
+ return ;
82
+ }
83
+ emit (' onSelect' , value );
84
+ };
85
+
86
+ const onClear = () => {
87
+ showPicker .value = false ;
88
+ };
89
+
90
+ const onConfirm = (value : number ) => {
91
+ showPicker .value = false ;
92
+ emit (' onSelect' , ' custom' , value );
93
+ };
94
+
67
95
const renderLabel = (option : SelectOption & { icon: Component }) => [
68
96
h (NIcon , {
69
97
style: {
@@ -74,9 +102,6 @@ const renderLabel = (option: SelectOption & { icon: Component }) => [
74
102
}),
75
103
option .label ?.toString (),
76
104
];
77
-
78
- const root = ref ();
79
- const trigger = ref ();
80
105
</script >
81
106
82
107
<template >
@@ -85,16 +110,16 @@ const trigger = ref();
85
110
class =" button-progress-container"
86
111
:data-progress =" percentage"
87
112
:style =" {
88
- '--progress': `${percentage}%`,
89
- '--progress-color': `var(--${type}-color-dark)`,
113
+ '--progress': `${ percentage }%`,
114
+ '--progress-color': `var(--${ type }-color-dark)`,
90
115
}"
91
116
>
92
117
<ProgressTooltip
93
118
:progress =" progress"
94
119
:to =" root"
95
120
:style =" {
96
- '--custom-bg-color': `var(--bg-color-${type}-80)`,
97
- '--custom-bg-color-hover': `var(--bg-color-${type})`,
121
+ '--custom-bg-color': `var(--bg-color-${ type }-80)`,
122
+ '--custom-bg-color-hover': `var(--bg-color-${ type })`,
98
123
}"
99
124
v-bind =" tooltip"
100
125
>
@@ -103,15 +128,16 @@ const trigger = ref();
103
128
</template >
104
129
<NPopselect
105
130
:style =" {
106
- '--custom-bg-color': `var(--bg-color-${type}-80)`,
107
- '--custom-bg-color-hover': `var(--bg-color-${type})`,
131
+ '--custom-bg-color': `var(--bg-color-${ type }-80)`,
132
+ '--custom-bg-color-hover': `var(--bg-color-${ type })`,
108
133
}"
109
134
:to =" root"
110
135
:render-label =" renderLabel"
111
136
trigger =" focus"
112
137
:disabled =" disabled"
113
138
v-bind =" select"
114
139
:on-update:show =" _show => !_show && trigger?.$el?.blur()"
140
+ :on-update-value =" onSelect"
115
141
>
116
142
<NButton
117
143
ref =" trigger"
@@ -129,6 +155,24 @@ const trigger = ref();
129
155
</NButton >
130
156
</NPopselect >
131
157
</ProgressTooltip >
158
+
159
+ <NModal
160
+ v-model:show =" showPicker"
161
+ :to =" root"
162
+ :style =" {
163
+ '--custom-bg-color': `var(--bg-color-${ type }-80)`,
164
+ '--custom-bg-color-hover': `var(--bg-color-${ type })`,
165
+ }"
166
+ class =" picker-modal"
167
+ >
168
+ <NDatePicker
169
+ panel
170
+ type =" datetime"
171
+ clearable
172
+ :on-clear =" onClear"
173
+ :on-confirm =" onConfirm"
174
+ />
175
+ </NModal >
132
176
</div >
133
177
</template >
134
178
@@ -164,4 +208,8 @@ const trigger = ref();
164
208
);
165
209
}
166
210
}
211
+
212
+ .picker-modal {
213
+ margin : auto ;
214
+ }
167
215
</style >
0 commit comments