07c5850b changed the widget used for the "mark as read"
menu item from OO.ui.ButtonOptionWidget to mw.echo.ui.MenuItemWidget.
While this makes sense, it also broke its functionality, because
mw.echo.ui.MenuItemWidgets are unselectable so if you click them
the 'choose' event isn't emitted.
However, we also can't make these widgets selectable, because
that breaks the links inside these widgets (the containing MenuSelectWidget
intercepts mouse events and prevents default). So instead,
make mw.echo.ui.MenuItemWidgets only be unselectable if they are
links (have config.url set), so that both use cases work.
Bug: T128432
Change-Id: I8374e3ae61a005ec7d25c2eb95b1391cbb191d60
Use dir=auto instead of wrapping in <bdi>.
They have the same effect, except that the latter produces
strange-looking truncation behavior with LTR body text in an RTL
interface because text-overflow: ellipsis; is set on the <div>,
not on the <bdi> node.
Bug: T127407
Change-Id: Id58a70f5b88a10c827e61d9e16aae1a81938709a
* Transform the action bar to table layout even in non-bundle
notifications.
* Increase the padding on the side for consistency
Bug: T125909
Bug: T125969
Bug: T126686
Change-Id: I26ba5b7a21a1f36774749154d3f95d61254c5ce2
The toggle-collapse process should be applied only when we click the
actual notification content/body and not the bundle items. This will
make it possible to middle-click (or right-click) a bundled item and
open it in a new window without resulting in collapsing the bundle.
Bug: T127416
Change-Id: Iaa06d5db8a1d5f9032874a800cafb6d5a4268876
Zopfli is the most efficient DEFLATE compression algorithm, trading run-time
performance for file sizes that are typically 3-8% smaller than those produced
by zlib with the maximum compression setting. Its output is Deflate-compatible,
so no specialized decoder is needed.
This change was created by running zopflipng against all the PNG files in this
repository. The exact invocation was:
git ls-files --exclude-per-directory=.gitignore -- '*.png' \|
parallel zopflipng -m -y {} {} \;
Files which zopflipng was not able to compress more efficiently were left unmodified.
Bug: T127608
Change-Id: I4bdef5e1b8e9ba63a3f13c7c475274e89f05ddc6
Zopfli is the most efficient DEFLATE compression algorithm, trading run-time
performance for file sizes that are typically 3-8% smaller than those produced
by zlib with the maximum compression setting. Its output is Deflate-compatible,
so no specialized decoder is needed.
This change was created by running zopflipng against all the PNG files in this
repository. The exact invocation was:
git ls-files --exclude-per-directory=.gitignore -- '*.png' \|
parallel zopflipng -m -y {} {} \;
Files which zopflipng was not able to compress more efficiently were left unmodified.
Bug: T127608
Change-Id: I1f01ac23c10d57edb8471f43ba01bf3cc8de5969
This makes the actions more consistent, and also allows for separating
the two behaviors: The one where we need a link to a destination
(User page, diff, etc) and one where we have an action the code needs
to take care of ("Mark as read" or, in the future, volume control, etc)
Also, this allows for adding descriptions to the secondary links in
the dotdotdot menu.
It also fixes the bug where the links did not work.
Bug: T125160
Change-Id: I0ebf3fc62425f86e2e7f1e96b67f8dc34db83efb
Make link-blue a bit bigger, revert a big smaller,
and change the blue used in link-blue.
Bug: T121624
Change-Id: I13d8667b4f2173c587330e1fc4604aa9f5632480
The rules setting the text color on the <a> with
various strong specificity overrides were unnecessary.
Instead, simply set the text color on -header.
This also makes the text color apply if there is no
primary link, because there is no <a> in that case.
Bug: T123756
Change-Id: I02c7d28438678968fa64a59beeac3d8d26cb0702
This will make the "flat" positioning of the bundle items a lot
more consistent and organized.
Bug: T121933
Bug: T123762
Change-Id: I472fcc89e540f1a886168069c547c6dc7e5ce613
Keep padding around the icon at 0.5em on the left and 1em
on the right for now; we'll change this soon to make the
icon centered.
Bug: T123656
Change-Id: I8c04daee460dd72e2358c3aa315110e05a9a5312
As a product decision it was decided that foreign notifications
cannot be 'mark all read' for their internal items.
Bug: T121930
Change-Id: I79292401b69adc4fad601192009296e02e8410b5
Make sure bundles can be marked as read by marking their sub-items
as read in the UI and also in the API.
However, for automatic 'mark as read' action (like the one that happens
when the model is "markReadWhenSeen") make sure to not mark-as-read
the bundles automatically.
Bug: T121930
Change-Id: I9d6bf6904fa3ca6559370e58853d29069f55af9e
The pure black icons which drew too much
attention when they are next to a lighter
text is changed by controlling the opacity
of the icons.
Bug: T119378
Change-Id: I2e6c8d47187621607a915e49cfe5380c744efe56
If an error has occurred while fetching from the API, the
placeholder item should display the API error information.
If the error is specifically a login issue, a specific
error message is displayed.
Also, adjusted the mw.echo.ui.PlaceholderItemWidget to
accept a clickable link; when valid (currently only with
login error) the link is applied so the user can click
the notification and be taken to the login page.
For general notices (like API error or a general 'no
notifications found' message) the link does nothing.
Bug: T121923
Change-Id: I89a43c7c0eb2cf8e63d03704536e0938ab57dd4d
We already output unix timestamp both in user preference timezone as well as
utc, but we only had the user timezone version for TS_MW format.
While we could change the frontend to use the unix timestamp format, I don't see
any reason not to also include the MW format in utc. Frontend can now easily use
that.
Also fixed creation of the moment object. The timestamp was created as UTC, but
the way it got there was wrong: it expects the timezone offset (Z) to be
included in the timestamp, which is not the case (so it just ended up at +0:00,
which was fine, but confusing). I removed the 'Z' and forced it to be
interpreted as utc.
Bug: T121813
Change-Id: I09403615a1ffbde5dd69af9914afdbdd86cbfe4d
We removed the item first from the 'unread' counter and then told
the API to mark it as read. The API, however, wisely first checks
if there is anything *to* mark as read, but by that point, the
unread count is zero, so it gracefully refuses and returns an
empty resolved promise.
That is clearly not the way to go. Remove the read item from its
smart unread counter only **after** it was sent to the API to be
marked as read.
Note: We shouldn't wait for the API promise to resolve to remove
the item from the counter, but the API should run its preliminary
tests before the item is removed.
Bug: T122087
Change-Id: Ia5fc35c7435db8c4742238897da67681cee23c41
Do not send an update to 'seenTime' to remote wikis; only update
the items that are in the local API.
Bug: T121928
Change-Id: I291ecdb53364327dbdcb769c0d93512eeed3ab29
Have the group item expand itself not only when clicking the literal
'expand' button, but also when we click the entire item itself, as
if to open the notification item.
Renamed the expanding method so it is not specific for the button
event alone; also renamed the 'toggleExpand' to 'toggleExpanded',
as it toggles the inner 'expanded' state withot the API request
expansion process.
Bug: T121929
Change-Id: Iac23e06d1c17be4e1c5f63663fb0f81261f50070
Use #888 instead of #666 to match secondary link text
(which is #000 with 50% opacity), both in the flyout and
on the special page.
Bonus: use LESS variables for these colors.
Change-Id: Ifc1182a001e9b25f6ff7c213b6fcde3dc2f0acd2
* Add the ability to use bundled expandable
notification groups
* Display bundled cross-wiki notifications following
the design
Bug: T115419
Bug: T115423
Bug: T115422
Change-Id: I8c3eba6d627c3f06d51d74fc9774e3fc2d02915d
Adds support in the logger code that is unused for now.
Note that I9bf6f4bcd41d8da5 must be deployed before this can be used on
Wikimedia sites.
Bug: T120158
Change-Id: I1968f36e21139975d25231ac25c22a73dea6fd0d
I'm not really sure where to stick the primary link. I could wrap the
entire notification in a <a> tag, but all the text becomes ugly (I
suppose we could hack around it with CSS?). For now I just added it
before all the secondary links.
Change-Id: I4f6add9ecfb367660d1a6346825382ad415bdb77
This is in preparation of adding more item models and widget types,
and in preparation of switching the notification widget away from being
a select widget.
Change-Id: I518fb3d80f4f67d677c21ca5593638269acfa544
This is in preparation for dealing with cross-wiki notifications
where we may need several types of operations to extract bundled
notifications from local and external APIs.
Also, renamed files:
* mw.echo.dm.AbstractAPIHandler -> mw.echo.dm.APIHandler
* mw.echo.dm.APIHandler -> mw.echo.dm.LocalAPIHandler
* All API-related handler files moved to their own folder
for better organization.
Change-Id: Ib730c780ea52c93a6026c5d0b22012b6f39bb50d
This is especially important for combined notifications and
notification lists from different sources; the model list should
be sorted to reflect items by timestamp and unread status.
Note: The dm.List and dm.SortedList now mirror the structures
OO.EmitterList and OO.SortedEmitterList that are awaiting to be
added for oojs in Ib94e4e4a49 and I3fd569691549 respectively.
Once those are available, the dm.List and dm.SortedList can
be removed, and the model can mixin OO.SortedEmitterList instead.
Change-Id: I97e1ecbe5dccc478be527a94f037500f78f74b14
Make sure it's possible to create a combined notification widget
that features both alerts and messages.
Change-Id: I4b3f263039f54430a61acc1a261d8aca8e894a90
This simplifies the operation of the API a bit, but more importantly
this will let us create a demo where we can manipulate the API result
and test various new notification formats while the work on the
backend API responses is ongoing, and also will allow us to have a
constant test for all notifications types, including backwards
compatibility.
Change-Id: I6081329a287cda4f5f1f1604ace5d04ff8d9fe3d
If a notification is already read it is by definition seen. Don't
mark those as unseen. This can actually happen if our seenTime is
invalid (like a cache miss)
Change-Id: Id943691599116597b6c68d2cc40e7b89a25ce05e
In Modern, the hover color for links in the #p-personal bar is
white, which is unhelpful for the buttons in the popup. Override
that style for hover.
Bug: T114080
Change-Id: I8b739f2a46c3eb3ce9f61e92b5025751047a451d
* Fix typo that caused logInteraction() to never do anything
* Fix incorrect context parameter passed by NotificationBadgeWidget
* Consistently use mw.Echo.Logger.static.context.* constants for the
context parameter everywhere
Bug: T114833
Change-Id: I140e4222169ad9e78c6bf016d9765828513adcbb
Making padding equal on either side, and use display:block
to avoid extra space underneath.
Bug: T115052
Change-Id: Icddb755cfe8892422661712d35eda4f01441207d
We have to account for the placeholder item, which doesn't have a
getModel method. We should ensure the real items and the placeholder
item implement a common interface so we don't need these kinds of
checks all over the place.
Bug: T114853
Change-Id: Iff6f0e85fb7737e09a34e72038b6b41681d95595
This browser test checks that mentions go to alerts and talk page
messages go to messages popup. This also upgrades the MW-Selenium
version in Echo tests to 1.6.1.
Depends on MW-Selenium version 1.6.1 (See T114061)
Bug: T113081
Change-Id: I40a17500cdfb838420c04dc0b9268ba56515cc2c
There was CSS trying to counteract this, but it wasn't strong
enough to override Modern's styles.
Bug: T114080
Change-Id: I96d9b32353fbabc8f720ecb869904639009c894f
Don't just remove it when all notifications are read, but when all
specifically talk notifications are read even if there are other
unread notifications in the popup.
Change-Id: I5aa65a4060d64f374b47fe91d8e53c92ded5fab2
We've corrected this behavior for updating seenTime but not for setting
the notifications as read if the widget is configured as
'markReadWhenSeen' which produced unexpected issues with updating alerts.
This is fixed in this commit.
Change-Id: I4d2420a81d2b8409749ad1621b2d56bdd14e8c6e
Modern has duplicated styles for `#p-personal li a` and
`#p-personal li a:hover`, so duplicate our styles too to make sure they
fully override Modern.
Bug: T114080
Change-Id: Ib3da29532e9f0939379f3988a629bd6b7b1fabb8
OOUI now uses absolute positioning for these icons, which breaks
the centered text model we'd like to use. Longer-term we should
use a different widget for these buttons, or perhaps a widget of
our own, but for now let's hack around that by undoing the
absolute positioning.
Change-Id: I8cc1fd69eeedde00facec80d82a21d5cc5610992
Whether the button should appear or not is updated when the badge
is updated, based on having unread notifications. But during construction
the button should be hidden.
When we do update the badge, the button should only appear if there
are unread messages and if the current widget is not 'markReadWhenSeen'
to avoid having the button 'flash' while notifications are marked
read.
Bug: T113629
Change-Id: I002db9e3d8990b5a2cd67bf5d120b1c7eb454362
The new oouified echo popup makes the tests invalid; this commit
rewrites those tests.
Also by doing this commit we are upgrading to Selenium 1.4.
Change-Id: I26215558768d55be449276c55b4b745c3a458ecb
And add a FIXME for our existing metric possibly being wrong if the API
request finishes before the ext.echo.ui module is loaded.
Change-Id: I918187dd276193b7602f60527b423ca06cb7e2d0
The notifications can be populated from the popup and outside of it.
We should update the seen time only if the request came from the popup
itself, and only if it is still open by the time the api request
has finished.
Bug: T113645
Change-Id: Id91ddabb85fd582be1890ea420d0559e0cdca167
The popup automatically updates itself every time it is opened.
If there are unseen notifications, they should be updated when the
next fetch happens, which means we must take off that class so
that the animation doesn't repeat itself.
Change-Id: Ib4173631efa1c5a3a3509e0797e60397397bd009
If the popup is open, whatever is coming in is immediately 'seen',
so we shouldn't flash the badge as red.
Bug: T112823
Change-Id: I9fe78ed11506de3c82043141f994e1ca96c5880b
The orange bar is replacing the 'talk' link; when it is removed, it
should actually be replaced back to being a regular 'talk' page
and not be completely removed from the page.
Change-Id: I930d321952e85ee79acbbd162ab763b4eea63ff1
We really only care about measuring the timing of the first click,
because that is the one that loads OOjs UI and fires an API request.
Bug: T113387
Change-Id: Ib37d31b07c45d546c75251a57a848e3ae0f4bf1b
We need the button to remain a standalone <a> element so it preserves
the exact same styling as the output we're getting from the PHP. the
only way to do this is to create the widget as the entire <li> and then
replace the original.
Bug: T112218
Change-Id: Ib6fd4369d46cb7f37b14675d63bbce9950abcd48
The status changed internally but was never passed to the API.
This commit fixes that mishap.
Bug: T112826
Change-Id: I1a6d2a871eae837860eb1f21df28134d5e747cd7
The unseen animation should display whether the option is unread or
read, because it should point out notifications that were unseen/new in
this session even if they are immediately marked as read (in cases
where the configuration is 'mark read when seen', like in alerts).
However, the animation itself switched by default to white background
which is an 'unread' state. This made cases like "mark all as read"
mark the notifications as read but still have a white background as
if they are unread, and yet have no 'x' button because they are actually
read. (Bear with me here)
This commit organizes the animation better. We now have a proper clear
naming for the two animations - unseen-to-read and unseen-to-unread and
we use unseen-to-read as default. unseen-to-unread is used when
the -unread class is applied and the other cases should reflect the
correct state of the option read/unread status.
Bug: T112826
Change-Id: I7fe8ea5dcf8c3e31d16213313be34b2350d03655
The logger code for clicktracking is only needed after something has
been clicked, so we don't need it in init.
* Move EventLogging initialization into Logger.js
* Add ext.eventLogging dependency server-side if needed
Change-Id: I46ff3c62b05c24dd2bb18a1574df17f9d2823125
If users are likely to open the flyout whenever they have unseen
notifications, we should preload some more resources to make those
intial openings faster instead of lazy-loading everything.
On the server-side, we will increment the MediaWiki.echo.unseen metric
whenever we serve a page when the user has unseen notifications. Then on
the client we will increment MediaWiki.echo.unseen.click if they opened
the flyout while having unseen notifications.
By comparing the two graphs, we can determine how likely users are to
click on the flyout whenever they have unread notifications, and how
useful preloading extra resources will be.
Change-Id: I14e9aa7f03d6ef275042b8a2c4cb0e5b5a64c0d7
There is no need to load the entire of Echo's ui module (especially
since that includes ooui widgets and their styles) on every page load.
There's only need to load the entire module if and when a user clicks
the Echo notification badge.
Also, make the echo.dm model accept an external fetchNotifications
promise so we can send the API request alongside loading the echo UI
and "feed" it into the DM for processing.
CSS adjusted to make the "jump" between the nojs and the js buttons
seem less jumpy.
Bug: T112401
Change-Id: I516e655ffd198511d694489a0702c5c713a5fd68
We don't really need it to render the no-JS version
of the notification badges (the only rule we were missing
was background-repeat: no-repeat;) and it significantly
increased the amount of render-blocking CSS.
This means we do need to call setupOOUI() ourselves
in order for our get_class( OOUI\Theme::singleton() ) hack
to keep working.
Bug: T112401
Change-Id: I148f8ac19dfe62cc84abe03e1a2ff00683d515c1
Remove the behavior of the SelectWidget 'choose' and instead wrap
the notifications with their primary url links. That way, the click
handler returns to browser native response, and we gain automatic
behavior for ctrl+click, middle click, and regular click.
CSS had to be adjusted as well.
Bug: T112004
Change-Id: If10a4d3be71a8cf3ce966f15b922da0b9a2ddcc7
Make the popup header the pending element to give the user a visual
indication that the notification widget is being updated, but don't
clear the notifications before loading more from the database.
Bug: T112186
Change-Id: If2b724fab07ef5b7caf5cab3e44fe326470ac0e7
The flyout is now part of the personal tools, so Modern's styling of
`#p-personal li a` now affects it. Override that for links in the flyout
so it doesn't look super silly.
Bug: T111825
Change-Id: Ie67ff2d7803362bd7214bade27383282620799b9
The alignment of the buttons was done haphazadly before, using
padding. This should be done better; we should calculate the buttons
width to be 50% of the width of the popup.
Since the popup accepts a width config, we know what its value is,
and can calculate the proper width. The width was added to the
variables.less file for continued use.
* Added popupWidth config variable to the badge widget
* Added OO.ui.ButtonGroupWidget to place the buttons in for
consistency and styling
* Added calculated width styles to both footer buttons
* Added corrections for MonoBook
Change-Id: Iad2c947da06241e9303cf1f35574177a0f602bbb
Hide the 'mark all read' button while we fetch notifications.
We can't mark all as read before there are any actual unread
notifications in the popup anyways.
Change-Id: I38ace6a3f8b7898bdcd82ce650947f0c7ef319e2
Notification badges are conceptually closer together than the rest of toolbar elements.
So it makes sense to move them closer visually too.
This is just a small CSS adjustment to compensate for the default margin
that items in the menu get. If there is a cleanner way to achieve the same,
feel free to refactor.
Bug: T108190
Change-Id: I06403f67c24f045c125c505dca2101f9eed79594
Since the nojs "base" version uses the automatic title creation
of the personal tools, the message keys were adjusted accordingly,
and the old unified message was removed.
Bug: T108190
Change-Id: I1f242f530aa68562aa4dc885156586c22c4df618
For some reason during the readjustment to the model/view the
mark all as read button was not toggled when it should have been.
It is now.
Change-Id: I05c32e9cb02e94b4e3dc3e2bcd9cead0eb802015
Listen to 'toggle' instead of onAction so we can only send api
requests for notifications if the popup is in the process of opening
and not when the button is clicked to close the popup.
Bug: T111667
Change-Id: I39aea942ff5a87a13043cccdb696ef8952ca61db
Make sure that when the seen state changes, the badge icon adjusts
in case there are two different icons for seen and unseen states.
Also organize a bit the unseen/unread status in initialization.
And separate and update the icons in the popup head to always fit
the status and icon of the badge.
Bug: T111432
Change-Id: I891a36c6eace9302b370a3efaf5aa6f57192c17f
The rule to make the firstHeading limited in height should only
apply to the design of the Special:Notifications page, and not
everywhere on MW.
Bug: T111628
Change-Id: I6636ed7f4ad0ccc7bbf83ace51dda62d09e09a5c
This is so that the animation definition remains on the notification even
after it is marked as seen.
Change-Id: Ifd19cd5cd003a4e29d0c42788d51aca985e0b859
First update the notifications as seen, then send the api request
for updating the seen time. Update the actual seen time from the
api response so the time is always in sync with server time.
Change-Id: I97717cfda7b665dcbc3add90712069700f44adf6
So we're not abusing user preferences for the last seen time.
EchoSeenTime is a small wrapper around ObjectCache that handles the
fallback to user preferences during the transition.
All JavaScript code now needs to use mw.config.get('wgEchoSeenTime').
Bug: T95839
Change-Id: Ia45ba5e30eb4564250539d04d5886d2598ebd49a
Split the notifications into 'alert' and 'message' badget with two
different flyouts. Also clean up styling and module behavior.
** Depends on ooui change Id4bbe14ba0bf6c for footers in popups.
** Depends on ooui change Ie93e4d6ed5637c for fixing a bug in
inverted icons.
** MobileFrontend must also be updated to support the new modules
in this patch I168f485d6e54cb4067
In this change:
* Split notifcations into alert and messages and display those in
two different badges.
* Create two separate flyout/popups for each category with their
notifications.
* Create a view-model to control notification state and emit events
for both the popup and the badge to intercept and react to.
* Clean up module load and distribution:
* Create an ext.echo.ui module for javascript-ui support and ooui
widgets.
* Create an ext.echo.nojs module that unifies all base classes that
are needed for both nojs and js support, that the js version
builds upon.
* Create a separate ext.echo.logger module as a singleton that can
be called to perform all logging.
* Clean up style uses
* Move the special page LESS file into nojs module so all styles
load properly even in nojs mode.
* Transfer some of the styling from JS to LESS for consistency.
* Make the 'read more' button load already with the styles it
needs to look like a button, since its behavior is similar in
nojs and js vesions, but before its classes were applied only
by the js, making it inconsistent and also making its appearance
'jump' from a link to a button.
* Delete and clean up all old and unused files.
* Moved 'Help.png' icon from modules/overlay to modules/icons for
later use.
Bug: T108190
Change-Id: I55f440ed9f64c46817f620328a6bb522d44c9ca9
This breaks pages using ?uselang=xx where "xx" is not
the user's language.
This reverts commit 0919b01e75.
Bug: T103935
Change-Id: I219810451b991cef88bac62cf880bfda6f98e930
mw.echo.setUpDismissability was removed in 08fc83b6de, and will
never be called since the class is never set.
Change-Id: I1e13bbabaeb7df21c161d4cf4205a1564e1d81d9
Since we didn't use to save seen time, it is unreliable at first.
I decided to just show them as read then, since we couldn't know
if they had or hadn't been read.
However, it would make more sense to keep them unread until we first
save the time a notifiation is seen: it is in line with the current
behavior (where the badge just stays red, always)
Also fixed a problem where I meant to .get a value but had .set
instead. It wasn't noticable because that function is currently
only called when things have just been seen, so even though it
was wrong, it produced a good result.
Bug: T94634
Change-Id: I7ee447249527feb3914c76cfffd673bbda062b75
Removed exemptions from .jscsrc and fixed the code to make jscs still
pass.
Kept the dangling underscores exemption because leading underscores
are (for now) used as a naming convention for private functions in
this repo.
Change-Id: I18964f8469f52c294276527d92cb6bf9f48c2576
I tried to stick as close to the existing code as possible.
Special:Notifications is slightly different from the overlay,
however. I made it add .mw-echo-unread class for consistency,
but that JS doesn't record seen time (it only loads older
entries), not does the CSS fadeout apply there (it marks
everything as read as soon as it's displayed, so different
behavior from overlay)
PS: I'm not sure about browser compat for the fadeout. But
even if some obscure browsers don't support this, meh. It's
not an "important" feature that can't be missed.
Bug: T94634
Change-Id: Ibb201823fb52ef8a3d5eaa39b0b724ede8d271d1
Links on the notification footer, "View edit" / "View changes", needs
to be blue instead of grey to be consistent with the Mediawiki interface.
The link turns blue upon hovering, just the way it is currently set
for other links on notifications like the page title.
Bug: T57367
Change-Id: Ibaaff52b9d4bdfc5beca442e10734dd5cf8886d7
This is now required to actually pick up the MW UI progressive
color, so there's a slight visual change (wrong blue => right blue).
Fixes T72818
Bug: T72818
Change-Id: I719eb20a3940904ab45f8376280e20432a3b2d80
Added ext.echo.updateNotificationCount to notify other extensions
about updates to the notification count.
Bug: T67178
Change-Id: I7f4e34f2c1808b249db010018dd1b49a8dde246a
mw-ui-quiet gets dark gray and bold.
This way it is easier to see which is the current tab.
Bug: T71929
Change-Id: Ie7e21cd71a385d216402d393344cf76d3ed45d23
Binding it to the element name should rarely be needed as it only
adds complexity with no clear benefit.
Nesting classes should also rarely be necessary as it basically
requires the code will never be embedded in or itself embed something
from another component (otherwise you'd clash with that other component's
class name, and if you don't clash, then it wasn't neccecary to
nest the class in the first place).
If the class is overlay-specfic it should be renamed to something
like '.mw-echo-overlay-grey-link'. Keeping it as-is and applying
directly though, as it doesn't appear overlay-specific.
Change-Id: Ied601058c8e501914113d542f88542c83157d5a0
The max-height of the notifications list was hardcoded to
the height of the window minus 134 pixels. I don't know
where this value came from, but it doesn't seem to take
borders into account. The correct value appears to be
139 in Chrome and 140 in Firefox, so I changed it to 140.
Also, this really really should not be a hardcoded value.
This 140 value can be measured in JavaScript; that's how I
derived it. Even better, oojs-ui has a mixin called
OO.ui.ClippableElement that automatically does this for you
AND automatically adjusts the height when the window is resized
as well.
Change-Id: I17bc2c5333e5c3d5dd720e6bccf8cbbdbb4abe6c
The "hover" pseudo-event was deprecated in jQuery 1.8 and removed in
1.9. This is logged as "JQMIGRATE: 'hover' pseudo-event is deprecated,
use 'mouseenter mouseleave'". This fix switches to using the .hover()
method which appears to be the original intent as two functions have
been used which .hover() supports, whereas .on() only accepts one
handler. Now the class change works as expected.
Change-Id: Ib28801293b72f8f344455b5f308876d185abc8bd
This reverts the tests and amends them after the
application of commit 5da9eac08a.
Luckily nothing appears to be broken.
Change-Id: I67acfe5dc74ef750d5443dd619dbb114623ee233
Just like all other text elements in the overlay: set the font-size to 13px
Not sure why this was em & rest px. 13px is equivalent to the current 0.8em in
Vector.
Change-Id: I29d67f21cc2af7209469299ab228ebe7dac98af7
The only exception is when there are new message notifications but no new
alert notifications.
Bug: 70461
Change-Id: I06daa3f7d526beeb878eb343c169e01acd49e71f
If you have an unread notifications not in the initial
load of special page, clicking load more would throw
an error
Bug: 69714
Change-Id: I9af588780b2ab8481ba252ddc21bad0601de7a0b
This class was only being applied to notification output
on special pages and not in the overlay, move it so it can.
Additionally:
* bolds .mw-echo-title-heading same as the anchors it works with
* clean up a repeated rule against `.mw-echo-title a`
Change-Id: I579252399b39746f5aa2cfc51b5cd3b9b8b2cdb0
Also adds browser tests for the behaviour of the mark all as read button
to ensure it only clears message notifications.
Dependency: Ifb7b1b7b7feb4a5af65c79bb16b91a5a9c70166c
Change-Id: I46e1de229e32d705e67cebde678ecea3f3633906
This removes the need from the super specific selectors.
It also allows us to create multiple notification elements
on a screen.
Change-Id: Ife5291a315915779689943ffc18ac73d77351d0e
IE8+ supports the pseudo element. The world will not explode if
IE6 and 7 do not have the chevron.
This simplifies code by dropping the use of the pokey element
Note: I know we can drop using the image too but I decided not to do
that in this patch.
Change-Id: Ia9ac434461e63bc2cf8554060126995ac65a3531
Danny noticed a bug where if both tabs have unread notifications,
then when opening the overlay and clicking on the alerts tab, the user
would be reverted back to the messages tab.
Test stops this from happening again.
Change-Id: I6bbbbf61251957336de8856201412fa3569ab22d
Don't mark messages as read until they have been acted on.
Show a mark as read button that marks entire list as read.
Change-Id: I4450a66cffd11c67b9a4ba9aac0fe958dc760e15
Note no design was defined so have taken this to mean use
mediawiki ui for consistency purposes.
* Use mw-ui-active and mw-ui-quiet for tabs
* Update tests
Change-Id: If7a51b2286cdfe6e839dacc2476c9a578bc7f1df
Shift to new API to support 2 tab view
When a new has no messages they will see the old style overlay with
Notifications heading. I have added tests to assure this is the case!
Later patches will:
1) Add the mark as read button only in message view
2) Note currently the tabs do not refresh when notifications is clear.
We need some kind of EventEmitter to make this sort of thing easier.
Change-Id: I62b590e81cd3fe867c4c13959cb43466aacfe2d5
Make various properties of the overlay properties of
EchoOverlay to reduce need for function parameters
Change-Id: I70ec0c650d58322aad93d71292a836d7cf7e7474
Not as scary as it looks. The change to _buildOverlay simply changes
indenting, and cleans up to reflect new parameter. Tests still pass ;-)
Kill noticationLimit concept
Only expose what's necessary on mw.echo.overlay
Change-Id: I2671a41af8188c14ad4c910396afa0d9000b6051
No usecase has been provided, and additionally the hooks
are not documented. Bartosz also points out that
mw.hook calls are asynchronous and memorized.
This reverts commit 9d3561afaf.
Change-Id: If735b46996fab3def835a54223412ef6d3105395
Adds two new hooks to allow extensions to tie into the notification
loading process. Between these two hooks and the new isInitialized()
method any extension can run code whenever a notification is displayed.
Change-Id: If351835be5f65ca098e2d235ea8c8e4dc40ae2b4
General code cleanup as reported by the PHPStorm static code
analysis. I hope it's not a problem that I made a lot of very
different (but all very tiny) changes in a single patch. If you
want to merge this but you think it's better to split it into
several patches first, please tell me.
Change-Id: I2e2c4bb47f8d20e038d28e236e2ff813b30504af
Tested with latest Firefox and Chrome as well as Opera 12.
See bug 57327 for full description, please.
Bug: 57327
Change-Id: Ibf6e7d590754402f4cfafa3a3db55bb0c6aa525e
The badge is always close to the top of the window (if it's visible), so
this is not necessary. Also, this behavior is definitely not desired
for the upcoming fixed header beta feature (the badge will always be
visible as a part of the fixed header).
Change-Id: I66e8a50b1139f7bcd005cfb3c3576578efe6a653
Provide users a better user experience by catching and logging
errors with Echo notifications.
Bug: 60906
Change-Id: Iee93a05c6eed468af8bbfa60249df0819c49c45b
Changed the font size of notifications which was earlier too small
and also the accessibility was also too low
Bug: 60239
Change-Id: I20be3cd2277e865ee694070f119999b7b170547c
If the echo-overlay-title-overflow text is too long, it's wrapped into multiple lines now.
Bug: 55919
Change-Id: Ib1d252ab26be7d73cbf71c6fb19d84b80d8d30c8
Apparently three wrongs make a right: hiding the overlay still worked.
* '#pt-notifications a' click event handler was not correctly checking
for events comig from inside the overlay due to a missing dot before
class name
* But if it were correctly checking, it would not be hiding the
overlay pokey (just its body) due to a copy-paste error
* Instead the clicks were handled by the 'body' click event handler,
which did not correctly check for events coming from
'#pt-notifications a'
I made things right again. The user-facing behavior is the same.
Change-Id: I02aba0e25ba4d81b234b327f120e0e2ff13d117c
Otherwise a new copy will be created every time the user opens and closes
the popup, and jQuery will hold on to each one forever (because it has
events bound), leaking a minuscule amount of memory.
Change-Id: I70c713be839f826fc27d07b04260c166f9052020
Core styles for Monobook include high-specificity background: transparent;
rule for #p-personal li a, we need to match it to set our background.
Also change hover behavior: switch to a deeper orange instead of
default white, similarly to how the badge already behaves.
Partially reverts I682182fe.
Bug: 56214
Change-Id: I9f343264c395ecf09c1e34e03d208ec2119fb622
Follows-up 383a818.
* There is no need for the additional element ("a") or
descendant ("#pt-mytalk") selector.
It isn't overrriding anything, only hardcodes details that make
it harder to maintain or extend this stylesheet. For example,
there is a gadget that makes user messages green instead of
orange, it now was required to hardcode the "#pt-mytalk a" part
of the selector eventhough those are subject to change.
Separation of concerns.
* Cache/reuse the jQuery object instead of executing the same
query to the document, again. It also avoids a potential bug
where the second query matches different elements (e.g. after
appending alertMessage, there could potentially be an additional
nested anchor link; there isn't now though, as the message is
plain text).
* Add comment about weird echoNewMsgAlertDisplayed variable.
Change-Id: I682182fe15a868969f25fa5bfe2412e2a6f3dddf
* In some languages like persian, the number 0 is represented as '.', we can't compare
'.' with either 0 or '0' to detect the no-notification status of the badge
* The markread API doesn't respect uselang param, it would return 0 instead of . in a url with uselang=fa
Note: we need to provide raw and formatted count in the API since client side javascript
doesn't provide fancy function like $wgLang->formatNum()
bug: 54575
Change-Id: I0a49828253ec346ed27c5b9a976f8bdff4e1fa90
Removing unused functions and declaring correct dependencies.
Targetting to desktop and mobile so it can be used by both.
Also removing dismiss-related code from the formatter.
Change-Id: Icccce64cfb3c564ab468a93ccdba9c5a61687fd5
Also making sure that footer has some amount of separation from
the notification title even if there is no payload.
Change-Id: I85a1a7989539044a0b0b53e76e70ddee9bb7165c
The space after colon on this line is actually a non-breaking space
( ), which is not allowed in this place according to CSS syntax.
Therefore all browsers ignored this rule (logging an error like
"Invalid CSS property value") and the shadow was never shown.
We could fix the rule instead, but I'm pretty sure users are used to
this by now, and in my opinion it looks better without shadow.
Bug: 53490
Change-Id: I1fd508d2059bec5cd79a6dcdce8dc9be6e6d4229
We want the notifications in the flyout to behave just like links,
including standard middle-click and Ctrl-click behavior. The simplest
way to do that would be to actually make them links - but the area can
contain a few other links, so we can't do that and have to resort to
ugly hacks.
Or do we?
Turns out that while browsers won't accept HTML containing nested <a>
tags[1], such a structure is valid XHTML, and it's possible to create
such structure in HTML mode using DOM manipulation. It works like one
would expect: the entire thing is clickable, but inner <a> tags' hrefs
override outer ones.
Firefox even had a request to make that work[2] which was happily
fulfilled.
Tested the basic case [see below] on Firefox 22, Opera 12, Opera 15
(which uses the Blink engine like Chrome), IE 8 and IE 6 and it works
the same on all of them. Tested the XHTML variant [see below] on all
of the above except for the IEs which don't grok XHTML and it exhibits
the same behavior.
[1] Simple test: $('<div>1<a>2<a>3</a>4</a>5</div>').html() is
"1<a>2</a><a>3</a>45", not actually "1<a>2<a>3</a>4</a>5" like one
might expect.
[2] https://bugzilla.mozilla.org/show_bug.cgi?id=331959
----
The test cases used are below. When trying out the XHTML one make sure
that the browser uses application/xhtml+xml MIME type; saving the file
with .xhtml extension should be enough.
XHTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<div>1<a href="http://google.com/">2<a href="http://example.com/">3</a>4</a>5</div>
</body>
</html>
HTML:
<!DOCTYPE html>
<html>
<body>
<script type="text/javascript">
var div = document.createElement('div');
var a1 = document.createElement('a');
a1.href = "http://google.com/";
var a2 = document.createElement('a');
a2.href = "http://example.com/";
div.appendChild( document.createTextNode('1') );
div.appendChild( a1 );
a1.appendChild( document.createTextNode('2') );
a1.appendChild( a2 );
a2.appendChild( document.createTextNode('3') );
a1.appendChild( document.createTextNode('4') );
div.appendChild( document.createTextNode('5') );
document.body.appendChild(div);
</script>
</body>
</html>
----
Bug: 52319
Change-Id: I311eca70f025ce92129c828cd88f96686b7cff72
Out of the default MW skins these only seem to affect CologneBlue.
* Reset padding and list-style-image on ul#mw-echo-special-container
ourselves, do not rely on the skin doing it
* Use transparent background on .mw-echo-notification (and
semi-transparent black on hover) instead of solid white and
light grey to accomodate colored skin backgrounds
Change-Id: I2c178627e4dbe889c4958afc41e4969aaa45a717
wgUserNewMsgRevisionId is null with only one revision and that revision is
not viewed, this makes it not reliable for determining if there is new
message. We just switch to check against $user->getNewtalk() instead.
We can still use wgUserNewMsgRevisionId to generate diff links if desired
Change-Id: I4cf50a944aada03151bd17f3610bd59b3bfb2bf2
separate into multiple ul elements with headings dividing them
This removes need for unnecessary styling rules in mobile web
Change-Id: I8acaef726ea0cc639054cf36d6c3649c7ab25bee
* Add missing spaces after 'function'
* Remove underscores from identifiers
* Don't use typeof for undefined with local variables and object properties
* API ok/err is deprecated since MediaWiki 1.20 (< 1.22-alpha), use .done and .fail
Change-Id: I5ca3403ee263a0c3e6709618e48e896340952337
When I changed mw.echo.special.initialize to be called as a
callback from $( document ).ready(), rather than being called
explicitly from the closure, it changed the context, which got
assigned to _this. This broke some of the function calls.
Change-Id: I602a58a82ee91646901d0ab1c8b7bb4b22b3437a
If link underlining is on, then the number in the badge
will be underlined. This is probably never needed, even
if the user wants to underline regular links.
Set text-decoration to none in all cases.
Change-Id: Ifaca38a8f0a6a3c8df39502a3da582f639ec6333
This provides some rudimentary styling support to make Echo usable
with the Modern skin.
It also fixes the Notifications special page so it is styled
correctly in Modern, CologneBlue, or with Javascript turned off.
Also some more tweaks for Monobook skin.
Retiring the 'feedback' link from the special page, per PM.
Bug: 47932
Change-Id: I633a93a78f5a78d0642a3a059fa6f7208f99cec4
Brought up by Krinkle in Icebfe86b (PS4):
* 'ok' and 'err' properties of Api are deprecated, use promise interface
* Use 'api' instead of 'Api'
* $( '<a>' ) instead of $( '<a/>' )
* Expected space after 'function' keyword
Change-Id: I0199db902174551bcf9269edafb1fef1df118b13
With this change we will no longer be relying on JS for the badge
functionality. This will prevent the flash of unstyled content,
and allow wikis to locally override the styling (since the unread
class is now applied immediately).
I also went ahead and made the badge styling more closely match the
talk page message alert styling per Vibha.
Also removed the old full link optional behavior since we weren't
using it, and it would have been a pain to maintain.
Bug: 48165
Bug: 48001
Change-Id: Ie85d66afd5181d487d0bb2776ae14b121ea50d88
* Icon can be defined using a path or a URL
* Extensions don't need custom CSS, but add icon through BeforeCreateEchoEvent
* Sites set their notification icon in LocalSettings.php or equivalent
Bug: 46585
Change-Id: Ifc02b653d07de19229dfb2604305e32f3bd595fe
Making monobook's text-transform not apply to notification flyout.
Unfortunately, 2 overrides are needed since the monobook selector
is applied weakly to the overlay in general (as an inherited style)
and strongly to the notifications themselves (since they're in a ul)
Bug: 47652
Change-Id: I2600b5836ea7bca59d9089d8bb7e69a6aaeca6a4
When there are more new notifications than can fit in the overly
it shows a message in the header alerting the user. This message
should be in regular text, while 'Notifications' should stay bold.
Changed per Fabrice.
Change-Id: I21dc0ed516e5656c6d1965970d7a5f313e317aa9
Button is only shown if there are more unread notifications than
fit in the overlay.
To avoid performance issues, this version only works for cases where
the number of unread notifications is less than the maximum count
(99 currently). Otherwise the button to mark all as read isn't
displayed (it's also limited on the server-side for good measure).
Bug: 47092
Change-Id: Ifcb0a436e2b31062741c441cca239d35ddefa0e1
Changing highlighting behavior for archive. Now unread notifications
are highlighted with bold text in the archive rather than with a
background color.
Bug: 47149
Change-Id: I03b2a2968db6d067041c2618c5b4f878d8dc548f
Having two links to the archive page is redundant and the meaning
of the title as a header for the list is lost.
Change-Id: I8dce36309e10854b9ff799c82501b6d59df0c621
Includes new web preferences for Echo
Also adding ability to set dismissability per notification type
Still need to arrange subscription options into a friendly format
Still need to add dismiss functionality to flyout
Change-Id: I484a24b424e69be3640e63b76f82735edae6f13a
This is replacing the implementation I did for 'html-light'.
The reason html-light doesn't work is that we don't have any way
of reliably determining which parameter should be the one that is
linked to in the notification title (flyout notifications are only
supposed to have one link). With this system, the notification
definer can specify a separate message/params combination to use
specifically for the notification flyout. If they don't specify
these, it falls back to the normal title message/params.
Change-Id: I35394849cf99307eba4a76e079333d19514fdb5d
From
https://integration.mediawiki.org/ci/job/mwext-Echo-jslint/142/console
18:54:22 >> modules/overlay/ext.echo.overlay.js: line 56, col 49, ['list']
is better written in dot notation.
18:54:22 >> modules/overlay/ext.echo.overlay.js: line 37, col 44, 'window'
is not defined.
18:54:22 >> modules/overlay/ext.echo.overlay.js: line 127, col 21,
'window' is not defined.
18:54:22 >> modules/special/ext.echo.special.js: line 58, col 49, ['list']
is better written in dot notation.
18:54:22 >> modules/special/ext.echo.special.js: line 112, col 25, Bad
line breaking before '&&'.
Change-Id: I2676a3e07d9d5f7419dd9030dbf218b2c0094cf1
1. EchoNotificationController::resetNotificationCount() does not reset count, it has misleading name (should fix the name in another patch)
2. Prevent multiple concurrent API calls resulting from multiple clicks on more link within very short amount of time
Change-Id: I4aeeadddd4fed833c2ae4308c1a0e94e6644f5e7
New badge behavior - Show badge even if zero notifications
Enable long and short links - i.e. 'Notification (X)' or just '(X)'
Depends on core change https://gerrit.wikimedia.org/r/#/c/38258/
Change-Id: Idc2288a4ddd0bf788ccdadb96d4744d223edaf0a
patch set 1:
* Consolidate notification retrieval in API and Special page
* Add load more function to special page with records as old as 7 days ago
* Add support for browsers with javascript disabled
patch set 2:
* Remove trailing whitespaces
patch set 3:
* Fix some i18n issue
* Fix variable names and some exta whitespace
* Load core css files on special page rendering
Change-Id: Ic69e430b5eb196e5223a2bb6b1d447ef257d559b
Payload components can include edit summary, edit snippet, welcome message.
This replaces the older 'content' system which constructed a payload
from an arbitrary message + parameters (but only supported a single
message).
Change-Id: I9a5e1d69f0c8296bb2bb79cb3f26e67aa34592bb
* Supports 'undo' and 'rollback' currently
* Also includes adding the edit summary used to all edit notifications.
* Also fixes a minor bug that made it seem like all EchoNotificationJobs were failing.
* Added revert icon to CSS
Change-Id: Id22470107b071cdbce33da7cf3dfd09d22947644
Basically having fun with the code analyzer.
Also:
* remove unused local variable assignments
* missing return values
* CSS optimizations.
* Initialize possible unset variables.
Change-Id: I77aa08ecb48eeda08f14dc38d7f35d57ea9fa110
First implementation of "two line" formatting.
Messages have a title and optional content.
Distinguishing writing on "your talk page" from another talk page in messages.
Change-Id: I9051e4bfb66d1c25c1bf68ec092b52fd90544336
* Instead of creating a new div, replaced the content of EVERY SINGLE DIV ON THE PAGE when a user had no notifications.
* Added some styling to make title and link prettier.
Change-Id: Id713ca56abc2f58ed1d580f3e43efa3c46d76c2a
Add a title and a link to Special:Notifications to the notifications overlay.
Also add a message to Special:Notifications and the overlay if a user has no notifications
Change-Id: I28407d3ea82039b160170f51ab987418e14be2af
This version is very rough.
For an example set of Minimum Releasable Functionality, this version will notify users on
changes to their watchlists or to their user talk pages.
However, it is still missing a conversion script to turn watchlists into echo subscriptions.
For now, notifications can be viewed through the new special page Special:Notifications, or through the API module provided.
Change-Id: I5867226e3e6195fbed81f4b5803e2310f057ffc4