Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-07-24 18:10:11 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-07-24 18:10:11 +0300
commit7308ec9d13fb69018200a40f287e76ef499ed47c (patch)
tree06c75f7ddceebd61d09f925a48fef2789338f3cd /app/assets/javascripts/super_sidebar/components/flyout_menu.vue
parentf296f23500b4b3758670ae0c5ce2e1779f533e8b (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/super_sidebar/components/flyout_menu.vue')
-rw-r--r--app/assets/javascripts/super_sidebar/components/flyout_menu.vue65
1 files changed, 65 insertions, 0 deletions
diff --git a/app/assets/javascripts/super_sidebar/components/flyout_menu.vue b/app/assets/javascripts/super_sidebar/components/flyout_menu.vue
new file mode 100644
index 00000000000..4f95b140a23
--- /dev/null
+++ b/app/assets/javascripts/super_sidebar/components/flyout_menu.vue
@@ -0,0 +1,65 @@
+<script>
+import { computePosition, autoUpdate, flip } from '@floating-ui/dom';
+import NavItem from './nav_item.vue';
+
+export default {
+ name: 'FlyoutMenu',
+ components: { NavItem },
+ props: {
+ targetId: {
+ type: String,
+ required: true,
+ },
+ items: {
+ type: Array,
+ required: true,
+ },
+ },
+ cleanupFunction: undefined,
+ mounted() {
+ const target = document.querySelector(`#${this.targetId}`);
+ const flyout = document.querySelector(`#${this.targetId}-flyout`);
+
+ function updatePosition() {
+ return computePosition(target, flyout, {
+ middleware: [flip()],
+ placement: 'right-start',
+ strategy: 'fixed',
+ }).then(({ x, y }) => {
+ Object.assign(flyout.style, {
+ left: `${x}px`,
+ top: `${y}px`,
+ });
+ });
+ }
+
+ this.$options.cleanupFunction = autoUpdate(target, flyout, updatePosition);
+ },
+ beforeUnmount() {
+ this.$options.cleanupFunction();
+ },
+};
+</script>
+
+<template>
+ <div
+ :id="`${targetId}-flyout`"
+ class="gl-fixed gl-pl-3 gl-z-index-9999"
+ @mouseover="$emit('mouseover')"
+ @mouseleave="$emit('mouseleave')"
+ >
+ <ul
+ v-if="items.length > 0"
+ class="gl-min-w-20 gl-max-w-34 gl-border-1 gl-rounded-base gl-border-solid gl-border-gray-100 gl-shadow gl-bg-white gl-p-2 gl-pb-1 gl-list-style-none"
+ >
+ <nav-item
+ v-for="item of items"
+ :key="item.id"
+ :item="item"
+ :is-flyout="true"
+ @pin-add="(itemId) => $emit('pin-add', itemId)"
+ @pin-remove="(itemId) => $emit('pin-remove', itemId)"
+ />
+ </ul>
+ </div>
+</template>