Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/ilovecveti.ru/bitrix/js/ui/avatar-editor/dist/ |
Upload File : |
this.BX = this.BX || {}; this.BX.UI = this.BX.UI || {}; (function (exports,ui_fonts_opensans,ui_designTokens,ui_notification,ui_entitySelector,ui_dialogs_messagebox,main_loader,main_core,main_core_events,main_popup,ui_buttons,ui_sidepanel_layout) { 'use strict'; let _ = t => t, _t, _t2, _t3, _t4; var _parent = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("parent"); class DefaultTab extends main_core_events.EventEmitter { constructor() { super(); this.cache = new main_core.Cache.MemoryCache(); Object.defineProperty(this, _parent, { writable: true, value: void 0 }); this.setEventNamespace('Main.Avatar.Editor'); } getPriority() { return this.constructor.priority; } setParentTab(tab) { babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent] = tab; } getHeaderContainer() { return this.cache.remember('headerContainer', () => { const id = this.constructor.code; const title = this.getHeader(); if (title === null) { return main_core.Tag.render(_t || (_t = _`<span style="display: none;" data-bx-role="tab-header" data-bx-state="hidden" data-bx-name="${0}"></span>`), id); } return main_core.Tag.render(_t2 || (_t2 = _`<span class="ui-avatar-editor__tab-button-item" data-bx-role="tab-header" data-bx-state="visible" data-bx-name="${0}">${0}</span>`), id, title); }); } getHeader() { if (babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent] !== null) return this.constructor.code.toUpperCase(); return null; } getBodyContainer() { return this.cache.remember('bodyContainer', () => { const id = this.constructor.code; return main_core.Tag.render(_t3 || (_t3 = _` <div class="ui-avatar-editor__content-block ui-avatar-editor__${0}-block" data-bx-role="tab-body" data-bx-name="${0}">${0}</div>`), id, id, this.getBody()); }); } getBody() { const id = this.constructor.code; return this.cache.remember('body', () => { return main_core.Tag.render(_t4 || (_t4 = _` <div> ${0} </div>`), id.toUpperCase()); }); } inactivate() { if (babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent]) { babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent].getHeaderContainer().removeAttribute('data-bx-active'); main_core.Dom.removeClass(babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent].getHeaderContainer(), 'ui-avatar-editor__tab-button-active'); } this.getHeaderContainer().removeAttribute('data-bx-active'); main_core.Dom.removeClass(this.getHeaderContainer(), 'ui-avatar-editor__tab-button-active'); this.getBodyContainer().removeAttribute('data-bx-active'); this.emit('onInactive'); return this; } activate() { if (babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent]) { babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent].getHeaderContainer().setAttribute('data-bx-active', 'Y'); main_core.Dom.addClass(babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent].getHeaderContainer(), 'ui-avatar-editor__tab-button-active'); } this.getHeaderContainer().setAttribute('data-bx-active', 'Y'); main_core.Dom.addClass(this.getHeaderContainer(), 'ui-avatar-editor__tab-button-active'); this.getBodyContainer().setAttribute('data-bx-active', 'Y'); this.emit('onActive'); return this; } showError({ message, code }) { const errorContainer = this.getBody().querySelector('[data-bx-role="error-container"]'); if (errorContainer) { errorContainer.innerText = message || code; } main_core.Dom.addClass(this.getBodyContainer(), 'ui-avatar-editor--error'); } static isAvailable() { return true; } static get code() { return 'default'; } } DefaultTab.priority = 1; let _$1 = t => t, _t$1; var _isCameraEnabled = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isCameraEnabled"); class CameraTab extends DefaultTab { getHeader() { return null; } getBody() { return this.cache.remember('body', () => { const res = main_core.Tag.render(_t$1 || (_t$1 = _$1` <div> <div class="ui-avatar-editor__camera-block-image"> <div class="ui-avatar-editor__btn-back" data-bx-role="button-back"></div> <div class="ui-avatar-editor__user-loader-item"> <div class="ui-avatar-editor__loader"> <svg class="ui-avatar-editor__circular" viewBox="25 25 50 50"> <circle class="ui-avatar-editor__path" cx="50" cy="50" r="20" fill="none" stroke-width="1" stroke-miterlimit="10"/> </svg> </div> </div> <div class="ui-avatar-editor__error"> <span> ${0} </span> <span data-bx-role="tab-camera-error"></span> </div> <div class="ui-avatar-editor__camera-block-image-inner"> <video autoplay></video> </div> </div> <div class="ui-avatar-editor__button-layout" data-bx-role="camera-button"> <div class="ui-avatar-editor__button"> <span class="ui-avatar-editor__button-icon"></span> </div> </div> </div> `), main_core.Loc.getMessage('JS_AVATAR_EDITOR_ERROR')); const video = res.querySelector('VIDEO'); video.addEventListener("playing", event => { const visibleWidth = res.clientWidth, visibleHeight = res.clientHeight, w = video.clientWidth, h = video.clientHeight, scale = Math.max(w > 0 ? visibleWidth / w : 1, h > 0 ? visibleHeight / h : 1), left = (w * scale - w) / 2 + (visibleWidth - w * scale) / 2, top = (h * scale - h) / 2 + (visibleHeight - h * scale) / 2; main_core.Dom.adjust(video.parentNode, { style: { width: w + 'px', height: h + 'px', transform: 'translate(' + Math.ceil(left) + 'px, ' + Math.ceil(top) + 'px) scale(' + scale + ', ' + scale + ')' } }); }); res.querySelector('[data-bx-role="camera-button"]').onclick = () => { this.emit('onSetFile', video); }; res.querySelector('[data-bx-role="button-back"]').onclick = () => { this.emit('onClickBack'); }; return res; }); } inactivate() { this.stopStreaming(); return super.inactivate(); } activate() { this.startStreaming(); return super.activate(); } startStreaming() { const video = this.getBody().querySelector('VIDEO'); video.setAttribute("active", "Y"); navigator.mediaDevices.getUserMedia({ audio: false, video: { width: { max: 1024, min: 640, ideal: 1024 }, height: { max: 860, min: 480, ideal: 860 } } }).then(function (stream) { if (video.hasAttribute("active")) { video.srcObject = stream; } else { stream.getTracks()[0].stop(); } }).catch(error => { this.getBody().querySelector('[data-bx-role="tab-camera-error"]').innerHTML = main_core.Text.encode(error); }); } stopStreaming() { const video = this.getBody().querySelector('VIDEO'); video.removeAttribute("active"); video.pause(); video.src = ""; if (video.srcObject) { video.srcObject.getTracks()[0].stop(); } } static check() { if (babelHelpers.classPrivateFieldLooseBase(this, _isCameraEnabled)[_isCameraEnabled] === null) { if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) { navigator.mediaDevices.enumerateDevices().then(devices => { babelHelpers.classPrivateFieldLooseBase(this, _isCameraEnabled)[_isCameraEnabled] = Array.from(devices).filter(function (deviceInfo) { return deviceInfo.kind === 'videoinput'; }).length > 0; }).catch(() => { babelHelpers.classPrivateFieldLooseBase(this, _isCameraEnabled)[_isCameraEnabled] = false; }); } else { babelHelpers.classPrivateFieldLooseBase(this, _isCameraEnabled)[_isCameraEnabled] = false; } } } static isAvailable() { this.check(); return babelHelpers.classPrivateFieldLooseBase(this, _isCameraEnabled)[_isCameraEnabled]; } static get code() { return 'camera'; } } CameraTab.priority = 2; Object.defineProperty(CameraTab, _isCameraEnabled, { writable: true, value: null }); var _ajaxRepo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("ajaxRepo"); class Backend { static saveMask({ id, title, accessCode }, file) { if (main_core.Loc.getMessage('USER_ID') <= 0) { return; } const formObj = new FormData(); formObj.append('id', id); formObj.append('title', title); if (accessCode.length > 0) { Array.from(accessCode).forEach((accessCode, index) => { formObj.append('accessCode[' + index + '][0]', accessCode[0]); formObj.append('accessCode[' + index + '][1]', accessCode[1]); }); } else { formObj.append('accessCode[]', ''); } if (file instanceof Blob) { formObj.append('file[changed]', 'Y'); formObj.append('file', file, file['name']); } else { formObj.append('file[changed]', 'N'); } return main_core.ajax.runAction('ui.avatar.mask.save', { data: formObj, analyticsLabel: { ui: 'avatarMask', actionType: 'edit', action: 'save' } }); } static getMaskList(actionName, { page, size }) { return new Promise((resolve, reject) => { main_core.ajax.runAction('ui.avatar.mask.get' + actionName, { data: {}, navigation: { page: page, size: size }, analyticsLabel: { ui: 'avatarMask', actionType: 'read', action: 'list' } }).then(({ data: { groupedItems } }) => { resolve(groupedItems); }).catch(reject); }); } static getMaskInitialInfo({ size, recentlyUsedListSize }) { return new Promise((resolve, reject) => { if (babelHelpers.classPrivateFieldLooseBase(this, _ajaxRepo)[_ajaxRepo]['getMaskInitialInfo']) { return resolve(babelHelpers.classPrivateFieldLooseBase(this, _ajaxRepo)[_ajaxRepo]['getMaskInitialInfo']); } main_core.ajax.runAction('ui.avatar.mask.getMaskInitialInfo', { data: { recentlyUsedListSize: recentlyUsedListSize }, navigation: { page: 1, size: size }, analyticsLabel: { ui: 'avatarMask', actionType: 'read', action: 'initialInfo' } }).then(({ data: { initialInfo } }) => { babelHelpers.classPrivateFieldLooseBase(this, _ajaxRepo)[_ajaxRepo]['getMaskInitialInfo'] = initialInfo; resolve(initialInfo); }).catch(reject); }); } static getMaskAccessCode(itemId) { return main_core.ajax.runAction('ui.avatar.mask.getMaskAccessCode', { data: { id: itemId }, analyticsLabel: { ui: 'avatarMask', actionType: 'edit', action: 'accessCode' } }); } static deleteMask(itemId) { return main_core.ajax.runAction('ui.avatar.mask.delete', { data: { id: itemId }, analyticsLabel: { ui: 'avatarMask', actionType: 'edit', action: 'delete' } }); } static useRecently(itemId) { return main_core.ajax.runAction('ui.avatar.mask.useRecently', { data: { id: itemId }, analyticsLabel: { ui: 'avatarMask', actionType: 'read', action: 'read' } }); } static cleanUp() { return main_core.ajax.runAction('ui.avatar.mask.cleanUp', { analyticsLabel: { ui: 'avatarMask', actionType: 'edit', action: 'cleanUp' } }); } } Object.defineProperty(Backend, _ajaxRepo, { writable: true, value: {} }); let _$2 = t => t, _t$2; function isImage(name, type, size) { type = type ? String(type) : null; size = size ? Number(size) : null; name = String(name).toLowerCase(); let ext = name.split('.').pop(); if (ext === name) { ext = null; } return (type === null || type.indexOf("image/") === 0) && (size === null || size < 20 * 1024 * 1024) && ext !== name && 'jpg,bmp,jpeg,jpe,gif,png,webp'.split(',').indexOf(ext) >= 0; } var _fileId = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("fileId"); var _fileAccept = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("fileAccept"); class UploadTab extends DefaultTab { constructor(options) { super(); Object.defineProperty(this, _fileId, { writable: true, value: void 0 }); Object.defineProperty(this, _fileAccept, { writable: true, value: 'image/*' }); babelHelpers.classPrivateFieldLooseBase(this, _fileId)[_fileId] = ['fileUpload_', new Date().valueOf()].join('_'); if (options && options.fileAccept) { babelHelpers.classPrivateFieldLooseBase(this, _fileAccept)[_fileAccept] = options.fileAccept; } } getHeader() { return null; } getBody() { return this.cache.remember('body', () => { const res = main_core.Tag.render(_t$2 || (_t$2 = _$2` <div> <div class="ui-avatar-editor__btn-back" data-bx-role="button-back"></div> <div class="ui-avatar-editor__upload-link-container"> <div data-bx-role="error-container" class="ui-avatar-editor__upload-error-desc"></div> <label for="${0}" class="ui-avatar-editor__upload-link"> ${0} <input type="file" id="${0}" data-bx-role="file-button" accept="${0}" /> </label> <div class="ui-avatar-editor__upload-desc"> ${0} </div> </div> <div class="ui-avatar-editor__upload-info"> <div class="ui-avatar-editor__upload-info-item"><!-- place for limit text --></div> </div> </div>`), babelHelpers.classPrivateFieldLooseBase(this, _fileId)[_fileId], main_core.Loc.getMessage('JS_AVATAR_EDITOR_PICK_UP_THE_FILE'), babelHelpers.classPrivateFieldLooseBase(this, _fileId)[_fileId], main_core.Text.encode(babelHelpers.classPrivateFieldLooseBase(this, _fileAccept)[_fileAccept]), main_core.Loc.getMessage('JS_AVATAR_EDITOR_DROP_FILES_INTO_THIS_AREA')); const f = event => { const { target } = event; const fileButton = res.querySelector('[data-bx-role="file-button"]'); const file = Array.from(target && target.files ? target.files : fileButton.files).shift(); if (isImage(file.name, file.type, file.size)) { this.emit('onSetFile', file); } main_core.Event.unbindAll(fileButton); const node = fileButton.cloneNode(true, { value: "" }); main_core.Dom.adjust(node, { props: { value: "" }, attrs: {} }); node.setAttribute("new", "Y" + new Date().valueOf()); fileButton.parentNode.insertBefore(node, fileButton); fileButton.parentNode.removeChild(fileButton); main_core.Event.bind(node, "change", f); }; main_core.Event.bind(res.querySelector('[data-bx-role="file-button"]'), 'change', f); const dropZone = new BX.DD.dropFiles(res); if (dropZone && dropZone.supported()) { main_core_events.EventEmitter.subscribe(dropZone, 'dropFiles', (files, e) => { if (e && e["dataTransfer"] && e["dataTransfer"]["items"] && e["dataTransfer"]["items"].length > 0) { const fileCopy = []; Array.from(e["dataTransfer"]["items"]).forEach(item => { if (item["webkitGetAsEntry"] && item["getAsFile"]) { let entry = item["webkitGetAsEntry"](); if (entry && entry.isFile) { fileCopy.push(item["getAsFile"]()); } } }); if (fileCopy.length > 0) { files = fileCopy; } } f({ target: { files: files } }); }, { compatMode: true }); main_core_events.EventEmitter.subscribe(dropZone, 'dragEnter', e => { if (e && e["dataTransfer"] && e.dataTransfer.types && e.dataTransfer.items) { const isFileTransfer = Array.from(e.dataTransfer.types).filter(type => { return type === "Files"; }).length > 0; if (isFileTransfer) { main_core.Dom.addClass(res.parentNode, 'dnd-over'); } } }, { compatMode: true }); main_core_events.EventEmitter.subscribe(dropZone, 'dragLeave', () => { main_core.Dom.removeClass(res.parentNode, 'dnd-over'); }, { compatMode: true }); } res.querySelector('[data-bx-role="button-back"]').onclick = () => { this.emit('onClickBack'); }; return res; }); } deleteError() { this.getBody().querySelector('[data-bx-role="error-container"]').innerText = ''; main_core.Dom.removeClass(this.getBodyContainer(), 'ui-avatar-editor--error'); } static get code() { return 'upload'; } } UploadTab.priority = 3; const Options = { maskSize: 400, imageSize: 1024, rawSrc: document.currentScript.src, rawPath: null, eventNamespace: 'Main.Avatar.Editor', get path() { if (Options.rawPath === null) { const res = Options.rawSrc.split('/'); let buf; while (buf = res.pop()) { if (buf === 'dist') { break; } } Options.rawPath = new main_core.Uri(res.join('/')).getPath(); } return Options.rawPath; }, getCollections: () => { const settings = Extension.getSettings('ui.avatar-editor'); return Array.from(settings['commonCollection'])[{ title: 'Sys', items: ['001_flower.png', '002_flower.png', '003_christmas_tree256.png', '005_red_rectangle.png', '005_blue_circle.png', '004_bow_purple.png'].map(function (title) { return { id: title, title: title, thumb: [Options.path, 'badges', title].join('/').replace('//', '/'), src: [Options.path, 'badges', title].join('/').replace('//', '/') }; }) }]; } }; let _$3 = t => t, _t$3; var _instance = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("instance"); var _data = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("data"); var _id = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("id"); var _changesCount = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("changesCount"); var _getEditor = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getEditor"); var _initAccessSelector = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("initAccessSelector"); var _showSlider = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("showSlider"); var _subscribedToASliderEvents = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("subscribedToASliderEvents"); class MaskEditor extends main_core_events.EventEmitter { constructor() { super(); Object.defineProperty(this, _showSlider, { value: _showSlider2 }); Object.defineProperty(this, _initAccessSelector, { value: _initAccessSelector2 }); Object.defineProperty(this, _getEditor, { value: _getEditor2 }); this.cache = new main_core.Cache.MemoryCache(); Object.defineProperty(this, _data, { writable: true, value: void 0 }); Object.defineProperty(this, _id, { writable: true, value: void 0 }); Object.defineProperty(this, _changesCount, { writable: true, value: 0 }); this.setEventNamespace([Options.eventNamespace, 'mask:editor'].join(':')); babelHelpers.classPrivateFieldLooseBase(this, _id)[_id] = [this.getEventNamespace(), new Date().getTime()].join(':'); } getContentContainer() { return this.cache.remember('content', () => { const res = main_core.Tag.render(_t$3 || (_t$3 = _$3`<div class="ui-avatar-editor--scope"> <ol class="ui-avatar-editor-list"> <li class="ui-avatar-editor-list-item"> <span class="ui-avatar-editor-list-item-num">1</span> ${0} <div class="ui-avatar-editor-list-link-box"> <a href="${0}" class="ui-avatar-editor-list-link">${0}</a> <a href="/bitrix/js/ui/avatar-editor/dist/user_frame_template.zip" download class="ui-avatar-editor-list-link">${0}</a> </div> </li> <li class="ui-avatar-editor-list-item"> <span class="ui-avatar-editor-list-item-num">2</span> ${0} <div class="ui-avatar-editor-mask-file" data-bx-role="mask-file"></div> </li> <li class="ui-avatar-editor-list-item">${0} <span class="ui-avatar-editor-list-item-num">3</span> <div class="ui-form"> <div class="ui-form-row"> <div class="ui-form-label"> <div class="ui-ctl-label-text">${0}</div> </div> <div class="ui-form-content"> <div class="ui-ctl ui-ctl-textbox ui-ctl-w100"> <input data-bx-role="title" type="text" class="ui-ctl-element" placeholder="${0}"> </div> </div> </div> <div class="ui-form-row"> <div class="ui-form-label"> <div class="ui-ctl-label-text">${0}</div> </div> <div class="ui-form-content"> <div class="ui-ctl ui-ctl-textbox ui-ctl-w100" data-bx-role="access-container"></div> </div> </div> </div> </li> </ol> </div>`), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_CREATOR_CONTENT_1_POINT').replace(/#SIZE/gi, main_core.Loc.getMessage('UI_AVATAR_MASK_MAX_SIZE')), main_core.Loc.getMessage('UI_AVATAR_MASK_PATH_ARTICLE'), main_core.Loc.getMessage('JS_AVATAR_EDITOR_HOW_TO'), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_DOWNLOAD_TEMPLATE2'), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_CREATOR_CONTENT_2_POINT'), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_CREATOR_CONTENT_3_POINT'), main_core.Loc.getMessage('JS_AVATAR_EDITOR_TITLE'), main_core.Loc.getMessage('JS_AVATAR_EDITOR_PLACEHOLDER'), main_core.Loc.getMessage('JS_AVATAR_EDITOR_ACCESS')); res.querySelector('[data-bx-role="mask-file"]').appendChild(babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().getContainer()); babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().getCanvasZooming().setDefaultValue(0.5).reset(); return res; }); } isModified() { return babelHelpers.classPrivateFieldLooseBase(this, _changesCount)[_changesCount] > 0; } openNew() { babelHelpers.classPrivateFieldLooseBase(this, _showSlider)[_showSlider]().then(() => { babelHelpers.classPrivateFieldLooseBase(this, _changesCount)[_changesCount] = 0; babelHelpers.classPrivateFieldLooseBase(this, _data)[_data] = { id: null, title: '', src: null, accessCode: [['meta-user', 'all-users']] }; babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().reset(); this.getContentContainer().querySelector('[data-bx-role="title"]').value = ''; babelHelpers.classPrivateFieldLooseBase(this, _initAccessSelector)[_initAccessSelector](); }); } openSaved(data) { babelHelpers.classPrivateFieldLooseBase(this, _data)[_data] = { id: data.id, title: data.title, src: data.src, accessCode: data.accessCode || null }; this.getContentContainer().querySelector('[data-bx-role="title"]').value = main_core.Text.encode(data.title); babelHelpers.classPrivateFieldLooseBase(this, _showSlider)[_showSlider]().then(() => { babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().loadSrc(data.src).then(() => { babelHelpers.classPrivateFieldLooseBase(this, _changesCount)[_changesCount] = 0; if (!data.accessCode) { Backend.getMaskAccessCode(data.id).then(({ data: { accessCode } }) => { this.emit('maskAccessCodeHasGot', accessCode); babelHelpers.classPrivateFieldLooseBase(this, _data)[_data].accessCode = accessCode; babelHelpers.classPrivateFieldLooseBase(this, _initAccessSelector)[_initAccessSelector](); }); } else { babelHelpers.classPrivateFieldLooseBase(this, _data)[_data].accessCode = Array.from(data.accessCode); babelHelpers.classPrivateFieldLooseBase(this, _initAccessSelector)[_initAccessSelector](); } }); }); } checkOpened() { return new Promise((resolve, reject) => { let isSuccess = true; if (babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().isEmpty()) { babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().getTab(UploadTab.code).showError({ message: main_core.Loc.getMessage('JS_AVATAR_EDITOR_ERROR_IMAGE_IS_NOT_CHOSEN') }); isSuccess = false; } const title = this.getContentContainer().querySelector('[data-bx-role="title"]').value.trim(); if (title.length <= 0) { this.getContentContainer().querySelector('[data-bx-role="title"]').style.border = '3px solid red'; isSuccess = false; } if (isSuccess) { return resolve(); } return reject(); }); } saveOpened() { return new Promise((resolve, reject) => { const cb = ({ blob }) => { Backend.saveMask({ id: babelHelpers.classPrivateFieldLooseBase(this, _data)[_data].id, title: this.getContentContainer().querySelector('[data-bx-role="title"]').value, accessCode: babelHelpers.classPrivateFieldLooseBase(this, _data)[_data].accessCode }, blob).then(resolve).catch(reject); }; if (!this.isModified()) { return cb({ blob: null }); } return babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().packBlob().then(cb); }); } destroy() { babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().reset(); this.getContentContainer().querySelector('[data-bx-role="title"]').value = ''; babelHelpers.classPrivateFieldLooseBase(this, _data)[_data] = null; this.cache.storage.clear(); } /** * Emits specified event with specified event object * @param {string} eventName * @param {BaseEvent | any} event * @return {this} */ emit(eventName, event) { BX.SidePanel.Instance.postMessageAll(babelHelpers.classPrivateFieldLooseBase(this, _id)[_id], eventName, event); return this; } static subscribe(eventName, listener) { main_core_events.EventEmitter.subscribe([Options.eventNamespace, 'mask:editor', eventName].join(':'), listener); if (babelHelpers.classPrivateFieldLooseBase(this, _subscribedToASliderEvents)[_subscribedToASliderEvents]) { return; } babelHelpers.classPrivateFieldLooseBase(this, _subscribedToASliderEvents)[_subscribedToASliderEvents] = true; main_core_events.EventEmitter.subscribe('SidePanel.Slider:onMessage', ({ data: [BXSidePanelMessageEvent] }) => { if (BXSidePanelMessageEvent.getSender().getUrl().indexOf([Options.eventNamespace, 'mask:editor'].join(':')) === 0) { main_core_events.EventEmitter.emit([Options.eventNamespace, 'mask:editor', BXSidePanelMessageEvent.getEventId()].join(':'), BXSidePanelMessageEvent.getData()); } }); } static getInstance() { if (babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance]) { return babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance]; } if (window === window.top) { if (!babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance]) { babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance] = new this(); } return babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance]; } return null; } static getPromiseWithInstance() { if (babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance] || this.getInstance()) { return new Promise(resolve => { resolve(babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance]); }); } return new Promise(resolve => { top.BX.Runtime.loadExtension(['ui.avatar-editor']).then(() => { babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance] = top.BX.UI.AvatarEditor.MaskEditor.getInstance(); resolve(babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance]); }); }); } } function _getEditor2() { return this.cache.remember('editor', () => { const res = new Editor({ enableCamera: false, enableUpload: true, uploadTabOptions: { fileAccept: 'image/png' }, enableMask: false }); res.subscribe('onChange', ({ data }) => { babelHelpers.classPrivateFieldLooseBase(this, _changesCount)[_changesCount]++; }); return res; }); } function _initAccessSelector2() { return this.cache.remember('TagSelector', () => { const handler = ({ target }) => { if (target instanceof ui_entitySelector.Dialog) { babelHelpers.classPrivateFieldLooseBase(this, _data)[_data].accessCode = target.getSelectedItems().map(item => { return [item.entityId, item.id]; }); } }; const selector = new top.BX.UI.EntitySelector.TagSelector({ id: this.constructor.name, dialogOptions: { id: this.constructor.name, context: null, preselectedItems: babelHelpers.classPrivateFieldLooseBase(this, _data)[_data].accessCode, events: { 'Item:onSelect': handler, 'Item:onDeselect': handler }, entities: [{ id: 'meta-user', options: { 'all-users': { title: 'All users', allowView: true } } }, { id: 'user', options: { emailUsers: false, inviteGuestLink: false, myEmailUsers: false } }, { id: 'department', options: { selectMode: 'usersAndDepartments', allowFlatDepartments: false } }] } }); selector.renderTo(this.getContentContainer().querySelector('[data-bx-role="access-container"]')); return selector; }); } function _showSlider2() { return new Promise((resolve, reject) => { BX.SidePanel.Instance.open(babelHelpers.classPrivateFieldLooseBase(this, _id)[_id], { width: 800, cacheable: false, allowChangeHistory: false, events: { onCloseByEsc: event => { event.denyAction(); }, onOpen: () => { setTimeout(() => { this.emit('onOpen', {}); }, 0); resolve(); }, onCloseComplete: this.destroy.bind(this) }, contentCallback: slider => { return ui_sidepanel_layout.Layout.createContent({ extensions: [], title: main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_CREATOR_TITLE'), content: () => { const res = this.getContentContainer(); setTimeout(() => { babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().getCanvasZooming().setDefaultValue(0.5).reset(); }, 0); return res; }, buttons: ({ CancelButton, SaveButton }) => { return [new SaveButton({ onclick: button => { button.setWaiting(true); this.checkOpened().then(this.saveOpened.bind(this)).then(({ data }) => { this.emit('onSave', { id: babelHelpers.classPrivateFieldLooseBase(this, _data)[_data].id, data: data }); button.setWaiting(false); slider.close(); }).catch(error => { if (error) { BX.UI.Notification.Center.notify({ content: ['Error is here', ...arguments].join('-') }); } button.setWaiting(false); }); } }), new CancelButton({ onclick: () => { slider.close(); } })]; } }); }, label: { text: main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_CREATOR_LABEL') } }); }); } Object.defineProperty(MaskEditor, _instance, { writable: true, value: void 0 }); Object.defineProperty(MaskEditor, _subscribedToASliderEvents, { writable: true, value: false }); let _$4 = t => t, _t$4; var _repo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("repo"); var _template = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("template"); class MaskItem extends main_core_events.EventEmitter { constructor(data, template) { super(); this.cache = new main_core.Cache.MemoryCache(); Object.defineProperty(this, _template, { writable: true, value: void 0 }); this.setEventNamespace('Main.Avatar.Editor'); this.data = data; babelHelpers.classPrivateFieldLooseBase(this, _template)[_template] = template; MaskEditor.subscribe('onSave', event => { try { const { data: { id, data } } = event; if (String(this.data.id) === String(id)) { this.update(data); } } catch (e) { console.log(e.message); } }); } getContainer() { return this.cache.remember('container', () => { const itemText = babelHelpers.classPrivateFieldLooseBase(this, _template)[_template].replace(/#MASK_ID#/gi, main_core.Text.encode(this.data.id)).replace(/#MASK_TITLE#/gi, main_core.Text.encode(this.data.title || '')).replace(/#MASK_SUBTITLE#/gi, main_core.Text.encode(this.data.description || '')).replace(/#MASK_SRC#/gi, main_core.Text.encode(this.data.src)); const res = main_core.Tag.render(_t$4 || (_t$4 = _$4`${0}`), itemText); main_core.Event.bind(res.querySelector('[data-bx-role="mask-item-menu-pointer"]'), 'click', this.onClickMenuPointer.bind(this)); babelHelpers.classPrivateFieldLooseBase(this.constructor, _repo)[_repo].set(res, this); main_core.Event.bind(res, 'click', this.setActive.bind(this)); return res; }); } getData() { return Object.assign({}, this.data); } getId() { return this.data.id; } update(data) { this.data.title = data.title; this.data.src = data.src; this.data.description = data.description; this.data.accessCode = data.accessCode; this.data.editable = data.editable; const oldContainer = this.getContainer(); this.cache.delete('container'); const newContainer = this.getContainer(); main_core.Dom.replace(oldContainer, newContainer); } setActive() { this.emit('onClickMask'); } onClickMenuPointer(event) { event.preventDefault(); event.stopPropagation(); const thisPopupId = 'mask-item-menu-context-' + this.data.id; const thisPopup = main_popup.MenuManager.create(thisPopupId, event.target, [{ href: this.data.src, dataset: { id: 'download' }, text: main_core.Loc.getMessage('JS_AVATAR_EDITOR_DOWNLOAD_BUTTON'), onclick: (event, item) => { item.getMenuWindow().close(); } }, this.data.editable ? { text: main_core.Loc.getMessage('JS_AVATAR_EDITOR_EDIT_BUTTON'), onclick: (event, item) => { this.emit('onClickEditMask'); item.getMenuWindow().close(); } } : null, this.data.editable ? { text: main_core.Loc.getMessage('JS_AVATAR_EDITOR_DELETE_BUTTON'), onclick: (event, item) => { this.emit('onClickDeleteMask'); item.getMenuWindow().close(); } } : null], { closeByEsc: true, autoHide: true, offsetTop: 0, offsetLeft: 15, angle: true, cacheable: false, targetContainer: event.target.closest('.ui-avatar-editor__mask-block-container'), className: 'popup-window-content-frame-item-menu', events: { onFirstShow: ({ compatData: [popup] }) => { popup.getContentContainer().querySelector('[data-id="download"]').setAttribute('download', ''); } } }); thisPopup.show(); main_core_events.EventEmitter.subscribeOnce(thisPopup.getPopupWindow().getEventNamespace() + ':onBeforeShow', () => { thisPopup.close(); }); return false; } static getByNode(node) { return babelHelpers.classPrivateFieldLooseBase(this, _repo)[_repo].get(node); } } Object.defineProperty(MaskItem, _repo, { writable: true, value: new WeakMap() }); let _$5 = t => t, _t$5, _t2$1, _t3$1, _t4$1, _t5, _t6; var _container = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("container"); var _state = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("state"); var _pageSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("pageSize"); var _pageNumber = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("pageNumber"); var _getTemplateGroup = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getTemplateGroup"); var _getTemplateItem = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getTemplateItem"); class MaskList extends main_core_events.EventEmitter { constructor({ initialPageSize, items }) { super(); Object.defineProperty(this, _getTemplateItem, { value: _getTemplateItem2 }); Object.defineProperty(this, _getTemplateGroup, { value: _getTemplateGroup2 }); Object.defineProperty(this, _container, { writable: true, value: void 0 }); this.cache = new main_core.Cache.MemoryCache(); Object.defineProperty(this, _state, { writable: true, value: this.constructor.paginationStates['ready'] }); Object.defineProperty(this, _pageSize, { writable: true, value: 10 }); Object.defineProperty(this, _pageNumber, { writable: true, value: 1 }); this.setEventNamespace('Main.Avatar.Editor'); babelHelpers.classPrivateFieldLooseBase(this, _container)[_container] = this.getContainer().querySelector('[data-bx-role="avatar-mask-list-container"]'); babelHelpers.classPrivateFieldLooseBase(this, _pageSize)[_pageSize] = this.constructor.regularPageSize; this.loadItems(items); this.setReady(); } static getTemplate() { return `<div> <div class="ui-avatar-editor--scope" data-bx-role="avatar-mask-list-container"> <section class="ui-avatar-editor__mask-block-list-container" id="mask_group"> <h3 class="ui-avatar-editor__mask-title" data-bx-role="group_title" data-bx-group-id="#GROUP_ID#">#GROUP_TITLE#</h3> <ul class="ui-avatar-editor__mask-block-mask-box" data-bx-role="group_body" data-bx-group-id="#GROUP_ID#"> <li class="ui-avatar-editor__mask-block-mask-element" id="mask_item" data-bx-role="mask_item" title="#MASK_TITLE# \n #MASK_SUBTITLE#" data-bx-id="#MASK_ID#"> <div data-bx-role="mask-thumb" class="ui-avatar-editor__mask-block-mask-image" style="background-image: url('#MASK_SRC#'); "/></div> <div class="ui-avatar-editor__mask-block-mask-name">#MASK_TITLE#</div> <div class="ui-avatar-editor__mask-block-mask-subname">#MASK_SUBTITLE#</div> <div class="ui-avatar-editor__mask-block-mask-menu" data-bx-role="mask-item-menu-pointer"></div> </li> </ul> </section> </div> <nav class="ui-avatar-editor-pagination" data-bx-role="avatar-mask-list-pagination"></nav> </div>`; } static setByNode(node, object) { return this.repoList.set(node, object); } static getByNode(node) { return this.repoList.get(node); } setPageSize(pageSize) { babelHelpers.classPrivateFieldLooseBase(this, _pageSize)[_pageSize] = pageSize; return this; } getContainer() { return this.cache.remember('container', () => { const res = main_core.Tag.render(_t$5 || (_t$5 = _$5`${0}`), this.constructor.getTemplate()); main_core.Dom.remove(res.querySelector('#mask_item')); main_core.Dom.remove(res.querySelector('#mask_group')); return res; }); } isReady() { return babelHelpers.classPrivateFieldLooseBase(this, _state)[_state] === this.constructor.paginationStates.ready; } setReady() { this.getMoreButton().setWaiting(false); babelHelpers.classPrivateFieldLooseBase(this, _state)[_state] = this.constructor.paginationStates.ready; } setBusy() { this.getMoreButton().setWaiting(true); babelHelpers.classPrivateFieldLooseBase(this, _state)[_state] = this.constructor.paginationStates.inprogress; } setFinished() { this.getMoreButton().setDisabled(true); babelHelpers.classPrivateFieldLooseBase(this, _state)[_state] = this.constructor.paginationStates.finished; main_core.Dom.remove(this.getContainer().querySelector('[data-bx-role="avatar-mask-list-pagination"]')); } getMoreButton() { return this.cache.remember('moreButton', () => { const butt = new ui_buttons.Button({ text: main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_LIST_PAGINATION'), baseClass: 'ui-btn ui-btn-light-border', size: ui_buttons.ButtonSize.SMALL, noCaps: true, round: true, onclick: this.load.bind(this) }); butt.renderTo(this.getContainer().querySelector('[data-bx-role="avatar-mask-list-pagination"]')); return butt; }); } load() { if (!this.isReady()) { return; } this.setBusy(); Backend.getMaskList(this.constructor.name.replace('Mask', ''), { page: ++babelHelpers.classPrivateFieldLooseBase(this, _pageNumber)[_pageNumber], size: babelHelpers.classPrivateFieldLooseBase(this, _pageSize)[_pageSize] }).then(this.loadItems.bind(this)).catch(this.terminate.bind(this)); } loadItems(items) { this.renderItems(items); this.finish(items); } renderItems(data) { let maxCount = babelHelpers.classPrivateFieldLooseBase(this, _pageSize)[_pageSize]; Object.values(data).forEach(({ id, title, items }) => { if (maxCount <= 0) { return; } items = Object.values(items).slice(0, maxCount); maxCount -= items.length; id = id || '0'; if (!babelHelpers.classPrivateFieldLooseBase(this, _container)[_container].querySelector(`[data-bx-group-id="${id}"][data-bx-role="group_body"]`)) { const groupText = babelHelpers.classPrivateFieldLooseBase(this, _getTemplateGroup)[_getTemplateGroup]().replace(/#GROUP_ID#/gi, main_core.Text.encode(id)).replace(/#GROUP_TITLE#/gi, main_core.Text.encode(title || '')); babelHelpers.classPrivateFieldLooseBase(this, _container)[_container].appendChild(main_core.Tag.render(_t2$1 || (_t2$1 = _$5`${0}`), groupText)); } const badgeContainer = babelHelpers.classPrivateFieldLooseBase(this, _container)[_container].querySelector(`[data-bx-group-id="${id}"][data-bx-role="group_body"]`); items.forEach(item => { const maskItem = new MaskItem(item, babelHelpers.classPrivateFieldLooseBase(this, _getTemplateItem)[_getTemplateItem]()); badgeContainer.appendChild(maskItem.getContainer()); }); }); } renderItemsReverse(data) { Object.values(data).forEach(({ id, title, items }) => { id = id || '0'; if (!babelHelpers.classPrivateFieldLooseBase(this, _container)[_container].querySelector(`[data-bx-group-id="${id}"][data-bx-role="group_body"]`)) { const groupText = babelHelpers.classPrivateFieldLooseBase(this, _getTemplateGroup)[_getTemplateGroup]().replace(/#GROUP_ID#/gi, main_core.Text.encode(id)).replace(/#GROUP_TITLE#/gi, main_core.Text.encode(title || '')); main_core.Dom.prepend(main_core.Tag.render(_t3$1 || (_t3$1 = _$5`${0}`), groupText), babelHelpers.classPrivateFieldLooseBase(this, _container)[_container]); } const badgeContainer = babelHelpers.classPrivateFieldLooseBase(this, _container)[_container].querySelector(`[data-bx-group-id="${id}"][data-bx-role="group_body"]`); items.forEach(item => { const maskItem = new MaskItem(item, babelHelpers.classPrivateFieldLooseBase(this, _getTemplateItem)[_getTemplateItem]()); main_core.Dom.prepend(maskItem.getContainer(), badgeContainer); }); }); } finish(data) { let thisPageItemCount = 0; data.forEach(({ items }) => { thisPageItemCount += items.length; }); if (thisPageItemCount >= babelHelpers.classPrivateFieldLooseBase(this, _pageSize)[_pageSize]) { this.setReady(); } else { this.setFinished(); } } terminate(data) { let errors = []; if (data instanceof Error) { console.log('data: ', data); errors.push(data); } else if (data['errors']) { errors = data.errors; } else { errors.push({ message: 'Some error' }); } this.setFinished(); errors.forEach(({ code, message }) => { babelHelpers.classPrivateFieldLooseBase(this, _container)[_container].appendChild(main_core.Tag.render(_t4$1 || (_t4$1 = _$5`<pre>${0}</pre>`), main_core.Text.encode(message))); }); } } function _getTemplateGroup2() { return this.cache.remember('templateGroup', () => { const maskGroup = main_core.Tag.render(_t5 || (_t5 = _$5`${0}`), this.constructor.getTemplate()).querySelector('#mask_group'); const maskItem = maskGroup.querySelector('#mask_item'); maskItem.parentNode.removeChild(maskItem); maskGroup.removeAttribute('id'); return maskGroup.outerHTML.trim(); }); } function _getTemplateItem2() { return this.cache.remember('templateItem', () => { const maskItem = main_core.Tag.render(_t6 || (_t6 = _$5`${0}`), this.constructor.getTemplate()).querySelector('#mask_item'); maskItem.removeAttribute('id'); return maskItem.outerHTML.trim(); }); } MaskList.repoList = new WeakMap(); MaskList.paginationStates = { ready: 0, inprogress: 1, finished: 3 }; MaskList.regularPageSize = 9; MaskList.shortPageSize = 3; class MaskRecentlyUsedList extends MaskList {} class MaskSystemList extends MaskList {} class MaskUserList extends MaskList { constructor() { super(...arguments); MaskEditor.subscribe('onSave', event => { try { const { data: { id, data } } = event; if (id === null) { this.renderItemsReverse({ 'doesNotMatter': { items: [data] } }); } } catch (e) { console.log(e.message); } }); } } class MaskSharedList extends MaskList {} let _$6 = t => t, _t$6; var _ready = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("ready"); var _callbacks = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("callbacks"); var _fulfillReadyCallbacksTimeout = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("fulfillReadyCallbacksTimeout"); var _deleteMaskVisually = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("deleteMaskVisually"); class MaskTab extends DefaultTab { constructor() { super(); Object.defineProperty(this, _deleteMaskVisually, { value: _deleteMaskVisually2 }); Object.defineProperty(this, _ready, { writable: true, value: false }); Object.defineProperty(this, _callbacks, { writable: true, value: [] }); Object.defineProperty(this, _fulfillReadyCallbacksTimeout, { writable: true, value: void 0 }); this.badges = null; this.activeId = null; this.mask = this.mask.bind(this); this.subscribeOnce('onActive', this.initialize.bind(this)); } getHeader() { return main_core.Loc.getMessage('JS_AVATAR_EDITOR_MASKS'); } getBody() { return this.cache.remember('body', () => { return main_core.Tag.render(_t$6 || (_t$6 = _$6`<div class="ui-avatar-editor__mask-block-container"> <div class="ui-avatar-editor__mask-block-content"> <div data-bx-role="semantic-container" data-bx-id="recently-used" style="display: none;"> <h3 class="ui-avatar-editor__mask-title">${0}</h3> <div data-bx-role="list-container" data-bx-id="recently-used"></div> </div> <div data-bx-role="list-container" data-bx-id="system"></div> <div data-bx-role="semantic-container" data-bx-id="shared" style="display: none"> <h3 class="ui-avatar-editor__mask-title">${0}</h3> <div data-bx-role="list-container" data-bx-id="shared"> <a class="ui-btn ui-btn-lg ui-btn-link ui-btn-wait ui-btn-no-caps ui-btn-icon-add">...</a> </div> </div> <div data-bx-role="semantic-container" data-bx-id="my-own"> <h3 class="ui-avatar-editor__mask-title" data-bx-id="rest-market-export-menu"> ${0} <div data-bx-id="rest-market-export-menu-pointer" class="ui-avatar-editor__menu-more"></div> </h3> <div data-bx-role="list-container" data-bx-id="my-own"></div> <a href="#" class="ui-avatar-editor__mask-create-box" data-bx-role="semantic-container" data-bx-id="rest-market" style="display: none;"> <div class="ui-avatar-editor__mask-btn-load"> <div class="ui-avatar-editor__mask-btn-load-icon"></div> ${0} <div class="ui-avatar-editor__mask-btn-load-cloud"></div> </div> </a> <div class="ui-avatar-editor__mask-create-box"> <div class="ui-avatar-editor__mask-btn-add" data-bx-id="avatar-mask-list-own-create">${0}</div> <a href="/bitrix/js/ui/avatar-editor/dist/user_frame_template.zip" download class="ui-avatar-editor__mask-link">${0}</a> </div> </div> </div> </div>`), main_core.Loc.getMessage('JS_AVATAR_EDITOR_RECENT_MASKS'), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_LIST_SHARED'), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_LIST_MY_OWN'), main_core.Loc.getMessage('JS_AVATAR_EDITOR_LOAD_FROM_MARKET'), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_ADD_MY_OWN'), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_DOWNLOAD_TEMPLATE1')); }); } initialize() { Backend.getMaskInitialInfo({ size: MaskList.regularPageSize, recentlyUsedListSize: MaskList.shortPageSize }).then(this.initializeData.bind(this)).catch(error => { console.log('errors: ', error); }); } initializeData({ recentlyUsedItems, systemItems, myOwnItems, sharedItems, restMarketInfo }) { const body = this.getBody(); if (main_core.Loc.getMessage('USER_ID') > 0) { main_core.Event.bind(body.querySelector('[data-bx-id="avatar-mask-list-own-create"]'), 'click', this.onClickCreateMask.bind(this)); main_core_events.EventEmitter.subscribe(this.getEventNamespace() + ':' + 'onClickEditMask', this.onClickEditMask.bind(this)); main_core_events.EventEmitter.subscribe(this.getEventNamespace() + ':' + 'onClickDeleteMask', this.onClickDeleteMask.bind(this)); } if (restMarketInfo['available'] === 'Y') { const menuItem = body.querySelector('[data-bx-id="rest-market-export-menu"]'); main_core.Dom.addClass(menuItem, '--menuable'); main_core.Event.bind(menuItem.querySelector('[data-bx-id="rest-market-export-menu-pointer"]'), 'click', event => { this.onClickOwnMaskMenu(event, restMarketInfo); }); const marketLink = body.querySelector('[data-bx-role="semantic-container"][data-bx-id="rest-market"]'); marketLink.style.display = ''; marketLink.href = restMarketInfo['marketUrl']; } [[MaskRecentlyUsedList, recentlyUsedItems, body.querySelector('[data-bx-role="list-container"][data-bx-id="recently-used"]')], [MaskSystemList, systemItems, body.querySelector('[data-bx-role="list-container"][data-bx-id="system"]')], [MaskUserList, myOwnItems, body.querySelector('[data-bx-role="list-container"][data-bx-id="my-own"]')], [MaskSharedList, sharedItems, body.querySelector('[data-bx-role="list-container"][data-bx-id="shared"]')]].forEach(([className, items, container]) => { items = items || []; if (items.length > 0) { const semanticContainer = container.closest('[data-bx-role="semantic-container"]'); if (semanticContainer) { semanticContainer.style.display = ''; } } container.innerHTML = ''; /** * @typedef {MaskList} list */ const list = new className({ initialPageSize: this.constructor.initialPageSize, items: items }); container.appendChild(list.getContainer()); MaskList.setByNode(container, list); }); main_core_events.EventEmitter.subscribe(this.getEventNamespace() + ':' + 'onClickMask', ({ target: maskItem }) => { /** * @typedef {MaskItem} maskItem */ if (this.getBody().contains(maskItem.getContainer())) { if (this.activeId === maskItem.getId()) { this.unmask(); } else { this.mask(maskItem.getData()); } } }); babelHelpers.classPrivateFieldLooseBase(this, _ready)[_ready] = true; this.fulfillReadyCallbacks(); } onReady(callback) { babelHelpers.classPrivateFieldLooseBase(this, _callbacks)[_callbacks].push(callback); if (babelHelpers.classPrivateFieldLooseBase(this, _ready)[_ready]) { this.fulfillReadyCallbacks(); } } fulfillReadyCallbacks() { if (babelHelpers.classPrivateFieldLooseBase(this, _fulfillReadyCallbacksTimeout)[_fulfillReadyCallbacksTimeout] > 0) { return; } const callback = babelHelpers.classPrivateFieldLooseBase(this, _callbacks)[_callbacks].shift(); if (callback) { if (babelHelpers.classPrivateFieldLooseBase(this, _callbacks)[_callbacks].length > 0) { babelHelpers.classPrivateFieldLooseBase(this, _fulfillReadyCallbacksTimeout)[_fulfillReadyCallbacksTimeout] = setTimeout(() => { babelHelpers.classPrivateFieldLooseBase(this, _fulfillReadyCallbacksTimeout)[_fulfillReadyCallbacksTimeout] = 0; this.fulfillReadyCallbacks(); }, 10); } callback.call(this); } } unmask() { if (this.activeId !== null) { let foundAtLeastOneNode; this.getBody().querySelectorAll(`[data-bx-role="mask_item"][data-bx-id="${this.activeId}"]`).forEach(node => { foundAtLeastOneNode = node; main_core.Dom.removeClass(node, '--active'); }); if (foundAtLeastOneNode) { this.emit('onUnsetMask', this.activeId); } } this.activeId = null; } maskById(id) { this.onReady(() => { const maskItem = MaskItem.getByNode(this.getBody().querySelector(`[data-bx-role="mask_item"][data-bx-id="${id}"]`)); if (maskItem instanceof MaskItem) { maskItem.setActive(); } }); } mask({ id, src, thumb }) { if (this.activeId !== id && main_core.Type.isStringFilled(id)) { this.unmask(); let foundAtLeastOneNode; this.getBody().querySelectorAll(`[data-bx-role="mask_item"][data-bx-id="${id}"]`).forEach(node => { foundAtLeastOneNode = node; main_core.Dom.addClass(node, ' --active'); }); if (foundAtLeastOneNode) { this.activeId = id; this.emit('onSetMask', { id: id, src: src, thumb: thumb || src }); } } } onClickCreateMask(event) { event.stopImmediatePropagation(); MaskEditor.getPromiseWithInstance().then(maskEditor => { maskEditor.openNew(); }); } onClickEditMask(event) { /* @var MaskItem maskItem */ const maskItem = event.getTarget(); if (this.getBody().contains(maskItem.getContainer())) { event.stopImmediatePropagation(); MaskEditor.getPromiseWithInstance().then(maskEditor => { maskEditor.openSaved(Object.assign({}, maskItem.getData())); }); } } onClickDeleteMask({ target }) { if (this.getBody().contains(target.getContainer())) { /* @var MaskItem target */ babelHelpers.classPrivateFieldLooseBase(this, _deleteMaskVisually)[_deleteMaskVisually](target); Backend.deleteMask(target.getId()).then(() => { this.getBody().querySelectorAll(`[data-bx-role="mask_item"][data-bx-id="${target.getId()}"]`).forEach(node => { main_core.Dom.remove(node); }); }).catch(({ errors }) => { BX.UI.Notification.Center.notify({ content: [main_core.Loc.getMessage('JS_AVATAR_EDITOR_ERROR'), ...errors.map(({ message, code }) => { return message || code; })].join(' ') }); }); } } onClickOwnMaskMenu(event, urls) { const thisPopupId = 'mask-item-menu-context-own-masks'; const isFilled = !!this.getBody().querySelector('[data-bx-role="list-container"][data-bx-id="my-own"]').querySelector(`[data-bx-role="mask_item"]`); const thisPopup = main_popup.MenuManager.create(thisPopupId, event.target, [isFilled && main_core.Type.isStringFilled(urls.exportUrl) ? { href: urls.exportUrl, text: main_core.Loc.getMessage('JS_AVATAR_EDITOR_EXPORT_BUTTON'), onclick: (event, item) => { this.emit('onClickExport'); item.getMenuWindow().close(); } } : null, isFilled ? { text: main_core.Loc.getMessage('JS_AVATAR_EDITOR_CLEAN_BUTTON'), onclick: (event, item) => { item.getMenuWindow().close(); new ui_dialogs_messagebox.MessageBox({ message: main_core.Loc.getMessage('JS_AVATAR_EDITOR_CLEAN_NOTIFICATION'), title: main_core.Loc.getMessage('JS_AVATAR_EDITOR_CLEAN_NOTIFICATION_TITLE'), buttons: ui_dialogs_messagebox.MessageBoxButtons.OK_CANCEL, okCaption: 'Ok', onOk: messageBox => { messageBox.close(); this.cleanUp(); } }).show(); } } : null, { href: urls.importUrl, text: main_core.Loc.getMessage('JS_AVATAR_EDITOR_IMPORT_BUTTON'), onclick: (event, item) => { this.emit('onClickImport'); item.getMenuWindow().close(); } }], { closeByEsc: true, autoHide: true, offsetTop: 0, offsetLeft: 15, angle: true, cacheable: false, targetContainer: event.target.closest('.ui-avatar-editor__mask-block-container'), className: 'popup-window-content-frame-item-menu' }); thisPopup.show(); main_core_events.EventEmitter.subscribeOnce(thisPopup.getPopupWindow().getEventNamespace() + ':onBeforeShow', () => { thisPopup.close(); }); return false; } cleanUp() //delete all my masks { const container = this.getBody().querySelector('[data-bx-role="list-container"][data-bx-id="my-own"]'); const loader = new main_loader.Loader({ target: container, color: 'rgba(82, 92, 105, 0.9)' }); loader.show(); Backend.cleanUp().then(() => { MaskList.getByNode(container).setFinished(); container.querySelectorAll(`[data-bx-role="mask_item"]`).forEach(node => { babelHelpers.classPrivateFieldLooseBase(this, _deleteMaskVisually)[_deleteMaskVisually](MaskItem.getByNode(node)); }); loader.hide(); }); } //TODO delete this string and its using after testing static isAvailable() { return main_core.Loc.getMessage('UI_AVATAR_MASK_IS_AVAILABLE') === true; } static get code() { return 'mask'; } } function _deleteMaskVisually2(maskItem) { /* @var MaskItem target */ this.getBody().querySelectorAll(`[data-bx-role="mask_item"][data-bx-id="${maskItem.getId()}"]`).forEach(node => { // node.style.display = 'none'; main_core.Dom.remove(node); }); const listContainer = this.getBodyContainer().querySelector('[data-bx-role="list-container"][data-bx-id="recently-used"]'); if (listContainer.childNodes.length <= 1) { const semanticContainer = listContainer.closest('[data-bx-role="semantic-container"]'); if (semanticContainer) { semanticContainer.style.display = 'none'; } } if (String(this.activeId) === String(maskItem.getId())) { this.unmask(); } } MaskTab.maxCount = 5; MaskTab.priority = 4; let _$7 = t => t, _t$7; class CanvasTab extends DefaultTab { getHeader() { return main_core.Loc.getMessage('JS_AVATAR_EDITOR_PHOTO'); } getBody() { return this.cache.remember('body', () => { const res = main_core.Tag.render(_t$7 || (_t$7 = _$7` <div class="ui-avatar-editor__content-block" data-bx-role="tab-canvas-body"> <div class="ui-avatar-editor__control" data-bx-role="canvas-zooming"> <div class="ui-avatar-editor__control-controller" data-bx-role="zoom-minus-button"> <span class="ui-avatar-editor__control-minus"></span> </div> <div class="ui-avatar-editor__control-inner" data-bx-role="zoom-scale"> <div class="ui-avatar-editor__control-slide-container ui-avatar-editor__control-slide-drag-state"> <div class="ui-avatar-editor__control-slide" data-bx-role="zoom-knob"></div> </div> </div> <div class="ui-avatar-editor__control-controller" data-bx-role="zoom-plus-button"> <span class="ui-avatar-editor__control-plus"></span> </div> </div> <div class="ui-avatar-editor__camera-block-image"> <div class="ui-avatar-editor__user-loader-item" data-bx-role="canvas-loader"> <div class="ui-avatar-editor__loader"> <svg class="ui-avatar-editor__circular" viewBox="25 25 50 50"> <circle class="ui-avatar-editor__path" cx="50" cy="50" r="20" fill="none" stroke-width="1" stroke-miterlimit="10"></circle> </svg> </div> </div> <div class="ui-avatar-editor__error" data-bx-role="canvas-error"> <span>${0}</span> <span data-bx-role="tab-canvas-error"></span> </div> <div class="ui-avatar-editor__user-avatar-item" data-bx-role="canvas-holder"> <span class="ui-avatar-editor__tab-avatar-image-item"></span> </div> <div data-editor-role="canvas-holder"> <canvas data-bx-canvas="canvas" height="330" width="330"></canvas> </div> </div> <div class="ui-avatar-editor__button-layout"> <div class="ui-avatar-editor__button" data-bx-role="button-add-picture" data-bx-id="upload-file"> <span class="ui-avatar-editor__button-name">${0}</span> </div> <div class="ui-avatar-editor__button" data-bx-role="button-add-picture" data-bx-id="snap-picture"> <span class="ui-avatar-editor__button-name">${0}</span> </div> </div> </div>`), main_core.Loc.getMessage('JS_AVATAR_EDITOR_ERROR'), main_core.Loc.getMessage('JS_AVATAR_EDITOR_UPLOAD'), main_core.Loc.getMessage('JS_AVATAR_EDITOR_SNAP')); return res; }); } static get code() { return 'canvas'; } } CanvasTab.priority = 1; let _$8 = t => t, _t$8; var _justACounter = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("justACounter"); var _queue = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("queue"); var _image = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("image"); var _canvas = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("canvas"); var _context = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("context"); var _reader = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("reader"); var _isReady = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isReady"); var _id$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("id"); var _load = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("load"); var _exec = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("exec"); var _dataURLToBlob = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("dataURLToBlob"); class CanvasLoader { constructor() { Object.defineProperty(this, _exec, { value: _exec2 }); Object.defineProperty(this, _load, { value: _load2 }); Object.defineProperty(this, _justACounter, { writable: true, value: 0 }); Object.defineProperty(this, _queue, { writable: true, value: void 0 }); Object.defineProperty(this, _image, { writable: true, value: void 0 }); Object.defineProperty(this, _canvas, { writable: true, value: void 0 }); Object.defineProperty(this, _context, { writable: true, value: void 0 }); Object.defineProperty(this, _reader, { writable: true, value: void 0 }); Object.defineProperty(this, _isReady, { writable: true, value: true }); Object.defineProperty(this, _id$1, { writable: true, value: void 0 }); babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader] = new FileReader(); babelHelpers.classPrivateFieldLooseBase(this, _queue)[_queue] = new Map(); babelHelpers.classPrivateFieldLooseBase(this, _image)[_image] = new Image(); babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].crossOrigin = 'anonymous'; babelHelpers.classPrivateFieldLooseBase(this, _canvas)[_canvas] = main_core.Tag.render(_t$8 || (_t$8 = _$8`<canvas id="loadercanvas"></canvas>`)); // document.querySelector('#workarea-content').appendChild(this.#canvas); babelHelpers.classPrivateFieldLooseBase(this, _context)[_context] = babelHelpers.classPrivateFieldLooseBase(this, _canvas)[_canvas].getContext('2d'); babelHelpers.classPrivateFieldLooseBase(this, _id$1)[_id$1] = String(new Date().getTime()); } push(file, successCallback, failCallback) { const id = [babelHelpers.classPrivateFieldLooseBase(this, _id$1)[_id$1], babelHelpers.classPrivateFieldLooseBase(this, _justACounter)[_justACounter]++].join('_'); babelHelpers.classPrivateFieldLooseBase(this, _queue)[_queue].set(id, [file, successCallback, failCallback]); babelHelpers.classPrivateFieldLooseBase(this, _exec)[_exec](); } getCanvas() { return babelHelpers.classPrivateFieldLooseBase(this, _canvas)[_canvas]; } getContext() { return babelHelpers.classPrivateFieldLooseBase(this, _context)[_context]; } pack(fileType) { return new Promise((resolve, reject) => { try { if (babelHelpers.classPrivateFieldLooseBase(this, _canvas)[_canvas]['toBlob']) { babelHelpers.classPrivateFieldLooseBase(this, _canvas)[_canvas].toBlob(resolve, fileType); } else { resolve(babelHelpers.classPrivateFieldLooseBase(this.constructor, _dataURLToBlob)[_dataURLToBlob](babelHelpers.classPrivateFieldLooseBase(this, _canvas)[_canvas].toDataURL(fileType))); } } catch (e) { reject(e); } }); } static getInstance() { if (this.instance === null) { this.instance = new this(); } return this.instance; } static loadFile(file, successCallback, failCallback) { if (!window["FileReader"]) { return failCallback(new Error({ message: 'FileReader is not supported.' })); } let newFile = file; if (main_core.Type.isString(file)) { newFile = { src: file, name: file.split('/').pop() }; } this.getInstance().push(newFile, successCallback, failCallback); } static loadCanvas() { this.getInstance().getCanvas(); } } function _load2(itemId) { if (!babelHelpers.classPrivateFieldLooseBase(this, _queue)[_queue].has(itemId) || babelHelpers.classPrivateFieldLooseBase(this, _isReady)[_isReady] !== true) { return; } babelHelpers.classPrivateFieldLooseBase(this, _isReady)[_isReady] = false; const [file, successCallback, failCallback] = babelHelpers.classPrivateFieldLooseBase(this, _queue)[_queue].get(itemId); babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].onload = function () {}; babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].onerror = function () {}; /* Almost all browsers cache images from local resource except of FF on 06.03.2017. It appears that FF collect src and does not abort image uploading when src is changed. And we had a bug when in onload event we got e.target.src of one element but source of image was from '/bitrix/images/1.gif'. */ // TODO check if chrome and other browsers cache local files for now. If it does not then delete next 2 strings try { window["URL"]["revokeObjectURL"](babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].src); } catch (e) {} if (!main_core.Browser.isFirefox()) { babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].src = '/bitrix/images/1.gif'; } const onFinish = () => { babelHelpers.classPrivateFieldLooseBase(this, _queue)[_queue].delete(itemId); babelHelpers.classPrivateFieldLooseBase(this, _isReady)[_isReady] = true; setTimeout(() => { babelHelpers.classPrivateFieldLooseBase(this, _exec)[_exec](); }, 0); }; const onLoad = e => { const image = e && e.target ? e.target : babelHelpers.classPrivateFieldLooseBase(this, _image)[_image]; if (image.src.indexOf('/bitrix/images/1.gif') >= 0) { return; } if (!!successCallback) { onFinish(); successCallback(image); } }; const onError = () => { if (!!failCallback) { try { failCallback(); } catch (e) { main_core.Runtime.debug(e); } } onFinish(); }; babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].name = file.name; babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].onload = onLoad; babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].onerror = onError; if (main_core.Type.isPlainObject(file) && (file['src'] || file['tmp_url'])) { const src = file['src'] || file['tmp_url']; babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].src = encodeURI(src) + (src.indexOf("?") > 0 ? '&' : '?') + 'imageUploader' + babelHelpers.classPrivateFieldLooseBase(this, _id$1)[_id$1] + babelHelpers.classPrivateFieldLooseBase(this, _justACounter)[_justACounter]++; } else { const res = Object.prototype.toString.call(file); if (res !== '[object File]' && res !== '[object Blob]') { onError(); } else if (window["URL"]) { babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].src = window["URL"]["createObjectURL"](file); } else { babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader].onloadend = e => { babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader].onloadend = null; babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader].onerror = null; babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].src = e.target.result; }; babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader].onerror = () => { babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader].onloadend = null; babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader].onerror = null; onError(); }; babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader].readAsDataURL(file); } } } function _exec2() { if (babelHelpers.classPrivateFieldLooseBase(this, _isReady)[_isReady] === true) { const itemId = Array.from(babelHelpers.classPrivateFieldLooseBase(this, _queue)[_queue].keys()).shift(); if (itemId) { babelHelpers.classPrivateFieldLooseBase(this, _load)[_load](itemId); } } } function _dataURLToBlob2(dataURL) { let marker = ';base64,', parts, contentType, raw, rawLength; if (dataURL.indexOf(marker) < 0) { parts = dataURL.split(','); contentType = parts[0].split(':')[1]; raw = parts[1]; return new Blob([raw], { type: contentType }); } parts = dataURL.split(marker); contentType = parts[0].split(':')[1]; raw = window.atob(parts[1]); rawLength = raw.length; const uInt8Array = new Uint8Array(rawLength); for (let i = 0; i < rawLength; ++i) { uInt8Array[i] = raw.charCodeAt(i); } return new Blob([uInt8Array], { type: contentType }); } Object.defineProperty(CanvasLoader, _dataURLToBlob, { value: _dataURLToBlob2 }); CanvasLoader.instance = null; var _isSet = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isSet"); var _canvas$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("canvas"); var _ctx = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("ctx"); var _table = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("table"); var _tableCloth = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("tableCloth"); var _tableFrame = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("tableFrame"); var _stretchToCanvasSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("stretchToCanvasSize"); class CanvasDefault extends main_core_events.EventEmitter { constructor(canvas, options) { super(); Object.defineProperty(this, _isSet, { writable: true, value: false }); Object.defineProperty(this, _canvas$1, { writable: true, value: void 0 }); Object.defineProperty(this, _ctx, { writable: true, value: void 0 }); Object.defineProperty(this, _table, { writable: true, value: void 0 }); Object.defineProperty(this, _tableCloth, { writable: true, value: void 0 }); Object.defineProperty(this, _tableFrame, { writable: true, value: void 0 }); Object.defineProperty(this, _stretchToCanvasSize, { writable: true, value: true }); this.setEventNamespace('Main.Avatar.Editor'); babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1] = canvas; babelHelpers.classPrivateFieldLooseBase(this, _ctx)[_ctx] = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].getContext("2d"); babelHelpers.classPrivateFieldLooseBase(this, _table)[_table] = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].parentNode; if (babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].clientWidth) { babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].clientWidth; babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].clientHeight; } else { babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].width; babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].height; } main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1], { style: { // 'background' : '#fdbd00', } }); main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _table)[_table], { style: { width: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width}px`, height: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height}px`, border: 'none', position: 'relative', overflow: 'visible' }, dataset: { role: 'table', width: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width, height: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height } }); babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth] = main_core.Dom.create('DIV'); main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth], { style: { 'border': 'none', // 'background' : '#ffd7e1', 'position': 'absolute', 'display': 'flex', 'align-items': 'center', 'justify-content': 'center', width: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width}px`, height: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height}px`, left: 0, top: 0 }, dataset: { role: 'tableCloth' } }); babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].appendChild(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1]); babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].appendChild(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth]); babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame] = main_core.Dom.create('DIV'); main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame], { style: { 'box-sizing': 'border-box', // 'border' : '4px dotted grey', 'position': 'absolute', width: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width}px`, height: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height}px` }, dataset: { role: 'tableFrame' } }); babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].appendChild(babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame]); this.mouseMove = this.mouseMove.bind(this); this.stopMoving = this.stopMoving.bind(this); babelHelpers.classPrivateFieldLooseBase(this, _stretchToCanvasSize)[_stretchToCanvasSize] = !(options && options.stretchToCanvasSize === false); this.reset(); } isEmpty() { return !babelHelpers.classPrivateFieldLooseBase(this, _isSet)[_isSet]; } reset() { babelHelpers.classPrivateFieldLooseBase(this, _ctx)[_ctx].clearRect(0, 0, babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].width, babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].height); babelHelpers.classPrivateFieldLooseBase(this, _isSet)[_isSet] = false; main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth], { style: { width: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width}px`, height: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height}px`, left: 0, top: 0 } }); main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1], { style: { transform: 'none', width: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width}px`, height: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height}px` } }); main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame], { style: { width: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width}px`, height: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height}px`, left: 0, top: 0 } }); this.disableToMove(); this.emit('onReset', babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1]); } set(imageNode) { //region set image const image = { width: 0, height: 0, scale: 1, name: imageNode["name"] }; if (imageNode.clientWidth) { image.width = imageNode.clientWidth; image.height = imageNode.clientHeight; } else { image.width = imageNode.width; image.height = imageNode.height; } if (image.width <= 0 || image.height <= 0) { return; } const scaleForImage = Math.ceil(Math.max(image.width > Options.imageSize ? Options.imageSize / image.width : babelHelpers.classPrivateFieldLooseBase(this, _stretchToCanvasSize)[_stretchToCanvasSize] !== false && image.width < babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width ? babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width / image.width : 1, image.height > Options.imageSize ? Options.imageSize / image.height : babelHelpers.classPrivateFieldLooseBase(this, _stretchToCanvasSize)[_stretchToCanvasSize] !== false && image.height < babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height ? babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height / image.height : 1) * 1000) / 1000; image.width = Math.ceil(image.width * scaleForImage); image.height = Math.ceil(image.height * scaleForImage); const k = Math.ceil(Math.max(image.width > 0 ? babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width / image.width : 1, image.height > 0 ? babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height / image.height : 1) * 1000) / 1000; image.scale = 0 < k && k < 1 ? k : 1; main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1], { props: { width: image.width, height: image.height }, style: { width: image.width + 'px', height: image.height + 'px', transform: 'scale(' + image.scale + ', ' + image.scale + ')' }, dataset: { width: image.width, height: image.height, scale: image.scale, initialScale: image.scale, hasChanged: false } }); babelHelpers.classPrivateFieldLooseBase(this, _isSet)[_isSet] = true; babelHelpers.classPrivateFieldLooseBase(this, _ctx)[_ctx].drawImage(imageNode, 0, 0, image.width, image.height); //endregion //region set TableCloth const tableFrame = { width: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width, height: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height }; const tableCloth = { width: 2 * tableFrame.width + Math.ceil(image.scale * image.width), height: 2 * tableFrame.height + Math.ceil(image.scale * image.height), left: -1 * Math.ceil((tableFrame.width + image.scale * image.width) / 2), top: -1 * Math.ceil((tableFrame.height + image.scale * image.height) / 2) }; main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth], { style: { width: `${tableCloth.width}px`, height: `${tableCloth.height}px`, top: `${tableCloth.top}px`, left: `${tableCloth.left}px` }, dataset: { top: tableCloth.top, left: tableCloth.left, topToBeInTheCenter: tableCloth.top, leftToBeInTheCenter: tableCloth.left, height: tableCloth.height, width: tableCloth.width } }); main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame], { style: { top: `${tableCloth.top * -1}px`, left: `${tableCloth.left * -1}px` } }); //endregion this.enableToMove(); this.emit('onSetImage', { canvas: babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1] }); } scale(zoomScale) { zoomScale = Math.max(0.01, 1 + zoomScale); const oldScale = Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.scale); const newScale = zoomScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.initialScale); //region set image main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1], { style: { transform: 'scale(' + newScale + ', ' + newScale + ')' }, dataset: { scale: newScale, hasChanged: true } }); //endregion //region set TableCloth const tableFrame = { height: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height, width: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width }; const tableCloth = { height: 2 * tableFrame.height + Math.ceil(newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.height)), width: 2 * tableFrame.width + Math.ceil(newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.width)), topToBeInTheCenter: -1 * Math.ceil((tableFrame.height + newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.height)) / 2), leftToBeInTheCenter: -1 * Math.ceil((tableFrame.width + newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.width)) / 2), top: null, left: null }; const deltaTopOld = babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.top - babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter; const deltaTop = deltaTopOld / oldScale * newScale; tableCloth.top = Math.ceil(tableCloth.topToBeInTheCenter + deltaTop); tableCloth.top = Math.max(Math.min(tableCloth.top, 0), -1 * (Number(tableCloth.height) - tableFrame.height)); const deltaLeftOld = babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.left - babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter; const deltaLeft = deltaLeftOld / oldScale * newScale; tableCloth.left = Math.ceil(deltaLeft + tableCloth.leftToBeInTheCenter); tableCloth.left = Math.max(Math.min(tableCloth.left, 0), -1 * (Number(tableCloth.width) - tableFrame.width)); main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth], { style: { width: `${tableCloth.width}px`, height: `${tableCloth.height}px`, top: `${tableCloth.top}px`, left: `${tableCloth.left}px` }, dataset: { top: tableCloth.top, left: tableCloth.left, topToBeInTheCenter: tableCloth.topToBeInTheCenter, leftToBeInTheCenter: tableCloth.leftToBeInTheCenter, height: tableCloth.height, width: tableCloth.width } }); //endregion //region set Table sights main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame], { style: { top: `${tableCloth.top * -1}px`, left: `${tableCloth.left * -1}px` } }); //endregion this.emit('onScale', { zoomScale, scale: newScale, topOffsetFromTheCenter: Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.top) - Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter), leftOffsetFromTheCenter: Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.left) - Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter), topInPercent: Math.ceil(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.top * 1000 / Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter)) / 1000, leftInPercent: Math.ceil(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.left * 1000 / Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter)) / 1000, oldScale }); } onScale({ data: { oldScale, scale, topOffsetFromTheCenter, leftOffsetFromTheCenter, topInPercent, leftInPercent } }) { const deltaScale = scale / oldScale; let top, left, newScale; if (Number(oldScale) === Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.scale)) { newScale = scale; } else { newScale = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.scale * deltaScale; } //region set image main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1], { style: { transform: 'scale(' + newScale + ', ' + newScale + ')' }, dataset: { scale: newScale, hasChanged: true } }); //endregion //region set TableCloth const tableFrame = { height: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height, width: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width }; const tableCloth = { height: 2 * tableFrame.height + Math.ceil(newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.height)), width: 2 * tableFrame.width + Math.ceil(newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.width)), topToBeInTheCenter: -1 * Math.ceil((tableFrame.height + newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.height)) / 2), leftToBeInTheCenter: -1 * Math.ceil((tableFrame.width + newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.width)) / 2), top: null, left: null }; if (Number(scale) === Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.scale)) { top = Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter) + topOffsetFromTheCenter; left = Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter) + leftOffsetFromTheCenter; } else { top = Math.ceil(Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter) * topInPercent); left = Math.ceil(Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter) * leftInPercent); } tableCloth.top = Math.max(Math.min(top, 0), -1 * (Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.height) - babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height)); tableCloth.left = Math.max(Math.min(left, 0), -1 * (Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.width) - babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width)); main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth], { style: { width: `${tableCloth.width}px`, height: `${tableCloth.height}px`, top: `${tableCloth.top}px`, left: `${tableCloth.left}px` }, dataset: { top: tableCloth.top, left: tableCloth.left, topToBeInTheCenter: tableCloth.topToBeInTheCenter, leftToBeInTheCenter: tableCloth.leftToBeInTheCenter, height: tableCloth.height, width: tableCloth.width } }); //endregion //region set Table sights main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame], { style: { top: `${tableCloth.top * -1}px`, left: `${tableCloth.left * -1}px` } }); //endregion } enableToMove() { if (babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].style.cursor === 'move') { return; } babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].style.cursor = 'move'; main_core.Event.bind(babelHelpers.classPrivateFieldLooseBase(this, _table)[_table], 'mousedown', e => { this.cursor = { startX: e.pageX, startY: e.pageY }; main_core.Event.bind(document, 'mousemove', this.mouseMove); main_core.Event.bind(document, 'mouseup', this.stopMoving); }); } disableToMove() { babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].style.cursor = 'default'; main_core.Event.unbindAll(babelHelpers.classPrivateFieldLooseBase(this, _table)[_table]); main_core.Event.unbind(document, 'mousemove', this.mouseMove); main_core.Event.unbind(document, 'mouseup', this.stopMoving); } move(deltaX, deltaY) { //region set image main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1], { dataset: { hasChanged: true } }); //endregion //region set TableCloth const tableFrame = { height: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height, width: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width }; const left = Math.max(Math.min(Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.left) - deltaX, 0), -1 * (Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.width) - tableFrame.width)); const top = Math.max(Math.min(Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.top) - deltaY, 0), -1 * (Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.height) - tableFrame.height)); main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth], { style: { top: `${top}px`, left: `${left}px` }, dataset: { top: top, left: left } }); this.emit('onMove', { topOffsetFromTheCenter: top - Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter), leftOffsetFromTheCenter: left - Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter), scale: babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.scale, topInPercent: Math.ceil(top * 1000 / Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter)) / 1000, leftInPercent: Math.ceil(left * 1000 / Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter)) / 1000 }); //region set Table sights main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame], { style: { top: `${top * -1}px`, left: `${left * -1}px` } }); //endregion } onMove({ data: { scale, topOffsetFromTheCenter, leftOffsetFromTheCenter, topInPercent, leftInPercent } }) { let top, left; if (Number(scale) === Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.scale)) { top = Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter) + topOffsetFromTheCenter; left = Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter) + leftOffsetFromTheCenter; } else { top = Math.ceil(Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter) * topInPercent); left = Math.ceil(Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter) * leftInPercent); } left = Math.max(Math.min(left, 0), -1 * (Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.width) - babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width)); top = Math.max(Math.min(top, 0), -1 * (Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.height) - babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height)); main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth], { style: { top: `${top}px`, left: `${left}px` }, dataset: { top: top, left: left } }); } mouseMove(e) { if (this.cursor === null) { return; } this.move(this.cursor.startX - e.pageX, this.cursor.startY - e.pageY); this.cursor.startX = e.pageX; this.cursor.startY = e.pageY; } stopMoving() { BX.unbind(document, "mousemove", this.mouseMove); BX.unbind(document, "mouseup", this.stopMoving); } getCanvas() { return babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1]; } getContext() { return babelHelpers.classPrivateFieldLooseBase(this, _ctx)[_ctx]; } getTable() { return babelHelpers.classPrivateFieldLooseBase(this, _table)[_table]; } getTableCloth() { return babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth]; } packBlob() { if (babelHelpers.classPrivateFieldLooseBase(this, _isSet)[_isSet] !== true) { return Promise.reject({ message: 'Source canvas does not exist.', code: 'empty data' }); } return new Promise((resolve, reject) => { //region set TableCloth const tableFrame = { height: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height, width: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width }; const scale = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.scale; const size = Math.min(Options.imageSize, Math.max(babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width / scale, babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width)); const scaleToResult = size / babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width; const loader = CanvasLoader.getInstance(); loader.getCanvas().height = size; loader.getCanvas().width = size; loader.getContext().clearRect(0, 0, size, size); //region getY let imageY, imageY1, imageY2; let canvasY1, canvasY2; imageY = -1 * (babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter - babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.top) + tableFrame.height / 2 - babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].height * scale / 2; if (imageY > 0) { canvasY1 = imageY; imageY1 = 0; } else { canvasY1 = 0; imageY1 = -1 * imageY; } imageY2 = imageY + babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].height * scale; if (imageY2 > tableFrame.height) { canvasY2 = tableFrame.height; imageY2 = tableFrame.height - imageY; } else { canvasY2 = imageY2; imageY2 = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].height * scale; } //endregion //region getX let imageX, imageX1, imageX2; let canvasX1, canvasX2; imageX = -1 * (babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter - babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.left) + tableFrame.width / 2 - babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].width * scale / 2; if (imageX > 0) { canvasX1 = imageX; imageX1 = 0; } else { canvasX1 = 0; imageX1 = -1 * imageX; } imageX2 = imageX + babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].width * scale; if (imageX2 > tableFrame.width) { canvasX2 = tableFrame.width; imageX2 = tableFrame.width - imageX; } else { canvasX2 = imageX2; imageX2 = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].width * scale; } //endregion imageX1 /= scale; imageX2 /= scale; imageY1 /= scale; imageY2 /= scale; canvasX1 *= scaleToResult; canvasY1 *= scaleToResult; canvasX2 *= scaleToResult; canvasY2 *= scaleToResult; loader.getContext().drawImage(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1], imageX1, imageY1, imageX2 - imageX1, imageY2 - imageY1, canvasX1, canvasY1, canvasX2 - canvasX1, canvasY2 - canvasY1); const changed = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.changed; loader.pack().then(blob => { blob.changed = changed; blob.width = size; blob.height = size; resolve(blob); }).catch(error => { reject(error); }); }); } } CanvasDefault.imageSize = { width: 1024, height: 1024 }; var _fileName = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("fileName"); var _applyNameAndExtensionToBlob = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("applyNameAndExtensionToBlob"); class CanvasMaster extends CanvasDefault { constructor(...args) { super(...args); Object.defineProperty(this, _applyNameAndExtensionToBlob, { value: _applyNameAndExtensionToBlob2 }); Object.defineProperty(this, _fileName, { writable: true, value: void 0 }); } load(file) { this.emit('onLoad'); babelHelpers.classPrivateFieldLooseBase(this, _fileName)[_fileName] = null; return new Promise((resolve, reject) => { this.reset(); CanvasLoader.loadFile(file, imageNode => { babelHelpers.classPrivateFieldLooseBase(this, _fileName)[_fileName] = imageNode.name; this.set(imageNode); resolve(); }, () => { this.emit('onError', main_core.Loc.getMessage('JS_AVATAR_EDITOR_ERROR_IMAGE_DEPLOYING')); reject(); }); }); } getBlob() { return new Promise((resolve, reject) => { this.packBlob().then(blob => { babelHelpers.classPrivateFieldLooseBase(this, _applyNameAndExtensionToBlob)[_applyNameAndExtensionToBlob](blob); resolve({ blob }); }).catch(reject); }); } } function _applyNameAndExtensionToBlob2(result) { result.name = babelHelpers.classPrivateFieldLooseBase(this, _fileName)[_fileName] || 'image'; let ext = result.name.split('.').pop().toLowerCase(); ext = ext === result.name ? '' : ext; if (result.type === 'image/png' && ext !== 'png') { if ('jpg,bmp,jpeg,jpe,gif,png,webp'.lastIndexOf(ext) > 0) { result.name = result.name.substr(0, result.name.lastIndexOf('.')); } result.name = [result.name || 'image', 'png'].join('.'); } return result; } class CanvasPreview extends CanvasDefault {} var _stepSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("stepSize"); var _value = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("value"); var _defaultValue = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("defaultValue"); var _containerWidth = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("containerWidth"); var _minValue = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("minValue"); var _maxValue = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("maxValue"); var _scale = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("scale"); var _knob = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("knob"); var _getContainerWidth = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getContainerWidth"); var _makeAStep = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("makeAStep"); var _adjust = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("adjust"); class CanvasZooming extends main_core_events.EventEmitter { constructor({ knob, scale, minus, plus }, defaultValue) { super(); Object.defineProperty(this, _adjust, { value: _adjust2 }); Object.defineProperty(this, _makeAStep, { value: _makeAStep2 }); Object.defineProperty(this, _getContainerWidth, { value: _getContainerWidth2 }); Object.defineProperty(this, _stepSize, { writable: true, value: 0.01 }); Object.defineProperty(this, _value, { writable: true, value: 0 }); Object.defineProperty(this, _defaultValue, { writable: true, value: 0 }); Object.defineProperty(this, _containerWidth, { writable: true, value: 0 }); Object.defineProperty(this, _minValue, { writable: true, value: -1 }); Object.defineProperty(this, _maxValue, { writable: true, value: 1 }); Object.defineProperty(this, _scale, { writable: true, value: void 0 }); Object.defineProperty(this, _knob, { writable: true, value: void 0 }); this.setEventNamespace('Main.Avatar.Editor'); main_core.Event.bind(minus, 'click', () => { babelHelpers.classPrivateFieldLooseBase(this, _makeAStep)[_makeAStep](false); }); main_core.Event.bind(plus, 'click', () => { babelHelpers.classPrivateFieldLooseBase(this, _makeAStep)[_makeAStep](true); }); this.stopMoving = this.stopMoving.bind(this); this.move = this.move.bind(this); main_core.Event.bind(knob, 'mousedown', event => { this.startMoving(event); }); if (defaultValue) { this.setDefaultValue(defaultValue); } babelHelpers.classPrivateFieldLooseBase(this, _scale)[_scale] = scale; babelHelpers.classPrivateFieldLooseBase(this, _knob)[_knob] = knob; this.reset(); } setDefaultValue(defaultValue) { babelHelpers.classPrivateFieldLooseBase(this, _defaultValue)[_defaultValue] = defaultValue > babelHelpers.classPrivateFieldLooseBase(this, _minValue)[_minValue] && defaultValue <= babelHelpers.classPrivateFieldLooseBase(this, _maxValue)[_maxValue] ? defaultValue : 0; return this; } getValue() { return babelHelpers.classPrivateFieldLooseBase(this, _value)[_value]; } reset() { babelHelpers.classPrivateFieldLooseBase(this, _value)[_value] = babelHelpers.classPrivateFieldLooseBase(this, _defaultValue)[_defaultValue]; babelHelpers.classPrivateFieldLooseBase(this, _adjust)[_adjust](); } setValue(value) { // eslint-disable-next-line no-param-reassign value = Math.ceil(value * 1000) / 1000; if (value !== babelHelpers.classPrivateFieldLooseBase(this, _value)[_value] && value >= babelHelpers.classPrivateFieldLooseBase(this, _minValue)[_minValue] && value <= babelHelpers.classPrivateFieldLooseBase(this, _maxValue)[_maxValue]) { babelHelpers.classPrivateFieldLooseBase(this, _value)[_value] = value; babelHelpers.classPrivateFieldLooseBase(this, _adjust)[_adjust](); this.emit('onChange', babelHelpers.classPrivateFieldLooseBase(this, _value)[_value] - babelHelpers.classPrivateFieldLooseBase(this, _defaultValue)[_defaultValue]); } } move({ pageX }) { if (pageX > 0 && babelHelpers.classPrivateFieldLooseBase(this, _getContainerWidth)[_getContainerWidth]() > 0) { const percent = (pageX - babelHelpers.classPrivateFieldLooseBase(this, _knob)[_knob].startPageX) / babelHelpers.classPrivateFieldLooseBase(this, _getContainerWidth)[_getContainerWidth](); babelHelpers.classPrivateFieldLooseBase(this, _knob)[_knob].startPageX = pageX; this.setValue(this.getValue() + percent); } } startMoving({ pageX }) { babelHelpers.classPrivateFieldLooseBase(this, _knob)[_knob].startPageX = pageX; main_core.Event.bind(document, 'mousemove', this.move); main_core.Event.bind(document, 'mouseup', this.stopMoving); } stopMoving() { main_core.Event.unbind(document, 'mousemove', this.move); main_core.Event.unbind(document, 'mouseup', this.stopMoving); } } function _getContainerWidth2() { if (babelHelpers.classPrivateFieldLooseBase(this, _containerWidth)[_containerWidth] > 0) { return babelHelpers.classPrivateFieldLooseBase(this, _containerWidth)[_containerWidth]; } const containerPos = main_core.Dom.getPosition(babelHelpers.classPrivateFieldLooseBase(this, _scale)[_scale]); const width = containerPos.width - main_core.Dom.getPosition(babelHelpers.classPrivateFieldLooseBase(this, _knob)[_knob]).width; if (width > 0) { babelHelpers.classPrivateFieldLooseBase(this, _containerWidth)[_containerWidth] = width; return babelHelpers.classPrivateFieldLooseBase(this, _containerWidth)[_containerWidth]; } return 0; } function _makeAStep2(increase) { const value = Math.min(Math.max(this.getValue() + (increase === false ? -1 : 1) * babelHelpers.classPrivateFieldLooseBase(this, _stepSize)[_stepSize], 0), 1); this.setValue(value); } function _adjust2() { const middle = babelHelpers.classPrivateFieldLooseBase(this, _getContainerWidth)[_getContainerWidth]() / (babelHelpers.classPrivateFieldLooseBase(this, _maxValue)[_maxValue] - babelHelpers.classPrivateFieldLooseBase(this, _minValue)[_minValue]); const value = middle + middle * this.getValue(); main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _knob)[_knob], { style: { left: [Math.ceil(value), 'px'].join('') } }); } var _canvas$2 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("canvas"); var _ctx$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("ctx"); var _container$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("container"); var _activeMask = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("activeMask"); class CanvasMask extends main_core_events.EventEmitter { constructor(container) { super(); Object.defineProperty(this, _canvas$2, { writable: true, value: void 0 }); Object.defineProperty(this, _ctx$1, { writable: true, value: void 0 }); Object.defineProperty(this, _container$1, { writable: true, value: void 0 }); Object.defineProperty(this, _activeMask, { writable: true, value: null }); this.setEventNamespace('Main.Avatar.Editor'); babelHelpers.classPrivateFieldLooseBase(this, _container$1)[_container$1] = container; this.set = this.set.bind(this); this.mask = this.mask.bind(this); this.unmask = this.unmask.bind(this); } mask({ id, src, thumb }) { main_core.Dom.style(babelHelpers.classPrivateFieldLooseBase(this, _container$1)[_container$1], 'background-image', 'url("' + main_core.Text.encode(thumb) + '")'); babelHelpers.classPrivateFieldLooseBase(this, _activeMask)[_activeMask] = { id, src }; CanvasLoader.loadFile(src, this.set, this.unmask); } set(imageSource) { //region set image const trueK = Math.max(imageSource.width > 0 ? Options.maskSize / imageSource.width : 1, imageSource.height > 0 ? Options.maskSize / imageSource.height : 1); const sourceS = parseInt(Options.maskSize / trueK); const sourceX = parseInt((imageSource.width - sourceS) / 2); const sourceY = parseInt((imageSource.height - sourceS) / 2); this.getCanvas().width = Options.maskSize; this.getCanvas().height = Options.maskSize; this.getContext().clearRect(0, 0, Options.maskSize, Options.maskSize); this.getContext().drawImage(imageSource, sourceX, sourceY, sourceS, sourceS, 0, 0, Options.maskSize, Options.maskSize); //endregion } applyAndPack(imageSource) { if (babelHelpers.classPrivateFieldLooseBase(this, _activeMask)[_activeMask] === null || imageSource.width < 100 || imageSource.height < 100) { return Promise.reject({ message: 'Image for masking has not appropriate format', code: 'bad image' }); } return new Promise(resolve => { const trueK = Math.max(imageSource.width > 0 ? Options.maskSize / imageSource.width : 1, imageSource.height > 0 ? Options.maskSize / imageSource.height : 1); const sourceS = parseInt(Options.maskSize / trueK); const sourceX = parseInt((imageSource.width - sourceS) / 2); const sourceY = parseInt((imageSource.height - sourceS) / 2); const loader = CanvasLoader.getInstance(); loader.getCanvas().width = Options.maskSize; loader.getCanvas().height = Options.maskSize; loader.getContext().clearRect(0, 0, Options.maskSize, Options.maskSize); loader.getContext().drawImage(imageSource, sourceX, sourceY, sourceS, sourceS, 0, 0, Options.maskSize, Options.maskSize); loader.getContext().drawImage(this.getCanvas(), 0, 0, Options.maskSize, Options.maskSize); loader.pack('image/png').then(blob => { blob.name = 'mask.png'; blob.maskId = babelHelpers.classPrivateFieldLooseBase(this, _activeMask)[_activeMask].id; resolve(blob, babelHelpers.classPrivateFieldLooseBase(this, _activeMask)[_activeMask].id); }); }); } getCanvas() { if (!babelHelpers.classPrivateFieldLooseBase(this, _canvas$2)[_canvas$2]) { babelHelpers.classPrivateFieldLooseBase(this, _canvas$2)[_canvas$2] = document.createElement('CANVAS'); } return babelHelpers.classPrivateFieldLooseBase(this, _canvas$2)[_canvas$2]; } getContext() { if (!babelHelpers.classPrivateFieldLooseBase(this, _ctx$1)[_ctx$1]) { babelHelpers.classPrivateFieldLooseBase(this, _ctx$1)[_ctx$1] = this.getCanvas().getContext("2d"); } return babelHelpers.classPrivateFieldLooseBase(this, _ctx$1)[_ctx$1]; } unmask() { babelHelpers.classPrivateFieldLooseBase(this, _container$1)[_container$1].style.backgroundImage = ''; babelHelpers.classPrivateFieldLooseBase(this, _activeMask)[_activeMask] = null; } } let _$9 = t => t, _t$9; const hiddenCanvas = Symbol('hiddenCanvas'); var _id$2 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("id"); var _activeTabId = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("activeTabId"); var _previousActiveTabId = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("previousActiveTabId"); var _tabs = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("tabs"); var _canvasMaster = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("canvasMaster"); var _canvasPreview = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("canvasPreview"); var _canvasZooming = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("canvasZooming"); var _canvasMask = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("canvasMask"); var _setActiveTabByDefault = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setActiveTabByDefault"); var _setPreviousActiveTab = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setPreviousActiveTab"); var _selectFile = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("selectFile"); var _snapAPicture = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("snapAPicture"); class Editor extends main_core_events.EventEmitter { constructor(options) { super(); Object.defineProperty(this, _snapAPicture, { value: _snapAPicture2 }); Object.defineProperty(this, _selectFile, { value: _selectFile2 }); Object.defineProperty(this, _setPreviousActiveTab, { value: _setPreviousActiveTab2 }); Object.defineProperty(this, _setActiveTabByDefault, { value: _setActiveTabByDefault2 }); Object.defineProperty(this, _id$2, { writable: true, value: 0 }); Object.defineProperty(this, _activeTabId, { writable: true, value: void 0 }); Object.defineProperty(this, _previousActiveTabId, { writable: true, value: void 0 }); Object.defineProperty(this, _tabs, { writable: true, value: new Map() }); this.cache = new main_core.Cache.MemoryCache(); Object.defineProperty(this, _canvasMaster, { writable: true, value: void 0 }); Object.defineProperty(this, _canvasPreview, { writable: true, value: void 0 }); Object.defineProperty(this, _canvasZooming, { writable: true, value: void 0 }); Object.defineProperty(this, _canvasMask, { writable: true, value: void 0 }); this.setEventNamespace('Main.Avatar.Editor'); babelHelpers.classPrivateFieldLooseBase(this, _id$2)[_id$2] = Editor.justANumber++; options = main_core.Type.isPlainObject(options) ? options : {}; const tabsWithThePictureInside = [[CanvasTab, true], [MaskTab, options.enableMask, null]]; tabsWithThePictureInside.forEach(([tabClass, enabled, initialOptions]) => { if (enabled === true && tabClass.isAvailable() !== false) { const tab = new tabClass(initialOptions); babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].set(tabClass.code, tab); tab.subscribe('onSetMask', ({ data }) => { this.getContainer().setAttribute('data-badge-is-set', 'Y'); babelHelpers.classPrivateFieldLooseBase(this, _canvasMask)[_canvasMask].mask(data); }); tab.subscribe('onUnsetMask', () => { this.getContainer().removeAttribute('data-badge-is-set'); babelHelpers.classPrivateFieldLooseBase(this, _canvasMask)[_canvasMask].unmask(); }); } }); const tabsWithConnectionsToThePicture = [[UploadTab, options.enableUpload, options.uploadTabOptions], [CameraTab, options.enableCamera, null]]; tabsWithConnectionsToThePicture.forEach(([tabClass, enabled, initialOptions]) => { if (enabled !== false && tabClass.isAvailable() !== false) { const tab = new tabClass(initialOptions); babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].set(tabClass.code, tab); tab.setParentTab(babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(CanvasTab.code)); tab.subscribe('onClickBack', () => { this.setActiveTab(CanvasTab.code); }); tab.subscribe('onSetFile', ({ data }) => { if (data instanceof Blob) { babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].load(data); } else { babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].set(data); } this.setActiveTab(CanvasTab.code); }); if (tab instanceof CameraTab) { this.subscribe('onOpen', () => { if (babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] === CameraTab.code) { tab.activate.call(tab); } }); this.subscribe('onClose', () => { if (babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] === CameraTab.code) { tab.inactivate.call(tab); } }); } } }); let theFutureActiveTab = babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId]; babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].forEach((tab, tabId) => { if (!theFutureActiveTab || babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(theFutureActiveTab).getPriority() < tab.getPriority()) { theFutureActiveTab = tabId; } }); babelHelpers.classPrivateFieldLooseBase(this, _setActiveTabByDefault)[_setActiveTabByDefault](theFutureActiveTab); main_core_events.EventEmitter.subscribe(this.getEventNamespace() + ':' + 'onEditMask', baseEvent => { //TODO describe that true mask has changed and this view is not actual. }); main_core_events.EventEmitter.subscribe(this.getEventNamespace() + ':' + 'onDeleteMask', baseEvent => { //TODO describe that true mask has changed and this view is not actual. }); this.init(); } init() { if (!this.getContainer().querySelector('canvas[data-bx-canvas="canvas"]')) { return setTimeout(this.init.bind(this), 1); } const tabsWithConnectionsToThePicture = [UploadTab, CameraTab]; tabsWithConnectionsToThePicture.forEach(tabClass => { this.getContainer().setAttribute('data-bx-' + tabClass.code + '-tab-available', babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].has(tabClass.code) ? 'Y' : 'N'); }); babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster] = new CanvasMaster(this.getContainer().querySelector('canvas[data-bx-canvas="canvas"]')); babelHelpers.classPrivateFieldLooseBase(this, _canvasPreview)[_canvasPreview] = new CanvasPreview(this.getContainer().querySelector('canvas[data-bx-canvas="preview"]')); babelHelpers.classPrivateFieldLooseBase(this, _canvasZooming)[_canvasZooming] = new CanvasZooming({ knob: this.getContainer().querySelector('[data-bx-role="zoom-knob"]'), scale: this.getContainer().querySelector('[data-bx-role="zoom-scale"]'), plus: this.getContainer().querySelector('[data-bx-role="zoom-plus-button"]'), minus: this.getContainer().querySelector('[data-bx-role="zoom-minus-button"]') }); babelHelpers.classPrivateFieldLooseBase(this, _canvasMask)[_canvasMask] = babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].has(MaskTab.code) ? new CanvasMask(this.getContainer().querySelector('[data-bx-role="canvas-mask"]')) : false; this.getContainer().querySelector('[data-bx-role="unset-canvas-mask"]').addEventListener('click', () => { this.getContainer().removeAttribute('data-badge-is-set'); babelHelpers.classPrivateFieldLooseBase(this, _canvasMask)[_canvasMask].unmask(); babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(MaskTab.code).unmask(); }); babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].subscribe('onLoad', event => { this.getContainer().setAttribute('data-bx-canvas-load-status', 'loading'); this.emit('onChange'); }); babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].subscribe('onReset', event => { this.getContainer().setAttribute('data-bx-canvas-load-status', 'isnotset'); babelHelpers.classPrivateFieldLooseBase(this, _canvasZooming)[_canvasZooming].reset(); babelHelpers.classPrivateFieldLooseBase(this, _canvasPreview)[_canvasPreview].reset(); this.emit('onChange'); }); this.getContainer().setAttribute('data-bx-canvas-load-status', 'isnotset'); babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].subscribe('onSetImage', ({ data: { canvas } }) => { this.getContainer().setAttribute('data-bx-canvas-load-status', 'set'); babelHelpers.classPrivateFieldLooseBase(this, _canvasZooming)[_canvasZooming].reset(); babelHelpers.classPrivateFieldLooseBase(this, _canvasPreview)[_canvasPreview].set(canvas); this.emit('onSet'); this.emit('onChange'); }); babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].subscribe('onMove', event => { babelHelpers.classPrivateFieldLooseBase(this, _canvasPreview)[_canvasPreview].onMove(event); this.emit('onChange'); }); babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].subscribe('onScale', event => { babelHelpers.classPrivateFieldLooseBase(this, _canvasPreview)[_canvasPreview].onScale(event); this.emit('onChange'); }); babelHelpers.classPrivateFieldLooseBase(this, _canvasZooming)[_canvasZooming].subscribe('onChange', ({ data }) => { babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].scale(data); }); babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].subscribe('onError', ({ data }) => { this.getContainer().setAttribute('data-bx-canvas-load-status', 'errored'); babelHelpers.classPrivateFieldLooseBase(this, _canvasZooming)[_canvasZooming].reset(); babelHelpers.classPrivateFieldLooseBase(this, _canvasPreview)[_canvasPreview].reset(); this.getContainer().querySelector('[data-bx-role="tab-canvas-error"]').innerHTML = data; }); this.emit('onReady'); } ready(callback) { if (babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster]) { callback.call(); } else { this.subscribe('onReady', callback); } return this; } getId() { return babelHelpers.classPrivateFieldLooseBase(this, _id$2)[_id$2]; } getContainer() { return this.cache.remember('container', () => { const res = main_core.Tag.render(_t$9 || (_t$9 = _$9` <div class="ui-avatar-editor__tab-wrapper ui-avatar-editor--scope"> <input type="hidden" data-bx-active-tab="doesNotMatterForNowItIsAFile"> <div class="ui-avatar-editor__tab-button-container" data-bx-role="headers" style="display:none;"></div> <div class="ui-avatar-editor__tab-container"> <div data-bx-role="bodies"></div> <div class="ui-avatar-editor__tab-avatar-block"> <div class="ui-avatar-editor__tab-avatar-inner"> <div class="ui-avatar-editor__arrow-icon-container"> <span class="ui-avatar-editor__arrow-icon"></span> </div> <div class="ui-avatar-editor__tab-avatar-image-container"> <div data-bx-role="unset-canvas-mask" class="ui-avatar-editor__tab-avatar-image-not-allowed"></div> <span class="ui-avatar-editor__tab-avatar-image-item" data-bx-role="canvas-button"> <div data-editor-role="preview-holder"> <canvas data-bx-canvas="preview" height="165" width="165"></canvas> </div> <div class="ui-avatar-editor__tab-avatar-mask" data-bx-role="canvas-mask"></div> </span> </div> <div class="ui-avatar-editor__tab-avatar-desc-container"> <span class="ui-avatar-editor__tab-avatar-desc-item"></span> </div> </div> </div> </div> </div>`)); const headers = res.querySelector('[data-bx-role="headers"]'); const bodies = res.querySelector('[data-bx-role="bodies"]'); Array.from(babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].entries()).forEach(([itemId, itemTab]) => { main_core.Event.bind(itemTab.getHeaderContainer(), 'click', () => { this.setActiveTab(itemId); }); main_core.Dom.append(itemTab.getHeaderContainer(), headers); main_core.Dom.append(itemTab.getBodyContainer(), bodies); }); if (headers.querySelectorAll('[data-bx-state="visible"]').length > 1) { headers.style.display = "block"; } [[UploadTab.code, res.querySelector('[data-bx-role="button-add-picture"][data-bx-id="upload-file"]'), () => { babelHelpers.classPrivateFieldLooseBase(this, _selectFile)[_selectFile](); }], [CameraTab.code, res.querySelector('[data-bx-role="button-add-picture"][data-bx-id="snap-picture"]'), () => { babelHelpers.classPrivateFieldLooseBase(this, _snapAPicture)[_snapAPicture](); }]].forEach(([tabName, buttonNode, callback]) => { if (babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].has(tabName)) { main_core.Event.bind(buttonNode, 'click', callback); } else { main_core.Dom.remove(buttonNode); } }); return res; }); } setActiveTab(activeTab, isIt = false) { if (!babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].has(activeTab)) { return null; } const activeTabChangesCounter = this.cache.get('activeTabChangesCounter') || 0; if (babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] !== activeTab) { if (babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] === null) { babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] = activeTab; } else if (babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].has(babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId])) { babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId]).inactivate(); } if (babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] === UploadTab.code || babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] === CameraTab.code) { babelHelpers.classPrivateFieldLooseBase(this, _previousActiveTabId)[_previousActiveTabId] = babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId]; } babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] = activeTab; babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId]).activate(); } this.cache.set('activeTabChangesCounter', activeTabChangesCounter + 1); return babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId]); } getTab(tabName) { return babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(tabName); } loadJSON(data) { return this.loadData(JSON.parse(data)); } loadData(data) { return new Promise((resolve, reject) => { if (main_core.Type.isPlainObject(data) && data['src']) { babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].load(data['src']).then(() => { if (data['maskId'] && babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].has(MaskTab.code)) { babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(MaskTab.code).maskById(data['maskId']); babelHelpers.classPrivateFieldLooseBase(this, _setActiveTabByDefault)[_setActiveTabByDefault](MaskTab.code); } else { babelHelpers.classPrivateFieldLooseBase(this, _setActiveTabByDefault)[_setActiveTabByDefault](CanvasTab.code); } resolve(data['src'], this); }).catch(reject); } else { babelHelpers.classPrivateFieldLooseBase(this, _setActiveTabByDefault)[_setActiveTabByDefault](UploadTab.code); resolve(null, this); } }); } loadSrc(src) { return new Promise((resolve, reject) => { babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].load(src).then(() => { this.setActiveTab(babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].has(MaskTab.code) ? MaskTab.code : CanvasTab.code); resolve(src, this); }).catch(() => { babelHelpers.classPrivateFieldLooseBase(this, _setPreviousActiveTab)[_setPreviousActiveTab](); reject(src, this); }); }); } reset() { babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].reset(); babelHelpers.classPrivateFieldLooseBase(this, _setPreviousActiveTab)[_setPreviousActiveTab](); return this; } packBlobAndMask() { return new Promise((resolve, reject) => { babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].getBlob().then(({ blob }) => { var _loader$hiddenCanvas; const loader = CanvasLoader.getInstance(); loader[hiddenCanvas] = (_loader$hiddenCanvas = loader[hiddenCanvas]) != null ? _loader$hiddenCanvas : document.createElement('canvas'); const canvas = loader[hiddenCanvas]; canvas.width = blob.width; canvas.height = blob.height; canvas.getContext('2d').drawImage(loader.getCanvas(), 0, 0); if (!babelHelpers.classPrivateFieldLooseBase(this, _canvasMask)[_canvasMask]) { return resolve({ blob, canvas }); } babelHelpers.classPrivateFieldLooseBase(this, _canvasMask)[_canvasMask].applyAndPack(canvas).then((maskedBlob, maskId) => { resolve({ blob, maskedBlob, maskId, canvas }); }).catch(() => { resolve({ blob, canvas }); }); }).catch(error => { return reject(error); }); }); } packBlob() { return new Promise((resolve, reject) => { babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].getBlob().then(resolve).catch(reject); }); } isEmpty() { return babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].isEmpty(); } isModified() { return babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].imageFrame.changed; } getCanvasEditor() { return babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster]; } getCanvasZooming() { return babelHelpers.classPrivateFieldLooseBase(this, _canvasZooming)[_canvasZooming]; } destroy() {} static createInstance(id, options) { if (this.repo.has(id)) { this.repo.get(id).destroy(); } const editor = new this(options); if (document.querySelector('#' + id)) { editor.ready(() => { editor.loadJSON(document.querySelector('#' + id).getAttribute('data-bx-ui-avatar-editor-info')); }); } if (main_core.Type.isStringFilled(id)) { this.repo.set(id, editor); } return editor; } static getInstanceById(id) { if (this.repo.has(id)) { return this.repo.get(id); } return null; } static getOrCreateInstanceById(id, options) { return this.getInstanceById(id) || this.createInstance(...arguments); } } function _setActiveTabByDefault2(activeTab) { if (this.cache.get('activeTabChangesCounter') > 0) { return; } this.setActiveTab(activeTab); this.cache.delete('activeTabChangesCounter'); } function _setPreviousActiveTab2() { this.setActiveTab(babelHelpers.classPrivateFieldLooseBase(this, _previousActiveTabId)[_previousActiveTabId]); } function _selectFile2() { // this.#canvasMaster.reset(); this.setActiveTab(UploadTab.code); return this; } function _snapAPicture2() { // this.#canvasMaster.reset(); this.setActiveTab(CameraTab.code); return this; } Editor.justANumber = 0; Editor.repo = new Map(); var _getPopup = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getPopup"); class EditorInPopup extends Editor { constructor(...args) { super(...args); Object.defineProperty(this, _getPopup, { value: _getPopup2 }); } hide() { babelHelpers.classPrivateFieldLooseBase(this, _getPopup)[_getPopup]().close(); } show(tabCode) { this.ready(() => { babelHelpers.classPrivateFieldLooseBase(this, _getPopup)[_getPopup]().show(); if (main_core.Type.isStringFilled(tabCode)) { this.setActiveTab(tabCode); } }); } showFile(url) { this.ready(() => { babelHelpers.classPrivateFieldLooseBase(this, _getPopup)[_getPopup]().show(); if (url) { return this.loadSrc(url); } }); } apply() { this.packBlobAndMask().then(({ blob, maskedBlob, maskId, canvas }) => { if (blob instanceof Blob) { if (maskId > 0) { Backend.useRecently(maskId); } const ev = new main_core_events.BaseEvent({ compatData: [blob, canvas], data: { blob, maskedBlob } }); main_core_events.EventEmitter.emit(this, 'onApply', ev, { useGlobalNaming: true }); this.emit('onApply', ev); } }).catch(error => { console.log('error: ', error); }); } onApply(callback) { this.subscribe('onApply', callback); return this; } subscribeOnFormIsReady(fieldName, callback) { this.subscribe('onApply', event => { const formObj = new FormData(); const { blob, maskedBlob } = event.getData(); formObj.append(fieldName, blob, blob['name']); const maskedFileId = ['maskedFile', Editor.justANumber++].join(':'); formObj.append(main_core.Loc.getMessage('UI_AVATAR_MASK_REQUEST_FIELD_NAME') + fieldName, maskedFileId); if (maskedBlob) { formObj.append(main_core.Loc.getMessage('UI_AVATAR_MASK_REQUEST_FIELD_NAME') + '[' + maskedFileId + ']', maskedBlob, blob['name']); formObj.append(main_core.Loc.getMessage('UI_AVATAR_MASK_REQUEST_FIELD_NAME') + '[' + maskedFileId + '][maskId]', maskedBlob['maskId']); callback(new main_core_events.BaseEvent({ data: { form: formObj, blob, maskedBlob, maskId: maskedBlob['maskId'] } })); } else { callback(new main_core_events.BaseEvent({ data: { form: formObj, blob } })); } }); } //region Compatibility click() { this.show(); } get popup() { return babelHelpers.classPrivateFieldLooseBase(this, _getPopup)[_getPopup](); } static isCameraAvailable() { return CameraTab.isAvailable(); } //endregion } function _getPopup2() { this.cache.remember('okButton', () => { const okButton = new ui_buttons.SaveButton({ onclick: () => { if (okButton.getState() === ui_buttons.ButtonState.ACTIVE) { this.apply(); } this.hide(); } }); if (this.isEmpty()) { okButton.setState(ui_buttons.ButtonState.DISABLED); this.subscribeOnce('onSet', () => { okButton.setState(ui_buttons.ButtonState.ACTIVE); }); } return okButton; }); return this.cache.remember('popup', () => { return main_popup.PopupManager.create('popup_' + this.getId(), null, { className: "ui-avatar-editor__popup", autoHide: false, lightShadow: true, closeIcon: true, closeByEsc: true, titleBar: main_core.Loc.getMessage('JS_AVATAR_EDITOR_TITLE_BAR'), content: this.getContainer(), zIndex: BX.PopupWindowManager.getMaxZIndex() + 1, overlay: {}, contentColor: "white", contentNoPaddings: true, bindOnResize: false, draggable: true, isScrollBlock: true, buttons: [this.cache.remember('okButton'), new ui_buttons.CancelButton({ onclick: () => { this.hide(); } })], events: { onShow: () => { this.emit('onOpen'); }, onClose: () => { this.emit('onClose'); } } }); }); } var _id$3 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("id"); var _showSlider$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("showSlider"); let currentEditor = EditorInPopup; /** * @namespace BX.UI.AvatarEditor */ function createInstance() { return currentEditor.createInstance(...arguments); } function isCameraAvailable() { return currentEditor.isCameraAvailable(); } function getInstanceById() { return currentEditor.getInstanceById(...arguments); } function getOrCreateInstanceById() { return currentEditor.getOrCreateInstanceById(...arguments); } CameraTab.check(); const BX$1 = main_core.Reflection.namespace('BX'); BX$1.AvatarEditor = currentEditor; exports.Editor = currentEditor; exports.MaskEditor = MaskEditor; exports.createInstance = createInstance; exports.getInstanceById = getInstanceById; exports.getOrCreateInstanceById = getOrCreateInstanceById; exports.isCameraAvailable = isCameraAvailable; }((this.BX.UI.AvatarEditor = this.BX.UI.AvatarEditor || {}),BX,BX,BX,BX.UI.EntitySelector,BX.UI.Dialogs,BX,BX,BX.Event,BX.Main,BX.UI,BX.UI.SidePanel)); //# sourceMappingURL=main.avatar-editor.bundle.js.map