Skip to content

Merge exip layout builder enhancement mips - #563

Merged
srenault-meeds merged 24 commits into
feature/mipsfrom
merge-exip-layout-builder-enhancement-mips
Aug 27, 2026
Merged

Merge exip layout builder enhancement mips#563
srenault-meeds merged 24 commits into
feature/mipsfrom
merge-exip-layout-builder-enhancement-mips

Conversation

@srenault-meeds

Copy link
Copy Markdown
Member

Merge to MIPS work done for eXIP Page Builder Enhancement

srenault-meeds and others added 23 commits August 27, 2026 10:27
Switching the page width from full window back to custom collapsed
the value to 0 because the customWidth computed property fell back
to 0 when width was '100%', which the number-input then clamped to
its min (300). Introduce a defaultWidth data property (1320) used as
the fallback everywhere the previous default value was hardcoded.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Extend the shared BackgroundInput.vue component (used both from site
"branding options" and the per-page "Edit Page Properties" drawer for
page/site/application backgrounds) with 3 gradient types instead of
the single implicit top-to-bottom linear gradient:
- Linear Gradient: Top to Bottom (default, matches previous behavior)
  or Left to Right.
- Radial Gradient: From color at the center, To color on the outside.
- Angular Gradient: conic gradient anchored at one of the 4 corners
  (Top Left / Top Right / Bottom Right / Bottom Left), From color
  used as the start of the angle.

backgroundEffect stays an opaque CSS background-image string end to
end (no backend/DTO changes needed), so existing persisted values
(plain `linear-gradient(from, to)`) keep parsing correctly as
"Linear / Top to Bottom".

Note: the angle mapping used for the angular/conic gradient per
corner is a best-effort CSS implementation (I could not access the
linked Adobe XD mockup); please visually confirm against the design
before merging.

EXO-88418

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Since the corner only shows a 90deg slice of the full 360deg conic
gradient, the 2-color transition needs explicit 0deg/90deg stops so
it completes within that visible slice instead of barely starting
before the box edge cuts it off.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Two independent bugs prevented alpha transparency from actually
showing on gradient backgrounds (page, section and application):

- BackgroundInput.vue: switching the background type radio to a
  gradient (linear/radial/angular) triggered two watchers reacting to
  the same change. The backgroundColorChoice watcher correctly set the
  container's backgroundColor to the fully-transparent #FFFFFF00
  marker, but the choice() watcher ran right after and unconditionally
  reset it back to the opaque defaultBackgroundColor. That opaque
  white then became the CSS backdrop painted behind the gradient's
  background-image, so any alpha in the From/To colors blended against
  solid white instead of true transparency. The reset is now scoped to
  the "color" choice only.

- ColorPicker.vue: the From/To color swatches painted their color
  directly on the drawer's panel background, so a semi-transparent
  color (e.g. #FFFFFF41) looked identical to a fully opaque one,
  making it impossible to visually confirm transparency was applied.
  Added a checkerboard backdrop behind the swatch (in editor.less,
  since this module's webpack config has no loader for Vue SFC <style>
  blocks) so alpha is now visible in the picker itself.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
 (#532)

Editable portlets (Text Block, Links List, News List, etc.) can hold
custom content added by admins, so removing them from a page now asks
for confirmation instead of deleting immediately.
Adds nested "Margins" and "Radius" controls under the Background section
(page, section and app), inset/rounding a new dedicated background layer
independently of the container's own box so portlet content and text
stay untouched.

- New BackgroundMarginInput.vue / BackgroundRadiusInput.vue form
components, mirroring the existing generic Margins/Radius UX.
- New getBackgroundLayerStyle()/parseBackgroundLayerValues()/
setBackgroundLayerValues() in ApplicationUtils.js: the 8 values can't be
stored as ModelStyle fields (external, not owned by this repo) so
they're opaquely encoded as cssClass tokens, mirroring the existing
mt-/brtr- token pattern.
- getStyle() gains a background-layer gate: skips the container's own
background paint when the layer is active, and explicitly clears
--appBackgroundColor/Image for application-styled containers so the
descendant .PORTLET-FRAGMENT doesn't fall back to its own opaque default
background.
- New <div class="layout-background-layer"> rendered across
ContainerBase/Application/Section (editor + live page) and the
section-template/page-preview editors.
- applyContainerStyle() replicates the bg-* cssClass tokens onto the
real container when called with a curated stand-in object (the
application drawers' backgroundProperties), since that object never
reaches the real container's cssClass otherwise.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Section-level drag reordering never recorded undo/redo history: the
history event was only emitted for app-in-cell moves, and the dragged
section's DOM element carries no data-storage-id to resolve it by. Undo
now captures the pre-move order of the section list on drag start and
restores it via the existing Undo/Redo header buttons and Ctrl+Z/Ctrl+Y.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
#529)

Add application Toolbar so users can filter by name and description the
list of apps while adding portlets to be added to the page layout

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…XO-88434 (#536)

Enable Sortable's JS-simulated drag (forceFallback) instead of native
HTML5 drag, which was silently blocking mouse-wheel scrolling during a
drag on most browsers.
Append the fallback drag clone to <body> (fallbackOnBody) to avoid a CSS
transform on an ancestor breaking its position: fixed tracking.
Add explicit auto-scroll of .site-scroll-parent when the cursor nears
the top/bottom edge while dragging, independent of the drag library's
own scroll handling.
Fixes:
https://community.exoplatform.com/portal/dw/tasks/taskDetail/88434
…XO-88435 (#535)

Section move/edit/clone/save-as-template buttons were positioned via a
margin-based offset that goes negative once the page spans full window
width, pushing them past the section bounds where they get clipped.
Inset them flush inside the viewport when full page mode is enabled
instead.

Also fixes pageFullWindow detection: EditPageDrawer never updated its
fullWindow flag from the width radio selection (dead property, always
false), so applying the full-window setting only took effect after a
publish + page refresh. And the initial detection in layout-editor fell
back to an ambient document.body CSS variable that can be left over from
unrelated rendering, causing false positives on pages that are not
actually full window.
Relax the clone/duplicate-section button visibility from platform
administrators only to any user with edit rights (space admins
included), matching backend authorization (canEditPage) and sibling
section actions. "Save as section template" stays admin-only since it
creates a global platform-wide template.

Also add missing error handling around the editor's initial draft/page
load so a rejected request surfaces an error instead of leaving the
loading spinner stuck forever.
…539)

- Add a "View options" group to the section drawer (display both / hide
on desktop / hide on mobile), replacing the old mobile-view-only radios
- Keep sections and applications editable while previewing mobile
(previously all edit affordances were disabled in that mode)
- Fix: saving a section edit while in mobile preview corrupted every
section's column count and merged them into one, because parseSections
re-derives colsCount from breakpoint CSS classes that mobile preview
temporarily strips

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
The section margin editor already handles all four sides in
SectionMarginInput.vue and the underlying storage/style pipeline;
only the plain content section drawer restricted the UI to top and
bottom. Enable the left/right props there too.
…-88511 (#540)

The page-properties drawer read a CSS var (--allPagesLightGrey) that is
never actually set by the branding admin page. The real value the admin
configures is exposed as --allPagesBackgroundColor, so non-customized
pages silently ignored the branding default. Also normalize the read
value to an 8-digit hex so the color picker keeps its alpha/transparency
support when the branding value has no alpha channel.

---------

Co-authored-by: ayoub cherif <aycherif@exoplatform.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…O-89042 (#552)

Opening the page/site width editor previously pre-selected Full window
whenever the ambient --allPagesWidth CSS var happened to be set, even
though the page container itself had no explicit width. Admins who
applied without noticing could unintentionally switch the page to full
window.
EXO-89043 (#553)

getStyle() removed the
--allPagesBackgroundColor/Image/Repeat/Size/Position custom properties
from <body> on every render where the site container had no explicit
background - the common/default case. Those properties aren't just a
client-side convention: UIPortalApplication.gtmpl writes them as inline
<body> style from the branding admin's configured page background,
before any JS runs. Removing them unconditionally silently defeated that
branding default on every normal page load.

Now only clear them when reverting an override getStyle() itself applied
(a site background toggled on then back off within the same session),
leaving the server-rendered branding default alone otherwise.
Add a "View options" group to the application drawer (display both /
hide on desktop / hide on mobile), replacing the old mobile-view-only
checkbox, mirroring the equivalent Section feature (EXO-88437).

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…8488 (#555)

Adds a "Text Background" option (color, gradient, image, margin, radius)
for each of Title/Header/Body/Subtitle text styles, mirroring the
existing app/section Background feature. The margin/radius are painted
on a ::before layer positioned behind the text via negative insets, so
configuring them never shifts the text itself.

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…refactor - EXO-88488 (#556)

PR #555 extracted shared logic into AbstractLayoutAttachmentPlugin and
added 4 new per-text-type attachment plugins, leaving ~156 instructions
untested. That dropped layout-service instruction coverage to 0.64,
below the 0.65 JaCoCo gate, which is why the PR Build check failed even
after merge.

Adds LayoutBackgroundAttachmentPluginTest covering hasEditPermission/
hasAccessPermission for both page_ and site_ prefixed entity ids,
exercising the shared abstract-class logic that had no test at all.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…XIP-89116

The Text Background feature sets position:relative on .text-color/.text-subtitle
via a blanket :where() selector, even when no background is configured. That
turned the card's title/description wrapper into a positioned element with
z-index:auto stacking above the (also z-index:auto) absolute-positioned + button,
since it comes later in the DOM. Its near-full-width box silently swallowed
clicks meant for the button, which then bubbled to the card's own preview()
handler instead of emitting add.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…XO-89116 (#559)

The Text Background feature sets position:relative on
.text-color/.text-subtitle via a blanket :where() selector, even when no
background is configured. That turned the card's title/description
wrapper into a positioned element with z-index:auto stacking above the
(also z-index:auto) absolute-positioned + button, since it comes later
in the DOM. Its near-full-width box silently swallowed clicks meant for
the button, which then bubbled to the card's own preview() handler
instead of emitting add.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
## Summary
- Vuetify's `.text-truncate` sets `overflow: hidden`, which clips a Text
Background `::before` layer painted on the same element whenever its
configured margin pushes it outside the box.
- Splits the truncated text onto a dedicated inner `.text-truncate`
child in the 5 affected sites (`ApplicationCard.vue`,
`EditPortletDialog.vue`, `SectionTemplate.vue`,
`SiteNavigationNewPageElementItem.vue`), so the outer element keeps the
background and the inner one keeps the ellipsis.
- Companion fix to `platform-ui`'s `helpers.less` (separate PR) provides
the CSS side of this split.

## Test plan
- [ ] Configure a Text Background with a margin on an app card title /
portlet dialog title / section template description / site navigation
description with long text
- [ ] Confirm ellipsis truncation still works
- [ ] Confirm the background bleeds past the text box instead of
clipping flush

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This change will remove the usage of Text Body and Subtitle Background Style. In addition, this will fix the Layout Editor Menu position in site Layout.
@srenault-meeds
srenault-meeds enabled auto-merge (rebase) August 27, 2026 14:35
@srenault-meeds
srenault-meeds merged commit d44af00 into feature/mips Aug 27, 2026
4 of 6 checks passed
@srenault-meeds
srenault-meeds deleted the merge-exip-layout-builder-enhancement-mips branch August 27, 2026 14:59
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
49.6% Coverage on New Code (required ≥ 60%)

See analysis details on SonarQube Cloud

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants