UNPKG

vue-poster-editor

Version:

A poster editor based on Vue.js

1,456 lines (1,158 loc) 64.1 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _debounce2 = require('lodash/debounce'); var _debounce3 = _interopRequireDefault(_debounce2); var _pickBy2 = require('lodash/pickBy'); var _pickBy3 = _interopRequireDefault(_pickBy2); var _defaults2 = require('lodash/defaults'); var _defaults3 = _interopRequireDefault(_defaults2); var _forEachRight2 = require('lodash/forEachRight'); var _forEachRight3 = _interopRequireDefault(_forEachRight2); var _isUndefined2 = require('lodash/isUndefined'); var _isUndefined3 = _interopRequireDefault(_isUndefined2); var _isNumber2 = require('lodash/isNumber'); var _isNumber3 = _interopRequireDefault(_isNumber2); var _assign2 = require('lodash/assign'); var _assign3 = _interopRequireDefault(_assign2); var _defaultsDeep2 = require('lodash/defaultsDeep'); var _defaultsDeep3 = _interopRequireDefault(_defaultsDeep2); var _forEach2 = require('lodash/forEach'); var _forEach3 = _interopRequireDefault(_forEach2); var _merge2 = require('lodash/merge'); var _merge3 = _interopRequireDefault(_merge2); var _cloneDeep2 = require('lodash/cloneDeep'); var _cloneDeep3 = _interopRequireDefault(_cloneDeep2); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _stateshot = require('stateshot'); var _editorDefaults = require('./editor-defaults'); var _editorDefaults2 = _interopRequireDefault(_editorDefaults); var _utils = require('./utils/utils'); var _utils2 = _interopRequireDefault(_utils); var _elementUseModel = require('./utils/element-use-model'); var _config = require('./utils/rich-text/config'); var _snapshotRules = require('./utils/snapshot-rules'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } exports.default = { props: ['editorOptions'], data: function data() { return { version: _editorDefaults2.default.version, type: 'poster', supportTypes: ['text', 'image', 'svg', 'mask', 'group'], layouts: [], innerProps: { options: (0, _cloneDeep3.default)(_editorDefaults2.default.options), global: (0, _merge3.default)({}, _editorDefaults2.default.global, _editorDefaults2.default.globalExts), currentLayout: null, currentElement: null, currentSubElement: null, selector: null, snapshotSize: 0, snapshotable: true }, clipboard: [], snapshotSize: 0, hasRedo: false, hasUndo: false }; }, computed: { options: { get: function get() { return this.innerProps.options; }, set: function set(options) { var _this = this; (0, _forEach3.default)(options, function (val, k) { _this.innerProps.options[k] = val; }); } }, global: { get: function get() { return this.innerProps.global; }, set: function set(global) { global = (0, _defaultsDeep3.default)(global, _editorDefaults2.default.global, _editorDefaults2.default.globalExts); global.$draging = false; this.innerProps.global = global; } }, currentLayout: { get: function get() { return this.innerProps.currentLayout; }, set: function set(layout) { this.innerProps.currentLayout = layout; } }, currentElement: { get: function get() { return this.innerProps.currentElement; }, set: function set(element) { var innerProps = this.innerProps; if (element !== innerProps.currentElement) { innerProps.currentElement = element; this.currentSubElement = null; } } }, currentSubElement: { get: function get() { return this.innerProps.currentSubElement; }, set: function set(element) { var innerProps = this.innerProps; var lastSubElement = innerProps.currentSubElement; if (lastSubElement) { lastSubElement.$selected = false; } if (element) { element.$selected = true; } innerProps.currentSubElement = element; } }, mode: { get: function get() { return this.options.mode; }, set: function set(mode) { var supportModes = ['design', 'preview', 'mirror', 'flow']; if (supportModes.indexOf(mode) === -1) { mode = 'design'; } this.options.mode = mode; } }, zoom: { get: function get() { return this.global.zoom || 1; }, set: function set(zoom) { this.global.zoom = zoom; } }, height: { get: function get() { if (this.mode === 'flow') { return this.layouts.reduce(function (prev, next) { return prev + next.height; }, 0); } var currentLayout = this.currentLayout; if (!currentLayout) { return 0; } return currentLayout.height; }, set: function set(height) { var currentLayout = this.currentLayout; if (currentLayout) { currentLayout.height = height; this.makeSnapshot('resize_layout'); } } }, width: { get: function get() { var currentLayout = this.currentLayout; if (!currentLayout) { return 0; } return currentLayout.width; }, set: function set(width) { var currentLayout = this.currentLayout; if (currentLayout) { currentLayout.width = width; this.makeSnapshot('resize_layout'); } } }, editable: function editable() { return this.mode === 'design' || this.mode === 'flow'; }, selector: { get: function get() { return this.innerProps.selector; }, set: function set(val) { this.innerProps.selector = val; } }, selectedElements: function selectedElements() { return this.getSelectedElements(); } }, methods: { setMode: function setMode(mode) { this.mode = mode; }, setOptions: function setOptions(options) { var defaultOpionts = (0, _cloneDeep3.default)(_editorDefaults2.default.options); options = (0, _assign3.default)({}, defaultOpionts, this.options, options); options.fontsMap = options.fontList.reduceRight(function (ret, item) { ret[item.name] = item; if (item.family) { ret[item.family] = item; } return ret; }, {}); this.innerProps.options = options; }, checkVersion: function checkVersion(v) { var selfVer = _utils.version.parse(this.version); var targetVer = _utils.version.parse(v); return selfVer.major >= targetVer.major; }, enableHotkey: function enableHotkey() { this.hotkeys.init(this.handleMap); this.hotkeys.setContext(this); }, disableHotkey: function disableHotkey() {}, resetSnapshot: function resetSnapshot() { this.$snapshots.reset(); this.makeSnapshot('init', null, true, 'templet'); }, makeSnapshot: function makeSnapshot(tag) { var targetLayout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var _this2 = this; var sync = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var scope = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'layout'; if (!this.innerProps.snapshotable) { return; } if (!targetLayout) { targetLayout = this.currentLayout; } var layoutIndex = this.layouts.findIndex(function (layout) { return layout === targetLayout; }); if (scope === 'templet') { layoutIndex = -1; } var state = { tag: tag, scope: scope, elementId: this.currentElement ? this.currentElement.$id : null, layoutId: targetLayout ? targetLayout.$id : null, layouts: this.layouts }; var syncState = function syncState() { _this2.snapshotSize = $snapshots.length; var _ref = [$snapshots.hasRedo, $snapshots.hasUndo]; _this2.hasRedo = _ref[0]; _this2.hasUndo = _ref[1]; }; var $snapshots = this.$snapshots; if (sync) { $snapshots.pushSync(state, layoutIndex); syncState(); } else { $snapshots.push(state, layoutIndex).then(syncState); } }, makeSnapshotByElement: function makeSnapshotByElement(element) { if (element && element.type.charAt(0) !== '$') { this.makeSnapshot('change_element'); } }, applySnapshot: function applySnapshot(snapshot) { var _this3 = this; var prevLayoutId = this.currentLayout && this.currentLayout.$id; var currentElementAfterApply = null; this.innerProps.snapshotable = false; this.snapshotSize = this.$snapshots.length; var _ref2 = [this.$snapshots.hasRedo, this.$snapshots.hasUndo]; this.hasRedo = _ref2[0]; this.hasUndo = _ref2[1]; var resetLayout = function resetLayout(editorLayout, snapshotLayout) { editorLayout.elements = []; _this3.$nextTick(function () { editorLayout.elements = snapshotLayout.elements.map(function (elementData) { var element = _this3.createElement(elementData); element.reset(); if (element.$id === snapshot.elementId) { currentElementAfterApply = element; } return element; }); Object.keys(snapshotLayout).forEach(function (key) { if (key !== 'elements') { editorLayout[key] = snapshotLayout[key]; } }); _this3.currentElement = currentElementAfterApply; if (prevLayoutId !== snapshot.layoutId) { _this3.currentElement = null; } }); }; var targetLayout = this.layouts.find(function (layout) { return layout.$id === snapshot.layoutId; }); if (targetLayout && snapshot.scope === 'layout') { var snapshotLayout = snapshot.layouts.find(function (layout) { return layout.$id === snapshot.layoutId; }); if (targetLayout && snapshotLayout) { resetLayout(targetLayout, snapshotLayout); } } else { var _loop = function _loop(i) { var targetLayout = _this3.layouts[i]; var snapshotLayout = snapshot.layouts[i]; if (!targetLayout && snapshotLayout) { snapshotLayout.elements = snapshotLayout.elements.map(function (element) { return _this3.createElement(element, snapshotLayout); }); _this3.addLayout(snapshotLayout, undefined, false); } else if (targetLayout && !snapshotLayout) { _this3.removeLayout(targetLayout, false); } else { resetLayout(targetLayout, snapshotLayout); } }; for (var i = 0; i < Math.max(this.layouts.length, snapshot.layouts.length); i++) { _loop(i); } } this.innerProps.snapshotable = true; }, undo: function undo() { var currentElement = this.currentElement; if (currentElement && (currentElement.type === '$croper' || currentElement.type === '$masker')) { this.$events.$emit('editor.edit.cancel', currentElement); return; } var snapshot = this.$snapshots.undo().get(); this.applySnapshot(snapshot); }, redo: function redo() { var snapshot = this.$snapshots.redo().get(); this.applySnapshot(snapshot); }, addLayout: function addLayout(layout, index) { var _this4 = this; var elements = layout && (layout.elements || layout.elems); delete layout.elems; var layoutProps = (0, _cloneDeep3.default)(_editorDefaults2.default.layout); layout = (0, _merge3.default)(layoutProps, layout); layout.elements = []; layout.$id = _utils2.default.uuid(); layout.top = 0; if ((0, _isNumber3.default)(index)) { this.layouts.splice(index, 0, layout); } else { this.layouts.push(layout); } if (elements && elements.length) { if (elements[0].zIndex > 0) { elements.sort(function (a, b) { return a.zIndex - b.zIndex; }); elements.forEach(function (element) { delete element.zIndex; }); } elements.forEach(function (element) { _this4.addElement(element, layout); }); } this.makeSnapshot('add_layout', layout, false, 'templet'); if (!this.currentLayout) { this.currentLayout = layout; } return layout; }, removeLayout: function removeLayout(layout) { if ((0, _isNumber3.default)(layout)) { var inx = layout % this.layouts.length; layout = this.layouts[inx]; } else if ((0, _isUndefined3.default)(layout)) { layout = this.currentLayout; } if (layout) { this.clearLayout(layout); var index = this.layouts.indexOf(layout); if (index > -1) { this.layouts.splice(index, 1); } if (layout === this.currentLayout) { this.currentLayout = this.layouts[0] || null; } this.makeSnapshot('remove_layout', layout, false, 'templet'); } }, clearLayout: function clearLayout(layout) { if ((0, _isNumber3.default)(layout)) { var inx = layout % this.layouts.length; layout = this.layouts[inx]; } else if ((0, _isUndefined3.default)(layout)) { layout = this.currentLayout; } if (layout) { layout.elements = []; if (layout === this.currentLayout) { this.currentElement = null; } this.makeSnapshot('clear_layout'); } }, changeLayout: function changeLayout(props, layouts) { layouts = [].concat(layouts || this.currentLayout); layouts.forEach(function (layout) { (0, _assign3.default)(layout, props); }); this.makeSnapshot('change_layout', null, false, 'templet'); }, toggleLayout: function toggleLayout(layout) { if ((0, _isNumber3.default)(layout)) { var inx = layout % this.layouts.length; layout = this.layouts[inx]; } if (layout && layout !== this.currentLayout) { if (this.currentCropElement || this.currentEditMask) { this.$events.$emit('editor.edit.apply', this.currentElement); } this.clearSelectedElements(); this.currentElement = null; this.currentLayout = layout; } }, getLayoutByPoint: function getLayoutByPoint(point) { var y = point.y; var lastLayout = null; var layout = this.layouts.find(function (layout) { lastLayout = layout; return y < layout.top + layout.height; }); return layout || lastLayout; }, getLayoutByElement: function getLayoutByElement(element) { var layouts = this.layouts; element = element || this.currentElement; return layouts.find(function (layout) { return layout.elements.indexOf(element) > -1; }); }, setLayoutByElement: function setLayoutByElement(element) { var layout = this.getLayoutByElement(element); if (layout) { this.toggleLayout(layout); } }, setLayoutByLayoutId: function setLayoutByLayoutId(layoutId) { this.currentLayout = this.layouts.find(function (layout) { return layout.$id === layoutId; }); }, switchLayout: function switchLayout(layoutA, layoutB) { var layouts = this.layouts; var indexA = null; var indexB = null; if ((0, _isNumber3.default)(layoutA)) { indexA = layoutA % layouts.length; layoutA = layouts[indexA]; } else { indexA = layouts.indexOf(layoutA); } if ((0, _isNumber3.default)(layoutB)) { indexB = layoutB % layouts.length; layoutB = layouts[indexB]; } else { indexB = layouts.indexOf(layoutB); } layouts.splice(indexA, 1, layoutB); layouts.splice(indexB, 1, layoutA); this.makeSnapshot('switch_layout'); }, createElement: function createElement(data, layout) { var type = data && data.type; if (!type) { throw new Error('No type to create element:' + JSON.stringify(data)); } if (!this.checkVersion(data.version || '0.0.0')) { throw new Error('Element version not support:' + data.version); } var element = (0, _elementUseModel.useElementModel)(data); if (!layout) { layout = this.currentLayout; } if (layout && (0, _isUndefined3.default)(data.left)) { element.left = Math.max(0, (layout.width - element.width) / 2); } if (layout && (0, _isUndefined3.default)(data.top)) { element.top = Math.max(0, (layout.height - element.height) / 2); } if (type === 'text') { var _options2 = this.options, fontsMap = _options2.fontsMap, fontList = _options2.fontList; if (!fontsMap[element.fontFamily]) { var defaultFont = fontList[0]; element.fontFamily = defaultFont ? defaultFont.name : ''; } } return element; }, addElement: function addElement(data, layout) { var element = data; if (!data || !data.$id) { element = this.createElement(data, layout); } if (this.supportTypes.indexOf(element.type) < 0) { throw new Error('Type [' + element.type + '] not supported'); } if (!layout) { layout = this.currentLayout; } if (layout && layout.elements) { layout.elements.push(element); this.makeSnapshot('add_element', layout); } return element; }, removeElement: function removeElement(elements, layout) { if (!layout) { layout = this.currentLayout; } if (!layout) { return; } var currElement = this.currentElement; if (!elements) { elements = this.getSelectedElements(true); } else if (!Array.isArray(elements)) { elements = [elements]; } if (!elements.length) { return; } elements.forEach(function (element) { var index = layout.elements.indexOf(element); if (index > -1) { layout.elements.splice(index, 1); } }); if (elements.indexOf(currElement) > -1) { this.focusElement(null); } this.$events.$emit('editor.remove', elements); this.makeSnapshot('remove_element'); }, replaceElement: function replaceElement(oldElement, newElement, layout) { oldElement = this.getElement(oldElement); newElement = this.createElement(newElement); if (!layout) { layout = this.currentLayout; } var inx = layout.elements.indexOf(oldElement); layout.elements.splice(inx, 1, newElement); newElement.$id = oldElement.$id; this.makeSnapshot('replace_element'); return newElement; }, changeElement: function changeElement(props, elements) { var _this5 = this; elements = elements ? [].concat(elements) : [this.currentElement]; elements.forEach(function (element) { var invalidProps = null; if (element.type === 'text') { var contentsProps = {}; invalidProps = {}; Object.keys(props).forEach(function (name) { if (!_config.styleMap[name]) { invalidProps[name] = props[name]; } else { contentsProps[name] = props[name]; } }); _this5.changeTextContents(contentsProps, element); } (0, _merge3.default)(element, invalidProps || props); }); this.makeSnapshot('change_element'); }, copyElement: function copyElement(elements) { var toClipboard = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; elements = elements ? [].concat(elements) : this.getSelectedElements(true); elements = elements.filter(function (element) { return element.type.indexOf('$') !== 0; }); if (elements.length) { elements = elements.map(this.createElement); this.options.clipboard.set(elements); if (toClipboard) { this.clipboard = elements; } } return elements; }, cutElement: function cutElement(elements) { var toClipboard = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; elements = elements ? [].concat(elements) : this.getSelectedElements(true); if (elements.length) { this.removeElement(elements); elements = elements.filter(function (element) { return element.type.indexOf('$') !== 0; }); this.copyElement(elements, toClipboard); } return elements; }, pasteElement: function pasteElement(elements, layout) { var _this6 = this; elements = elements || this.clipboard; layout = layout || this.currentLayout; var hookClipboard = this.options.clipboard; var outerContent = hookClipboard.get(); if (outerContent) { elements = outerContent.map(this.createElement); } if (elements.length) { this.clearSelectedElements(); var bbox = _utils2.default.getBBoxByElements(elements, 1); var prePoint = { left: bbox.left, top: bbox.top }; var currentElement = this.currentElement; if (currentElement) { bbox.left = currentElement.left + 20; bbox.top = currentElement.top + 20; } else { bbox.left = (layout.width - bbox.width) / 2; bbox.top = (layout.height - bbox.height) / 2; } elements = elements.map(function (element) { element.$selected = false; element.$id = _utils2.default.uuid(); element = _this6.createElement(element); element.left += bbox.left - prePoint.left; element.top += bbox.top - prePoint.top; return _this6.addElement(element, layout); }); this.focusElement(elements.length === 1 ? elements[0] : null); this.$events.$emit('editor.paste', elements); this.makeSnapshot('paste_element'); return elements; } }, cloneElement: function cloneElement(elements) { elements = elements ? [].concat(elements) : this.getSelectedElements(true); elements = elements.filter(function (element) { return element.type.indexOf('$') !== 0; }); elements = this.copyElement(elements, false); return this.pasteElement(elements); }, lockElement: function lockElement(elements) { this.changeElement({ lock: true }, elements); }, unlockElement: function unlockElement(elements) { this.changeElement({ lock: false }, elements); }, getElementsByPoint: function getElementsByPoint() { var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var layout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.currentLayout; var retElems = []; var options = this.options; var allElems = layout && layout.elements || []; var elems = allElems.filter(function (elem) { return !elem.hidden && !elem.frozen; }); if (!elems || !elems.length) { return retElems; } x -= layout.left || 0; y -= layout.top || 0; if (options.canvasOverflowHidden && (x < 0 || y < 0 || x > this.width || y > this.height)) { return retElems; } (0, _forEachRight3.default)(elems, function (elem) { var rect = _utils2.default.getElementRect(elem, 1); if (_utils2.default.pointInRect(x, y, rect)) { retElems.push(elem); } }); return retElems; }, getElementByPoint: function getElementByPoint() { var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var layout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.currentLayout; var elems = this.getElementsByPoint(x, y, layout); return elems[0] || null; }, elementFromPoint: function elementFromPoint() { var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var layout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.currentLayout; var returnAll = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; var elems = this.getElementsByPoint(x, y, layout); if (returnAll) { return elems; } return elems[0] || null; }, focusElement: function focusElement(element) { element = this.getElement(element, { queryCurrntElement: false }); if (element !== this.currentElement) { this.currentElement = element; } }, focusElementByPoint: function focusElementByPoint(x, y, layout) { var element = this.elementFromPoint(x, y); if (element && element !== this.currentElement) { this.currentElement = element; } if (element && element.type === 'group') { if (this.mode === 'flow') { layout = layout || this.currentLayout; x -= layout.left || 0; y -= layout.top || 0; } var subElement = this.elementFromPoint(x, y, element); this.currentSubElement = subElement; } return element; }, getElement: function getElement(id, options) { options = (0, _defaults3.default)({ queryCurrntElement: true, deep: false }, options); if (id === undefined && options.queryCurrntElement) { return this.currentElement; } if (!id) { return null; } if (id && id.$id) { return id; } var layout = options.layout || this.currentLayout; var elements = layout && layout.elements || []; var ret = null; (0, _forEach3.default)(elements, function (element) { if (element.$id === id) { ret = element; return false; } }); return ret; }, getSelectedElements: function getSelectedElements(withCurrentElement) { var layout = this.currentLayout; var elements = layout ? layout.elements : []; elements = elements.filter(function (element) { return element.$selected; }); var currElement = this.currentElement; if (currElement && withCurrentElement && elements.indexOf(currElement) < 0) { elements.push(currElement); } return elements; }, clearSelectedElements: function clearSelectedElements() { var selectedElements = this.selectedElements; if (selectedElements.length) { selectedElements.forEach(function (element) { element.$selected = false; }); } }, selectElement: function selectElement(element) { element = this.getElement(element); if (!element) { return; } this.selector.add(element); this.selector.showSelector(); }, unselectElement: function unselectElement(element) { element = this.getElement(element); if (!element) { return; } this.selector.remove(element); this.selector.showSelector(); }, alignmentElements: function alignmentElements(direction) { var elements = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.selectedElements; _utils2.default.alignment(direction, elements); this.selector.showSelector(); this.makeSnapshot('apply_alignment'); }, goElementIndex: function goElementIndex(elements, step) { var layout = this.currentLayout; if (!layout) { return; } var allElements = layout && layout.elements || []; elements = elements ? [].concat(elements) : this.getSelectedElements(true); var inx = null; elements = elements.filter(function (element) { if (element && element.type.indexOf('$') < 0) { inx = allElements.indexOf(element); if (inx >= 0 && inx <= allElements.length - 1) { allElements.splice(inx, 1); inx += step; inx = Math.max(0, inx); inx = Math.min(inx, allElements.length); return true; } } }); allElements.splice.apply(allElements, [inx, 0].concat(_toConsumableArray(elements))); this.makeSnapshot('apply_alignment'); }, setElementToTop: function setElementToTop(elements) { this.goElementIndex(elements, this.currentLayout.elements.length); }, setElementToBottom: function setElementToBottom(elements) { this.goElementIndex(elements, -this.currentLayout.elements.length); }, forwardElement: function forwardElement(elements) { this.goElementIndex(elements, 1); }, backwardElement: function backwardElement(elements) { this.goElementIndex(elements, -1); }, createGroup: function createGroup(elements) { var _this7 = this; var self = this; if (!elements) { elements = this.getSelectedElements(); } var childs = []; var flatElements = function flatElements(elements) { elements.forEach(function (element) { if (element.type === 'group') { flatElements(self.collapseGroup(element)); return; } childs.push(element); }); }; flatElements(elements); var bbox = _utils2.default.getBBoxByElements(childs); var group = this.createElement({ type: 'group', height: bbox.height, width: bbox.width, left: bbox.left, top: bbox.top, elements: [] }); childs.forEach(function (element) { element = _this7.addElement(element, group); element.disableEditable(); element.$selected = false; element.left -= group.left; element.top -= group.top; }); return group; }, collapseGroup: function collapseGroup(element) { var _this8 = this; var group = this.getElement(element); var elements = group && group.elements; if (!elements && !elements.length) { return []; } var groupRotate = group.rotate; return elements.map(function (element) { element = _this8.createElement(element); element.enableEditable(); element.rotate += groupRotate; var prePoint = { x: group.left + element.left + element.width / 2, y: group.top + element.top + element.height / 2 }; var newPoint = _utils2.default.getRectPoints({ left: prePoint.x, top: prePoint.y, width: group.width - element.left * 2 - element.width, height: group.height - element.top * 2 - element.height, rotate: groupRotate, skewX: element.skewX, skewY: element.skewY }); element.left += group.left + newPoint.nw.x - prePoint.x; element.top += group.top + newPoint.nw.y - prePoint.y; return element; }); }, addGroupByElements: function addGroupByElements(elements) { var _this9 = this; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (!elements) { elements = this.getSelectedElements(); } if (!elements.length) { return; } var group = this.createGroup(elements); Object.keys(options).forEach(function (key) { group[key] = options[key]; }); elements.forEach(function (element) { _this9.removeElement(element); }); this.addElement(group); this.focusElement(group); }, flatGroup: function flatGroup(element) { var _this10 = this; var groupElement = this.getElement(element); var elements = groupElement && groupElement.elements; if (!elements || groupElement.type === '$selector') { return; } var groupLayout = this.getLayoutByElement(element); var groupIndex = groupLayout.elements.indexOf(groupElement); var indexOffset = groupIndex - groupLayout.elements.length; elements = this.collapseGroup(groupElement); this.removeElement(groupElement); elements.forEach(function (element) { element = _this10.addElement(element); _this10.goElementIndex(element, indexOffset); element.$selected = true; }); this.selector.showSelector(); }, getPointsByElement: function getPointsByElement(element) { var zoom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; element = element || this.currentElement; return _utils2.default.getPointsByElement(element, zoom || this.zoom); }, convertImageToMask: function convertImageToMask(element, layout) { element = this.getElement(element); if (!element) { return; } var data = (0, _pickBy3.default)(element, function (v, k) { return k.charAt(0) !== '$'; }); data.type = 'mask'; data.mask = data.url; data.imageUrl = null; data.imageWidth = data.width; data.imageHeight = data.height; data.imageTransform = { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 }; var clip = data.clip; if (clip) { data.imageWidth += clip.left + clip.right; data.imageHeight += clip.top + clip.bottom; data.imageTransform.tx = -clip.left; data.imageTransform.ty = -clip.top; data.clip = null; data.version = _editorDefaults2.default.version; } var newElement = this.replaceElement(element, data, layout); this.focusElement(newElement); return newElement; }, convertMaskToImage: function convertMaskToImage(element, layout, url) { element = this.getElement(element); if (!element) { return; } var data = (0, _pickBy3.default)(element, function (v, k) { return k.charAt(0) !== '$'; }); data.type = 'image'; data.url = url || data.mask; data.clip = null; data.version = _editorDefaults2.default.version; var newElement = this.replaceElement(element, data, layout); this.focusElement(newElement); return newElement; }, _checkTempletLoaded: function _checkTempletLoaded() { var _this11 = this; var global = this.global; if (global.$loaded) { return; } var unloadLayouts = this.layouts.filter(function (layout) { return !layout.$loaded; }); var count = 0; unloadLayouts.forEach(function (layout) { var unloadedElements = layout.elements.filter(function (element) { return !element.$loaded; }); if (!unloadedElements.length) { layout.$loaded = true; count += 1; _this11.$emit('editor-layout-loaded', layout); _this11.$emit('layout.load', layout); } }); if (count >= unloadLayouts.length) { global.$loaded = true; this.$emit('editor-templet-loaded'); this.$emit('load'); global.$rendered = true; this.$emit('editor-templet-rendered'); } }, checkTempletLoaded: function checkTempletLoaded() { if (!this.checkTempletLoadedLazy) { this.checkTempletLoadedLazy = (0, _debounce3.default)(this._checkTempletLoaded, 96); } this.checkTempletLoadedLazy(); }, resetTemplet: function resetTemplet() { this.resetSnapshot(); this.currentLayout = null; this.currentElement = null; this.layouts = []; }, setTemplet: function setTemplet(tpl) { var _this12 = this; var defaultIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; return _bluebird2.default.try(function () { if (!tpl) { throw new Error('No templet give'); } if (!_this12.checkVersion(tpl.version || '0.0.0')) { throw new Error('This templet is not support'); } _this12.resetTemplet(); }).then(function () { _this12.global = (0, _merge3.default)(_this12.global, tpl.global); _this12.global.zoom = 1; _this12.global.$loaded = false; _this12.type = tpl.type || _this12.global.type || 'poster'; }).then(function () { var layouts = tpl.layouts || []; if (!layouts.length) { layouts.push({}); } layouts.forEach(function (layout) { layout.backgroundColor = _utils.onecolor.rgbaParser(layout.backgroundColor || '#FFFFFF00').cssa(); _this12.addLayout(layout); }); _this12.currentLayout = _this12.layouts[defaultIndex]; }).then(function () { _this12.resetSnapshot(); return _this12.$nextTick(); }).then(function () { _this12.$emit('editor.templet.ready'); _this12.checkTempletLoaded(); }); }, exportTemplet: function exportTemplet(layouts) { var _this13 = this; if (layouts === undefined) { layouts = this.layouts; } else { var args = []; [].slice.call(arguments).forEach(function (item) { args = args.concat(item); }); layouts = args.map(function (item) { if (typeof item === 'number') { return _this13.layouts[item]; } else if ((typeof item === 'undefined' ? 'undefined' : _typeof(item)) === 'object') { return item; } else { console.error('ExportTemplet arguments is not available', layouts); } }).filter(function (item) { return item; }); } var promise = _bluebird2.default.bind(this); return promise.then(function () { var tpl = { version: _this13.version, type: _this13.type, global: _this13.global, layouts: layouts || [] }; return JSON.stringify(tpl, function (k, v) { if (k[0] === '$') { return; } if ((k === 'color' || k === 'backgroundColor') && typeof v === 'string') { return _utils.onecolor.hexa(v); } if (k === 'colors') { if (v instanceof Array) { return v.map(function (color) { return _utils.onecolor.hexa(color); }); } else { var result = {}; for (var key in v) { result[key] = _utils.onecolor.hexa(v[key]); } return result; } } if (k === 'fontFamily') { var _options3 = _this13.options, fontsMap = _options3.fontsMap, fontList = _options3.fontList; var font = fontsMap[v] || fontList[0]; return font.name || font.family || v; } if (v && (typeof v === 'undefined' ? 'undefined' : _typeof(v)) === 'object' && v.type === 'text' && v.contents instanceof Array && v.contents.length) { var contents = _utils.serialize.mergeChild(v.contents); if (contents.length === 1) { v = JSON.parse(JSON.stringify(v)); v.content = contents[0].content; Object.keys(contents[0]).forEach(function (name) { if (v.hasOwnProperty(name) && _config.styleMap[name]) { v[name] = contents[0][name]; } }); v.contents = null; } } return v; }); }); }, exportTempletData: function exportTempletData() { return this.exportTemplet().then(function (content) { return JSON.parse(content); }); }, exportResourceBlobs: function exportResourceBlobs(layouts, options) { var urlHandler = function urlHandler(element, _options) { var mapKeys = element.type === 'mask' ? ['url', 'mask', 'imageUrl', 'effectedImage'] : ['url', 'effectedImage']; var resource = {}; mapKeys.forEach(function (key) { var url = element[key]; var valid = url && url.indexOf(';base64') > 0 && url.length > _options.contentLimit; if (valid) { resource[key] = _utils2.default.dataurlToBlob(url); } }); return _bluebird2.default.resolve(resource); }; var defaultOptions = { contentLimit: 5, mask: urlHandler, image: urlHandler, svg: function svg(element) { var resource = {}; var url = element.url, content = element.content;