Skip to content

Commit 6c63ddb

Browse files
committed
add vue 3
1 parent 8cf047e commit 6c63ddb

File tree

3 files changed

+74
-93
lines changed

3 files changed

+74
-93
lines changed

packages/dialtone-vue3/components/hovercard/hovercard.vue

Lines changed: 66 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
<template>
33
<dt-popover
44
:id="id"
5+
:open="hovercardOpen"
56
:placement="placement"
67
:content-class="contentClass"
8+
:dialog-class="dialogClass"
79
:fallback-placements="fallbackPlacements"
810
:padding="padding"
911
:transition="transition ? 'fade' : null"
@@ -13,19 +15,24 @@
1315
:header-class="headerClass"
1416
:footer-class="footerClass"
1517
:append-to="appendTo"
16-
:hovercard="true"
1718
data-qa="dt-hovercard"
18-
:open="open"
1919
:enter-delay="enterDelay"
2020
:leave-delay="leaveDelay"
2121
@opened="(e) => ($emit('opened', e))"
22+
@mouseenter-popover="onMouseEnter"
23+
@mouseleave-popover="onMouseLeave"
2224
>
2325
<template #anchor="{ attrs }">
24-
<!-- @slot Anchor element that activates the hovercard. Usually a button. -->
25-
<slot
26-
name="anchor"
27-
v-bind="attrs"
28-
/>
26+
<div
27+
@mouseenter-popover="onMouseEnter"
28+
@mouseleave-popover="onMouseLeave"
29+
>
30+
<!-- @slot Anchor element that activates the hovercard. Usually a button. -->
31+
<slot
32+
name="anchor"
33+
v-bind="attrs"
34+
/>
35+
</div>
2936
</template>
3037
<template #content>
3138
<!-- @slot Slot for the content that is displayed in the hovercard. -->
@@ -44,11 +51,12 @@
4451
</template>
4552

4653
<script setup>
54+
import { ref, watch } from 'vue';
4755
import { POPOVER_APPEND_TO_VALUES, POPOVER_PADDING_CLASSES, DtPopover } from '@/components/popover/index.js';
4856
import { TOOLTIP_DIRECTIONS, TOOLTIP_DELAY_MS } from '@/components/tooltip/index.js';
4957
import { getUniqueString } from '@/common/utils';
5058
51-
defineProps({
59+
const props = defineProps({
5260
/**
5361
* Fade transition when the content display is toggled.
5462
* @type boolean
@@ -173,24 +181,24 @@ defineProps({
173181
return POPOVER_APPEND_TO_VALUES.includes(appendTo) ||
174182
(appendTo instanceof HTMLElement);
175183
},
184+
},
176185
177-
/**
178-
* The enter delay in milliseconds before the hovercard is shown.
179-
* @type number
180-
*/
181-
enterDelay: {
182-
type: Number,
183-
default: TOOLTIP_DELAY_MS,
184-
},
186+
/**
187+
* The enter delay in milliseconds before the hovercard is shown.
188+
* @type number
189+
*/
190+
enterDelay: {
191+
type: Number,
192+
default: TOOLTIP_DELAY_MS,
193+
},
185194
186-
/**
187-
* The leave delay in milliseconds before the hovercard is hidden.
188-
* @type number
189-
*/
190-
leaveDelay: {
191-
type: Number,
192-
default: TOOLTIP_DELAY_MS,
193-
},
195+
/**
196+
* The leave delay in milliseconds before the hovercard is hidden.
197+
* @type number
198+
*/
199+
leaveDelay: {
200+
type: Number,
201+
default: TOOLTIP_DELAY_MS,
194202
},
195203
});
196204
@@ -203,4 +211,38 @@ defineEmits([
203211
*/
204212
'opened',
205213
]);
214+
215+
const hovercardOpen = ref(props.open);
216+
const inTimer = ref(null);
217+
const outTimer = ref(null);
218+
219+
watch(() => props.open, (open) => {
220+
hovercardOpen.value = open;
221+
}, { immediate: true });
222+
223+
function setInTimer () {
224+
inTimer.value = setTimeout(() => {
225+
hovercardOpen.value = true;
226+
}, props.enterDelay);
227+
}
228+
229+
function setOutTimer () {
230+
outTimer.value = setTimeout(() => {
231+
hovercardOpen.value = false;
232+
}, props.leaveDelay);
233+
}
234+
235+
function onMouseEnter () {
236+
if (props.open === null) {
237+
clearTimeout(outTimer.value);
238+
setInTimer();
239+
}
240+
}
241+
242+
function onMouseLeave () {
243+
if (props.open === null) {
244+
clearTimeout(inTimer.value);
245+
setOutTimer();
246+
}
247+
}
206248
</script>

packages/dialtone-vue3/components/hovercard/hovercard_many.story.vue

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
:time="data.time"
1010
:is-active="true"
1111
:state="$attrs.state"
12-
@hover="$attrs.onHover"
13-
@focus="$attrs.onFocus"
1412
>
1513
<template #avatar>
1614
<dt-hovercard

packages/dialtone-vue3/components/popover/popover.vue

Lines changed: 8 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@keydown.escape.capture="closePopover"
3131
@keydown.enter="$emit('keydown', $event)"
3232
@keydown.space="$emit('keydown', $event)"
33-
@mouseenter="openHovercard"
34-
@mouseleave="closeHovercard"
33+
@mouseenter="onMouseEnter"
34+
@mouseleave="onMouseLeave"
3535
>
3636
<!-- @slot Anchor element that activates the popover. Usually a button. -->
3737
<slot
@@ -63,8 +63,8 @@
6363
:css="$attrs.css"
6464
:tabindex="contentTabindex"
6565
v-on="popoverListeners"
66-
@mouseenter="openHovercard"
67-
@mouseleave="closeHovercard"
66+
@mouseenter="onMouseEnter"
67+
@mouseleave="onMouseLeave"
6868
>
6969
<popover-header-footer
7070
v-if="hasSlotContent($slots.headerContent) || showCloseButton"
@@ -142,7 +142,6 @@ import { createTippyPopover, getPopperOptions } from './tippy_utils';
142142
import PopoverHeaderFooter from './popover_header_footer.vue';
143143
import SrOnlyCloseButtonMixin from '@/common/mixins/sr_only_close_button';
144144
import SrOnlyCloseButton from '@/common/sr_only_close_button.vue';
145-
import { TOOLTIP_DELAY_MS } from '@/components/tooltip/index.js';
146145
147146
/**
148147
* A Popover displays a content overlay when its anchor element is activated.
@@ -515,33 +514,6 @@ export default {
515514
(appendTo instanceof HTMLElement);
516515
},
517516
},
518-
519-
/**
520-
* Set this prop to true and popover component will support hovercard behaviour
521-
* It will open on mouseenter and close on mouseleave with timer delay of 300ms
522-
*/
523-
hovercard: {
524-
type: Boolean,
525-
default: false,
526-
},
527-
528-
/**
529-
* The enter delay in milliseconds before the hovercard is shown.
530-
* @type number
531-
*/
532-
enterDelay: {
533-
type: Number,
534-
default: TOOLTIP_DELAY_MS,
535-
},
536-
537-
/**
538-
* The leave delay in milliseconds before the hovercard is hidden.
539-
* @type number
540-
*/
541-
leaveDelay: {
542-
type: Number,
543-
default: TOOLTIP_DELAY_MS,
544-
},
545517
},
546518
547519
emits: [
@@ -579,8 +551,6 @@ export default {
579551
anchorEl: null,
580552
popoverContentEl: null,
581553
hasSlotContent,
582-
inTimer: null,
583-
outTimer: null,
584554
};
585555
},
586556
@@ -762,7 +732,6 @@ export default {
762732
},
763733
764734
defaultToggleOpen (e) {
765-
if (this.hovercard) { return; }
766735
if (this.openOnContext) { return; }
767736
768737
// Only use default toggle behaviour if the user has not set the open prop.
@@ -1048,41 +1017,13 @@ export default {
10481017
});
10491018
},
10501019
1051-
// ============================================================================
1052-
// $ HOVERCARD
1053-
// ----------------------------------------------------------------------------
1054-
1055-
setInTimer () {
1056-
this.inTimer = setTimeout(() => {
1057-
this.isOpen = true;
1058-
}, this.enterDelay);
1059-
},
1060-
1061-
setOutTimer () {
1062-
this.outTimer = setTimeout(() => {
1063-
this.isOpen = false;
1064-
}, this.leaveDelay);
1065-
},
1066-
1067-
openHovercard () {
1068-
if (!this.hovercard) return;
1069-
if (this.open === null || this.open === undefined) {
1070-
clearTimeout(this.outTimer);
1071-
this.setInTimer();
1072-
}
1020+
onMouseEnter () {
1021+
this.$emit('mouseenter-popover');
10731022
},
10741023
1075-
closeHovercard () {
1076-
if (!this.hovercard) return;
1077-
if (this.open === null || this.open === undefined) {
1078-
clearTimeout(this.inTimer);
1079-
this.setOutTimer();
1080-
}
1024+
onMouseLeave () {
1025+
this.$emit('mouseleave-popover');
10811026
},
1082-
1083-
// ============================================================================
1084-
// $ HOVERCARD
1085-
// ----------------------------------------------------------------------------
10861027
},
10871028
};
10881029
</script>

0 commit comments

Comments
 (0)