Skip to content
Snippets Groups Projects
Unverified Commit 9fe14155 authored by Lauri Timmanee's avatar Lauri Timmanee
Browse files

Issue #3246755 by mherchel, yogeshmpawar, Libbna, cindytwilliams, zenimagine:...

Issue #3246755 by mherchel, yogeshmpawar, Libbna, cindytwilliams, zenimagine: Olivero main/user account menu layout struggles with long menus
parent 9c6d3d2d
No related branches found
No related tags found
42 merge requests!85673265330-fix-missing-hyphens: Create patch to MR and fix remaining words,!8394[warning] array_flip(): Can only flip STRING and INTEGER values, when saving a non-revisionable custom content entity,!7780issue 3443822: fix for 'No route found for the specified format html. Supported formats: json, xml.',!7416Simplify the HTML of field.html.twig,!7150Revert "Issue #3137119 by munish.kumar, johnwebdev, Jaypan, jungle, xjm,...,!6445Issue #3034692: Renamed the getHandler function which return the configuration of a handler instance on given display,!5013Issue #3071143: Table Render Array Example Is Incorrect,!4848Issue #1566662: Update module should send notifications on Thursdays,!4792Issue #2230689: Remove redundant "Italic" style,!4782Issue #2662898: "Links" field not displaying on custom view modes,!4220Issue #3368223: Link field > Access to internal links is not checked on display.,!4173Issue #2123543: Add string context and location filters to the translate interface,!3884Issue #3356842,!3870Issue #3087868,!3812Draft: Issue #3339373 by alexpott, andypost, mondrake:...,!3736Issue #3294005: Refactor Claro's form--password-confirm stylesheet,!3686Issue #3219967 against 9.5.x,!3683Issue #2939397: Clearing AliasManager cache with root path raises warning,!3543Issue #3344259: Allow ajax dialog to have focus configurable,!3437Issue #3106205: Length of menu_tree.url and menu_tree.route_param_key are too short (255 characters),!3356Issue #3209129: Scrolling problems when adding a block via layout builder,!2982Issue #3301562: Translate the default settings for this plugin (TimestampAgoFormatter),!2921Issue #1383696: Allow a custom HTML element to be selected for a grouping field,!2920Issue #3260175: Saving media entity without an owner crashes,!2857Issue #3314541: Remove unnecessary fill from SVG icon for the "Media Library" CKEditor 5 button — enabling dark mode support in contrib,!2841Resolve #3296811 "Resourceresponsetrait needs a",!2803Issue #3041402: Add option absolute url in formatter URL to image,!2733Issue #3293855: Update the outdated user_help text for user.admin_permissions and the description of the select box on the role settings page,!2527Issue #3298714: Undefined #options and Count Warning in Radios.php,!2447Issue #3293135: shouldUpdateThumbnail does not update thumbnail is source field changed,!2428Issue #3032078: Multiple webheads can cause infinite growth of Twig cache,!2280Issue #3280415: Metapackage Generator Breaks Under Composer --no-dev,!2205Quote all names in the regions section.,!2050Issue #3272969: Remove UnqiueField constraint.,!1956Issue #3268872: hook_views_invalidate_cache not called when a view is deleted,!1893Issue #3217260: Add a way to make media captions not editable in CKEditor,!1690fixing include_source documentation at SubProcess.php,!1520Issue #2815221: Add ability to use Quick Edit to the latest_revision route,!1459Issue #3087632: menu_name max length is too long,!878Issue #3221534: throw an exception when IDs passed to loadMultiple() are badly formed,!866Issue #2845319: The highlighting of the 'Home' menu-link does not respect query strings and fragment identifiers,!204Issue #3040556: It is not possible to react to an entity being duplicated
......@@ -32,3 +32,13 @@ olivero_test.anchor_link:
url: "internal:#footer"
menu_name: main
weight: 200
olivero_test.long_item_1:
title: Long long long long
route_name: <front>
menu_name: main
weight: 200
olivero_test.long_item_2:
title: Long long long long
route_name: <front>
menu_name: main
weight: 200
......@@ -66,7 +66,7 @@ module.exports = {
.waitForElementVisible(headerNavSelector)
.assert.visible(headerNavSelector)
.assert.not.visible(`#${linkSubMenuId}`)
.moveToElement(`[aria-controls="${linkSubMenuId}"]`, 0, 0)
.moveToElement(`[aria-controls="${linkSubMenuId}"]`, 1, 1)
.assert.visible(`#${linkSubMenuId}`)
.assert.attributeEquals(
`[aria-controls="${linkSubMenuId}"]`,
......@@ -74,7 +74,7 @@ module.exports = {
'true',
)
.assert.not.visible(`#${buttonSubMenuId}`)
.moveToElement(`[aria-controls="${buttonSubMenuId}"]`, 0, 0)
.moveToElement(`[aria-controls="${buttonSubMenuId}"]`, 1, 1)
.assert.visible(`#${buttonSubMenuId}`)
.assert.attributeEquals(
`[aria-controls="${buttonSubMenuId}"]`,
......@@ -82,4 +82,17 @@ module.exports = {
'true',
);
},
'Verify desktop menu converts to mobile if it gets too long': (browser) => {
browser
.drupalRelativeURL('/node')
.waitForElementVisible('body')
.assert.not.elementPresent('body.is-always-mobile-nav')
.resizeWindow(1320, 800)
.execute(() => {
// Directly modify the width of the site branding name so that it causes
// the primary navigation to be too long, and switch into mobile mode.
document.querySelector('.site-branding__name').style.width = '350px';
}, [])
.assert.elementPresent('body.is-always-mobile-nav');
},
};
/**
* @file
* This script watches the desktop version of the primary navigation. If it
* wraps to two lines, it will automatically transition to a mobile navigation
* and remember where it wrapped so it can transition back.
*/
((Drupal, once) => {
/**
* Handles the transition from mobile navigation to desktop navigation.
*
* @param {Element} navWrapper - The primary navigation's top-level <ul> element.
* @param {Element} navItem - The first item within the primary navigation.
*/
function transitionToDesktopNavigation(navWrapper, navItem) {
document.body.classList.remove('is-always-mobile-nav');
// Double check to see if the navigation is wrapping, and if so, re-enable
// mobile navigation. This solves an edge cases where if the amount of
// navigation items always causes the primary navigation to wrap, and the
// page is loaded at a narrower viewport and then widened, the mobile nav
// may not be enabled.
if (navWrapper.clientHeight > navItem.clientHeight) {
document.body.classList.add('is-always-mobile-nav');
}
}
/**
* Callback from Resize Observer. This checks if the primary navigation is
* wrapping, and if so, transitions to the mobile navigation.
*
* @param {ResizeObserverEntry} entries - Object passed from ResizeObserver.
*/
function checkIfDesktopNavigationWraps(entries) {
const navItem = document.querySelector('.primary-nav__menu-item');
if (
Drupal.olivero.isDesktopNav() &&
entries[0].contentRect.height > navItem.clientHeight
) {
const navMediaQuery = window.matchMedia(
`(max-width: ${window.innerWidth + 5}px)`, // 5px adds a small buffer before switching back.
);
document.body.classList.add('is-always-mobile-nav');
// In the event that the viewport was resized, we remember the viewport
// width with a one-time event listener ,so we can attempt to transition
// from mobile navigation to desktop navigation.
navMediaQuery.addEventListener(
'change',
() => {
transitionToDesktopNavigation(entries[0].target, navItem);
},
{ once: true },
);
}
}
/**
* Set up Resize Observer to listen for changes to the size of the primary
* navigation.
*
* @param {Element} primaryNav - The primary navigation's top-level <ul> element.
*/
function init(primaryNav) {
if ('ResizeObserver' in window) {
const resizeObserver = new ResizeObserver(checkIfDesktopNavigationWraps);
resizeObserver.observe(primaryNav);
}
}
/**
* Initialize the automatic navigation transition.
*
* @type {Drupal~behavior}
*
* @prop {Drupal~behaviorAttach} attach
* Attach context and settings for navigation.
*/
Drupal.behaviors.automaticMobileNav = {
attach(context) {
once(
'olivero-automatic-mobile-nav',
'[data-drupal-selector="primary-nav-menu--level-1"]',
context,
).forEach(init);
},
};
})(Drupal, once);
/**
* DO NOT EDIT THIS FILE.
* See the following change record for more information,
* https://www.drupal.org/node/2815083
* @preserve
**/
(function (Drupal, once) {
function transitionToDesktopNavigation(navWrapper, navItem) {
document.body.classList.remove('is-always-mobile-nav');
if (navWrapper.clientHeight > navItem.clientHeight) {
document.body.classList.add('is-always-mobile-nav');
}
}
function checkIfDesktopNavigationWraps(entries) {
var navItem = document.querySelector('.primary-nav__menu-item');
if (Drupal.olivero.isDesktopNav() && entries[0].contentRect.height > navItem.clientHeight) {
var navMediaQuery = window.matchMedia("(max-width: ".concat(window.innerWidth + 5, "px)"));
document.body.classList.add('is-always-mobile-nav');
navMediaQuery.addEventListener('change', function () {
transitionToDesktopNavigation(entries[0].target, navItem);
}, {
once: true
});
}
}
function init(primaryNav) {
if ('ResizeObserver' in window) {
var resizeObserver = new ResizeObserver(checkIfDesktopNavigationWraps);
resizeObserver.observe(primaryNav);
}
}
Drupal.behaviors.automaticMobileNav = {
attach: function attach(context) {
once('olivero-automatic-mobile-nav', '[data-drupal-selector="primary-nav-menu--level-1"]', context).forEach(init);
}
};
})(Drupal, once);
\ No newline at end of file
......@@ -220,6 +220,10 @@ navigation-primary:
js:
js/navigation.js: {}
js/second-level-navigation.js: {}
js/nav-resize.js: {}
dependencies:
- core/drupal
- core/once
navigation-secondary:
version: VERSION
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment