Skip to content

Commit 88cfeaa

Browse files
committed
Release 1.0.4: Slice-Scroll via SLICE_SHOW EP
1 parent 0a089a0 commit 88cfeaa

File tree

5 files changed

+74
-10
lines changed

5 files changed

+74
-10
lines changed

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file.
44

55
This project adheres to [Semantic Versioning](https://semver.org/).
66

7+
## [1.0.4] – 2026-03-13
8+
9+
### Added
10+
11+
- **Slice-Scroll**: Nach dem Speichern eines Slices scrollt der iframe automatisch zur Position des bearbeiteten Slices
12+
- `SLICE_SHOW`-Extension-Point injiziert unsichtbare Scroll-Anker (`<span id="rex-slice-{id}">`) ins Frontend – nur wenn `?lp_anchors=1` in der iframe-URL steht
13+
- `load_frontend: true` in `package.yml` damit `boot.php` auch im Frontend ausgeführt wird
14+
15+
### Fixed
16+
17+
- `LivePreviewUrlApi`: fehlende `use`-Statements für REDAXO-Klassen im Namespace ergänzt
18+
19+
---
20+
721
## [1.0.3] – 2026-03-12
822

923
### Fixed

assets/js/live_preview.js

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,18 @@
7575
function getPanel() { return document.getElementById('rex-lp-panel'); }
7676
function getIframe() { return document.getElementById('rex-lp-iframe'); }
7777

78+
/**
79+
* Fügt lp_anchors=1 an eine Frontend-URL an (für SLICE_SHOW-Anker im iframe).
80+
* Bestehende lp_anchors-Parameter werden vorher entfernt.
81+
*/
82+
function addLpAnchors(url) {
83+
if (!url || url === 'about:blank') { return url; }
84+
var base = url.split('#')[0].replace(/([?&])lp_anchors=\d+&?/, function(m, sep) {
85+
return sep === '?' ? '?' : '';
86+
}).replace(/[?&]$/, '');
87+
return base + (base.indexOf('?') !== -1 ? '&' : '?') + 'lp_anchors=1';
88+
}
89+
7890
// -------------------------------------------------------------------------
7991
// Float-Panel – Drag-to-detach
8092
// -------------------------------------------------------------------------
@@ -485,14 +497,25 @@
485497
function refreshIframe() {
486498
var iframe = getIframe();
487499
if (!iframe) { return; }
488-
try {
489-
iframe.contentWindow.location.reload();
490-
} catch (e) {
491-
// Cross-Origin-Fallback: src neu setzen
492-
var src = iframe.src;
493-
iframe.src = '';
494-
setTimeout(function () { iframe.src = src; }, 50);
500+
501+
var baseUrl = iframe.dataset.src || '';
502+
if (!baseUrl) {
503+
// Fallback wenn data-src nicht gesetzt
504+
try {
505+
iframe.contentWindow.location.reload();
506+
} catch (e) {
507+
var old = iframe.src;
508+
iframe.src = '';
509+
setTimeout(function () { iframe.src = old; }, 50);
510+
}
511+
return;
495512
}
513+
514+
// slice_id aus der aktuellen Backend-URL lesen:
515+
// Nach Klick auf "Bearbeiten" steht die ID im URL-Parameter.
516+
var params = new window.URLSearchParams(window.location.search);
517+
var sliceId = params.get('slice_id');
518+
iframe.src = addLpAnchors(baseUrl) + (sliceId ? '#rex-slice-' + sliceId : '');
496519
}
497520

498521
function scheduleRefresh(delay) {
@@ -987,7 +1010,9 @@
9871010
$.getJSON(apiUrl, { article_id: articleId, clang: clang })
9881011
.done(function (data) {
9891012
if (data && data.url) {
990-
iframe.src = data.url;
1013+
// dataset.src aktuell halten (clean URL ohne lp_anchors/hash)
1014+
iframe.dataset.src = data.url;
1015+
iframe.src = addLpAnchors(data.url);
9911016

9921017
// Modal-iframe ebenfalls aktualisieren wenn offen
9931018
var modal = document.getElementById('rex-lp-modal');
@@ -1041,7 +1066,7 @@
10411066
if (iframe) {
10421067
if (enabled) {
10431068
// Kein Reload nötig: data-src ist immer aktuell
1044-
iframe.src = iframe.dataset.src || '';
1069+
iframe.src = addLpAnchors(iframe.dataset.src || '');
10451070
} else {
10461071
iframe.src = 'about:blank';
10471072
}

boot.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,21 @@
22

33
/** @var rex_addon $this */
44

5+
// Frontend: Scroll-Anker für Live-Preview (nur wenn lp_anchors=1 in der URL)
6+
// Jeder Slice bekommt ein unsichtbares <span id="rex-slice-{id}"> vorangestellt,
7+
// über das der iframe nach einem Slice-Save direkt ans richtige Element scrollt.
8+
rex_extension::register('SLICE_SHOW', static function(rex_extension_point $ep) {
9+
if (!rex_request('lp_anchors', 'int', 0)) {
10+
return;
11+
}
12+
$sliceId = (int) $ep->getParam('slice_id');
13+
if (!$sliceId) {
14+
return;
15+
}
16+
return '<span id="rex-slice-' . $sliceId . '" style="display:block;height:0;overflow:hidden;pointer-events:none;"></span>'
17+
. $ep->getSubject();
18+
});
19+
520
if (!rex::isBackend() || !rex::getUser()) {
621
return;
722
}

lib/LivePreviewUrlApi.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@
22

33
namespace FriendsOfREDAXO\LivePreview;
44

5+
use rex;
6+
use rex_addon;
7+
use rex_api_function;
8+
use rex_api_result;
9+
use rex_article_revision;
10+
use rex_backend_login;
11+
use rex_clang;
12+
use rex_response;
13+
514
/**
615
* Live Preview – API-Endpunkt
716
*

package.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package: live_preview
2-
version: '1.0.3'
2+
version: '1.0.4'
33
author: 'Friends Of REDAXO'
44
supportpage: https://github.com/FriendsOfREDAXO/live_preview
5+
load_frontend: true
56

67
autoload:
78
classes:

0 commit comments

Comments
 (0)