/**
* @namespace flexygo.ui.wc
*/
var flexygo;
(function (flexygo) {
var ui;
(function (ui) {
var wc;
(function (wc) {
/**
* Library for the FlxOfflineEmulator
*
* @class FlxOfflineEmulator
* @constructor
* @return {FlxOfflineEmulator} .
*/
class FlxOfflineEmulator extends HTMLElement {
constructor() {
//If a constructor is defined, is REQUIRED call the super constructor
super();
/**
* Set if element has been connected to DOM
* @property connected {boolean}
*/
this.connected = false;
/**
* Ionic Mode
* @property ionicMode {string}
*/
this.ionicMode = 'md';
/**
* Iframe Loaded
* @property iframeLoaded {boolean}
*/
this.iframeLoaded = false;
}
/**
* Array of observed attributes. REQUIRED
* @property observedAttributes {Array}
*/
static get observedAttributes() {
return ['ModuleName', 'url', 'mode'];
}
/**
* Init the webcomponent. REQUIRED.
* @method init
*/
init() {
this.render();
}
/**
* Refresh de webcomponent. REQUIRED.
* @method refresh
*/
refresh() {
this.ionicWindow.postMessage({ action: 'reload' }, '*');
}
/**
* Refresh pages from linked app.
* @method refresh
*/
refreshpages() {
this.ionicWindow.postMessage({ action: 'syncTemplates' }, '*');
}
/**
* Render HTML data.
* @method render
*/
render() {
if (this.url) {
$(this).html([
this.renderModeToggle(),
this.renderDevice(),
this.renderHelpOptions(),
].join(''));
this.setMainEvents();
}
else {
flexygo.msg.warning("The emulator needs the url attribute");
}
}
/**
* Render Mode Toggle.
* @method render
*/
renderModeToggle() {
return (`<div class="mode-toggle" active-mode="${this.ionicMode}">
<div class="toggle-group">
${[{ mode: 'ios', icon: 'fa fa-apple' }, { mode: 'md', icon: 'fa fa-android' }].map(platform => (`<button
${(platform.mode === this.ionicMode) ? 'class= "rippled"' : ''}
data-toggle="tooltip"
title="${flexygo.localization.translate('offlineemulator.' + platform.mode)}"
mode="${platform.mode}">
<i class="${platform.icon}"/>
</button>`)).join('')}
</div>
</div>`);
}
/**
* Render Device.
* @method render
*/
renderDevice() {
return (`<div class="device" mode="${this.ionicMode}">
<figure>
<svg class="device__md-bar" viewBox="0 0 1384.3 40.3">
<path class="st0" d="M1343 5l18.8 32.3c.8 1.3 2.7 1.3 3.5 0L1384 5c.8-1.3-.2-3-1.7-3h-37.6c-1.5 0-2.5 1.7-1.7 3z"/>
<circle class="st0" cx="1299" cy="20.2" r="20"/>
<path class="st0" d="M1213 1.2h30c2.2 0 4 1.8 4 4v30c0 2.2-1.8 4-4 4h-30c-2.2 0-4-1.8-4-4v-30c0-2.3 1.8-4 4-4zM16 4.2h64c8.8 0 16 7.2 16 16s-7.2 16-16 16H16c-8.8 0-16-7.2-16-16s7.2-16 16-16z"/>
</svg>
<svg class="device__ios-notch" viewBox="0 0 219 31">
<path d="M0 1V0h219v1a5 5 0 0 0-5 5v3c0 12.15-9.85 22-22 22H27C14.85 31 5 21.15 5 9V6a5 5 0 0 0-5-5z" fill-rule="evenodd"/>
</svg>
<iframe
loading="lazy"
importance="low"
src="${this.buildUrl()}"/>
</figure>
</div>`);
}
/**
* Render Device.
* @method render
*/
renderHelpOptions() {
return (`<div class="help-options">
<i data-action="refreshpages" class="flx-icon icon-refresh" data-toggle="tooltip" data-placement="bottom" title="Refresh"/>
<i data-action="externalemulator" class="flx-icon icon-new-link" data-toggle="tooltip" data-placement="bottom" title="External emulator"/>
</div>`);
}
/**
* Set Main Events.
* @method setMainEvents
*/
setMainEvents() {
$(this).find('.device>figure>iframe').off('load.offline-emulator').on('load.offline-emulator', (e) => {
this.iframeLoaded = true;
this.ionicWindow = e.currentTarget.contentWindow;
});
$(this).find('.mode-toggle>.toggle-group>button').off('click.offline-emulator').on('click.offline-emulator', (e) => {
if (this.ionicMode !== e.currentTarget.getAttribute("mode")) {
this.setAttribute('mode', e.currentTarget.getAttribute("mode"));
setTimeout(() => {
$(this).find('.mode-toggle>.toggle-group>button').removeClass('rippled').filter(`[mode="${e.currentTarget.getAttribute("mode")}"]`).addClass('rippled');
}, 500);
}
}).hover((e) => {
if (e.currentTarget.getAttribute("mode") !== this.ionicMode) {
$(this).find('.mode-toggle>.toggle-group').addClass('chage-mode');
}
}, (e) => {
$(this).find('.mode-toggle>.toggle-group').removeClass('chage-mode');
});
$(this).find('.help-options>[data-action]').off('click.offline-emulator').on('click.offline-emulator', (e) => {
switch ($(e.currentTarget).attr('data-action')) {
case 'refreshpages':
this.refreshpages();
break;
case 'externalemulator':
window.open(this.buildUrl());
break;
}
});
$(this).find('[data-toggle="tooltip"]').tooltip({ container: 'body', trigger: 'hover', delay: { show: 600, hide: 0 } });
}
/**
* Change Url.
* @method changeUrl
*/
changeUrl() {
$(this).find('.device>figure>iframe').attr('src', this.buildUrl());
}
/**
* Change Mode.
* @method changeMode
*/
changeMode() {
$(this).find('.mode-toggle').attr("active-mode", this.ionicMode);
$(this).find('.device').attr("mode", this.ionicMode);
$(this).find('.device>figure>iframe').attr('src', this.buildUrl());
$(this).find('.mode-toggle>.toggle-group').removeClass('chage-mode');
}
/**
* Build Url.
* @method buildUrl
*/
buildUrl() {
return `${this.url}?ionic:mode=${this.ionicMode}`;
}
/**
* Fires when element is attached to DOM
* @method connectedCallback
*/
connectedCallback() {
let element = $(this);
this.connected = true;
this.moduleName = element.attr("modulename");
this.url = element.attr("url");
element.attr("mode", this.ionicMode);
this.init();
}
/**
* Fires when the attribute value of the element is changed.
* @method attributeChangedCallback
*/
attributeChangedCallback(attrName, oldVal, newVal) {
let needInit = false;
if (attrName.toLowerCase() == 'modulename' && newVal && newVal != '') {
this.moduleName = newVal;
needInit = true;
}
else if (attrName.toLowerCase() == 'url' && newVal && newVal != '') {
this.url = newVal;
if (this.connected) {
this.changeUrl();
}
}
else if (attrName.toLowerCase() == 'mode' && newVal && newVal != '') {
this.ionicMode = newVal;
if (this.connected) {
this.changeMode();
}
}
if (this.connected && needInit) {
this.init();
}
}
}
wc.FlxOfflineEmulator = FlxOfflineEmulator;
})(wc = ui.wc || (ui.wc = {}));
})(ui = flexygo.ui || (flexygo.ui = {}));
})(flexygo || (flexygo = {}));
window.customElements.define("flx-offline-emulator", flexygo.ui.wc.FlxOfflineEmulator);
//# sourceMappingURL=flx-offline-emulator.js.map