Skip to content

Commit 206ae01

Browse files
committed
feat(panel): adds modal picker to buttons
1 parent dd66366 commit 206ae01

File tree

2 files changed

+81
-9
lines changed

2 files changed

+81
-9
lines changed

src/components/views/panel/PanelButtonProgress.vue

+57-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
import {
33
type ButtonProps,
44
NButton,
5+
NDatePicker,
56
NIcon,
7+
NModal,
68
NPopselect,
79
type PopselectProps,
810
type SelectOption,
@@ -57,13 +59,39 @@ const props = defineProps({
5759
},
5860
});
5961
62+
const emit = defineEmits<{
63+
(o: 'onSelect', value: string | number | (string | number)[], date?: number): void;
64+
}>();
65+
6066
const { percentage } = toRefs(props);
6167
68+
const root = ref();
69+
const trigger = ref();
70+
6271
const progressBackground = computed(() => {
6372
if (percentage?.value === undefined) return false;
6473
return percentage.value > 0 && percentage.value < 100;
6574
});
6675
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+
6795
const renderLabel = (option: SelectOption & { icon: Component }) => [
6896
h(NIcon, {
6997
style: {
@@ -74,9 +102,6 @@ const renderLabel = (option: SelectOption & { icon: Component }) => [
74102
}),
75103
option.label?.toString(),
76104
];
77-
78-
const root = ref();
79-
const trigger = ref();
80105
</script>
81106

82107
<template>
@@ -85,16 +110,16 @@ const trigger = ref();
85110
class="button-progress-container"
86111
:data-progress="percentage"
87112
:style="{
88-
'--progress': `${percentage}%`,
89-
'--progress-color': `var(--${type}-color-dark)`,
113+
'--progress': `${ percentage }%`,
114+
'--progress-color': `var(--${ type }-color-dark)`,
90115
}"
91116
>
92117
<ProgressTooltip
93118
:progress="progress"
94119
:to="root"
95120
: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 })`,
98123
}"
99124
v-bind="tooltip"
100125
>
@@ -103,15 +128,16 @@ const trigger = ref();
103128
</template>
104129
<NPopselect
105130
: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 })`,
108133
}"
109134
:to="root"
110135
:render-label="renderLabel"
111136
trigger="focus"
112137
:disabled="disabled"
113138
v-bind="select"
114139
:on-update:show="_show => !_show && trigger?.$el?.blur()"
140+
:on-update-value="onSelect"
115141
>
116142
<NButton
117143
ref="trigger"
@@ -129,6 +155,24 @@ const trigger = ref();
129155
</NButton>
130156
</NPopselect>
131157
</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>
132176
</div>
133177
</template>
134178

@@ -164,4 +208,8 @@ const trigger = ref();
164208
);
165209
}
166210
}
211+
212+
.picker-modal {
213+
margin: auto;
214+
}
167215
</style>

src/components/views/panel/ShowPanelButtons.vue

+24
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,27 @@ const props = defineProps({
5656
},
5757
});
5858
59+
const emit = defineEmits<{
60+
(e: 'onListUpdate', value: ListEntity['id'][]): void;
61+
(e: 'onCollectionUpdate', value: ListEntity['id'], date?: number): void;
62+
(e: 'onWatchedUpdate', value: ListEntity['id'], date?: number): void;
63+
}>();
64+
65+
const onListUpdate = (value: ListEntity['id'] | ListEntity['id'][]) => {
66+
emit('onListUpdate', value as ListEntity['id'][]);
67+
};
68+
69+
const onCollectionUpdate = (
70+
value: ListEntity['id'] | ListEntity['id'][],
71+
date?: number,
72+
) => {
73+
emit('onCollectionUpdate', value as ListEntity['id'], date);
74+
};
75+
76+
const onWatchedUpdate = (value: ListEntity['id'] | ListEntity['id'][], date?: number) => {
77+
emit('onWatchedUpdate', value as ListEntity['id'], date);
78+
};
79+
5980
const { mode, watchedProgress, collectionProgress, activeLoading } = toRefs(props);
6081
6182
const watched = computed(() => {
@@ -150,6 +171,7 @@ onMounted(() => {
150171
:filled="!!activeLists?.length"
151172
:disabled="listsLoading"
152173
type="warning"
174+
@on-select="onListUpdate"
153175
>
154176
<template #tooltip>
155177
<NFlex vertical size="small" align="center" justify="center">
@@ -177,6 +199,7 @@ onMounted(() => {
177199
:filled="collected"
178200
:disabled="collectionLoading"
179201
type="info"
202+
@on-select="onCollectionUpdate"
180203
>
181204
{{ i18n(`label__collection__${ collected ? 'remove' : 'add' }`) }}
182205
</PanelButtonProgress>
@@ -196,6 +219,7 @@ onMounted(() => {
196219
:percentage="watchedPercentage"
197220
:filled="watched"
198221
:disabled="watchedLoading"
222+
@on-select="onWatchedUpdate"
199223
>
200224
{{ i18n(`label__history__${ watched ? 'remove' : 'add' }`) }}
201225
</PanelButtonProgress>

0 commit comments

Comments
 (0)