From 70f4a30defaa1d3269385ce713a5926ab84d7727 Mon Sep 17 00:00:00 2001 From: Johann-S Date: Mon, 22 May 2017 16:14:10 +0200 Subject: [PATCH] Better management of dropdown/dropup with alignment --- js/src/dropdown.js | 48 +++++++++++++++++++---------------- js/tests/visual/dropdown.html | 38 +++++++++++++++++++-------- 2 files changed, 54 insertions(+), 32 deletions(-) diff --git a/js/src/dropdown.js b/js/src/dropdown.js index 846746384b..acc3ed453a 100644 --- a/js/src/dropdown.js +++ b/js/src/dropdown.js @@ -68,8 +68,10 @@ const Dropdown = (($) => { } const AttachmentMap = { - TOP : 'top-start', - BOTTOM : 'bottom-start' + TOP : 'top-start', + TOPEND : 'top-end', + BOTTOM : 'bottom-start', + BOTTOMEND : 'bottom-end' } const Default = { @@ -144,21 +146,21 @@ const Dropdown = (($) => { return } - // Handle dropup - const dropdownPlacement = $(this._element).parent().hasClass(ClassName.DROPUP) ? AttachmentMap.TOP : this._config.placement - this._popper = new Popper(this._element, this._menu, { - placement : dropdownPlacement, + let element = this._element + // for dropup with alignment we use the parent as popper container + if ($(parent).hasClass(ClassName.DROPUP)) { + if ($(this._menu).hasClass(ClassName.MENULEFT) || $(this._menu).hasClass(ClassName.MENURIGHT)) { + element = parent + } + } + this._popper = new Popper(element, this._menu, { + placement : this._getPlacement(), modifiers : { offset : { offset : this._config.offset }, flip : { enabled : this._config.flip - }, - beforeApplyStyle: { - order: 899, // 900 is the order of applyStyle - enabled: true, - fn: this._beforePopperApplyStyle } } }) @@ -238,21 +240,23 @@ const Dropdown = (($) => { return this._menu } - _beforePopperApplyStyle(data) { - if ($(data.instance.popper).hasClass(ClassName.MENURIGHT)) { - data.styles = { - right: 0, - left: 'auto' + _getPlacement() { + const $parentDropdown = $(this._element).parent() + let placement = this._config.placement + + // Handle dropup + if ($parentDropdown.hasClass(ClassName.DROPUP) || this._config.placement === AttachmentMap.TOP) { + placement = AttachmentMap.TOP + if ($(this._menu).hasClass(ClassName.MENURIGHT)) { + placement = AttachmentMap.TOPEND } } - - if ($(data.instance.popper).hasClass(ClassName.MENULEFT)) { - data.styles = { - right: 'auto', - left: 0 + else { + if ($(this._menu).hasClass(ClassName.MENURIGHT)) { + placement = AttachmentMap.BOTTOMEND } } - return data + return placement } // static diff --git a/js/tests/visual/dropdown.html b/js/tests/visual/dropdown.html index 166cbf7259..fee096c6c8 100644 --- a/js/tests/visual/dropdown.html +++ b/js/tests/visual/dropdown.html @@ -61,11 +61,10 @@
-
- +
+ +
- -
-
+
+
+ Dropup split align right + - +
+ + +
+
- -- 2.47.2