Fix vertical content jumps in the BlockNote editor on selection
BlockNote 0.51 puts the className we pass to <BlockNoteView>
(`block-note-editor-container`) onto BOTH the outer `.bn-container`
wrapper AND an inner wrapper that does NOT carry `.bn-container`. With
the previous selector matching by class name alone, every rule cascaded
onto both nesting levels — most importantly `display: flex`,
`flex-direction: column-reverse` and `gap: 10px`.
Two flex layouts stacked one inside the other meant that whenever the
side menu / drag handle plugin views re-rendered (which happens every
time the selection moves or the mouse leaves the editor), both layout
calcs ran and the inner wrapper's gap shifted the visible content by a
few pixels.
Tightening the selector to `.block-note-editor-container.bn-container`
restricts the rules to the outer wrapper only; the inner wrapper falls
back to defaults (`display: block`, no gap) and stops contributing to
the layout.
Refs https://community.openproject.org/wp/STC-779
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
The view-helper migration introduced by the parent PR now covers the
remaining mailer surfaces: UserMailer (`message_posted`, `news_added`,
`news_comment_added`), ProjectMailer (`project_created`),
ProjectArtifactsMailer (`creation_wizard_submitted`), MemberMailer
(`added_project`, `updated_project`, `updated_global`), AnnouncementMailer
(`announce`), DocumentsMailer (`document_added`), and the shared mailer
layout (`localized_emails_header`, `localized_emails_footer`).
Sites drop the `static_html: true` / `only_path: false` / `plain_text: true`
boilerplate; `render_mode:` pinning lives in the helper.
The layout previously called `OpenProject::TextFormatting::Renderer.format_text`
directly, bypassing the helper layer. The empty visibility cache (no
current_user-scoped preload at layout time) is handled by the existing
fallback in `LinkHandlers::WorkPackages#text_only?` — covered by a new
sanity spec in `user_mailer_spec.rb` that exercises the header path with
a WP reference and asserts plain-text formatted_id rendering.
Per-bucket regression coverage added: absolute-URL and formatted_id
assertions across both classic and semantic identifier modes, mirroring
the WorkPackageMailer spec pattern.
* Fix GitHub/NoTitleAttribute, LinkHasHref errors
- Replaces `title` attribute with `aria-label` for interactive elements.
- Removes `title` from non-interactive elements.
- Converts `<a>` tags without proper `href` to `<button>` elements,
using Primer `Button`/`IconButton` where possible.
# Conflicts:
# app/views/custom_fields/_custom_options.html.erb
# spec/features/admin/custom_fields/shared_custom_field_expectations.rb
# spec/features/admin/custom_fields/work_packages/list_spec.rb
* Fix Autocomplete missing errors
* Fix GitHub/NoPositiveTabIndex errors
Removes all positive `tabindex` values.
* Fix Rails/LinkToBlank errors
* Replace toast with Primer Banner on LDAP form
* Add frozen_string_literal
* Ignore erb lint for deprecated files
* Fix linting errors in repository module
* Fix linting errors in budgets and custom actions
* Fix linting errors in member form and 2fa
* Fix linting errors in mcost types and wiki help and storages
* Fix linting errors in multi select filters, ifc viewer, and unsupported browser banner
* Fix failing spec
* Use Primer banner instead of op-toast where ever it is possible
* Use octicon instead of op_icon
* Fix failing tests
* Use no-decoration-on-hover for button links and change the button with only an icon to primer icon button
* Keep webhook response modal activation selector class-based
* use icon button for edit of hourly rate
---------
Co-authored-by: Behrokh Satarnejad <b.satarnejad@openproject.com>
Improve visual representation of inline macros, by ensuring
they all use the same CSS attributes and have a reduced vertical padding,
so they don't overlap as much.
We also improved the vertical alignment of the leading icon for these macros.
As a sidefind, we replaced a handcrafted version of the InlineMessage with the
existing InlineMessage component. This also improved alignment of the icon.
Documents created with zero-width Unicode characters (e.g. U+200B)
in their titles become unclickable on the index page, making them
hard to manage or delete.
Introduce RemoveInvisibleCharacters normalizer, replacing the former
RemoveAsciiControlCharacters. It strips both ASCII control characters
and Unicode zero-width characters, with each category defined as a
named constant for clarity. Apply it to Document#title and update
existing callers (Project#identifier, CustomField#name).
Add a shared RSpec example "strips invisible characters" to verify
normalization consistently across all three models.
Extract non-IndexedDB refinements from PR #22125 so they can ship
independently while IndexedDB offline persistence is evaluated separately.
- Gate collaboration on Setting.real_time_text_collaboration_enabled?
instead of hardcoding it to true
- Remove the test-mode fallback that created a standalone Y.Doc without
a provider; HocuspocusProvider is now required for document editing
- Refactor useCollaboration hooks: callback-based timeout with proactive
cancel on sync, extracted useProviderAuthError hook, JSDoc comments
- Add read/write context-aware connection error messages (readonly users
see "real-time updates will resume" vs writers see "changes will sync")
- Add blocked offline mode: when the server is unreachable and there is
no local cache, hide the editor entirely to prevent an empty Y.Doc
from being synced as authoritative content on reconnect
- Update feature specs to use real hocuspocus shared context instead of
stubbing collaboration_enabled, add offline blocking tests
Replace the warning banner approach with Primer's inline field
validation (invalid: / validation_message:) on the hocuspocus URL
text field. This shows the error directly on the field when the
current value uses an unsupported protocol, which works for both
env-var-overridden (read-only) and user-submitted values.
Adds contract-level validation to ensure the collaborative editing
hocuspocus URL only accepts WebSocket protocols (ws://, wss://).
Previously, misconfiguration with https:// would silently cause
Content Security Policy errors at runtime.
https://community.openproject.org/wp/71888
Fix default document types recreated after every update
The Documents TypeSeeder overrode applicable? with a count <= 3
heuristic that was too permissive: users who deleted unwanted types
dropped below the threshold, causing the seeder to recreate them on
every subsequent update.
Remove the custom applicable? overrides, falling back to ModelSeeder
defaults which only seed when the table is empty. The 17.0 migration
already handles upgrading old DocumentCategory enumerations.
https://community.openproject.org/wp/71877
`draggable="true"` enables HTML5 Drag and Drop, which conflicts with the
Dragula-based implementation used by `GenericDragAndDropController`.
https://community.openproject.org/wp/71327
Apply least privilege principle: RefreshTokensController now returns
only encrypted_token, expires_at, and expires_in_seconds. Excludes
resource_url and readonly which are only needed for initial page load.