%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/components/bitrix/landing.demo_preview/templates/.default/ |
Current File : /home/bitrix/www/bitrix/components/bitrix/landing.demo_preview/templates/.default/script.js |
;(function() { "use strict"; BX.namespace("BX.Landing"); var slice = BX.Landing.Utils.slice; var proxy = BX.Landing.Utils.proxy; var bind = BX.Landing.Utils.bind; var unbind = BX.Landing.Utils.unbind; var addClass = BX.Landing.Utils.addClass; var removeClass = BX.Landing.Utils.removeClass; var isNumber = BX.Landing.Utils.isNumber; var style = BX.Landing.Utils.style; var data = BX.Landing.Utils.data; var addQueryParams = BX.Landing.Utils.addQueryParams; var getDeltaFromEvent = BX.Landing.Utils.getDeltaFromEvent; /** * Implements interface for works with template preview * @constructor */ BX.Landing.TemplatePreview = function(params) { this.closeButton = document.querySelector(".landing-template-preview-close"); this.createButton = document.querySelector(".landing-template-preview-create"); this.palette = document.querySelector(".landing-template-preview-palette"); this.paletteSiteColor = document.querySelector(".landing-template-preview-palette-sitecolor"); this.imageContainer = document.querySelector(".preview-desktop-body-image"); this.loaderContainer = document.querySelector(".preview-desktop-body-loader-container"); this.previewFrame = document.querySelector(".preview-desktop-body-preview-frame"); this.loader = new BX.Loader({}); this.messages = params.messages || {}; this.loaderText = null; this.progressBar = null; this.IsLoadedFrame = false; this.createStore = false; if (BX.type.isBoolean(params.createStore)) this.createStore = params.createStore; this.ajaxUrl = ''; this.ajaxParams = {}; this.onCreateButtonClick = proxy(this.onCreateButtonClick, this); this.onCancelButtonClick = proxy(this.onCancelButtonClick, this); this.onFrameLoad = proxy(this.onFrameLoad, this); this.init(); }; /** * Gets instance of BX.Landing.TemplatePreview * @return {BX.Landing.TemplatePreview} */ BX.Landing.TemplatePreview.getInstance = function(params) { return ( BX.Landing.TemplatePreview.instance || (BX.Landing.TemplatePreview.instance = new BX.Landing.TemplatePreview(params)) ); }; BX.Landing.TemplatePreview.prototype = { /** * Initializes template preview elements */ init: function() { var colorItems = slice(this.palette.children); if(this.paletteSiteColor) { colorItems = colorItems.concat(slice(this.paletteSiteColor.children)); } colorItems.forEach(this.initSelectableItem, this); bind(this.previewFrame, "load", this.onFrameLoad); bind(this.closeButton, "click", this.onCancelButtonClick); bind(this.createButton, "click", this.onCreateButtonClick); void this.showPreview(data(this.getActiveColorNode(), "data-src")); }, onFrameLoad: function() { this.IsLoadedFrame = true; }, getActiveColorNode: function() { var active = this.palette.querySelector(".active"); if(!active && this.paletteSiteColor) { active = this.paletteSiteColor.querySelector(".active"); } return active; }, /** * Shows preview * @param {string} src * @return {Promise<T>} */ showPreview: function(src) { return this.showLoader() .then(this.createFrameIfNeeded()) .then(this.loadPreview(src)) .then(this.delay(200)) .then(this.hideLoader()); }, /** * Creates frame if needed * @return {Function} */ createFrameIfNeeded: function() { return function() { new Promise(function(resolve) { if (!this.previewFrame.style.width) { var containerWidth = this.imageContainer.clientWidth; void style(this.previewFrame, { "width": "1000px", "height": "calc((100vh - 140px) * (100 / "+((containerWidth/1000)*100)+"))", "transform": "scale("+(containerWidth/1000)+") translateZ(0)", "transform-origin": "top left", "border": "none" }); } resolve(this.previewFrame); }.bind(this)); }.bind(this) }, /** * Loads template preview * @param {string} src * @return {Function} */ loadPreview: function(src) { return function() { return new Promise(function(resolve) { if (this.previewFrame.src !== src) { this.previewFrame.src = src; this.previewFrame.onload = function() { resolve(this.previewFrame); }.bind(this); return; } resolve(this.previewFrame); }.bind(this)); }.bind(this) }, /** * Shows preview loader * @return {Promise} */ showLoader: function() { return new Promise(function(resolve) { void this.loader.show(this.loaderContainer); addClass(this.imageContainer, "landing-template-preview-overlay"); resolve(); }.bind(this)); }, /** * Hides loader * @return {Function} */ hideLoader: function() { return function(iframe) { return new Promise(function(resolve) { void this.loader.hide(); removeClass(this.imageContainer, "landing-template-preview-overlay"); resolve(iframe); }.bind(this)); }.bind(this); }, /** * Creates delay * @param delay * @return {Function} */ delay: function(delay) { delay = isNumber(delay) ? delay : 0; return function(image) { return new Promise(function(resolve) { setTimeout(resolve.bind(null, image), delay); }); } }, /** * Gets value * @return {Object} */ getValue: function() { var result = {}; if(this.paletteSiteColor && this.getActiveColorNode().parentElement === this.paletteSiteColor) { // add theme_use_site flag result[data(this.paletteSiteColor, "data-name")] = 'Y'; } result[data(this.palette, "data-name")] = data(this.getActiveColorNode(), "data-value"); return result; }, /** * Makes create url * @return {string} */ getCreateUrl: function() { return addQueryParams(this.createButton.getAttribute("href"), this.getValue()); }, /** * Handles click event on close button * @param {MouseEvent} event */ onCancelButtonClick: function(event) { event.preventDefault(); top.BX.SidePanel.Instance.close(); }, /** * Handles click event on create button * @param {MouseEvent} event */ onCreateButtonClick: function(event) { event.preventDefault(); if(this.isStore() && this.IsLoadedFrame) { this.loaderText = BX.create("div", { props: { className: "landing-template-preview-loader-text"}, text: this.messages.LANDING_LOADER_WAIT}); this.progressBar = new BX.UI.ProgressBar({ column: true }); this.progressBar.getContainer().classList.add("ui-progressbar-landing-preview"); this.loaderContainer.appendChild(this.loaderText); this.loaderContainer.appendChild(this.progressBar.getContainer()); } if (this.isStore()) { this.showLoader(); this.initCatalogParams(); this.createCatalog(); } else { this.showLoader() .then(this.delay(200)) .then(function() { top.location = this.getCreateUrl(); }.bind(this)); } }, initCatalogParams: function() { if (this.createButton.hasAttribute('data-href')) { this.ajaxUrl = this.createButton.getAttribute('data-href'); } this.ajaxParams = this.getValue(); this.ajaxParams['start'] = 'Y'; }, createCatalog: function() { if (this.ajaxUrl === '') { this.hideLoader(); return; } BX.ajax.loadJSON( this.ajaxUrl, this.ajaxParams, BX.proxy(this.createCatalogResult, this) ); }, createCatalogResult: function(data) { if (data.status === 'continue') { this.ajaxParams['start'] = 'N'; this.progressBar.update(data.progress); this.progressBar.setTextAfter(data.message); this.createCatalog(); } else { top.location = data.url; } }, /** * Initializes selectable items * @param {HTMLElement} item */ initSelectableItem: function(item) { bind(item, "click", proxy(this.onSelectableItemClick, this)); }, /** * Handles click on selectable item * @param event */ onSelectableItemClick: function(event) { event.preventDefault(); if ( event.currentTarget.parentElement === this.palette || (this.paletteSiteColor && event.currentTarget.parentElement === this.paletteSiteColor) ) { removeClass(this.getActiveColorNode(), "active"); addClass(event.currentTarget, "active"); this.showPreview(data(this.getActiveColorNode(), "data-src")); } }, isStore: function() { return this.createStore; } }; })();