This commit is contained in:
2024-05-20 15:37:46 +03:00
commit 00b7dbd0b7
10404 changed files with 3285853 additions and 0 deletions

View File

@ -0,0 +1,35 @@
<?php
namespace Nextend\SmartSlider3\Application\Admin\Preview\Block\PreviewToolbar;
use Nextend\Framework\View\AbstractBlock;
use Nextend\SmartSlider3\Application\Admin\TraitAdminUrl;
class BlockPreviewToolbar extends AbstractBlock {
use TraitAdminUrl;
/** @var integer */
protected $sliderID;
public function display() {
$this->renderTemplatePart('PreviewToolbar');
}
/**
* @return int
*/
public function getSliderID() {
return $this->sliderID;
}
/**
* @param int $sliderID
*/
public function setSliderID($sliderID) {
$this->sliderID = $sliderID;
}
}

View File

@ -0,0 +1,62 @@
<?php
namespace Nextend\SmartSlider3\Application\Admin\Preview\Block\PreviewToolbar;
use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButtonPlainIcon;
use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButtonSpacer;
/**
* @var $this BlockPreviewToolbar
*/
?>
<div class="n2_preview_toolbar">
<div class="n2_preview_toolbar__size">
<div class="n2_preview_toolbar__editable n2_preview_toolbar__width">
1200
</div>
<div class="n2_preview_toolbar__x">
X
</div>
<div class="n2_preview_toolbar__editable n2_preview_toolbar__height">
800
</div>
</div>
<select class="n2_preview_toolbar__scale">
<option value="25">25%</option>
<option value="50">50%</option>
<option value="75">75%</option>
<option value="100" selected>100%</option>
<option value="125">125%</option>
<option value="150">150%</option>
</select>
<?php
$buttonOrientation = new BlockButtonPlainIcon($this);
$buttonOrientation->addClass('n2_button_preview_orientation');
$buttonOrientation->addAttribute('data-n2tip', n2_('Toggle orientation'));
$buttonOrientation->setBig();
$buttonOrientation->setIcon('ssi_24 ssi_24--orientation');
$buttonOrientation->display();
$spacer = new BlockButtonSpacer($this);
$spacer->setIsVisible(true);
$spacer->display();
$buttonReload = new BlockButtonPlainIcon($this);
$buttonReload->addClass('n2_button_preview_reload');
$buttonReload->addAttribute('data-n2tip', n2_('Reload preview'));
$buttonReload->setBig();
$buttonReload->setIcon('ssi_24 ssi_24--redo');
$buttonReload->display();
$buttonFullPreview = new BlockButtonPlainIcon($this);
$buttonFullPreview->setUrl($this->getUrlPreviewFull($this->getSliderID()));
$buttonFullPreview->addAttribute('data-n2tip', n2_('Open preview in full'));
$buttonFullPreview->setTarget('_blank');
$buttonFullPreview->setBig();
$buttonFullPreview->setIcon('ssi_24 ssi_24--newwindow');
$buttonFullPreview->display();
?>
</div>

View File

@ -0,0 +1,150 @@
<?php
namespace Nextend\SmartSlider3\Application\Admin\Preview;
use Nextend\Framework\Misc\Base64;
use Nextend\Framework\Request\Request;
use Nextend\SmartSlider3\Application\Admin\AbstractControllerAdmin;
use Nextend\SmartSlider3\Application\Model\ModelGenerator;
use Nextend\SmartSlider3\Application\Model\ModelSlides;
use Nextend\SmartSlider3\SmartSlider3Info;
class ControllerPreview extends AbstractControllerAdmin {
private $sliderId = 0;
public function initialize() {
parent::initialize();
$this->sliderId = Request::$REQUEST->getInt('sliderid');
SmartSlider3Info::$forceDesktop = true;
}
public function actionIndex() {
if ($this->validateToken() && $this->validatePermission('smartslider_edit')) {
$view = new ViewPreviewIndex($this);
$view->setSliderID($this->sliderId);
$sliderData = Request::$POST->getVar('slider', false);
if (!is_array($sliderData)) {
$sliderData = false;
}
$view->setSliderData($sliderData);
$view->display();
} else {
$this->permissionError();
}
}
public function actionFull() {
if ($this->validateToken()) {
$view = new ViewPreviewFull($this);
$view->setSliderData(json_decode(Request::$POST->getVar('sliderData', '[]'), true));
$view->setSlidesData(json_decode(Request::$POST->getVar('slidesData', '[]'), true));
$view->setGeneratorData(json_decode(Request::$POST->getVar('generatorData', '[]'), true));
$view->setSliderID($this->sliderId);
$view->display();
} else {
$this->permissionError();
}
}
public function actionSlider() {
if ($this->validateToken() && $this->validatePermission('smartslider_edit')) {
$view = new ViewPreviewIndex($this);
$view->setIsIframe(true);
$view->setSliderID($this->sliderId);
$sliderData = Request::$POST->getVar('slider', false);
if (!is_array($sliderData)) {
$sliderData = false;
}
$view->setSliderData($sliderData);
$view->display();
} else {
$this->permissionError();
}
}
public function actionSlide() {
if ($this->validateToken() && $this->validatePermission('smartslider_edit')) {
$slideId = Request::$REQUEST->getInt('slideId');
if ($this->sliderId) {
$slidesData = array();
$slidesModel = new ModelSlides($this);
$slideData = Request::$REQUEST->getVar('slide');
if (!empty($slideData)) {
$slide = $slidesModel->convertSlideDataToDatabaseRow(json_decode(Base64::decode($slideData), true));
$slide['slide'] = json_encode($slide['slide']);
$slide['params'] = json_encode($slide['params']);
if ($slideId) {
$slide['id'] = $slideId;
$slidesData[$slideId] = $slide;
}
}
$view = new ViewPreviewIndex($this);
if (Request::$REQUEST->getVar('frame')) {
$view->setIsIframe(true);
}
$view->setSliderID($this->sliderId);
$view->setSlidesData($slidesData);
$view->display();
}
} else {
$this->permissionError();
}
}
public function actionGenerator() {
if ($this->validateToken() && $this->validatePermission('smartslider_edit')) {
$generator_id = Request::$REQUEST->getInt('generator_id');
$generatorModel = new ModelGenerator($this);
$sliderID = $generatorModel->getSliderId($generator_id);
if ($sliderID) {
$generatorData = array();
$generatorData[$generator_id] = Request::$REQUEST->getVar('generator');
$view = new ViewPreviewIndex($this);
$view->setIsIframe(true);
$view->setSliderID($sliderID);
$view->setGeneratorData($generatorData);
$view->display();
}
} else {
$this->permissionError();
}
}
private function permissionError() {
$this->redirectToSliders();
}
}

View File

@ -0,0 +1,170 @@
<?php
namespace Nextend\SmartSlider3\Application\Admin\Preview;
use Nextend\Framework\Asset\Js\Js;
use Nextend\SmartSlider3\Settings;
/**
* @var $this ViewPreviewFull
*/
JS::addGlobalInline('document.documentElement.classList.add("n2_html--application-only");');
JS::addGlobalInline('document.documentElement.classList.add("n2_html--slider-preview");');
$slider = $this->renderSlider();
$externals = Settings::get('external-css-files');
if (!empty($externals)) {
$externals = explode("\n", $externals);
foreach ($externals as $external) {
echo "<link rel='stylesheet' href='" . esc_url($external) . "' type='text/css' media='all'>";
}
}
// PHPCS - Content already escaped
echo $slider; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
$slidesData = $this->getSlidesData();
if (!empty($slidesData)) {
$slideId = key($slidesData);
if ($slideId > 0) {
?>
<script>
n2ss.ready(<?php echo esc_html($this->getSliderID()); ?>, function (slider) {
slider.visible(function () {
slider.slideToID(<?php echo esc_html($slideId); ?>);
});
});
</script>
<?php
}
}
?>
<script>
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape') {
parent.postMessage(JSON.stringify({action: 'cancel'}), "*");
}
});
if (window.parent !== window) {
_N2.r(['$', 'documentReady'], function () {
var $ = _N2.$,
html = document.documentElement,
body = document.body,
$sliders = $('.n2-ss-slider');
function syncDeviceDetails() {
$sliders.each(function () {
var match = $(this).attr('id').match(/n2-ss-([0-9]+)/);
if (match) {
n2ss.ready(match[1], function (slider) {
slider.stages.done('Show', function () {
syncDeviceDetailsSlider(slider);
});
});
}
});
}
function syncDeviceDetailsSlider(slider) {
var isLandscape = window.matchMedia("(orientation: landscape)").matches,
breakpoints = slider.responsive.parameters.breakpoints,
breakpoint, screenWidthLimit, maxWidth = -1, minWidth = 0, hadMinScreenWidth = false, i;
for (i = breakpoints.length - 1; i >= 0; i--) {
breakpoint = breakpoints[i];
screenWidthLimit = isLandscape ? breakpoint.landscapeWidth : breakpoint.portraitWidth;
if (breakpoint.type === 'max-screen-width') {
minWidth = maxWidth + 1;
maxWidth = screenWidthLimit;
} else if (breakpoint.type === 'min-screen-width') {
hadMinScreenWidth = true;
if (slider.responsive.device === 'desktopPortrait') {
maxWidth = screenWidthLimit - 1;
} else {
minWidth = screenWidthLimit;
maxWidth = 100000;
}
}
if (breakpoint.device === slider.responsive.device) {
break;
}
}
if (!hadMinScreenWidth && slider.responsive.device === 'desktopPortrait') {
minWidth = screenWidthLimit + 1;
maxWidth = 100000;
}
window.parent.postMessage(
JSON.stringify({
action: 'device_info',
data: {
id: slider.id,
top: slider.sliderElement.getBoundingClientRect().top + document.documentElement.scrollTop,
device: slider.responsive.device,
isLandscape: isLandscape,
minScreenWidth: minWidth,
maxScreenWidth: maxWidth
}
}),
"*"
);
}
if (window.ResizeObserver !== undefined) {
var observer = new ResizeObserver((function () {
syncDeviceDetails();
}).bind(this));
observer.observe(body);
} else {
try {
/**
* We can detect every width changes with a dummy iframe.
*/
$('<iframe sandbox="allow-same-origin allow-scripts" style="position:absolute;left:0;top:0;margin:0;padding:0;border:0;display:block;width:100%;height:100%;min-height:0;max-height:none;z-index:10;"></iframe>')
.on('load', function (e) {
$(e.target.contentWindow ? e.target.contentWindow : e.target.contentDocument.defaultView)
.on('resize', function () {
syncDeviceDetails();
});
})
.appendTo(body);
} catch (e) {
}
}
n2ss.on('SliderDeviceOrientation', function (slider) {
syncDeviceDetailsSlider(slider);
})
function broadcastScrollTop(scrollTop) {
window.parent.postMessage(
JSON.stringify({
action: 'scrollTop',
data: {
scrollTop: scrollTop
}
}),
"*"
);
}
document.addEventListener('scroll', function () {
broadcastScrollTop(html.scrollTop || body.scrollTop);
}, {
passive: true,
capture: true
});
broadcastScrollTop(html.scrollTop || body.scrollTop);
});
}
</script>

View File

@ -0,0 +1,43 @@
<?php
namespace Nextend\SmartSlider3\Application\Admin\Preview;
use Nextend\Framework\Asset\Js\Js;
/**
* @var $this ViewPreviewIndex
*/
JS::addGlobalInline('document.documentElement.classList.add("n2_html--application-only");');
Js::addFirstCode("new _N2.SliderPreview();");
?>
<div class="n2_preview">
<form target="n2_preview__device_screen_inner_frame" action="<?php echo esc_url($this->getUrlPreviewFull($this->getSliderID())); ?>" method="post">
<input type="hidden" name="sliderData" value="<?php echo esc_attr(json_encode($this->sliderData)); ?>">
<input type="hidden" name="slidesData" value="<?php echo esc_attr(json_encode($this->slidesData)); ?>">
<input type="hidden" name="generatorData" value="<?php echo esc_attr(json_encode($this->generatorData)); ?>">
</form>
<div class="n2_preview__ruler">
<div class="n2_preview__ruler_label"></div>
</div>
<div class="n2_preview__device_info">
<div class="n2_preview__device_info_label"><?php n2_e('State'); ?>:&nbsp;</div>
<div class="n2_preview__device_info_state"><?php n2_e('Desktop'); ?></div>
<i class="ssi_16 ssi_16--info" data-tip-description="" data-tip-label="<?php n2_e('Reason'); ?>"></i>
</div>
<div class="n2_preview__device_screen">
<div class="n2_preview__device_screen_inner" style="<?php echo esc_attr($this->getWidthCSS()); ?>">
<iframe name="n2_preview__device_screen_inner_frame"></iframe>
<div class="n2_preview__frame_overlay"></div>
<div class="n2_preview__resize_width">
</div>
<div class="n2_preview__resize_height">
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,111 @@
<?php
namespace Nextend\SmartSlider3\Application\Admin\Preview;
use Nextend\Framework\View\AbstractView;
use Nextend\SmartSlider3\Application\Admin\Layout\LayoutEmpty;
use Nextend\SmartSlider3\SliderManager\SliderManager;
class ViewPreviewFull extends AbstractView {
/** @var integer */
protected $sliderID;
/** @var array */
protected $sliderData;
/** @var array */
protected $slidesData;
/** @var array */
protected $generatorData;
public function display() {
$this->layout = new LayoutEmpty($this);
$this->layout->addContent($this->render('Full'));
$this->layout->render();
}
/**
* @return int
*/
public function getSliderID() {
return $this->sliderID;
}
/**
* @param int $sliderID
*/
public function setSliderID($sliderID) {
$this->sliderID = $sliderID;
}
/**
* @return array
*/
public function getSliderData() {
return $this->sliderData;
}
/**
* @param array $sliderData
*/
public function setSliderData($sliderData) {
$this->sliderData = $sliderData;
}
/**
* @return array
*/
public function getSlidesData() {
return $this->slidesData;
}
/**
* @param array $slidesData
*/
public function setSlidesData($slidesData) {
$this->slidesData = $slidesData;
}
/**
* @return array
*/
public function getGeneratorData() {
return $this->generatorData;
}
/**
* @param array $generatorData
*/
public function setGeneratorData($generatorData) {
$this->generatorData = $generatorData;
}
/**
* @return string Return value is already escaped
*/
public function renderSlider() {
$locale = setlocale(LC_NUMERIC, 0);
setlocale(LC_NUMERIC, "C");
$sliderManager = new SliderManager($this, $this->sliderID, true, array(
'sliderData' => $this->sliderData,
'slidesData' => $this->slidesData,
'generatorData' => $this->generatorData
));
$sliderManager->allowDisplayWhenEmpty();
$sliderHTML = $sliderManager->render();
setlocale(LC_NUMERIC, $locale);
return $sliderHTML;
}
}

View File

@ -0,0 +1,160 @@
<?php
namespace Nextend\SmartSlider3\Application\Admin\Preview;
use Nextend\Framework\View\AbstractView;
use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButton;
use Nextend\SmartSlider3\Application\Admin\Layout\LayoutIframe;
use Nextend\SmartSlider3\Application\Admin\Preview\Block\PreviewToolbar\BlockPreviewToolbar;
use Nextend\SmartSlider3\Application\Admin\Settings\ViewSettingsGeneral;
use Nextend\SmartSlider3\Application\Admin\TraitAdminUrl;
use Nextend\SmartSlider3\Application\Model\ModelSliders;
use Nextend\SmartSlider3\Settings;
use Nextend\SmartSlider3\Slider\SliderParams;
class ViewPreviewIndex extends AbstractView {
use TraitAdminUrl;
/** @var integer */
protected $sliderID;
/** @var array */
protected $sliderData = array();
/** @var array */
protected $slidesData = array();
/** @var array */
protected $generatorData = array();
protected $isIframe = false;
public function display() {
$this->layout = new LayoutIframe($this);
$this->layout->setLabel(n2_('Preview'));
$blockPreviewToolbar = new BlockPreviewToolbar($this);
$blockPreviewToolbar->setSliderID($this->sliderID);
$this->layout->addAction($blockPreviewToolbar);
if ($this->isIframe) {
$buttonClose = new BlockButton($this);
$buttonClose->addClass('n2_preview_slider__close');
$buttonClose->setLabel(n2_('Close'));
$buttonClose->setBig();
$buttonClose->setGreyDark();
$this->layout->addAction($buttonClose);
}
$this->layout->addContent($this->render('Index'));
$this->layout->render();
}
/**
* @return int
*/
public function getSliderID() {
return $this->sliderID;
}
/**
* @param int $sliderID
*/
public function setSliderID($sliderID) {
$this->sliderID = $sliderID;
}
/**
* @return array
*/
public function getSliderData() {
return $this->sliderData;
}
/**
* @param array $sliderData
*/
public function setSliderData($sliderData) {
$this->sliderData = $sliderData;
}
public function getWidthCSS() {
if ($this->sliderData) {
$sliderParams = new SliderParams($this->sliderID, $this->sliderData['type'], $this->sliderData);
} else {
$model = new ModelSliders($this);
$slider = $model->get($this->sliderID);
$sliderParams = new SliderParams($this->sliderID, $slider['type'], $slider['params'], true);
}
if ($sliderParams->get('responsive-mode') == 'fullwidth' || $sliderParams->get('responsive-mode') == 'fullpage') {
return '';
}
$minScreenWidth = $sliderParams->get('width');
if (intval($sliderParams->get('responsive-breakpoint-tablet-landscape-enabled', 0))) {
$useLocalBreakpoints = !$sliderParams->get('responsive-breakpoint-global', 0);
$minScreenWidth = max($minScreenWidth, 1 + intval($useLocalBreakpoints ? $sliderParams->get('responsive-breakpoint-tablet-landscape', ViewSettingsGeneral::defaults['tablet-large-portrait']) : Settings::get('responsive-screen-width-tablet-landscape', ViewSettingsGeneral::defaults['tablet-large-portrait'])));
$minScreenWidth = max($minScreenWidth, 1 + ($useLocalBreakpoints ? $sliderParams->get('responsive-breakpoint-tablet-landscape-landscape', ViewSettingsGeneral::defaults['tablet-large-landscape']) : Settings::get('responsive-screen-width-tablet-landscape-landscape', ViewSettingsGeneral::defaults['tablet-large-landscape'])));
}
if (intval($sliderParams->get('responsive-breakpoint-tablet-portrait-enabled', 0))) {
$useLocalBreakpoints = !$sliderParams->get('responsive-breakpoint-global', 0);
$minScreenWidth = max($minScreenWidth, 1 + intval($useLocalBreakpoints ? $sliderParams->get('responsive-breakpoint-tablet-portrait', ViewSettingsGeneral::defaults['tablet-portrait']) : Settings::get('responsive-screen-width-tablet-portrait', ViewSettingsGeneral::defaults['tablet-portrait'])));
$minScreenWidth = max($minScreenWidth, 1 + intval($useLocalBreakpoints ? $sliderParams->get('responsive-breakpoint-tablet-portrait-landscape', ViewSettingsGeneral::defaults['tablet-landscape']) : Settings::get('responsive-screen-width-tablet-portrait-landscape', ViewSettingsGeneral::defaults['tablet-landscape'])));
}
return 'max-width:' . $minScreenWidth . 'px;';
}
/**
* @return array
*/
public function getSlidesData() {
return $this->slidesData;
}
/**
* @param array $slidesData
*/
public function setSlidesData($slidesData) {
$this->slidesData = $slidesData;
}
/**
* @return array
*/
public function getGeneratorData() {
return $this->generatorData;
}
/**
* @param array $generatorData
*/
public function setGeneratorData($generatorData) {
$this->generatorData = $generatorData;
}
/**
* @return bool
*/
public function isIframe() {
return $this->isIframe;
}
/**
* @param bool $isIframe
*/
public function setIsIframe($isIframe) {
$this->isIframe = $isIframe;
}
}