Repository navigation
What's new: the ? menu above the calendar, main builds, and feedback with a screenshot - #167
Merged
Merged
Conversation
…ewest release The menu was an ordinary dropdown inside the header's z-20 stacking context, so the calendar's day headings painted over it. It now opens in the top layer through ui--user-menu, like the account menu, and closes when an item is chosen. A build that is not a tag (main, sha-…, a checkout) counted as no release, so installs that follow main never saw the dialog. It now counts as the newest tagged release in its own changelog; Unreleased is still never shown. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sending with a screenshot closed the dialog without the sent screen. The form is now posted with fetch() and its answer drawn into the dialog; anything that is not the dialog (a proxy refusing a large body, a server error) is said in the form with its status, and the dialog stays. The screenshot is a JPEG at most 1600 px wide instead of a full-size PNG, a fraction of the size, so a reverse proxy's default body limit is far away. The From is the first field of the account that is an address; an account with none is refused in the form instead of throwing at send time. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s spec The spec looked for the conversation by id alone, and the messages inside it carry the same attribute with their own ids. On CI a message id equalled the conversation's, so two elements matched and the strict locator failed on the first try and the retry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DanversKara
added a commit
to DanversKara/pl_mail_bearermail
that referenced
this pull request
Oct 19, 2026
* What's new opens after an update, with a way to send feedback (karatektus#166) * What's new opens after an update, with a way to send feedback The release notes from CHANGELOG.md, read from the image, in a dialog that opens by itself the first time somebody uses plMail after an update and never on a fresh install. A ? in the top bar opens it again, with a dot while something is unseen; "Don't show this after updates" silences it, and Settings -> General -> What's new undoes that. Highlights are marked in the changelog with an HTML comment and may carry a screenshot taken by tests/e2e/whats-new-screenshots.spec.ts. Send feedback is a mail from one of the person's own accounts to APP_FEEDBACK_TO (feedback@pluetzner.de by default), with an optional rating and a screenshot of the page behind the dialog. Existing users are recorded as having seen 0.3.1 by a migration; anyone created later starts on the release running at their first request. Closes karatektus#165. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Plain changelog headlines from 0.3.2 on, and highlights with screenshots Every bold headline users see under "New to you" now says what changed in a few words. Each release gets a handful of highlights, eight of them with a picture cropped to the card or pane they are about, taken by tests/e2e/whats-new-screenshots.spec.ts. Relative links in the notes keep their words and lose the target, and the parsed changelog's cache key carries a format version so a new image never serves the previous one's parse. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep highlight pictures for ten releases, and none that nothing names Every file in public/whats-new ships in every image. ChangelogReaderTest now fails on a picture no highlight names, and on one whose release is more than ten back; the release pull request that crosses the line deletes it and leaves the entry a highlight without a picture. Documented in CONTRIBUTING.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Credit karatektus#166 in the changelog Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Match the Back button by its whole name in the back-navigation specs Playwright matches a string name as a substring, so "Back" also found the new "Help and feedback" button in the top bar, which comes first, and the specs opened its menu instead of going back to the list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * What's new: the ? menu above the calendar, main builds, and feedback with a screenshot (karatektus#167) * The ? menu draws above the calendar, and a main build announces its newest release The menu was an ordinary dropdown inside the header's z-20 stacking context, so the calendar's day headings painted over it. It now opens in the top layer through ui--user-menu, like the account menu, and closes when an item is chosen. A build that is not a tag (main, sha-…, a checkout) counted as no release, so installs that follow main never saw the dialog. It now counts as the newest tagged release in its own changelog; Unreleased is still never shown. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Feedback with a screenshot stays in the dialog, whatever comes back Sending with a screenshot closed the dialog without the sent screen. The form is now posted with fetch() and its answer drawn into the dialog; anything that is not the dialog (a proxy refusing a large body, a server error) is said in the form with its status, and the dialog stays. The screenshot is a JPEG at most 1600 px wide instead of a full-size PNG, a fraction of the size, so a reverse proxy's default body limit is far away. The From is the first field of the account that is an address; an account with none is refused in the form instead of throwing at send time. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Find the open conversation's toolbar by type in the keyboard-shortcuts spec The spec looked for the conversation by id alone, and the messages inside it carry the same attribute with their own ids. On CI a message id equalled the conversation's, so two elements matched and the strict locator failed on the first try and the retry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * What's new: a screenshot grows to fill the dialog instead of opening a tab (karatektus#181) Clicking a highlight's screenshot opened the PNG in a new tab. It now grows out of its thumbnail until it fills the What's new dialog, with an X; the X, Escape or Back shrink it back, and What's new stays open. Back goes through a history entry of its own (assets/history_layer.js), imported first in app.js so its popstate listener runs before Turbo's, which would otherwise restore the page and close the dialog. Closes karatektus#179 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * Store a UIDVALIDITY above 2147483647 (karatektus#174) mailbox.uid_validity becomes a BIGINT, so IMAP folders whose UIDVALIDITY is above the signed INT range sync again. Reversible migration; the mapping stays ?int (DBAL 4 hydrates a bigint as an int). Closes karatektus#171 Co-Authored-By: Philippe Delodder <philippe@delodder.be> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * A conversation no longer splits when its replies are synced first (karatektus#176) Threading looked only from a reply to the message it answers, so replies synced before that message (INBOX before Sent Items) opened threads of their own and stayed there. MessageThreader now also looks the other way: after a message gets its thread, mail that already names its Message-ID in In-Reply-To or References is folded in by the new ThreadMerger. The older thread survives, keeping its JMAP id, summary, insights, star, snooze, labels and pinned tab. A GIN expression index makes the reverse lookup an index probe. Review follow-up: moved mail is added to the surviving thread's collection so a label rule later in the same batch keeps its labels, plus tests for that, bracketed legacy references and provider-keyed survivors. Closes karatektus#172 Co-authored-by: Philippe Delodder <philippe@delodder.be> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Let a deployment pull request through without an issue of its own (karatektus#183) A milestone branch on its way to main (milestone/v0.4.0, karatektus#182) collects work that was agreed and reviewed piece by piece, each piece closing its own issue. It has no issue of its own to name, and listing the pieces' issues only works once each has landed, so the required linked-issue check refused it. `deployment` joins `bug`, `chore` and `dependencies` as a label that needs none. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * A label a rule applies to new mail stays on its conversation (karatektus#185) Rules run after threading and before the batch's flush, and ThreadLabelSynchronizer took the union over $thread->messages, which did not yet hold the message the threader had just attached. A rule's label was taken straight off the conversation again. The sync now counts the messages that point at the thread in memory (collection, identity map and pending inserts). Closes karatektus#184 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Release v0.3.6 (karatektus#194) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Leave a message another Gmail account holds with that account (karatektus#196) * Leave a message another Gmail account holds with that account With several Gmail accounts connected, mail forwarded from one to another reaches the second still Delivered-To the first and is attributed there. Both merges in SyncGmailMessageBatchHandler then found the first account's own row by Message-ID and wrote the second mailbox's Gmail id over its own: they were written for a sibling that syncs over IMAP, and the sibling map is every active account. The first account's sync then stored the message a second time, and a later merge by Message-ID picked the other of the two rows and gave it an id its twin still held: a duplicate key on uniq_message_gmail_id_account, the whole batch failed, and every retry fetched it again until Gmail answered 429 (discussion karatektus#168). A row is now looked up by its Gmail id before either merge. A merge only gives an id to a row of a non-Gmail account that has none yet, or has this carrier's; anything else is recorded as held elsewhere, so the import counts it and stops asking for it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Link the changelog entry to its PR Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * What's new: one X on a full-size screenshot (karatektus#197) The picture brought its own X into the corner of the dialog body, just below the modal's X. It is gone; while a picture is up, the modal's X is relabelled "Close the screenshot" and its first press puts the picture back, the second closes What's new, as Escape already did. Closes karatektus#187 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * Calendar: an event that ends when it starts stays on its day (karatektus#198) An end equal to the start (or a zero DURATION) is a stated instant and now gets one minute instead of the nominal hour, so a 23:59 reminder no longer runs past midnight and shows again on the next day. The nominal hour for an event with no end at all now stops at the midnight of the day it starts on, in DTSTART's own zone. Closes karatektus#170 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * Outlook's <![endif]--> no longer leaks into a message as text (karatektus#178) Closes karatektus#175. Co-authored-by: Philippe Delodder <7259755+phdelodder@users.noreply.github.com> * Drop a header block the server repeats at the top of the body (karatektus#177) Closes karatektus#173. Co-authored-by: Philippe Delodder <7259755+phdelodder@users.noreply.github.com> * Compose: allow a send addressed to Bcc only (karatektus#200) A send with nobody in To was refused with "Add at least one recipient before sending", even with addresses in Cc or Bcc. The window's guard counted To, Cc and Bcc; the server's Count(min: 1) rule in the send group counted To only. The rule is now a Callback on the To field that counts all three, read off the bound form since the fields are unmapped. A send with no recipient at all is still refused; a draft may still be saved with none. Closes karatektus#201. Co-Authored-By: jo2904 <josephdegaullier@gmx.fr> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Bump the minor-and-patch group with 13 updates (karatektus#193) Bumps the minor-and-patch group with 13 updates: | Package | From | To | | --- | --- | --- | | [doctrine/orm](https://github.com/doctrine/orm) | `3.7.4` | `3.7.5` | | [symfony/asset-mapper](https://github.com/symfony/asset-mapper) | `8.1.8` | `8.1.9` | | [symfony/console](https://github.com/symfony/console) | `8.1.8` | `8.1.9` | | [symfony/framework-bundle](https://github.com/symfony/framework-bundle) | `8.1.8` | `8.1.9` | | [symfony/http-client](https://github.com/symfony/http-client) | `8.1.8` | `8.1.9` | | [symfony/mercure-bundle](https://github.com/symfony/mercure-bundle) | `0.5.0` | `0.6.1` | | [symfony/process](https://github.com/symfony/process) | `8.1.7` | `8.1.9` | | [symfony/stimulus-bundle](https://github.com/symfony/stimulus-bundle) | `3.5.1` | `3.6.0` | | [symfony/string](https://github.com/symfony/string) | `8.1.7` | `8.1.9` | | [symfony/twig-bundle](https://github.com/symfony/twig-bundle) | `8.1.7` | `8.1.9` | | [symfony/ux-autocomplete](https://github.com/symfony/ux-autocomplete) | `3.5.1` | `3.6.0` | | [symfony/ux-turbo](https://github.com/symfony/ux-turbo) | `3.5.1` | `3.6.0` | | [symfony/web-profiler-bundle](https://github.com/symfony/web-profiler-bundle) | `8.1.8` | `8.1.9` | Updates `doctrine/orm` from 3.7.4 to 3.7.5 - [Release notes](https://github.com/doctrine/orm/releases) - [Commits](doctrine/orm@3.7.4...3.7.5) Updates `symfony/asset-mapper` from 8.1.8 to 8.1.9 - [Release notes](https://github.com/symfony/asset-mapper/releases) - [Changelog](https://github.com/symfony/asset-mapper/blob/8.2/CHANGELOG.md) - [Commits](symfony/asset-mapper@v8.1.8...v8.1.9) Updates `symfony/console` from 8.1.8 to 8.1.9 - [Release notes](https://github.com/symfony/console/releases) - [Changelog](https://github.com/symfony/console/blob/8.2/CHANGELOG.md) - [Commits](symfony/console@v8.1.8...v8.1.9) Updates `symfony/framework-bundle` from 8.1.8 to 8.1.9 - [Release notes](https://github.com/symfony/framework-bundle/releases) - [Changelog](https://github.com/symfony/framework-bundle/blob/8.2/CHANGELOG.md) - [Commits](symfony/framework-bundle@v8.1.8...v8.1.9) Updates `symfony/http-client` from 8.1.8 to 8.1.9 - [Release notes](https://github.com/symfony/http-client/releases) - [Changelog](https://github.com/symfony/http-client/blob/8.2/CHANGELOG.md) - [Commits](symfony/http-client@v8.1.8...v8.1.9) Updates `symfony/mercure-bundle` from 0.5.0 to 0.6.1 - [Release notes](https://github.com/symfony/mercure-bundle/releases) - [Changelog](https://github.com/symfony/mercure-bundle/blob/main/CHANGELOG.md) - [Commits](symfony/mercure-bundle@v0.5.0...v0.6.1) Updates `symfony/process` from 8.1.7 to 8.1.9 - [Release notes](https://github.com/symfony/process/releases) - [Changelog](https://github.com/symfony/process/blob/8.2/CHANGELOG.md) - [Commits](symfony/process@v8.1.7...v8.1.9) Updates `symfony/stimulus-bundle` from 3.5.1 to 3.6.0 - [Release notes](https://github.com/symfony/stimulus-bundle/releases) - [Changelog](https://github.com/symfony/stimulus-bundle/blob/3.x/CHANGELOG.md) - [Commits](symfony/stimulus-bundle@v3.5.1...v3.6.0) Updates `symfony/string` from 8.1.7 to 8.1.9 - [Release notes](https://github.com/symfony/string/releases) - [Changelog](https://github.com/symfony/string/blob/8.2/CHANGELOG.md) - [Commits](symfony/string@v8.1.7...v8.1.9) Updates `symfony/twig-bundle` from 8.1.7 to 8.1.9 - [Release notes](https://github.com/symfony/twig-bundle/releases) - [Changelog](https://github.com/symfony/twig-bundle/blob/8.2/CHANGELOG.md) - [Commits](symfony/twig-bundle@v8.1.7...v8.1.9) Updates `symfony/ux-autocomplete` from 3.5.1 to 3.6.0 - [Release notes](https://github.com/symfony/ux-autocomplete/releases) - [Changelog](https://github.com/symfony/ux-autocomplete/blob/3.x/CHANGELOG.md) - [Commits](symfony/ux-autocomplete@v3.5.1...v3.6.0) Updates `symfony/ux-turbo` from 3.5.1 to 3.6.0 - [Release notes](https://github.com/symfony/ux-turbo/releases) - [Changelog](https://github.com/symfony/ux-turbo/blob/3.x/CHANGELOG.md) - [Commits](symfony/ux-turbo@v3.5.1...v3.6.0) Updates `symfony/web-profiler-bundle` from 8.1.8 to 8.1.9 - [Release notes](https://github.com/symfony/web-profiler-bundle/releases) - [Changelog](https://github.com/symfony/web-profiler-bundle/blob/8.2/CHANGELOG.md) - [Commits](symfony/web-profiler-bundle@v8.1.8...v8.1.9) --- updated-dependencies: - dependency-name: doctrine/orm dependency-version: 3.7.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: symfony/asset-mapper dependency-version: 8.1.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: symfony/console dependency-version: 8.1.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: symfony/framework-bundle dependency-version: 8.1.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: symfony/http-client dependency-version: 8.1.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: symfony/mercure-bundle dependency-version: 0.6.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: symfony/process dependency-version: 8.1.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: symfony/stimulus-bundle dependency-version: 3.6.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: symfony/string dependency-version: 8.1.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: symfony/twig-bundle dependency-version: 8.1.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: symfony/ux-autocomplete dependency-version: 3.6.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: symfony/ux-turbo dependency-version: 3.6.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: symfony/web-profiler-bundle dependency-version: 8.1.9 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minor-and-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump actions/labeler from 5 to 7 (karatektus#192) Bumps the actions group with 1 update: [actions/labeler](https://github.com/actions/labeler). Updates `actions/labeler` from 5 to 7 - [Release notes](https://github.com/actions/labeler/releases) - [Commits](actions/labeler@v5...v7) --- updated-dependencies: - dependency-name: actions/labeler dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump @types/node from 26.6.4 to 26.6.5 (karatektus#191) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 26.6.4 to 26.6.5. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 26.6.5 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump @playwright/test from 1.63.0 to 1.64.0 in the playwright group across 1 directory (karatektus#190) * Bump @playwright/test Bumps the playwright group with 1 update in the / directory: [@playwright/test](https://github.com/microsoft/playwright). Updates `@playwright/test` from 1.63.0 to 1.64.0 - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](microsoft/playwright@v1.63.0...v1.64.0) --- updated-dependencies: - dependency-name: "@playwright/test" dependency-version: 1.64.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: playwright ... Signed-off-by: dependabot[bot] <support@github.com> * E2E: abort the stubbed reconnect navigation instead of answering 204 Chromium 156 (Playwright 1.64) reports a navigation that ends in a 204 as a finished request that commits nothing, where Chromium 155 reported it as failed (net::ERR_ABORTED). Playwright's click waits for the navigation it started to commit or fail, so with 1.64 the click never returned and the test timed out reading "" off a closing page. An abort is reported as a failure by every Chromium and keeps the document just the same. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * E2E: touch beside the open drawer, after it has stopped sliding The drawer-open pull touched the middle of the rows (x~196) right after `inert` came off, at the start of the drawer's 200ms slide. Once the 256px drawer has arrived, that point is the drawer, not the backdrop, so the hit-test only passed while it beat the transition; slower CI runners lost that race on every branch from 2026-10-16. Wait for the drawer to rest, then touch the backdrop strip to its right, and pull at the same point once it is closed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Paul Lützner <karatektus@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * Top bar on phones: Contacts goes to the drawer (it is there already), making room for upstream's ? menu diag: report failing PHPUnit tests (temporary) * Tests: What's new feedback goes to APP_FEEDBACK_TO (set in .env.test); drop PHPUnit diag --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Paul Lützner <karatektus@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Philippe Delodder <7259755+phdelodder@users.noreply.github.com> Co-authored-by: Philippe Delodder <philippe@delodder.be> Co-authored-by: Sven <sj@pmdevelopment.de> Co-authored-by: jo2904 <59180897+jo2904@users.noreply.github.com> Co-authored-by: jo2904 <josephdegaullier@gmx.fr> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follow-ups to #166 (What's new, #165), found trying it on an install that follows
main. These were pushed tofeat/whats-newafter #166 had already been merged, so they never reachedmain.z-20stacking context, so the calendar's day headings painted over it. It now opens in the top layer throughui--user-menu, like the account menu, and closes when an item is chosen. New browser test: the menu is on top over/calendar/week.maininstall. Only avX.Y.Zbuild counted as a release, somain/sha-…images had none. A build that is not a tag now counts as the newest tagged release in its ownCHANGELOG.md; Unreleased is still never shown. Docs (EN/DE) updated.fetch()and draws the answer into the dialog; anything that is not the dialog is reported in the form with its HTTP status instead of being visited as a page. The screenshot is a JPEG at most 1600 px wide instead of a full-size PNG. The From is the first account field that is an address, and an account with none is refused in the form instead of throwing. New browser tests for a refused request (413) and for the sent screen with a screenshot.Checks run locally: What's new, documentation and translation PHPUnit tests (69), PHPStan clean, and the What's new / menu / back-navigation browser specs against a stack built from these commits.
🤖 Generated with Claude Code