3b1e7d32acf9807a85b1e1232b83f154.json
58.8 KB
{"ast":null,"code":"import snippet from 'tui-code-snippet';\nimport { HELP_MENUS } from './consts';\nimport { getSelector, assignmentForDestroy, cls } from './util';\nimport mainContainer from './ui/template/mainContainer';\nimport controls from './ui/template/controls';\nimport Theme from './ui/theme/theme';\nimport Shape from './ui/shape';\nimport Crop from './ui/crop';\nimport Flip from './ui/flip';\nimport Rotate from './ui/rotate';\nimport Text from './ui/text';\nimport Mask from './ui/mask';\nimport Icon from './ui/icon';\nimport Draw from './ui/draw';\nimport Filter from './ui/filter';\nimport Locale from './ui/locale/locale';\nconst SUB_UI_COMPONENT = {\n Shape,\n Crop,\n Flip,\n Rotate,\n Text,\n Mask,\n Icon,\n Draw,\n Filter\n};\nconst BI_EXPRESSION_MINSIZE_WHEN_TOP_POSITION = '1300';\n/**\r\n * Ui class\r\n * @class\r\n * @param {string|HTMLElement} element - Wrapper's element or selector\r\n * @param {Object} [options] - Ui setting options\r\n * @param {number} options.loadImage - Init default load image\r\n * @param {number} options.initMenu - Init start menu\r\n * @param {Boolean} [options.menuBarPosition=bottom] - Let\r\n * @param {Boolean} [options.applyCropSelectionStyle=false] - Let\r\n * @param {Boolean} [options.usageStatistics=false] - Use statistics or not\r\n * @param {Object} [options.uiSize] - ui size of editor\r\n * @param {string} options.uiSize.width - width of ui\r\n * @param {string} options.uiSize.height - height of ui\r\n * @param {Object} actions - ui action instance\r\n */\n\nclass Ui {\n constructor(element, options, actions) {\n this.options = this._initializeOption(options);\n this._actions = actions;\n this.submenu = false;\n this.imageSize = {};\n this.uiSize = {};\n this._locale = new Locale(this.options.locale);\n this.theme = new Theme(this.options.theme);\n this.eventHandler = {};\n this._submenuChangeTransection = false;\n this._selectedElement = null;\n this._mainElement = null;\n this._editorElementWrap = null;\n this._editorElement = null;\n this._menuElement = null;\n this._subMenuElement = null;\n\n this._makeUiElement(element);\n\n this._setUiSize();\n\n this._initMenuEvent = false;\n\n this._makeSubMenu();\n }\n /**\r\n * Destroys the instance.\r\n */\n\n\n destroy() {\n this._removeUiEvent();\n\n this._destroyAllMenu();\n\n this._selectedElement.innerHTML = '';\n assignmentForDestroy(this);\n }\n /**\r\n * Set Default Selection for includeUI\r\n * @param {Object} option - imageEditor options\r\n * @returns {Object} - extends selectionStyle option\r\n * @ignore\r\n */\n\n\n setUiDefaultSelectionStyle(option) {\n return snippet.extend({\n applyCropSelectionStyle: true,\n applyGroupSelectionStyle: true,\n selectionStyle: {\n cornerStyle: 'circle',\n cornerSize: 16,\n cornerColor: '#fff',\n cornerStrokeColor: '#fff',\n transparentCorners: false,\n lineWidth: 2,\n borderColor: '#fff'\n }\n }, option);\n }\n /**\r\n * Change editor size\r\n * @param {Object} resizeInfo - ui & image size info\r\n * @param {Object} [resizeInfo.uiSize] - image size dimension\r\n * @param {string} resizeInfo.uiSize.width - ui width\r\n * @param {string} resizeInfo.uiSize.height - ui height\r\n * @param {Object} [resizeInfo.imageSize] - image size dimension\r\n * @param {Number} resizeInfo.imageSize.oldWidth - old width\r\n * @param {Number} resizeInfo.imageSize.oldHeight - old height\r\n * @param {Number} resizeInfo.imageSize.newWidth - new width\r\n * @param {Number} resizeInfo.imageSize.newHeight - new height\r\n * @example\r\n * // Change the image size and ui size, and change the affected ui state together.\r\n * imageEditor.ui.resizeEditor({\r\n * imageSize: {oldWidth: 100, oldHeight: 100, newWidth: 700, newHeight: 700},\r\n * uiSize: {width: 1000, height: 1000}\r\n * });\r\n * @example\r\n * // Apply the ui state while preserving the previous attribute (for example, if responsive Ui)\r\n * imageEditor.ui.resizeEditor();\r\n */\n\n\n resizeEditor({\n uiSize,\n imageSize = this.imageSize\n } = {}) {\n if (imageSize !== this.imageSize) {\n this.imageSize = imageSize;\n }\n\n if (uiSize) {\n this._setUiSize(uiSize);\n }\n\n const {\n width,\n height\n } = this._getCanvasMaxDimension();\n\n const editorElementStyle = this._editorElement.style;\n const {\n menuBarPosition\n } = this.options;\n editorElementStyle.height = `${height}px`;\n editorElementStyle.width = `${width}px`;\n\n this._setEditorPosition(menuBarPosition);\n\n this._editorElementWrap.style.bottom = `0px`;\n this._editorElementWrap.style.top = `0px`;\n this._editorElementWrap.style.left = `0px`;\n this._editorElementWrap.style.width = `100%`;\n const selectElementClassList = this._selectedElement.classList;\n\n if (menuBarPosition === 'top' && this._selectedElement.offsetWidth < BI_EXPRESSION_MINSIZE_WHEN_TOP_POSITION) {\n selectElementClassList.add('tui-image-editor-top-optimization');\n } else {\n selectElementClassList.remove('tui-image-editor-top-optimization');\n }\n }\n /**\r\n * Change help button status\r\n * @param {string} buttonType - target button type\r\n * @param {Boolean} enableStatus - enabled status\r\n * @ignore\r\n */\n\n\n changeHelpButtonEnabled(buttonType, enableStatus) {\n const buttonClassList = this._buttonElements[buttonType].classList;\n buttonClassList[enableStatus ? 'add' : 'remove']('enabled');\n }\n /**\r\n * Change delete button status\r\n * @param {Object} [options] - Ui setting options\r\n * @param {object} [options.loadImage] - Init default load image\r\n * @param {string} [options.initMenu] - Init start menu\r\n * @param {string} [options.menuBarPosition=bottom] - Let\r\n * @param {boolean} [options.applyCropSelectionStyle=false] - Let\r\n * @param {boolean} [options.usageStatistics=false] - Send statistics ping or not\r\n * @returns {Object} initialize option\r\n * @private\r\n */\n\n\n _initializeOption(options) {\n return snippet.extend({\n loadImage: {\n path: '',\n name: ''\n },\n locale: {},\n menuIconPath: '',\n menu: ['crop', 'flip', 'rotate', 'draw', 'shape', 'icon', 'text', 'mask', 'filter'],\n initMenu: '',\n uiSize: {\n width: '100%',\n height: '100%'\n },\n menuBarPosition: 'bottom'\n }, options);\n }\n /**\r\n * Set ui container size\r\n * @param {Object} uiSize - ui dimension\r\n * @param {string} uiSize.width - css width property\r\n * @param {string} uiSize.height - css height property\r\n * @private\r\n */\n\n\n _setUiSize(uiSize = this.options.uiSize) {\n const elementDimension = this._selectedElement.style;\n elementDimension.width = uiSize.width;\n elementDimension.height = uiSize.height;\n }\n /**\r\n * Make submenu dom element\r\n * @private\r\n */\n\n\n _makeSubMenu() {\n snippet.forEach(this.options.menu, menuName => {\n const SubComponentClass = SUB_UI_COMPONENT[menuName.replace(/^[a-z]/, $0 => $0.toUpperCase())]; // make menu element\n\n this._makeMenuElement(menuName); // menu btn element\n\n\n this._buttonElements[menuName] = this._menuElement.querySelector(`.tie-btn-${menuName}`); // submenu ui instance\n\n this[menuName] = new SubComponentClass(this._subMenuElement, {\n locale: this._locale,\n makeSvgIcon: this.theme.makeMenSvgIconSet.bind(this.theme),\n menuBarPosition: this.options.menuBarPosition,\n usageStatistics: this.options.usageStatistics\n });\n });\n }\n /**\r\n * Make primary ui dom element\r\n * @param {string|HTMLElement} element - Wrapper's element or selector\r\n * @private\r\n */\n\n\n _makeUiElement(element) {\n let selectedElement;\n window.snippet = snippet;\n\n if (element.nodeType) {\n selectedElement = element;\n } else {\n selectedElement = document.querySelector(element);\n }\n\n const selector = getSelector(selectedElement);\n selectedElement.classList.add('tui-image-editor-container');\n selectedElement.innerHTML = controls({\n locale: this._locale,\n biImage: this.theme.getStyle('common.bi'),\n loadButtonStyle: this.theme.getStyle('loadButton'),\n downloadButtonStyle: this.theme.getStyle('downloadButton')\n }) + mainContainer({\n locale: this._locale,\n biImage: this.theme.getStyle('common.bi'),\n commonStyle: this.theme.getStyle('common'),\n headerStyle: this.theme.getStyle('header'),\n loadButtonStyle: this.theme.getStyle('loadButton'),\n downloadButtonStyle: this.theme.getStyle('downloadButton'),\n submenuStyle: this.theme.getStyle('submenu')\n });\n this._selectedElement = selectedElement;\n\n this._selectedElement.classList.add(this.options.menuBarPosition);\n\n this._mainElement = selector('.tui-image-editor-main');\n this._editorElementWrap = selector('.tui-image-editor-wrap');\n this._editorElement = selector('.tui-image-editor');\n this._menuElement = selector('.tui-image-editor-menu');\n this._subMenuElement = selector('.tui-image-editor-submenu');\n this._buttonElements = {\n download: this._selectedElement.querySelectorAll('.tui-image-editor-download-btn'),\n load: this._selectedElement.querySelectorAll('.tui-image-editor-load-btn')\n };\n\n this._addHelpMenus();\n }\n /**\r\n * make array for help menu output, including partitions.\r\n * @returns {Array}\r\n * @private\r\n */\n\n\n _makeHelpMenuWithPartition() {\n const helpMenuWithPartition = [...HELP_MENUS, ''];\n helpMenuWithPartition.splice(3, 0, '');\n return helpMenuWithPartition;\n }\n /**\r\n * Add help menu\r\n * @private\r\n */\n\n\n _addHelpMenus() {\n const helpMenuWithPartition = this._makeHelpMenuWithPartition();\n\n snippet.forEach(helpMenuWithPartition, menuName => {\n if (!menuName) {\n this._makeMenuPartitionElement();\n } else {\n this._makeMenuElement(menuName, ['normal', 'disabled', 'hover'], 'help');\n\n if (menuName) {\n this._buttonElements[menuName] = this._menuElement.querySelector(`.tie-btn-${menuName}`);\n }\n }\n });\n }\n /**\r\n * Make menu partition element\r\n * @private\r\n */\n\n\n _makeMenuPartitionElement() {\n const partitionElement = document.createElement('li');\n const partitionInnerElement = document.createElement('div');\n partitionElement.className = cls('item');\n partitionInnerElement.className = cls('icpartition');\n partitionElement.appendChild(partitionInnerElement);\n\n this._menuElement.appendChild(partitionElement);\n }\n /**\r\n * Make menu button element\r\n * @param {string} menuName - menu name\r\n * @param {Array} useIconTypes - Possible values are \\['normal', 'active', 'hover', 'disabled'\\]\r\n * @param {string} menuType - 'normal' or 'help'\r\n * @private\r\n */\n\n\n _makeMenuElement(menuName, useIconTypes = ['normal', 'active', 'hover'], menuType = 'normal') {\n const btnElement = document.createElement('li');\n const menuItemHtml = this.theme.makeMenSvgIconSet(useIconTypes, menuName);\n\n this._addTooltipAttribute(btnElement, menuName);\n\n btnElement.className = `tie-btn-${menuName} ${cls('item')} ${menuType}`;\n btnElement.innerHTML = menuItemHtml;\n\n this._menuElement.appendChild(btnElement);\n }\n /**\r\n * Add help action event\r\n * @private\r\n */\n\n\n _addHelpActionEvent() {\n snippet.forEach(HELP_MENUS, helpName => {\n this.eventHandler[helpName] = () => this._actions.main[helpName]();\n\n this._buttonElements[helpName].addEventListener('click', this.eventHandler[helpName]);\n });\n }\n /**\r\n * Remove help action event\r\n * @private\r\n */\n\n\n _removeHelpActionEvent() {\n snippet.forEach(HELP_MENUS, helpName => {\n this._buttonElements[helpName].removeEventListener('click', this.eventHandler[helpName]);\n });\n }\n /**\r\n * Add attribute for menu tooltip\r\n * @param {HTMLElement} element - menu element\r\n * @param {string} tooltipName - tooltipName\r\n * @private\r\n */\n\n\n _addTooltipAttribute(element, tooltipName) {\n element.setAttribute('tooltip-content', this._locale.localize(tooltipName.replace(/^[a-z]/g, $0 => $0.toUpperCase())));\n }\n /**\r\n * Add download event\r\n * @private\r\n */\n\n\n _addDownloadEvent() {\n this.eventHandler.download = () => this._actions.main.download();\n\n snippet.forEach(this._buttonElements.download, element => {\n element.addEventListener('click', this.eventHandler.download);\n });\n }\n\n _removeDownloadEvent() {\n snippet.forEach(this._buttonElements.download, element => {\n element.removeEventListener('click', this.eventHandler.download);\n });\n }\n /**\r\n * Add load event\r\n * @private\r\n */\n\n\n _addLoadEvent() {\n this.eventHandler.loadImage = event => this._actions.main.load(event.target.files[0]);\n\n snippet.forEach(this._buttonElements.load, element => {\n element.addEventListener('change', this.eventHandler.loadImage);\n });\n }\n /**\r\n * Remmove load event\r\n * @private\r\n */\n\n\n _removeLoadEvent() {\n snippet.forEach(this._buttonElements.load, element => {\n element.removeEventListener('change', this.eventHandler.loadImage);\n });\n }\n /**\r\n * Add menu event\r\n * @param {string} menuName - menu name\r\n * @private\r\n */\n\n\n _addMainMenuEvent(menuName) {\n this.eventHandler[menuName] = () => this.changeMenu(menuName);\n\n this._buttonElements[menuName].addEventListener('click', this.eventHandler[menuName]);\n }\n /**\r\n * Add menu event\r\n * @param {string} menuName - menu name\r\n * @private\r\n */\n\n\n _addSubMenuEvent(menuName) {\n this[menuName].addEvent(this._actions[menuName]);\n }\n /**\r\n * Add menu event\r\n * @private\r\n */\n\n\n _addMenuEvent() {\n snippet.forEach(this.options.menu, menuName => {\n this._addMainMenuEvent(menuName);\n\n this._addSubMenuEvent(menuName);\n });\n }\n /**\r\n * Remove menu event\r\n * @private\r\n */\n\n\n _removeMainMenuEvent() {\n snippet.forEach(this.options.menu, menuName => {\n this._buttonElements[menuName].removeEventListener('click', this.eventHandler[menuName]);\n });\n }\n /**\r\n * Get editor area element\r\n * @returns {HTMLElement} editor area html element\r\n * @ignore\r\n */\n\n\n getEditorArea() {\n return this._editorElement;\n }\n /**\r\n * Add event for menu items\r\n * @ignore\r\n */\n\n\n activeMenuEvent() {\n if (this._initMenuEvent) {\n return;\n }\n\n this._addHelpActionEvent();\n\n this._addDownloadEvent();\n\n this._addMenuEvent();\n\n this._initMenu();\n\n this._initMenuEvent = true;\n }\n /**\r\n * Remove ui event\r\n * @private\r\n */\n\n\n _removeUiEvent() {\n this._removeHelpActionEvent();\n\n this._removeDownloadEvent();\n\n this._removeLoadEvent();\n\n this._removeMainMenuEvent();\n }\n /**\r\n * Destroy all menu instance\r\n * @private\r\n */\n\n\n _destroyAllMenu() {\n snippet.forEach(this.options.menu, menuName => {\n this[menuName].destroy();\n });\n }\n /**\r\n * Init canvas\r\n * @ignore\r\n */\n\n\n initCanvas() {\n const loadImageInfo = this._getLoadImage();\n\n if (loadImageInfo.path) {\n this._actions.main.initLoadImage(loadImageInfo.path, loadImageInfo.name).then(() => {\n this.activeMenuEvent();\n });\n }\n\n this._addLoadEvent();\n\n const gridVisual = document.createElement('div');\n gridVisual.className = cls('grid-visual');\n const grid = `<table>\n <tr><td class=\"dot left-top\"></td><td></td><td class=\"dot right-top\"></td></tr>\n <tr><td></td><td></td><td></td></tr>\n <tr><td class=\"dot left-bottom\"></td><td></td><td class=\"dot right-bottom\"></td></tr>\n </table>`;\n gridVisual.innerHTML = grid;\n this._editorContainerElement = this._editorElement.querySelector('.tui-image-editor-canvas-container');\n\n this._editorContainerElement.appendChild(gridVisual);\n }\n /**\r\n * get editor area element\r\n * @returns {Object} load image option\r\n * @private\r\n */\n\n\n _getLoadImage() {\n return this.options.loadImage;\n }\n /**\r\n * change menu\r\n * @param {string} menuName - menu name\r\n * @param {boolean} toggle - whether toogle or not\r\n * @param {boolean} discardSelection - discard selection\r\n * @ignore\r\n */\n\n\n changeMenu(menuName, toggle = true, discardSelection = true) {\n if (!this._submenuChangeTransection) {\n this._submenuChangeTransection = true;\n\n this._changeMenu(menuName, toggle, discardSelection);\n\n this._submenuChangeTransection = false;\n }\n }\n /**\r\n * change menu\r\n * @param {string} menuName - menu name\r\n * @param {boolean} toggle - whether toogle or not\r\n * @param {boolean} discardSelection - discard selection\r\n * @private\r\n */\n\n\n _changeMenu(menuName, toggle, discardSelection) {\n if (this.submenu) {\n this._buttonElements[this.submenu].classList.remove('active');\n\n this._mainElement.classList.remove(`tui-image-editor-menu-${this.submenu}`);\n\n if (discardSelection) {\n this._actions.main.discardSelection();\n }\n\n this._actions.main.changeSelectableAll(true);\n\n this[this.submenu].changeStandbyMode();\n }\n\n if (this.submenu === menuName && toggle) {\n this.submenu = null;\n } else {\n this._buttonElements[menuName].classList.add('active');\n\n this._mainElement.classList.add(`tui-image-editor-menu-${menuName}`);\n\n this.submenu = menuName;\n this[this.submenu].changeStartMode();\n }\n\n this.resizeEditor();\n }\n /**\r\n * Init menu\r\n * @private\r\n */\n\n\n _initMenu() {\n if (this.options.initMenu) {\n const evt = document.createEvent('MouseEvents');\n evt.initEvent('click', true, false);\n\n this._buttonElements[this.options.initMenu].dispatchEvent(evt);\n }\n\n if (this.icon) {\n this.icon.registDefaultIcon();\n }\n }\n /**\r\n * Get canvas max Dimension\r\n * @returns {Object} - width & height of editor\r\n * @private\r\n */\n\n\n _getCanvasMaxDimension() {\n const {\n maxWidth,\n maxHeight\n } = this._editorContainerElement.style;\n const width = parseFloat(maxWidth);\n const height = parseFloat(maxHeight);\n return {\n width,\n height\n };\n }\n /**\r\n * Set editor position\r\n * @param {string} menuBarPosition - top or right or bottom or left\r\n * @private\r\n */\n // eslint-disable-next-line complexity\n\n\n _setEditorPosition(menuBarPosition) {\n const {\n width,\n height\n } = this._getCanvasMaxDimension();\n\n const editorElementStyle = this._editorElement.style;\n let top = 0;\n let left = 0;\n\n if (this.submenu) {\n if (menuBarPosition === 'bottom') {\n if (height > this._editorElementWrap.scrollHeight - 150) {\n top = (height - this._editorElementWrap.scrollHeight) / 2;\n } else {\n top = 150 / 2 * -1;\n }\n } else if (menuBarPosition === 'top') {\n if (height > this._editorElementWrap.offsetHeight - 150) {\n top = 150 / 2 - (height - (this._editorElementWrap.offsetHeight - 150)) / 2;\n } else {\n top = 150 / 2;\n }\n } else if (menuBarPosition === 'left') {\n if (width > this._editorElementWrap.offsetWidth - 248) {\n left = 248 / 2 - (width - (this._editorElementWrap.offsetWidth - 248)) / 2;\n } else {\n left = 248 / 2;\n }\n } else if (menuBarPosition === 'right') {\n if (width > this._editorElementWrap.scrollWidth - 248) {\n left = (width - this._editorElementWrap.scrollWidth) / 2;\n } else {\n left = 248 / 2 * -1;\n }\n }\n }\n\n editorElementStyle.top = `${top}px`;\n editorElementStyle.left = `${left}px`;\n }\n\n}\n\nexport default Ui;","map":{"version":3,"sources":["C:/Users/kkwan_000/Desktop/git/2017110269/minsung/src/js/ui.js"],"names":["snippet","HELP_MENUS","getSelector","assignmentForDestroy","cls","mainContainer","controls","Theme","Shape","Crop","Flip","Rotate","Text","Mask","Icon","Draw","Filter","Locale","SUB_UI_COMPONENT","BI_EXPRESSION_MINSIZE_WHEN_TOP_POSITION","Ui","constructor","element","options","actions","_initializeOption","_actions","submenu","imageSize","uiSize","_locale","locale","theme","eventHandler","_submenuChangeTransection","_selectedElement","_mainElement","_editorElementWrap","_editorElement","_menuElement","_subMenuElement","_makeUiElement","_setUiSize","_initMenuEvent","_makeSubMenu","destroy","_removeUiEvent","_destroyAllMenu","innerHTML","setUiDefaultSelectionStyle","option","extend","applyCropSelectionStyle","applyGroupSelectionStyle","selectionStyle","cornerStyle","cornerSize","cornerColor","cornerStrokeColor","transparentCorners","lineWidth","borderColor","resizeEditor","width","height","_getCanvasMaxDimension","editorElementStyle","style","menuBarPosition","_setEditorPosition","bottom","top","left","selectElementClassList","classList","offsetWidth","add","remove","changeHelpButtonEnabled","buttonType","enableStatus","buttonClassList","_buttonElements","loadImage","path","name","menuIconPath","menu","initMenu","elementDimension","forEach","menuName","SubComponentClass","replace","$0","toUpperCase","_makeMenuElement","querySelector","makeSvgIcon","makeMenSvgIconSet","bind","usageStatistics","selectedElement","window","nodeType","document","selector","biImage","getStyle","loadButtonStyle","downloadButtonStyle","commonStyle","headerStyle","submenuStyle","download","querySelectorAll","load","_addHelpMenus","_makeHelpMenuWithPartition","helpMenuWithPartition","splice","_makeMenuPartitionElement","partitionElement","createElement","partitionInnerElement","className","appendChild","useIconTypes","menuType","btnElement","menuItemHtml","_addTooltipAttribute","_addHelpActionEvent","helpName","main","addEventListener","_removeHelpActionEvent","removeEventListener","tooltipName","setAttribute","localize","_addDownloadEvent","_removeDownloadEvent","_addLoadEvent","event","target","files","_removeLoadEvent","_addMainMenuEvent","changeMenu","_addSubMenuEvent","addEvent","_addMenuEvent","_removeMainMenuEvent","getEditorArea","activeMenuEvent","_initMenu","initCanvas","loadImageInfo","_getLoadImage","initLoadImage","then","gridVisual","grid","_editorContainerElement","toggle","discardSelection","_changeMenu","changeSelectableAll","changeStandbyMode","changeStartMode","evt","createEvent","initEvent","dispatchEvent","icon","registDefaultIcon","maxWidth","maxHeight","parseFloat","scrollHeight","offsetHeight","scrollWidth"],"mappings":"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","sourcesContent":["import snippet from 'tui-code-snippet';\r\nimport { HELP_MENUS } from './consts';\r\nimport { getSelector, assignmentForDestroy, cls } from './util';\r\nimport mainContainer from './ui/template/mainContainer';\r\nimport controls from './ui/template/controls';\r\n\r\nimport Theme from './ui/theme/theme';\r\nimport Shape from './ui/shape';\r\nimport Crop from './ui/crop';\r\nimport Flip from './ui/flip';\r\nimport Rotate from './ui/rotate';\r\nimport Text from './ui/text';\r\nimport Mask from './ui/mask';\r\nimport Icon from './ui/icon';\r\nimport Draw from './ui/draw';\r\nimport Filter from './ui/filter';\r\nimport Locale from './ui/locale/locale';\r\n\r\nconst SUB_UI_COMPONENT = {\r\n Shape,\r\n Crop,\r\n Flip,\r\n Rotate,\r\n Text,\r\n Mask,\r\n Icon,\r\n Draw,\r\n Filter,\r\n};\r\n\r\nconst BI_EXPRESSION_MINSIZE_WHEN_TOP_POSITION = '1300';\r\n\r\n/**\r\n * Ui class\r\n * @class\r\n * @param {string|HTMLElement} element - Wrapper's element or selector\r\n * @param {Object} [options] - Ui setting options\r\n * @param {number} options.loadImage - Init default load image\r\n * @param {number} options.initMenu - Init start menu\r\n * @param {Boolean} [options.menuBarPosition=bottom] - Let\r\n * @param {Boolean} [options.applyCropSelectionStyle=false] - Let\r\n * @param {Boolean} [options.usageStatistics=false] - Use statistics or not\r\n * @param {Object} [options.uiSize] - ui size of editor\r\n * @param {string} options.uiSize.width - width of ui\r\n * @param {string} options.uiSize.height - height of ui\r\n * @param {Object} actions - ui action instance\r\n */\r\nclass Ui {\r\n constructor(element, options, actions) {\r\n this.options = this._initializeOption(options);\r\n this._actions = actions;\r\n this.submenu = false;\r\n this.imageSize = {};\r\n this.uiSize = {};\r\n this._locale = new Locale(this.options.locale);\r\n this.theme = new Theme(this.options.theme);\r\n this.eventHandler = {};\r\n this._submenuChangeTransection = false;\r\n this._selectedElement = null;\r\n this._mainElement = null;\r\n this._editorElementWrap = null;\r\n this._editorElement = null;\r\n this._menuElement = null;\r\n this._subMenuElement = null;\r\n this._makeUiElement(element);\r\n this._setUiSize();\r\n this._initMenuEvent = false;\r\n\r\n this._makeSubMenu();\r\n }\r\n\r\n /**\r\n * Destroys the instance.\r\n */\r\n destroy() {\r\n this._removeUiEvent();\r\n this._destroyAllMenu();\r\n this._selectedElement.innerHTML = '';\r\n\r\n assignmentForDestroy(this);\r\n }\r\n\r\n /**\r\n * Set Default Selection for includeUI\r\n * @param {Object} option - imageEditor options\r\n * @returns {Object} - extends selectionStyle option\r\n * @ignore\r\n */\r\n setUiDefaultSelectionStyle(option) {\r\n return snippet.extend(\r\n {\r\n applyCropSelectionStyle: true,\r\n applyGroupSelectionStyle: true,\r\n selectionStyle: {\r\n cornerStyle: 'circle',\r\n cornerSize: 16,\r\n cornerColor: '#fff',\r\n cornerStrokeColor: '#fff',\r\n transparentCorners: false,\r\n lineWidth: 2,\r\n borderColor: '#fff',\r\n },\r\n },\r\n option\r\n );\r\n }\r\n\r\n /**\r\n * Change editor size\r\n * @param {Object} resizeInfo - ui & image size info\r\n * @param {Object} [resizeInfo.uiSize] - image size dimension\r\n * @param {string} resizeInfo.uiSize.width - ui width\r\n * @param {string} resizeInfo.uiSize.height - ui height\r\n * @param {Object} [resizeInfo.imageSize] - image size dimension\r\n * @param {Number} resizeInfo.imageSize.oldWidth - old width\r\n * @param {Number} resizeInfo.imageSize.oldHeight - old height\r\n * @param {Number} resizeInfo.imageSize.newWidth - new width\r\n * @param {Number} resizeInfo.imageSize.newHeight - new height\r\n * @example\r\n * // Change the image size and ui size, and change the affected ui state together.\r\n * imageEditor.ui.resizeEditor({\r\n * imageSize: {oldWidth: 100, oldHeight: 100, newWidth: 700, newHeight: 700},\r\n * uiSize: {width: 1000, height: 1000}\r\n * });\r\n * @example\r\n * // Apply the ui state while preserving the previous attribute (for example, if responsive Ui)\r\n * imageEditor.ui.resizeEditor();\r\n */\r\n resizeEditor({ uiSize, imageSize = this.imageSize } = {}) {\r\n if (imageSize !== this.imageSize) {\r\n this.imageSize = imageSize;\r\n }\r\n if (uiSize) {\r\n this._setUiSize(uiSize);\r\n }\r\n\r\n const { width, height } = this._getCanvasMaxDimension();\r\n const editorElementStyle = this._editorElement.style;\r\n const { menuBarPosition } = this.options;\r\n\r\n editorElementStyle.height = `${height}px`;\r\n editorElementStyle.width = `${width}px`;\r\n\r\n this._setEditorPosition(menuBarPosition);\r\n\r\n this._editorElementWrap.style.bottom = `0px`;\r\n this._editorElementWrap.style.top = `0px`;\r\n this._editorElementWrap.style.left = `0px`;\r\n this._editorElementWrap.style.width = `100%`;\r\n\r\n const selectElementClassList = this._selectedElement.classList;\r\n\r\n if (\r\n menuBarPosition === 'top' &&\r\n this._selectedElement.offsetWidth < BI_EXPRESSION_MINSIZE_WHEN_TOP_POSITION\r\n ) {\r\n selectElementClassList.add('tui-image-editor-top-optimization');\r\n } else {\r\n selectElementClassList.remove('tui-image-editor-top-optimization');\r\n }\r\n }\r\n\r\n /**\r\n * Change help button status\r\n * @param {string} buttonType - target button type\r\n * @param {Boolean} enableStatus - enabled status\r\n * @ignore\r\n */\r\n changeHelpButtonEnabled(buttonType, enableStatus) {\r\n const buttonClassList = this._buttonElements[buttonType].classList;\r\n\r\n buttonClassList[enableStatus ? 'add' : 'remove']('enabled');\r\n }\r\n\r\n /**\r\n * Change delete button status\r\n * @param {Object} [options] - Ui setting options\r\n * @param {object} [options.loadImage] - Init default load image\r\n * @param {string} [options.initMenu] - Init start menu\r\n * @param {string} [options.menuBarPosition=bottom] - Let\r\n * @param {boolean} [options.applyCropSelectionStyle=false] - Let\r\n * @param {boolean} [options.usageStatistics=false] - Send statistics ping or not\r\n * @returns {Object} initialize option\r\n * @private\r\n */\r\n _initializeOption(options) {\r\n return snippet.extend(\r\n {\r\n loadImage: {\r\n path: '',\r\n name: '',\r\n },\r\n locale: {},\r\n menuIconPath: '',\r\n menu: ['crop', 'flip', 'rotate', 'draw', 'shape', 'icon', 'text', 'mask', 'filter'],\r\n initMenu: '',\r\n uiSize: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n menuBarPosition: 'bottom',\r\n },\r\n options\r\n );\r\n }\r\n\r\n /**\r\n * Set ui container size\r\n * @param {Object} uiSize - ui dimension\r\n * @param {string} uiSize.width - css width property\r\n * @param {string} uiSize.height - css height property\r\n * @private\r\n */\r\n _setUiSize(uiSize = this.options.uiSize) {\r\n const elementDimension = this._selectedElement.style;\r\n elementDimension.width = uiSize.width;\r\n elementDimension.height = uiSize.height;\r\n }\r\n\r\n /**\r\n * Make submenu dom element\r\n * @private\r\n */\r\n _makeSubMenu() {\r\n snippet.forEach(this.options.menu, (menuName) => {\r\n const SubComponentClass =\r\n SUB_UI_COMPONENT[menuName.replace(/^[a-z]/, ($0) => $0.toUpperCase())];\r\n\r\n // make menu element\r\n this._makeMenuElement(menuName);\r\n\r\n // menu btn element\r\n this._buttonElements[menuName] = this._menuElement.querySelector(`.tie-btn-${menuName}`);\r\n\r\n // submenu ui instance\r\n this[menuName] = new SubComponentClass(this._subMenuElement, {\r\n locale: this._locale,\r\n makeSvgIcon: this.theme.makeMenSvgIconSet.bind(this.theme),\r\n menuBarPosition: this.options.menuBarPosition,\r\n usageStatistics: this.options.usageStatistics,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Make primary ui dom element\r\n * @param {string|HTMLElement} element - Wrapper's element or selector\r\n * @private\r\n */\r\n _makeUiElement(element) {\r\n let selectedElement;\r\n\r\n window.snippet = snippet;\r\n\r\n if (element.nodeType) {\r\n selectedElement = element;\r\n } else {\r\n selectedElement = document.querySelector(element);\r\n }\r\n const selector = getSelector(selectedElement);\r\n\r\n selectedElement.classList.add('tui-image-editor-container');\r\n selectedElement.innerHTML =\r\n controls({\r\n locale: this._locale,\r\n biImage: this.theme.getStyle('common.bi'),\r\n loadButtonStyle: this.theme.getStyle('loadButton'),\r\n downloadButtonStyle: this.theme.getStyle('downloadButton'),\r\n }) +\r\n mainContainer({\r\n locale: this._locale,\r\n biImage: this.theme.getStyle('common.bi'),\r\n commonStyle: this.theme.getStyle('common'),\r\n headerStyle: this.theme.getStyle('header'),\r\n loadButtonStyle: this.theme.getStyle('loadButton'),\r\n downloadButtonStyle: this.theme.getStyle('downloadButton'),\r\n submenuStyle: this.theme.getStyle('submenu'),\r\n });\r\n\r\n this._selectedElement = selectedElement;\r\n this._selectedElement.classList.add(this.options.menuBarPosition);\r\n\r\n this._mainElement = selector('.tui-image-editor-main');\r\n this._editorElementWrap = selector('.tui-image-editor-wrap');\r\n this._editorElement = selector('.tui-image-editor');\r\n this._menuElement = selector('.tui-image-editor-menu');\r\n this._subMenuElement = selector('.tui-image-editor-submenu');\r\n this._buttonElements = {\r\n download: this._selectedElement.querySelectorAll('.tui-image-editor-download-btn'),\r\n load: this._selectedElement.querySelectorAll('.tui-image-editor-load-btn'),\r\n };\r\n\r\n this._addHelpMenus();\r\n }\r\n\r\n /**\r\n * make array for help menu output, including partitions.\r\n * @returns {Array}\r\n * @private\r\n */\r\n _makeHelpMenuWithPartition() {\r\n const helpMenuWithPartition = [...HELP_MENUS, ''];\r\n helpMenuWithPartition.splice(3, 0, '');\r\n\r\n return helpMenuWithPartition;\r\n }\r\n\r\n /**\r\n * Add help menu\r\n * @private\r\n */\r\n _addHelpMenus() {\r\n const helpMenuWithPartition = this._makeHelpMenuWithPartition();\r\n\r\n snippet.forEach(helpMenuWithPartition, (menuName) => {\r\n if (!menuName) {\r\n this._makeMenuPartitionElement();\r\n } else {\r\n this._makeMenuElement(menuName, ['normal', 'disabled', 'hover'], 'help');\r\n\r\n if (menuName) {\r\n this._buttonElements[menuName] = this._menuElement.querySelector(`.tie-btn-${menuName}`);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Make menu partition element\r\n * @private\r\n */\r\n _makeMenuPartitionElement() {\r\n const partitionElement = document.createElement('li');\r\n const partitionInnerElement = document.createElement('div');\r\n partitionElement.className = cls('item');\r\n partitionInnerElement.className = cls('icpartition');\r\n partitionElement.appendChild(partitionInnerElement);\r\n\r\n this._menuElement.appendChild(partitionElement);\r\n }\r\n\r\n /**\r\n * Make menu button element\r\n * @param {string} menuName - menu name\r\n * @param {Array} useIconTypes - Possible values are \\['normal', 'active', 'hover', 'disabled'\\]\r\n * @param {string} menuType - 'normal' or 'help'\r\n * @private\r\n */\r\n _makeMenuElement(menuName, useIconTypes = ['normal', 'active', 'hover'], menuType = 'normal') {\r\n const btnElement = document.createElement('li');\r\n const menuItemHtml = this.theme.makeMenSvgIconSet(useIconTypes, menuName);\r\n\r\n this._addTooltipAttribute(btnElement, menuName);\r\n btnElement.className = `tie-btn-${menuName} ${cls('item')} ${menuType}`;\r\n btnElement.innerHTML = menuItemHtml;\r\n\r\n this._menuElement.appendChild(btnElement);\r\n }\r\n\r\n /**\r\n * Add help action event\r\n * @private\r\n */\r\n _addHelpActionEvent() {\r\n snippet.forEach(HELP_MENUS, (helpName) => {\r\n this.eventHandler[helpName] = () => this._actions.main[helpName]();\r\n this._buttonElements[helpName].addEventListener('click', this.eventHandler[helpName]);\r\n });\r\n }\r\n\r\n /**\r\n * Remove help action event\r\n * @private\r\n */\r\n _removeHelpActionEvent() {\r\n snippet.forEach(HELP_MENUS, (helpName) => {\r\n this._buttonElements[helpName].removeEventListener('click', this.eventHandler[helpName]);\r\n });\r\n }\r\n\r\n /**\r\n * Add attribute for menu tooltip\r\n * @param {HTMLElement} element - menu element\r\n * @param {string} tooltipName - tooltipName\r\n * @private\r\n */\r\n _addTooltipAttribute(element, tooltipName) {\r\n element.setAttribute(\r\n 'tooltip-content',\r\n this._locale.localize(tooltipName.replace(/^[a-z]/g, ($0) => $0.toUpperCase()))\r\n );\r\n }\r\n\r\n /**\r\n * Add download event\r\n * @private\r\n */\r\n _addDownloadEvent() {\r\n this.eventHandler.download = () => this._actions.main.download();\r\n snippet.forEach(this._buttonElements.download, (element) => {\r\n element.addEventListener('click', this.eventHandler.download);\r\n });\r\n }\r\n\r\n _removeDownloadEvent() {\r\n snippet.forEach(this._buttonElements.download, (element) => {\r\n element.removeEventListener('click', this.eventHandler.download);\r\n });\r\n }\r\n\r\n /**\r\n * Add load event\r\n * @private\r\n */\r\n _addLoadEvent() {\r\n this.eventHandler.loadImage = (event) => this._actions.main.load(event.target.files[0]);\r\n\r\n snippet.forEach(this._buttonElements.load, (element) => {\r\n element.addEventListener('change', this.eventHandler.loadImage);\r\n });\r\n }\r\n\r\n /**\r\n * Remmove load event\r\n * @private\r\n */\r\n _removeLoadEvent() {\r\n snippet.forEach(this._buttonElements.load, (element) => {\r\n element.removeEventListener('change', this.eventHandler.loadImage);\r\n });\r\n }\r\n\r\n /**\r\n * Add menu event\r\n * @param {string} menuName - menu name\r\n * @private\r\n */\r\n _addMainMenuEvent(menuName) {\r\n this.eventHandler[menuName] = () => this.changeMenu(menuName);\r\n this._buttonElements[menuName].addEventListener('click', this.eventHandler[menuName]);\r\n }\r\n\r\n /**\r\n * Add menu event\r\n * @param {string} menuName - menu name\r\n * @private\r\n */\r\n _addSubMenuEvent(menuName) {\r\n this[menuName].addEvent(this._actions[menuName]);\r\n }\r\n\r\n /**\r\n * Add menu event\r\n * @private\r\n */\r\n _addMenuEvent() {\r\n snippet.forEach(this.options.menu, (menuName) => {\r\n this._addMainMenuEvent(menuName);\r\n this._addSubMenuEvent(menuName);\r\n });\r\n }\r\n\r\n /**\r\n * Remove menu event\r\n * @private\r\n */\r\n _removeMainMenuEvent() {\r\n snippet.forEach(this.options.menu, (menuName) => {\r\n this._buttonElements[menuName].removeEventListener('click', this.eventHandler[menuName]);\r\n });\r\n }\r\n\r\n /**\r\n * Get editor area element\r\n * @returns {HTMLElement} editor area html element\r\n * @ignore\r\n */\r\n getEditorArea() {\r\n return this._editorElement;\r\n }\r\n\r\n /**\r\n * Add event for menu items\r\n * @ignore\r\n */\r\n activeMenuEvent() {\r\n if (this._initMenuEvent) {\r\n return;\r\n }\r\n\r\n this._addHelpActionEvent();\r\n this._addDownloadEvent();\r\n this._addMenuEvent();\r\n this._initMenu();\r\n this._initMenuEvent = true;\r\n }\r\n\r\n /**\r\n * Remove ui event\r\n * @private\r\n */\r\n _removeUiEvent() {\r\n this._removeHelpActionEvent();\r\n this._removeDownloadEvent();\r\n this._removeLoadEvent();\r\n this._removeMainMenuEvent();\r\n }\r\n\r\n /**\r\n * Destroy all menu instance\r\n * @private\r\n */\r\n _destroyAllMenu() {\r\n snippet.forEach(this.options.menu, (menuName) => {\r\n this[menuName].destroy();\r\n });\r\n }\r\n\r\n /**\r\n * Init canvas\r\n * @ignore\r\n */\r\n initCanvas() {\r\n const loadImageInfo = this._getLoadImage();\r\n if (loadImageInfo.path) {\r\n this._actions.main.initLoadImage(loadImageInfo.path, loadImageInfo.name).then(() => {\r\n this.activeMenuEvent();\r\n });\r\n }\r\n\r\n this._addLoadEvent();\r\n\r\n const gridVisual = document.createElement('div');\r\n\r\n gridVisual.className = cls('grid-visual');\r\n const grid = `<table>\r\n <tr><td class=\"dot left-top\"></td><td></td><td class=\"dot right-top\"></td></tr>\r\n <tr><td></td><td></td><td></td></tr>\r\n <tr><td class=\"dot left-bottom\"></td><td></td><td class=\"dot right-bottom\"></td></tr>\r\n </table>`;\r\n gridVisual.innerHTML = grid;\r\n this._editorContainerElement = this._editorElement.querySelector(\r\n '.tui-image-editor-canvas-container'\r\n );\r\n this._editorContainerElement.appendChild(gridVisual);\r\n }\r\n\r\n /**\r\n * get editor area element\r\n * @returns {Object} load image option\r\n * @private\r\n */\r\n _getLoadImage() {\r\n return this.options.loadImage;\r\n }\r\n\r\n /**\r\n * change menu\r\n * @param {string} menuName - menu name\r\n * @param {boolean} toggle - whether toogle or not\r\n * @param {boolean} discardSelection - discard selection\r\n * @ignore\r\n */\r\n changeMenu(menuName, toggle = true, discardSelection = true) {\r\n if (!this._submenuChangeTransection) {\r\n this._submenuChangeTransection = true;\r\n this._changeMenu(menuName, toggle, discardSelection);\r\n this._submenuChangeTransection = false;\r\n }\r\n }\r\n\r\n /**\r\n * change menu\r\n * @param {string} menuName - menu name\r\n * @param {boolean} toggle - whether toogle or not\r\n * @param {boolean} discardSelection - discard selection\r\n * @private\r\n */\r\n _changeMenu(menuName, toggle, discardSelection) {\r\n if (this.submenu) {\r\n this._buttonElements[this.submenu].classList.remove('active');\r\n this._mainElement.classList.remove(`tui-image-editor-menu-${this.submenu}`);\r\n if (discardSelection) {\r\n this._actions.main.discardSelection();\r\n }\r\n this._actions.main.changeSelectableAll(true);\r\n this[this.submenu].changeStandbyMode();\r\n }\r\n\r\n if (this.submenu === menuName && toggle) {\r\n this.submenu = null;\r\n } else {\r\n this._buttonElements[menuName].classList.add('active');\r\n this._mainElement.classList.add(`tui-image-editor-menu-${menuName}`);\r\n this.submenu = menuName;\r\n this[this.submenu].changeStartMode();\r\n }\r\n\r\n this.resizeEditor();\r\n }\r\n\r\n /**\r\n * Init menu\r\n * @private\r\n */\r\n _initMenu() {\r\n if (this.options.initMenu) {\r\n const evt = document.createEvent('MouseEvents');\r\n evt.initEvent('click', true, false);\r\n this._buttonElements[this.options.initMenu].dispatchEvent(evt);\r\n }\r\n\r\n if (this.icon) {\r\n this.icon.registDefaultIcon();\r\n }\r\n }\r\n\r\n /**\r\n * Get canvas max Dimension\r\n * @returns {Object} - width & height of editor\r\n * @private\r\n */\r\n _getCanvasMaxDimension() {\r\n const { maxWidth, maxHeight } = this._editorContainerElement.style;\r\n const width = parseFloat(maxWidth);\r\n const height = parseFloat(maxHeight);\r\n\r\n return {\r\n width,\r\n height,\r\n };\r\n }\r\n\r\n /**\r\n * Set editor position\r\n * @param {string} menuBarPosition - top or right or bottom or left\r\n * @private\r\n */\r\n // eslint-disable-next-line complexity\r\n _setEditorPosition(menuBarPosition) {\r\n const { width, height } = this._getCanvasMaxDimension();\r\n const editorElementStyle = this._editorElement.style;\r\n let top = 0;\r\n let left = 0;\r\n\r\n if (this.submenu) {\r\n if (menuBarPosition === 'bottom') {\r\n if (height > this._editorElementWrap.scrollHeight - 150) {\r\n top = (height - this._editorElementWrap.scrollHeight) / 2;\r\n } else {\r\n top = (150 / 2) * -1;\r\n }\r\n } else if (menuBarPosition === 'top') {\r\n if (height > this._editorElementWrap.offsetHeight - 150) {\r\n top = 150 / 2 - (height - (this._editorElementWrap.offsetHeight - 150)) / 2;\r\n } else {\r\n top = 150 / 2;\r\n }\r\n } else if (menuBarPosition === 'left') {\r\n if (width > this._editorElementWrap.offsetWidth - 248) {\r\n left = 248 / 2 - (width - (this._editorElementWrap.offsetWidth - 248)) / 2;\r\n } else {\r\n left = 248 / 2;\r\n }\r\n } else if (menuBarPosition === 'right') {\r\n if (width > this._editorElementWrap.scrollWidth - 248) {\r\n left = (width - this._editorElementWrap.scrollWidth) / 2;\r\n } else {\r\n left = (248 / 2) * -1;\r\n }\r\n }\r\n }\r\n editorElementStyle.top = `${top}px`;\r\n editorElementStyle.left = `${left}px`;\r\n }\r\n}\r\n\r\nexport default Ui;\r\n"]},"metadata":{},"sourceType":"module"}