* Track frequently used emojis in web UI
* Persist emoji usage, but debounce commits to the settings API
* Fix#5144 - Add tooltips to picker
* Display only 2 lines of frequently used emojis
The padding trick was hard-coded to a 16:9 ratio, but we can use
width and height provided from OEmbed information and width
of the card itself to calculate a new height
* Fix#2102 - Implement hotkeys
Hotkeys on status list:
- r to reply
- m to mention author
- f to favourite
- b to boost
- enter to open status
- p to open author's profile
- up or k to move up in the list
- down or j to move down in the list
- 1-9 to focus a status in one of the columns
- n to focus the compose textarea
- alt+n to start a brand new toot
- backspace to navigate back
* Add navigational hotkeys
The key g followed by:
- s: start
- h: home
- n: notifications
- l: local timeline
- t: federated timeline
- f: favourites
- u: own profile
- p: pinned toots
- b: blocked users
- m: muted users
* Add hotkey for focusing search, make escape un-focus compose/search
* Fix focusing notifications column, fix hotkeys in compose textarea
* Add pagination in media modal
* Change array name
* Add an element class
* Avoid nested class
* Pull out the active class
* Use map instead of forEach
* Remove parentheses
* yarn manage:translations
* Add Japanese translations for #5170
* Add Japanese translations for #5123
* Add Japanese translations for #5046
* Add Japanese translations for #5099
* Add Japanese translations for #5161
* "項目" -> "絵文字"
aria-label contained body of status with content warning, which should be
hidden by default. Remove the label for the case and other cases due to
consistency.
Translate "about" page, several settings pages, data export/import,
sessions overview, authorized followers page, account deletion page.
More consistent use of words:
- A toot is a Beitrag.
- An account is a Konto.
Some small improvements.
* Fix#117 - Add ability to specify alternative text for media attachments
- POST /api/v1/media accepts `description` straight away
- PUT /api/v1/media/:id to update `description` (only for unattached ones)
- Serialized as `name` of Document object in ActivityPub
- Uploads form adjusted for better performance and description input
* Add tests
* Change undo button blend mode to difference
A new rake task emojis:generate downloads a full list of valid
unicode sequences from unicode.org and checks it against existing
Twemoji files, finally generating a map from each sequence to the
existing file (e.g. when there's multiple ways an emoji can be
expressed). The map is dumped into app/javascript/mastodon/emoji_map.json
That file is loaded by emojione_light.js (now a misnomer) which
decorates it further with shortcodes taken from emoji-mart's index.
* Add emoji autosuggest
Some credit goes to glitch-soc/mastodon#149
* Remove server-side shortcode->unicode conversion
* Insert shortcode when suggestion is custom emoji
* Remove remnant of server-side emojis
* Update style of autosuggestions
* Fix wrong emoji filenames generated in autosuggest item
* Do not lazy load emoji picker, as that no longer works
* Fix custom emoji autosuggest
* Fix multiple "Custom" categories getting added to emoji index, only add once
* Fix JavaScript interface with long IDs
Somewhat predictably, the JS interface handled IDs as numbers, which in
JS are IEEE double-precision floats. This loses some precision when
working with numbers as large as those generated by the new ID scheme,
so we instead handle them here as strings. This is relatively simple,
and doesn't appear to have caused any problems, but should definitely
be tested more thoroughly than the built-in tests. Several days of use
appear to support this working properly.
BREAKING CHANGE:
The major(!) change here is that IDs are now returned as strings by the
REST endpoints, rather than as integers. In practice, relatively few
changes were required to make the existing JS UI work with this change,
but it will likely hit API clients pretty hard: it's an entirely
different type to consume. (The one API client I tested, Tusky, handles
this with no problems, however.)
Twitter ran into this issue when introducing Snowflake IDs, and decided
to instead introduce an `id_str` field in JSON responses. I have opted
to *not* do that, and instead force all IDs to 64-bit integers
represented by strings in one go. (I believe Twitter exacerbated their
problem by rolling out the changes three times: once for statuses, once
for DMs, and once for user IDs, as well as by leaving an integer ID
value in JSON. As they said, "If you’re using the `id` field with JSON
in a Javascript-related language, there is a very high likelihood that
the integers will be silently munged by Javascript interpreters. In most
cases, this will result in behavior such as being unable to load or
delete a specific direct message, because the ID you're sending to the
API is different than the actual identifier associated with the
message." [1]) However, given that this is a significant change for API
users, alternatives or a transition time may be appropriate.
1: https://blog.twitter.com/developer/en_us/a/2011/direct-messages-going-snowflake-on-sep-30-2011.html
* Additional fixes for stringified IDs in JSON
These should be the last two. These were identified using eslint to try
to identify any plain casts to JavaScript numbers. (Some such casts are
legitimate, but these were not.)
Adding the following to .eslintrc.yml will identify casts to numbers:
~~~
no-restricted-syntax:
- warn
- selector: UnaryExpression[operator='+'] > :not(Literal)
message: Avoid the use of unary +
- selector: CallExpression[callee.name='Number']
message: Casting with Number() may coerce string IDs to numbers
~~~
The remaining three casts appear legitimate: two casts to array indices,
one in a server to turn an environment variable into a number.
* Back out RelationshipsController Change
This was made to make a test a bit less flakey, but has nothing to
do with this branch.
* Change internal streaming payloads to stringified IDs as well
Per
https://github.com/tootsuite/mastodon/pull/5019#issuecomment-330736452
we need these changes to send deleted status IDs as strings, not
integers.
* Custom emoji
- In OStatus: `<link rel="emoji" name="coolcat" href="http://..." />`
- In ActivityPub: `{ type: "Emoji", name: ":coolcat:", href: "http://..." }`
- In REST API: Status object includes `emojis` array (`shortcode`, `url`)
- Domain blocks with reject media stop emojis
- Emoji file up to 50KB
- Web UI handles custom emojis
- Static pages render custom emojis as `<img />` tags
Side effects:
- Undo #4500 optimization, as I needed to modify it to restore
shortcode handling in emojify()
- Formatter#plaintext should now make sure stripped out line-breaks
and paragraphs are replaced with newlines
* Fix emoji at the start not being converted
* So Spanish. Much changes. Wow.
* Some little fixes
* Updated es.yml, and fixed some ortographical errors
* Some little changes to simple_form.es.yml
* Yeah, so much translations
* Spanish e-mail messages
* Remove unused message
* zh-*: transition from "like" back to "fav"
This commit reverts the translation for the yellow-star "fav" button
back to "fav" in Chinese. Some ambuiguity between "like" and "fav" is
deliberately used in zh-TW/HK by using the existing phrase "最爱"
(favorite (adj.), lit. love-most) instead of "收藏" (favourite (v.),
"collect") in some instances.
Fixes#3511.
* zh-*: apply suggestions for PR #4557
* zh-cn: de-monetize ya account
In Chinese two separate characters, 账 and 帐, can be used to spell the
word for account (账/帐户). However, the one with a 贝 on the left is
evolved from the latter specifically for monetary purposes. Since
people usually can't figure out which one to use, it might be a good
idea to use the original not-so-money one.
* zh-*: complete jsx translation
* Fix behavior while the button is invisible
e.g. pointer cursor, couldn't open contextmenu
* Avoid rendering the button to remove blank space if no more items are available or no items are rendered
* l10n update for Redesign video player (#4911)
* Update videp
* Update
I hope this time format works well.
* One missing string
* Update time format
I'd like the complete name of the month in the Long format and the short one in the short format.
I hope it works now
* Redesign video player
* Use new video player on static public pages too
* Use media gallery component on static public pages too
* Pause video when hiding it
* Full-screen sizing on WebKit
* Add aria labels to video player buttons
* Display link card on public status page
* Fix fullscreen from modal sizing issue
* Remove contain: strict property to fix fullscreen from columns
Resolved:
* Lot of redundant renders while mouse moving
* Scroll jumping when timeline loaded
* Scroll position isn't kept when statuses below the scrollTop was deleted then new status arrived
Unresolved:
* Scroll position isn't kept when statuses over the scrollTop was deleted then new status arrived
-> It needs to know which statuses are over the scrollTop
* New status indicator should be active when new statuses arrived while mouse moved recently
-> It needs a) update indicator in ScrollableList, or b) set scrollTop status while mouse moving
To reflect status posting immediately, we've inserted the status into timelines directly. However, status insertion changes "latest status", and it means next timeline refresh only fetches statuses since the inserted status. This behavior is very bad for disconnected timeline and mobile views.
After this patch, it refreshes timeline for disconnected timelines, instead of direct insertion.
* Add Pinned_toot_section
* Fix add frozen_string_literal
* Fix delete no need controller and tests
* Fix replace query strings to axios params
* Fix change value to accountId and disabling more button
* Make "unfollow" undo pending outgoing follow request too
* Add cancel button to web UI when awaiting follow request approval
* Make the hourglass button do the cancelling
* UploadArea should only preventDefault for Escape
This will make accessibility for some things less effortful, since we won't have to define a prior event handler to do whatever should be happening by default.
* Remove workaround for fixed bug in SettingToggle
SettingToggle was toggling itself in response to keydown of space, and then the keyup was doing it again
* Make PreviewCard records reuseable between statuses
**Warning!** Migration truncates preview_cards tablec
* Allow a wider thumbnail for link preview, display it in horizontal layout (#4648)
* Delete preview cards files before truncating
* Rename old table instead of truncating it
* Add mastodon:maintenance:remove_deprecated_preview_cards
* Ignore deprecated_preview_cards in schema definition
* Fix null behaviour
- Ask for desktop notifications after 1 minute of use instead of
instantly
- Ask for protocol handler permission after 5 minutes of use
instead of instantly
* Make the fr locales up-to-date with the last changes (new profile view, applications)
* Use the same wording for toots in fr.yml and fr.json
* Translate the pin related strings
* Translate pin-related locales on the front-end
* Add missing locales in doorkeeper.fr.yml and remove un-used ones
* Change "posts" back to "status" in the /about/more page in fr.yml
* Fix typos for "status" in fr.yml
* fix typo for "status" in fr.json
* Remove duplicate string
* Non-breaking space before punctuation
* 'Better' translation for "unpin"
* Put back 'pouet' where it was already
* Fix
* Fix
* Refactor Web::PushSubscription, remove welcome message
* Add missing helper
* Use locale of the receiver on push notifications (#4519)
* Remove unused translations
* Fix dir on notifications
Commit 9d1f8b9d6a scrolls the columns area
when the route changes since the user is likely to want to see the
rightmost column in such cases.
However, redirection is automatic and does not indicate users' intension.
Do not scroll the columns area due to one.
* Added new translations of error messages, block and mute domains and users
* Added new translations of error messages, block and mute domains and users
* Ajout de traductions manquantes
Ajoute des traductions pour les chaînes n’en ayant pas en version 1.5.1.
Add translations for the strings that are missing them in 1.5.1.
* Remplace « ' » par « ’ »
Retire de la traduction les apostrophes droites « ' » (U+0027) au profit des apostrophes typographiques « ’ » (U+2019).
En typographie française, les apostrophes typographiques sont utilisées à la place des apostrophes droites. La traduction était incohérente et utilisait les deux.
Remove from the translation all the vertical apostrophes (U+0027) in favor of the curly ones (U+2019).
In French typography, typographic apostrophes are used instead of vertical ones. The translation was incoherent and used both.
* Ajout d’espaces insécables
Ajoute des espaces insécables suivant les régles nécessaires en typographie française.
Add non-breaking spaces following rules of French typography.
* Remplace « status » par « statut »
Remplace le mot anglais « status » par sa traduction française « statut ».
Replace the English word "status" by its French translation "statut".
* Correction de la politique de confidentialité
Apporte diverses corrections à la traduction de la politique de confidentialité.
Add various fixes to the privacy policy's translation.
* Remplace « mentionné » par « mentionné·e »
Harmonise la traduction en remplaçant « mentionné » par sa forme épicène.
Harmonize the translation by replacing "mentionné" (sure) by its epicene form.
* Remplace « Coup d’œil » par « Jeter un coup d’œil… »
Remplace la première traduction par une forme plus proche de la version originelle.
Replace the first translation by something closer to the original version.
* Remplace « Bon Appétoot ! » par « Bon appouetit ! »
Remplace « Bon Appétoot ! » par « Bon appouetit ! » pour essayer de conserver le jeu de mot.
Replace « Bon Appétoot ! » by « Bon appouetit ! » to keep the pun.
* Remplace « Bon Appétoot ! » par « Bon appouetit ! » (2)
Remplace « Bon Appétoot ! » par « Bon appouetit ! » pour essayer de conserver le jeu de mot.
Replace « Bon Appétoot ! » by « Bon appouetit ! » to keep the pun.f
* Corrections
Corrige des fautes d’orthographe et change « appouetit » pour « appouétit ».
Correct some mistakes and change "appouetit" to "appouétit".
* Refactored Avatar and AvatarOverlay (DRY) to have 'account' as prop.
Also removed animate attribute from compose navigation bar, which should
have never been there. Added test for avatar overlay.
* fix broken tests
* god dammit another bug in tests! travis please let this pass
* formatting in avatar overlay
The feature to pin column could hide the rightmost column, which is
specified with children property of ColumnsArea.
The user is likely to see the column when the property changed, so scroll
the area in such cases.
* fix(status_action_bar): Use aria-pressed for reblog and favourite button
* fix(column_back_button): Keyboard accessible
* fix(status_content): Make focusable and accessible
* fix(dropdown_menu): Use aria-expanded instead of aria-pressed
* fix(emoji_picker_dropdown): Use aria-expanded instead of aria-hidden
* feat(icon_button): Add aria-expanded
* fix(privacy_dropdown): Use aria-expanded instead of aria-hidden
* fix(web_push_notification): Do not hard reload tab
* fix(web_push_notification_worker): Guard against null subscription
* refactor: Incorporate pull request feedback
* fix(dropdown_menu): Keyboard navigation
* fix(icon_button): Add aria-pressed attribute
* fix(privacy_dropdown): Make accessible
* fix(emoji_picker_dropdown): Make accessible
* fix(icon_button): Support tabIndex
* fix(actions_modal): Remove icon from tab order
* fix(dropdown_menu): Add role=group
* fix(setting_toggle): Toggle via space key
* fix(dropdown_menu): Remove redundant handling of Space key
* fix(emoji_picker_dropdown): Remove redundant Space key handling
* fix(privacy_dropdown): Remove redundant Space key handling
* fix(status): Switch to article and add aria-posinset, aria-setsize
* fix(status_list): Use role=feed and pass more ARIA props to Status
* chore(eslint): jsx-a11y/role-supports-aria-props