Two problems: (1) the node form's modal AJAX submit handler
(figli_compta_ledger_node_form_ajax_submit) closed the dialog on
success without ever surfacing whatever messenger() had queued during
save() -- e.g. NodeForm's own "Ligne comptable X has been updated."
Since the /lignes table only ever refreshes via AJAX afterwards, never
a full page load, that message was silently lost instead of just
delayed. Now forwarded via MessageCommand before closing the modal.
(2) Gin's default message styling is a full-size flash banner meant
for a single admin form, in-flow (pushing the page down) and far too
large for frequent background feedback on this dashboard.
admin-chrome.css repositions [data-drupal-messages] /
[data-drupal-messages-fallback] to fixed top-right (out of document
flow, so nothing shifts) and shrinks text/padding/dismiss-button size
drastically while keeping them legible. admin-chrome.js auto-dismisses
non-error messages after 2s via a MutationObserver (Drupal.Message.add()
just appends a DOM node, it never re-fires attachBehaviors(), so
behaviors/once() would miss anything added after the initial page
load); error messages are left alone, requiring the existing manual
click on Gin's own dismiss button. Both attached globally via the
existing admin_chrome library (already loaded on every page for the
phantom-top-bar fix), consistent with that precedent.
Verified: a real full-form save on a clean node returns exactly
{message (status, "has been updated"), closeDialog} in that order: a
répartition-inconsistent node still correctly blocks the full form
(unaffected, skip_validation is never used here); a synthetic
status/warning/error trio confirms fixed positioning, no layout
shift, ~40% smaller text, and status/warning auto-hiding while error
persists until manually dismissed.
82 lines
2.9 KiB
CSS
82 lines
2.9 KiB
CSS
/* Core Navigation's top bar (`.top-bar`) only shows itself when its
|
|
tools/context/actions regions are non-empty -- but with no blocks placed
|
|
there, the regions still contain whitespace text nodes from the Twig
|
|
loop scaffolding, which defeats the `:not(:empty)` check. Result: an
|
|
empty top bar renders anyway, with the page content pushed down to make
|
|
room for it. We only use the Gin sidebar (the left icon rail), so force
|
|
the phantom bar off and collapse the space it would otherwise reserve. */
|
|
.top-bar {
|
|
display: none !important;
|
|
}
|
|
|
|
.top-bar ~ .dialog-off-canvas-main-canvas {
|
|
margin-block-start: 0 !important;
|
|
}
|
|
|
|
/* Drupal status messages: fixed top-right, out of document flow, so they
|
|
never shift the page layout the way the default in-flow placement does
|
|
-- and shrunk to a fraction of Gin's default size, which is sized for a
|
|
single full-width flash banner on an admin form, not a toast for
|
|
frequent background feedback here. Targets both the real region
|
|
([data-drupal-messages], present once a message is queued on a normal
|
|
page load) and the JS-only fallback container
|
|
([data-drupal-messages-fallback], used when Drupal.Message.add() -- our
|
|
own MessageCommand-driven AJAX messages included -- has no region to
|
|
attach to). Auto-dismiss timing for non-error messages is handled in
|
|
admin-chrome.js. */
|
|
[data-drupal-messages],
|
|
[data-drupal-messages-fallback] {
|
|
position: fixed !important;
|
|
top: 0.75rem;
|
|
right: 0.75rem;
|
|
left: auto !important;
|
|
width: auto;
|
|
max-width: 22rem;
|
|
z-index: 1000;
|
|
}
|
|
[data-drupal-messages] .messages-list__wrapper,
|
|
[data-drupal-messages] .messages__wrapper,
|
|
[data-drupal-messages-fallback] .messages-list__wrapper,
|
|
[data-drupal-messages-fallback] .messages__wrapper {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.4rem;
|
|
}
|
|
[data-drupal-messages] .messages,
|
|
[data-drupal-messages-fallback] .messages {
|
|
padding: 0.5rem 0.6rem;
|
|
font-size: 0.78rem;
|
|
line-height: 1.3;
|
|
border-radius: 6px;
|
|
}
|
|
[data-drupal-messages] .messages__header,
|
|
[data-drupal-messages-fallback] .messages__header {
|
|
margin-block-end: 0.15rem;
|
|
margin-inline-end: 1.1em;
|
|
}
|
|
[data-drupal-messages] .messages__header::before,
|
|
[data-drupal-messages-fallback] .messages__header::before {
|
|
width: 1rem !important;
|
|
height: 1rem !important;
|
|
}
|
|
[data-drupal-messages] .messages__title,
|
|
[data-drupal-messages-fallback] .messages__title {
|
|
font-size: 0.78rem;
|
|
}
|
|
[data-drupal-messages] .messages__title,
|
|
[data-drupal-messages] .messages__content,
|
|
[data-drupal-messages-fallback] .messages__title,
|
|
[data-drupal-messages-fallback] .messages__content {
|
|
margin-inline-start: 1.4rem;
|
|
}
|
|
[data-drupal-messages] .button--dismiss,
|
|
[data-drupal-messages-fallback] .button--dismiss {
|
|
height: 20px !important;
|
|
width: 20px !important;
|
|
margin: 0.3rem !important;
|
|
}
|
|
[data-drupal-messages] .button--dismiss .icon-close,
|
|
[data-drupal-messages-fallback] .button--dismiss .icon-close {
|
|
mask-size: 11px 11px !important;
|
|
}
|