diff --git a/modules/overlay/ext.echo.overlay.init.js b/modules/overlay/ext.echo.overlay.init.js index 49737c82c..f2bd3a490 100644 --- a/modules/overlay/ext.echo.overlay.init.js +++ b/modules/overlay/ext.echo.overlay.init.js @@ -28,11 +28,14 @@ function ( $overlay ) { $overlay .hide() - .appendTo( $( '#pt-notifications' ) ); - - // Create the pokey (aka chevron) - $overlay.before( $( '
' ).addClass( 'mw-echo-overlay-pokey' ) ); + .appendTo( document.body ); + function positionOverlay() { + var offset = $( '#pt-notifications' ).offset(); + $overlay.css( { left: offset.left - 200 } ); + } + positionOverlay(); + $( window ).on( 'resize', positionOverlay ); mw.hook( 'ext.echo.overlay.beforeShowingOverlay' ).fire( $overlay ); // Show the notifications overlay @@ -55,7 +58,7 @@ } ); $( 'body' ).click( function ( e ) { - if ( ! $( e.target ).is( '.mw-echo-overlay, .mw-echo-overlay *, .mw-echo-overlay-pokey, #pt-notifications a' ) ) { + if ( ! $( e.target ).is( '.mw-echo-overlay, .mw-echo-overlay *, #pt-notifications a' ) ) { mw.echo.overlay.removeOverlay(); } } ); diff --git a/modules/overlay/ext.echo.overlay.js b/modules/overlay/ext.echo.overlay.js index 628f29f31..e27d3c9df 100644 --- a/modules/overlay/ext.echo.overlay.js +++ b/modules/overlay/ext.echo.overlay.js @@ -61,7 +61,7 @@ // If id is given mark that as read otherwise use all unread messages data.list = id; } else { - data.all = 1; + data.sections = this.name; } return this.api.post( mw.echo.desktop.appendUseLang( data ) ).then( function ( result ) { @@ -402,7 +402,7 @@ } ); }, removeOverlay: function () { - $( '.mw-echo-overlay, .mw-echo-overlay-pokey' ).fadeOut( 'fast', + $( '.mw-echo-overlay' ).fadeOut( 'fast', function () { $( this ).remove(); } diff --git a/modules/overlay/ext.echo.overlay.less b/modules/overlay/ext.echo.overlay.less index ef96d1c44..0c82f5cb8 100644 --- a/modules/overlay/ext.echo.overlay.less +++ b/modules/overlay/ext.echo.overlay.less @@ -1,7 +1,14 @@ +.mw-echo-title { + a { + font-weight: bold; + } +} + +@offset: 200px; +@chevronHeight: 11px; .mw-echo-overlay { position: absolute; - top: 30px; - left: -200px; + top: 30px + @chevronHeight; border: 1px solid silver; background-color: #fff; width: 450px; @@ -10,30 +17,20 @@ color: #6D6D6D; z-index: 100; box-shadow: 0 3px 8px rgba(50, 50, 50, 0.35); -} -.mw-echo-overlay-pokey { - /* @embed */ - background-image: url('PokeyNorth.png'); - background-repeat: no-repeat; - width: 21px; - height: 11px; - position: absolute; - z-index: 101; - top: 20px; - left: -5px; -} - -#p-personal { - .mw-echo-overlay-title ul, - .mw-echo-notifications ul { - // override #p-personal ul in core - padding: 0; - } - // override #p-personal ul in core - li.mw-echo-notification { - margin: 0; - float: none; + // IE8 + &:before, + &::before { + content: ''; + background-image: url('PokeyNorth.png'); + background-repeat: no-repeat; + width: 21px; + height: @chevronHeight; + position: absolute; + z-index: 101; + top: -@chevronHeight; + // subtract half the width from the offset and then add the left box shadow + left: @offset - 10px + 3px; } } @@ -71,6 +68,8 @@ .mw-echo-notifications, ul { overflow: auto; + padding: 0; + margin: 0; } li.mw-echo-notification { @@ -127,7 +126,6 @@ } .mw-echo-overlay-title { - /*border-bottom: 1px solid #A7D7F9;*/ font-size: 13px; line-height: 15px; padding: 15px 15px 15px 28px; @@ -137,22 +135,20 @@ line-height: 15px; font: inherit; } -} -/* override #p-personal li*/ -#p-personal .mw-echo-overlay-title li { - font-size: 1em; - margin-left: 0; -} + li { + display: inline; + font-size: 1em; + margin-left: 0; -.mw-echo-overlay-title li { - &::after { - content: " · "; - padding: 0 .25em; - } - &:last-child { &::after { - content: ''; + content: " · "; + padding: 0 .25em; + } + &:last-child { + &::after { + content: ''; + } } } } @@ -227,10 +223,6 @@ } } -#pt-notifications { - position: relative; -} - .mw-echo-overlay-none { font-size: 13px; border-bottom: 1px solid #DDDDDD; diff --git a/modules/overlay/ext.echo.overlay.modern.css b/modules/overlay/ext.echo.overlay.modern.css index f86bd29af..005e6d9e9 100644 --- a/modules/overlay/ext.echo.overlay.modern.css +++ b/modules/overlay/ext.echo.overlay.modern.css @@ -9,9 +9,6 @@ body #p-personal { left: -20px; top: 31px; } -#p-personal .mw-echo-overlay-pokey { - left: -6px; -} #p-personal #pt-notifications ul, #p-personal #pt-notifications li { text-transform: none; diff --git a/tests/browser/features/messages.feature b/tests/browser/features/messages.feature new file mode 100644 index 000000000..7df0f1c64 --- /dev/null +++ b/tests/browser/features/messages.feature @@ -0,0 +1,15 @@ +@chrome @en.wikipedia.beta.wmflabs.org @firefox @login +Feature: Notification types + + # Scenarios which trigger notifications + Scenario: Mark all as unread + Given I am logged in with no notifications + And I have a Flow message + And another user mentions me on the wiki + And I am on the "Selenium Echo flyout test page" page + And I click the notification flyout button + And I see the notification flyout + And I have unread alert notifications + When I click the mark all as read button + And I am on the "Selenium Echo flyout test page" page + Then I have new notifications diff --git a/tests/browser/features/step_definitions/common_steps.rb b/tests/browser/features/step_definitions/common_steps.rb index 744899737..657b13160 100644 --- a/tests/browser/features/step_definitions/common_steps.rb +++ b/tests/browser/features/step_definitions/common_steps.rb @@ -2,6 +2,10 @@ def get_session_username return "#{ENV["MEDIAWIKI_USER"]}_#{@browser.name}" end +def get_session_username_b() + return "EchoUser" +end + # For use in Firefox browser tests only Given /^I am using user agent "(.+)"$/ do |user_agent| @user_agent = user_agent diff --git a/tests/browser/features/step_definitions/messages_steps.rb b/tests/browser/features/step_definitions/messages_steps.rb new file mode 100644 index 000000000..a79a1d605 --- /dev/null +++ b/tests/browser/features/step_definitions/messages_steps.rb @@ -0,0 +1,12 @@ +Given(/^I have a Flow message$/) do + client = on(APIPage).client + username = get_session_username_b() + step 'the user "' + username + '" exists' + client.log_in(username, ENV["MEDIAWIKI_PASSWORD"]) + client.action( 'flow', token_type: 'edit', submodule: 'new-topic', page: 'Talk:Flow QA', + nttopic:'Mention #1', ntcontent: '[[User:' + get_session_username() + ']] I wanted to say hello.' ) +end + +When(/^I click the mark all as read button$/) do + on(ArticlePage).mark_as_read_element.when_present.click +end diff --git a/tests/browser/features/step_definitions/notifications_steps.rb b/tests/browser/features/step_definitions/notifications_steps.rb index 99340932a..02ce5a316 100644 --- a/tests/browser/features/step_definitions/notifications_steps.rb +++ b/tests/browser/features/step_definitions/notifications_steps.rb @@ -5,7 +5,7 @@ def make_page_with_user( title, text, username ) end def make_page_with_user_b( title, text ) - username = "EchoUser" + username = get_session_username_b() step 'the user "' + username + '" exists' make_page_with_user( title, text, username ) end @@ -38,26 +38,17 @@ Given(/^another user mentions me on the wiki$/) do end Given(/^I am logged in with no notifications$/) do + # Mark all messages as read + client = on(APIPage).client + username = get_session_username() + step 'the user "' + username + '" exists' + client.log_in(username, ENV["MEDIAWIKI_PASSWORD"]) + client.action( 'echomarkread', token_type: 'edit', all: '1' ) + step 'I am logged in my non-shared account' - # wait for JavaScript to have fully loaded - sleep 5 - on(ArticlePage).flyout_link_element.click - # wait for the API call that marks these as read and for UI to refresh - sleep 5 on(ArticlePage).flyout_link_element.class_name.should_not match 'mw-echo-unread-notifications' end Then(/^I have new notifications$/) do on(ArticlePage).flyout_link_element.when_present.class_name.should match 'mw-echo-unread-notifications' end - -Then(/^I have no new notifications$/) do - on(ArticlePage).flyout_link_element.when_present.class_name.should_not match 'mw-echo-unread-notifications' -end - -Then(/^another user has linked to a page I created from another page$/) do - title = 'Selenium Echo link test ' + @random_string - make_page_with_user_a(title, "Selenium test page. Feel free to delete me.") - title2 = title + ' ' + @random_string - make_page_with_user_b(title2, "I am linking to [[" + title + "]].") -end diff --git a/tests/browser/features/support/pages/article_page.rb b/tests/browser/features/support/pages/article_page.rb index 7deb09213..75891cdd3 100644 --- a/tests/browser/features/support/pages/article_page.rb +++ b/tests/browser/features/support/pages/article_page.rb @@ -5,4 +5,8 @@ class ArticlePage li("flyout_link_container", css: "#pt-notifications") a("flyout_link", css: "#pt-notifications a") div("flyout", css: ".mw-echo-overlay") + + # Overlay header + a("alert_tab_link", css: '.mw-echo-overlay-title ul li a', index: 1) + button("mark_as_read", css: '.mw-echo-notifications > button') end