X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/ddb7f33868ea499ab8f48a7062f145e8c0fbe02f..refs/pull/2639/head:/resources/js/components/dropdown.js diff --git a/resources/js/components/dropdown.js b/resources/js/components/dropdown.js index 4de1e239b..22402d483 100644 --- a/resources/js/components/dropdown.js +++ b/resources/js/components/dropdown.js @@ -3,17 +3,21 @@ import {onSelect} from "../services/dom"; /** * Dropdown * Provides some simple logic to create simple dropdown menus. + * @extends {Component} */ class DropDown { - constructor(elem) { - this.container = elem; - this.menu = elem.querySelector('.dropdown-menu, [dropdown-menu]'); - this.moveMenu = elem.hasAttribute('dropdown-move-menu'); - this.toggle = elem.querySelector('[dropdown-toggle]'); + setup() { + this.container = this.$el; + this.menu = this.$refs.menu; + this.toggle = this.$refs.toggle; + this.moveMenu = this.$opts.moveMenu; + + this.direction = (document.dir === 'rtl') ? 'right' : 'left'; this.body = document.body; this.showing = false; this.setupListeners(); + this.hide = this.hide.bind(this); } show(event = null) { @@ -28,7 +32,11 @@ class DropDown { this.rect = this.menu.getBoundingClientRect(); this.body.appendChild(this.menu); this.menu.style.position = 'fixed'; - this.menu.style.left = `${this.rect.left}px`; + if (this.direction === 'right') { + this.menu.style.right = `${(this.rect.right - this.rect.width)}px`; + } else { + this.menu.style.left = `${this.rect.left}px`; + } this.menu.style.top = `${this.rect.top}px`; this.menu.style.width = `${this.rect.width}px`; } @@ -67,7 +75,7 @@ class DropDown { this.toggle.setAttribute('aria-expanded', 'false'); if (this.moveMenu) { this.menu.style.position = ''; - this.menu.style.left = ''; + this.menu.style[this.direction] = ''; this.menu.style.top = ''; this.menu.style.width = ''; this.container.appendChild(this.menu);