diff --git a/simple-mind-map/index.js b/simple-mind-map/index.js index ec7cb0d9..5878bccd 100644 --- a/simple-mind-map/index.js +++ b/simple-mind-map/index.js @@ -7,10 +7,17 @@ import Style from './src/core/render/node/Style' import KeyCommand from './src/core/command/KeyCommand' import Command from './src/core/command/Command' import BatchExecution from './src/utils/BatchExecution' -import { layoutValueList, CONSTANTS, commonCaches } from './src/constants/constant' +import { + layoutValueList, + CONSTANTS, + commonCaches, + ERROR_TYPES +} from './src/constants/constant' import { SVG } from '@svgdotjs/svg.js' import { simpleDeepClone, getType } from './src/utils' -import defaultTheme, { checkIsNodeSizeIndependenceConfig } from './src/themes/default' +import defaultTheme, { + checkIsNodeSizeIndependenceConfig +} from './src/themes/default' import { defaultOpt } from './src/constants/defaultOptions' // 思维导图 @@ -22,11 +29,13 @@ class MindMap { // 容器元素 this.el = this.opt.el + if (!this.el) throw new Error('缺少容器元素el') this.elRect = this.el.getBoundingClientRect() // 画布宽高 this.width = this.elRect.width this.height = this.elRect.height + if (this.width <= 0 || this.height <= 0) throw new Error('容器元素el的宽高不能为0') // 画布 this.svg = SVG().addTo(this.el).size(this.width, this.height) @@ -68,7 +77,7 @@ class MindMap { this.batchExecution = new BatchExecution() // 注册插件 - MindMap.pluginList.forEach((plugin) => { + MindMap.pluginList.forEach(plugin => { this.initPlugin(plugin) }) @@ -136,10 +145,10 @@ class MindMap { // 初始化缓存数据 initCache() { - Object.keys(commonCaches).forEach((key) => { + Object.keys(commonCaches).forEach(key => { let type = getType(commonCaches[key]) let value = '' - switch(type) { + switch (type) { case 'Boolean': value = false break @@ -164,7 +173,7 @@ class MindMap { this.renderer.clearAllActive() this.opt.theme = theme this.render(null, CONSTANTS.CHANGE_THEME) - this.emit('view_theme_change', theme) + this.emit('view_theme_change', theme) } // 获取当前主题 @@ -278,8 +287,12 @@ class MindMap { // 导出 async export(...args) { - let result = await this.doExport.export(...args) - return result + try { + let result = await this.doExport.export(...args) + return result + } catch (error) { + this.mindMap.opt.errorHandler(ERROR_TYPES.EXPORT_ERROR, error) + } } // 转换位置 @@ -327,7 +340,11 @@ class MindMap { // 克隆一份数据 let clone = svg.clone() // 如果实际图形宽高超出了屏幕宽高,且存在水印的话需要重新绘制水印,否则会出现超出部分没有水印的问题 - if ((rect.width > origWidth || rect.height > origHeight) && this.watermark && this.watermark.hasWatermark()) { + if ( + (rect.width > origWidth || rect.height > origHeight) && + this.watermark && + this.watermark.hasWatermark() + ) { this.width = rect.width this.height = rect.height this.watermark.draw() @@ -388,7 +405,7 @@ class MindMap { // 销毁 destroy() { // 移除插件 - [...MindMap.pluginList].forEach((plugin) => { + ;[...MindMap.pluginList].forEach(plugin => { this[plugin.instanceName] = null }) // 解绑事件 @@ -408,8 +425,8 @@ MindMap.usePlugin = (plugin, opt = {}) => { MindMap.pluginList.push(plugin) return MindMap } -MindMap.hasPlugin = (plugin) => { - return MindMap.pluginList.findIndex((item) => { +MindMap.hasPlugin = plugin => { + return MindMap.pluginList.findIndex(item => { return item === plugin }) } diff --git a/simple-mind-map/src/constants/constant.js b/simple-mind-map/src/constants/constant.js index 269c2c12..f07b162f 100644 --- a/simple-mind-map/src/constants/constant.js +++ b/simple-mind-map/src/constants/constant.js @@ -332,4 +332,14 @@ export const nodeDataNoStylePropList = [ export const commonCaches = { measureCustomNodeContentSizeEl: null, measureRichtextNodeTextSizeEl: null +} + +// 错误类型 +export const ERROR_TYPES = { + READ_CLIPBOARD_ERROR: 'read_clipboard_error', + PARSE_PASTE_DATA_ERROR: 'parse_paste_data_error', + CUSTOM_HANDLE_CLIPBOARD_TEXT_ERROR: 'custom_handle_clipboard_text_error', + LOAD_CLIPBOARD_IMAGE_ERROR: 'load_clipboard_image_error', + BEFORE_TEXT_EDIT_ERROR: 'before_text_edit_error', + EXPORT_ERROR: 'export_error' } \ No newline at end of file diff --git a/simple-mind-map/src/constants/defaultOptions.js b/simple-mind-map/src/constants/defaultOptions.js index e1d40911..693a67ef 100644 --- a/simple-mind-map/src/constants/defaultOptions.js +++ b/simple-mind-map/src/constants/defaultOptions.js @@ -151,5 +151,9 @@ export const defaultOpt = { // 如果你的处理逻辑存在异步逻辑,也可以返回一个promise customHandleClipboardText: null, // 禁止鼠标滚轮缩放,你仍旧可以使用api进行缩放 - disableMouseWheelZoom: false + disableMouseWheelZoom: false, + // 错误处理函数 + errorHandler: (code, error) => { + console.error(code, error) + } } diff --git a/simple-mind-map/src/core/render/Render.js b/simple-mind-map/src/core/render/Render.js index 02e11ff9..39506d75 100644 --- a/simple-mind-map/src/core/render/Render.js +++ b/simple-mind-map/src/core/render/Render.js @@ -17,7 +17,7 @@ import { } from '../../utils' import { shapeList } from './node/Shape' import { lineStyleProps } from '../../themes/default' -import { CONSTANTS } from '../../constants/constant' +import { CONSTANTS, ERROR_TYPES } from '../../constants/constant' // 布局列表 const layouts = { @@ -629,6 +629,7 @@ class Render { // 粘贴事件 async onPaste() { + const { errorHandler } = this.mindMap.opt // 读取剪贴板的文字和图片 let text = null let img = null @@ -647,7 +648,7 @@ class Render { } } } catch (error) { - console.log(error) + errorHandler(ERROR_TYPES.READ_CLIPBOARD_ERROR, error) } } // 检查剪切板数据是否有变化 @@ -682,7 +683,9 @@ class Render { text = String(res) } } - } catch (error) {} + } catch (error) { + errorHandler(ERROR_TYPES.CUSTOM_HANDLE_CLIPBOARD_TEXT_ERROR, error) + } } // 默认处理 if (useDefault) { @@ -691,7 +694,9 @@ class Render { if (parsedData && parsedData.simpleMindMap) { smmData = parsedData.data } - } catch (error) {} + } catch (error) { + errorHandler(ERROR_TYPES.PARSE_PASTE_DATA_ERROR, error) + } } if (smmData) { this.mindMap.execCommand( @@ -724,7 +729,7 @@ class Render { }) } } catch (error) { - console.log(error) + errorHandler(ERROR_TYPES.LOAD_CLIPBOARD_IMAGE_ERROR, error) } } } else { diff --git a/simple-mind-map/src/core/render/TextEdit.js b/simple-mind-map/src/core/render/TextEdit.js index 0926d3e0..33569874 100644 --- a/simple-mind-map/src/core/render/TextEdit.js +++ b/simple-mind-map/src/core/render/TextEdit.js @@ -1,4 +1,5 @@ import { getStrWithBrFromHtml, checkNodeOuter } from '../../utils' +import { ERROR_TYPES } from '../../constants/constant' // 节点文字编辑类 export default class TextEdit { @@ -104,6 +105,7 @@ export default class TextEdit { isShow = await beforeTextEdit(node, isInserting) } catch (error) { isShow = false + this.mindMap.opt.errorHandler(ERROR_TYPES.BEFORE_TEXT_EDIT_ERROR, error) } if (!isShow) return } diff --git a/simple-mind-map/src/parse/markdownTo.js b/simple-mind-map/src/parse/markdownTo.js index 38ab7f0f..e399bf22 100644 --- a/simple-mind-map/src/parse/markdownTo.js +++ b/simple-mind-map/src/parse/markdownTo.js @@ -28,7 +28,7 @@ const handleList = node => { } // 将markdown转换成节点树 -export const transformMarkdownTo = async md => { +export const transformMarkdownTo = md => { const tree = fromMarkdown(md) let root = { children: []