@opentiny/fluent-editor 4.0.0-alpha.12 → 4.0.0-alpha.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- import { merge } from "lodash-es";
5
4
  import Quill from "quill";
5
+ import { merge } from "../../utils/merge.es.js";
6
6
  import { CustomImage } from "./image.es.js";
7
7
  import DefaultOptions from "./options.es.js";
8
8
  import "./specs/index.es.js";
@@ -1 +1 @@
1
- {"version":3,"file":"blot-formatter.es.js","sources":["../../../../src/modules/custom-image/blot-formatter.ts"],"sourcesContent":["import type FluentEditor from '../../core/fluent-editor'\nimport type { Action } from './actions'\nimport type { BlotFormatterOptions } from './options'\nimport type { BlotSpec } from './specs'\nimport { merge as deepmerge } from 'lodash-es'\nimport Quill from 'quill'\nimport { CustomImage } from './image'\nimport DefaultOptions from './options'\nimport { CustomImageSpec } from './specs'\n\nconst dontMerge = (_destination: Array<any>, source: Array<any>) => source\n\nexport class BlotFormatter {\n options: BlotFormatterOptions\n currentSpec: BlotSpec\n specs: BlotSpec[]\n overlay: HTMLElement\n actions: Action[]\n observer: MutationObserver\n\n static register() {\n Quill.register({\n 'formats/image': CustomImage,\n 'modules/image-spec': CustomImageSpec,\n }, true)\n }\n\n constructor(public quill: FluentEditor, options: Partial<BlotFormatterOptions> = {}) {\n this.options = deepmerge({}, DefaultOptions, options, { arrayMerge: dontMerge })\n if (options.allowInvalidUrl !== undefined) {\n this.options.allowInvalidUrl = options.allowInvalidUrl\n }\n CustomImage.setOptions(this.options.allowInvalidUrl)\n this.currentSpec = null\n this.actions = []\n this.overlay = document.createElement('div')\n this.overlay.classList.add(this.options.overlay.className)\n if (this.options.overlay.style) {\n Object.assign(this.overlay.style, this.options.overlay.style)\n }\n\n // disable native image resizing on firefox\n document.execCommand('enableObjectResizing', false, 'false') // eslint-disable-next-line-line no-undef\n this.quill.root.addEventListener('click', this.onClick)\n this.specs = this.options.specs.map((SpecClass: any) => new SpecClass(this))\n this.specs.forEach(spec => spec.init())\n }\n\n show(spec: BlotSpec) {\n this.currentSpec = spec\n this.currentSpec.setSelection()\n this.setUserSelect('none')\n this.quill.root.parentNode.appendChild(this.overlay)\n this.repositionOverlay()\n this.createActions(spec)\n\n // fix: 图片对齐之后,虚线外框应该跟随移动\n const imageDom = spec.getTargetElement()\n const win: any = window\n const MutationObserver: typeof window.MutationObserver = win.MutationObserver || win.WebKitMutationObserver || win.MozMutationObserver\n const element = imageDom.parentNode\n this.observer = new MutationObserver((mutationList) => {\n for (const mutation of mutationList) {\n const target = mutation.target as HTMLElement\n const image = target.querySelector('img')\n if (image) {\n this.repositionOverlay()\n }\n }\n })\n this.observer.observe(element, {\n attributes: true,\n attributeFilter: ['class'],\n attributeOldValue: true,\n subtree: true,\n })\n }\n\n hide() {\n if (!this.currentSpec) {\n return\n }\n\n const imgDom = this.currentSpec.getTargetElement()\n if (imgDom) {\n imgDom.classList.remove('current-select-img')\n }\n\n this.currentSpec.onHide()\n this.currentSpec = null\n this.quill.root.parentNode.removeChild(this.overlay)\n this.overlay.style.setProperty('display', 'none')\n this.setUserSelect('')\n this.destroyActions()\n }\n\n update() {\n this.repositionOverlay()\n this.actions.forEach(action => action.onUpdate())\n }\n\n createActions(spec: BlotSpec) {\n this.actions = spec.getActions().map((ActionClass: any) => {\n const action: Action = new ActionClass(this)\n action.onCreate()\n return action\n })\n }\n\n destroyActions() {\n this.actions.forEach((action: Action) => action.onDestroy())\n this.actions = []\n }\n\n repositionOverlay() {\n if (!this.currentSpec) {\n return\n }\n\n const overlayTarget = this.currentSpec.getOverlayElement()\n if (!overlayTarget) {\n return\n }\n\n const parent = this.quill.root.parentElement\n const specRect = overlayTarget.getBoundingClientRect()\n const parentRect = parent.getBoundingClientRect()\n\n Object.assign(this.overlay.style, {\n display: 'block',\n left: `${specRect.left - parentRect.left - 1 + parent.scrollLeft}px`,\n top: `${specRect.top - parentRect.top + parent.scrollTop}px`,\n width: `${specRect.width}px`,\n height: `${specRect.height}px`,\n })\n }\n\n setUserSelect(value: string) {\n const props: string[] = [\n 'userSelect',\n 'mozUserSelect',\n 'webkitUserSelect',\n 'msUserSelect',\n ]\n\n props.forEach((prop: string) => {\n // set on contenteditable element and <html>\n this.quill.root.style.setProperty(prop, value)\n if (document.documentElement) {\n document.documentElement.style.setProperty(prop, value)\n }\n })\n }\n\n onClick = () => {\n this.hide()\n }\n}\n"],"names":["deepmerge"],"mappings":"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"}
1
+ {"version":3,"file":"blot-formatter.es.js","sources":["../../../../src/modules/custom-image/blot-formatter.ts"],"sourcesContent":["import type FluentEditor from '../../core/fluent-editor'\nimport type { Action } from './actions'\nimport type { BlotFormatterOptions } from './options'\nimport type { BlotSpec } from './specs'\nimport Quill from 'quill'\nimport { merge as deepmerge } from '../../utils/merge'\nimport { CustomImage } from './image'\nimport DefaultOptions from './options'\nimport { CustomImageSpec } from './specs'\n\nconst dontMerge = (_destination: Array<any>, source: Array<any>) => source\n\nexport class BlotFormatter {\n options: BlotFormatterOptions\n currentSpec: BlotSpec\n specs: BlotSpec[]\n overlay: HTMLElement\n actions: Action[]\n observer: MutationObserver\n\n static register() {\n Quill.register({\n 'formats/image': CustomImage,\n 'modules/image-spec': CustomImageSpec,\n }, true)\n }\n\n constructor(public quill: FluentEditor, options: Partial<BlotFormatterOptions> = {}) {\n this.options = deepmerge({}, DefaultOptions, options, { arrayMerge: dontMerge })\n if (options.allowInvalidUrl !== undefined) {\n this.options.allowInvalidUrl = options.allowInvalidUrl\n }\n CustomImage.setOptions(this.options.allowInvalidUrl)\n this.currentSpec = null\n this.actions = []\n this.overlay = document.createElement('div')\n this.overlay.classList.add(this.options.overlay.className)\n if (this.options.overlay.style) {\n Object.assign(this.overlay.style, this.options.overlay.style)\n }\n\n // disable native image resizing on firefox\n document.execCommand('enableObjectResizing', false, 'false') // eslint-disable-next-line-line no-undef\n this.quill.root.addEventListener('click', this.onClick)\n this.specs = this.options.specs.map((SpecClass: any) => new SpecClass(this))\n this.specs.forEach(spec => spec.init())\n }\n\n show(spec: BlotSpec) {\n this.currentSpec = spec\n this.currentSpec.setSelection()\n this.setUserSelect('none')\n this.quill.root.parentNode.appendChild(this.overlay)\n this.repositionOverlay()\n this.createActions(spec)\n\n // fix: 图片对齐之后,虚线外框应该跟随移动\n const imageDom = spec.getTargetElement()\n const win: any = window\n const MutationObserver: typeof window.MutationObserver = win.MutationObserver || win.WebKitMutationObserver || win.MozMutationObserver\n const element = imageDom.parentNode\n this.observer = new MutationObserver((mutationList) => {\n for (const mutation of mutationList) {\n const target = mutation.target as HTMLElement\n const image = target.querySelector('img')\n if (image) {\n this.repositionOverlay()\n }\n }\n })\n this.observer.observe(element, {\n attributes: true,\n attributeFilter: ['class'],\n attributeOldValue: true,\n subtree: true,\n })\n }\n\n hide() {\n if (!this.currentSpec) {\n return\n }\n\n const imgDom = this.currentSpec.getTargetElement()\n if (imgDom) {\n imgDom.classList.remove('current-select-img')\n }\n\n this.currentSpec.onHide()\n this.currentSpec = null\n this.quill.root.parentNode.removeChild(this.overlay)\n this.overlay.style.setProperty('display', 'none')\n this.setUserSelect('')\n this.destroyActions()\n }\n\n update() {\n this.repositionOverlay()\n this.actions.forEach(action => action.onUpdate())\n }\n\n createActions(spec: BlotSpec) {\n this.actions = spec.getActions().map((ActionClass: any) => {\n const action: Action = new ActionClass(this)\n action.onCreate()\n return action\n })\n }\n\n destroyActions() {\n this.actions.forEach((action: Action) => action.onDestroy())\n this.actions = []\n }\n\n repositionOverlay() {\n if (!this.currentSpec) {\n return\n }\n\n const overlayTarget = this.currentSpec.getOverlayElement()\n if (!overlayTarget) {\n return\n }\n\n const parent = this.quill.root.parentElement\n const specRect = overlayTarget.getBoundingClientRect()\n const parentRect = parent.getBoundingClientRect()\n\n Object.assign(this.overlay.style, {\n display: 'block',\n left: `${specRect.left - parentRect.left - 1 + parent.scrollLeft}px`,\n top: `${specRect.top - parentRect.top + parent.scrollTop}px`,\n width: `${specRect.width}px`,\n height: `${specRect.height}px`,\n })\n }\n\n setUserSelect(value: string) {\n const props: string[] = [\n 'userSelect',\n 'mozUserSelect',\n 'webkitUserSelect',\n 'msUserSelect',\n ]\n\n props.forEach((prop: string) => {\n // set on contenteditable element and <html>\n this.quill.root.style.setProperty(prop, value)\n if (document.documentElement) {\n document.documentElement.style.setProperty(prop, value)\n }\n })\n }\n\n onClick = () => {\n this.hide()\n }\n}\n"],"names":["deepmerge"],"mappings":";;;;;;;;;AAUA,MAAM,YAAY,CAAC,cAA0B,WAAuB;AAE7D,MAAM,cAAc;AAAA,EAezB,YAAmB,OAAqB,UAAyC,IAAI;AAdrF;AACA;AACA;AACA;AACA;AACA;AAwIA,mCAAU,MAAM;AACd,WAAK,KAAA;AAAA,IACP;AAjImB,SAAA,QAAA;AACjB,SAAK,UAAUA,MAAU,CAAA,GAAI,gBAAgB,SAAS,EAAE,YAAY,WAAW;AAC/E,QAAI,QAAQ,oBAAoB,QAAW;AACzC,WAAK,QAAQ,kBAAkB,QAAQ;AAAA,IACzC;AACA,gBAAY,WAAW,KAAK,QAAQ,eAAe;AACnD,SAAK,cAAc;AACnB,SAAK,UAAU,CAAA;AACf,SAAK,UAAU,SAAS,cAAc,KAAK;AAC3C,SAAK,QAAQ,UAAU,IAAI,KAAK,QAAQ,QAAQ,SAAS;AACzD,QAAI,KAAK,QAAQ,QAAQ,OAAO;AAC9B,aAAO,OAAO,KAAK,QAAQ,OAAO,KAAK,QAAQ,QAAQ,KAAK;AAAA,IAC9D;AAGA,aAAS,YAAY,wBAAwB,OAAO,OAAO;AAC3D,SAAK,MAAM,KAAK,iBAAiB,SAAS,KAAK,OAAO;AACtD,SAAK,QAAQ,KAAK,QAAQ,MAAM,IAAI,CAAC,cAAmB,IAAI,UAAU,IAAI,CAAC;AAC3E,SAAK,MAAM,QAAQ,CAAA,SAAQ,KAAK,MAAM;AAAA,EACxC;AAAA,EA1BA,OAAO,WAAW;AAChB,UAAM,SAAS;AAAA,MACb,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,IAAA,GACrB,IAAI;AAAA,EACT;AAAA,EAuBA,KAAK,MAAgB;AACnB,SAAK,cAAc;AACnB,SAAK,YAAY,aAAA;AACjB,SAAK,cAAc,MAAM;AACzB,SAAK,MAAM,KAAK,WAAW,YAAY,KAAK,OAAO;AACnD,SAAK,kBAAA;AACL,SAAK,cAAc,IAAI;AAGvB,UAAM,WAAW,KAAK,iBAAA;AACtB,UAAM,MAAW;AACjB,UAAM,mBAAmD,IAAI,oBAAoB,IAAI,0BAA0B,IAAI;AACnH,UAAM,UAAU,SAAS;AACzB,SAAK,WAAW,IAAI,iBAAiB,CAAC,iBAAiB;AACrD,iBAAW,YAAY,cAAc;AACnC,cAAM,SAAS,SAAS;AACxB,cAAM,QAAQ,OAAO,cAAc,KAAK;AACxC,YAAI,OAAO;AACT,eAAK,kBAAA;AAAA,QACP;AAAA,MACF;AAAA,IACF,CAAC;AACD,SAAK,SAAS,QAAQ,SAAS;AAAA,MAC7B,YAAY;AAAA,MACZ,iBAAiB,CAAC,OAAO;AAAA,MACzB,mBAAmB;AAAA,MACnB,SAAS;AAAA,IAAA,CACV;AAAA,EACH;AAAA,EAEA,OAAO;AACL,QAAI,CAAC,KAAK,aAAa;AACrB;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,YAAY,iBAAA;AAChC,QAAI,QAAQ;AACV,aAAO,UAAU,OAAO,oBAAoB;AAAA,IAC9C;AAEA,SAAK,YAAY,OAAA;AACjB,SAAK,cAAc;AACnB,SAAK,MAAM,KAAK,WAAW,YAAY,KAAK,OAAO;AACnD,SAAK,QAAQ,MAAM,YAAY,WAAW,MAAM;AAChD,SAAK,cAAc,EAAE;AACrB,SAAK,eAAA;AAAA,EACP;AAAA,EAEA,SAAS;AACP,SAAK,kBAAA;AACL,SAAK,QAAQ,QAAQ,CAAA,WAAU,OAAO,UAAU;AAAA,EAClD;AAAA,EAEA,cAAc,MAAgB;AAC5B,SAAK,UAAU,KAAK,WAAA,EAAa,IAAI,CAAC,gBAAqB;AACzD,YAAM,SAAiB,IAAI,YAAY,IAAI;AAC3C,aAAO,SAAA;AACP,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,iBAAiB;AACf,SAAK,QAAQ,QAAQ,CAAC,WAAmB,OAAO,WAAW;AAC3D,SAAK,UAAU,CAAA;AAAA,EACjB;AAAA,EAEA,oBAAoB;AAClB,QAAI,CAAC,KAAK,aAAa;AACrB;AAAA,IACF;AAEA,UAAM,gBAAgB,KAAK,YAAY,kBAAA;AACvC,QAAI,CAAC,eAAe;AAClB;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,UAAM,WAAW,cAAc,sBAAA;AAC/B,UAAM,aAAa,OAAO,sBAAA;AAE1B,WAAO,OAAO,KAAK,QAAQ,OAAO;AAAA,MAChC,SAAS;AAAA,MACT,MAAM,GAAG,SAAS,OAAO,WAAW,OAAO,IAAI,OAAO,UAAU;AAAA,MAChE,KAAK,GAAG,SAAS,MAAM,WAAW,MAAM,OAAO,SAAS;AAAA,MACxD,OAAO,GAAG,SAAS,KAAK;AAAA,MACxB,QAAQ,GAAG,SAAS,MAAM;AAAA,IAAA,CAC3B;AAAA,EACH;AAAA,EAEA,cAAc,OAAe;AAC3B,UAAM,QAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAGF,UAAM,QAAQ,CAAC,SAAiB;AAE9B,WAAK,MAAM,KAAK,MAAM,YAAY,MAAM,KAAK;AAC7C,UAAI,SAAS,iBAAiB;AAC5B,iBAAS,gBAAgB,MAAM,YAAY,MAAM,KAAK;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH;AAKF;"}
@@ -1,7 +1,7 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- import { debounce } from "lodash-es";
4
+ import { debounce } from "../utils/debounce.es.js";
5
5
  const DEFAULT_OPTIONS = {
6
6
  // @ts-ignore
7
7
  emojiData: window.emojiData,
@@ -1 +1 @@
1
- {"version":3,"file":"emoji.es.js","sources":["../../../src/modules/emoji.ts"],"sourcesContent":["import type { EmojiMartData } from '@emoji-mart/data'\nimport type { computePosition } from '@floating-ui/dom'\nimport type { Picker } from 'emoji-mart'\nimport type TypeToolbar from 'quill/modules/toolbar'\nimport type FluentEditor from '../fluent-editor'\nimport { debounce } from 'lodash-es'\n\nexport interface EmojiModuleOptions {\n emojiData?: EmojiMartData\n EmojiPicker?: new (props: any) => Picker\n emojiPickerPosition?: typeof computePosition\n theme?: string\n locale?: string\n set?: string\n skinTonePosition?: string\n previewPosition?: string\n searchPosition?: string\n categories?: string[]\n maxFrequentRows?: number\n perLine?: number\n navPosition?: string\n noCountryFlags?: boolean\n dynamicWidth?: boolean\n}\n\nconst DEFAULT_OPTIONS: EmojiModuleOptions = {\n // @ts-ignore\n emojiData: window.emojiData,\n // @ts-ignore\n EmojiPicker: window.EmojiPicker,\n // @ts-ignore\n emojiPickerPosition: window.emojiPickerPosition,\n theme: 'light',\n set: 'native',\n skinTonePosition: 'none',\n previewPosition: 'bottom',\n searchPosition: 'sticky',\n categories: ['frequent', 'people', 'nature', 'foods', 'activity', 'places', 'objects', 'symbols', 'flags'],\n maxFrequentRows: 2,\n perLine: 8,\n navPosition: 'top',\n noCountryFlags: false,\n dynamicWidth: false,\n}\n\nconst PICKER_DOM_ID = 'emoji-picker'\n\nconst LOCALE_MAP = {\n 'zh-CN': 'zh',\n 'en-US': 'en',\n} as const\n\nclass EmojiModule {\n private readonly quill: FluentEditor\n private readonly options: EmojiModuleOptions\n private picker: HTMLElement | null = null\n private isPickerVisible = false\n private cleanupResizeObserver: (() => void) | null = null\n\n constructor(quill: FluentEditor, options: EmojiModuleOptions = {}) {\n this.quill = quill\n\n this.options = { ...DEFAULT_OPTIONS, ...options }\n\n const toolbar = this.quill.getModule('toolbar') as TypeToolbar\n\n if (toolbar) {\n toolbar.addHandler('emoji', () => {\n if (this.isPickerVisible) {\n this.closeDialog()\n }\n else {\n this.openDialog()\n }\n })\n }\n }\n\n private getEmojiButton() {\n return document.querySelector('.ql-emoji') as HTMLElement | null\n }\n\n private async updatePickerPosition() {\n const button = this.getEmojiButton()\n const pickerElement = document.getElementById(PICKER_DOM_ID)\n\n if (!button || !this.picker || !pickerElement) {\n return\n }\n\n const { emojiPickerPosition } = this.options\n\n try {\n const { x, y } = await emojiPickerPosition(button, pickerElement)\n this.picker.style.top = `${y}px`\n this.picker.style.left = `${x}px`\n }\n catch (error) {\n console.warn('Failed to compute picker position:', error)\n }\n }\n\n // 监听容器大小变化,更新表情选择弹窗位置\n private setupContainerResizeObserver() {\n const container = this.quill.root.parentElement\n if (!container) {\n return null\n }\n\n const debouncedUpdate = debounce(() => {\n this.updatePickerPosition()\n }, 100)\n\n const resizeObserver = new ResizeObserver(() => {\n debouncedUpdate()\n })\n\n resizeObserver.observe(container)\n\n return () => {\n resizeObserver.disconnect()\n debouncedUpdate.cancel()\n }\n }\n\n // 创建表情选择弹窗\n private createPicker() {\n const { EmojiPicker, emojiData, ...options } = this.options\n\n const pickerConfig = {\n // emoji-mart 与 tiny-editor 国际化的的 locale 不一致使用 LOCALE_MAP 转换\n locale: LOCALE_MAP[this.quill.lang] ?? 'en',\n data: emojiData,\n ...options,\n onEmojiSelect: this.handleEmojiSelect.bind(this),\n onClickOutside: this.handleClickOutside.bind(this),\n }\n\n const picker = new EmojiPicker(pickerConfig) as unknown as HTMLElement\n\n // 设置样式和属性\n picker.id = PICKER_DOM_ID\n picker.style.position = 'absolute'\n picker.style.zIndex = '1000'\n\n return picker\n }\n\n // 打开表情弹窗\n public openDialog() {\n if (this.picker) {\n return\n }\n\n try {\n this.picker = this.createPicker()\n document.body.appendChild(this.picker)\n\n this.updatePickerPosition()\n this.cleanupResizeObserver = this.setupContainerResizeObserver()\n this.isPickerVisible = true\n }\n catch (error) {\n console.error('Failed to open emoji picker:', error)\n this.closeDialog()\n }\n }\n\n // 关闭表情弹窗\n public closeDialog() {\n if (!this.picker) {\n return\n }\n\n this.isPickerVisible = false\n this.picker.remove()\n this.picker = null\n\n this.cleanupResizeObserver?.()\n this.cleanupResizeObserver = null\n }\n\n // 处理表情选择事件\n private handleEmojiSelect(emoji: { native: string }) {\n const selection = this.quill.getSelection(true)\n if (!selection) {\n console.warn('No selection available for emoji insertion')\n return\n }\n\n try {\n // 记录插入位置\n const insertIndex = selection.index\n this.quill.insertText(insertIndex, emoji.native, 'user')\n\n this.closeDialog()\n\n // 设置光标到表情符号后面\n this.quill.setSelection(insertIndex + emoji.native.length)\n }\n catch (error) {\n console.error('Failed to insert emoji:', error)\n }\n }\n\n // 处理外部点击事件\n private handleClickOutside(event: MouseEvent) {\n const button = this.getEmojiButton()\n\n const target = event.target\n\n const isClickOnButton = target === button || (target instanceof Element && button?.contains(target))\n\n // 如果点击的是表情符号按钮或其子元素,则不关闭选择器\n if (isClickOnButton) {\n return\n }\n\n this.closeDialog()\n }\n\n // 销毁模块,清理资源\n public destroy() {\n this.cleanupResizeObserver?.()\n this.cleanupResizeObserver = null\n this.closeDialog()\n }\n}\n\nexport { EmojiModule }\n"],"names":[],"mappings":";;;;AAyBA,MAAM,kBAAsC;AAAA;AAAA,EAE1C,WAAW,OAAO;AAAA;AAAA,EAElB,aAAa,OAAO;AAAA;AAAA,EAEpB,qBAAqB,OAAO;AAAA,EAC5B,OAAO;AAAA,EACP,KAAK;AAAA,EACL,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,YAAY,CAAC,YAAY,UAAU,UAAU,SAAS,YAAY,UAAU,WAAW,WAAW,OAAO;AAAA,EACzG,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,cAAc;AAChB;AAEA,MAAM,gBAAgB;AAEtB,MAAM,aAAa;AAAA,EACjB,SAAS;AAAA,EACT,SAAS;AACX;AAEA,MAAM,YAAY;AAAA,EAOhB,YAAY,OAAqB,UAA8B,IAAI;AANlD;AACA;AACT,kCAA6B;AAC7B,2CAAkB;AAClB,iDAA6C;AAGnD,SAAK,QAAQ;AAEb,SAAK,UAAU,EAAE,GAAG,iBAAiB,GAAG,QAAA;AAExC,UAAM,UAAU,KAAK,MAAM,UAAU,SAAS;AAE9C,QAAI,SAAS;AACX,cAAQ,WAAW,SAAS,MAAM;AAChC,YAAI,KAAK,iBAAiB;AACxB,eAAK,YAAA;AAAA,QACP,OACK;AACH,eAAK,WAAA;AAAA,QACP;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,iBAAiB;AACvB,WAAO,SAAS,cAAc,WAAW;AAAA,EAC3C;AAAA,EAEA,MAAc,uBAAuB;AACnC,UAAM,SAAS,KAAK,eAAA;AACpB,UAAM,gBAAgB,SAAS,eAAe,aAAa;AAE3D,QAAI,CAAC,UAAU,CAAC,KAAK,UAAU,CAAC,eAAe;AAC7C;AAAA,IACF;AAEA,UAAM,EAAE,wBAAwB,KAAK;AAErC,QAAI;AACF,YAAM,EAAE,GAAG,EAAA,IAAM,MAAM,oBAAoB,QAAQ,aAAa;AAChE,WAAK,OAAO,MAAM,MAAM,GAAG,CAAC;AAC5B,WAAK,OAAO,MAAM,OAAO,GAAG,CAAC;AAAA,IAC/B,SACO,OAAO;AACZ,cAAQ,KAAK,sCAAsC,KAAK;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA,EAGQ,+BAA+B;AACrC,UAAM,YAAY,KAAK,MAAM,KAAK;AAClC,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,SAAS,MAAM;AACrC,WAAK,qBAAA;AAAA,IACP,GAAG,GAAG;AAEN,UAAM,iBAAiB,IAAI,eAAe,MAAM;AAC9C,sBAAA;AAAA,IACF,CAAC;AAED,mBAAe,QAAQ,SAAS;AAEhC,WAAO,MAAM;AACX,qBAAe,WAAA;AACf,sBAAgB,OAAA;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EAGQ,eAAe;AACrB,UAAM,EAAE,aAAa,WAAW,GAAG,QAAA,IAAY,KAAK;AAEpD,UAAM,eAAe;AAAA;AAAA,MAEnB,QAAQ,WAAW,KAAK,MAAM,IAAI,KAAK;AAAA,MACvC,MAAM;AAAA,MACN,GAAG;AAAA,MACH,eAAe,KAAK,kBAAkB,KAAK,IAAI;AAAA,MAC/C,gBAAgB,KAAK,mBAAmB,KAAK,IAAI;AAAA,IAAA;AAGnD,UAAM,SAAS,IAAI,YAAY,YAAY;AAG3C,WAAO,KAAK;AACZ,WAAO,MAAM,WAAW;AACxB,WAAO,MAAM,SAAS;AAEtB,WAAO;AAAA,EACT;AAAA;AAAA,EAGO,aAAa;AAClB,QAAI,KAAK,QAAQ;AACf;AAAA,IACF;AAEA,QAAI;AACF,WAAK,SAAS,KAAK,aAAA;AACnB,eAAS,KAAK,YAAY,KAAK,MAAM;AAErC,WAAK,qBAAA;AACL,WAAK,wBAAwB,KAAK,6BAAA;AAClC,WAAK,kBAAkB;AAAA,IACzB,SACO,OAAO;AACZ,cAAQ,MAAM,gCAAgC,KAAK;AACnD,WAAK,YAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA,EAGO,cAAc;;AACnB,QAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,IACF;AAEA,SAAK,kBAAkB;AACvB,SAAK,OAAO,OAAA;AACZ,SAAK,SAAS;AAEd,eAAK,0BAAL;AACA,SAAK,wBAAwB;AAAA,EAC/B;AAAA;AAAA,EAGQ,kBAAkB,OAA2B;AACnD,UAAM,YAAY,KAAK,MAAM,aAAa,IAAI;AAC9C,QAAI,CAAC,WAAW;AACd,cAAQ,KAAK,4CAA4C;AACzD;AAAA,IACF;AAEA,QAAI;AAEF,YAAM,cAAc,UAAU;AAC9B,WAAK,MAAM,WAAW,aAAa,MAAM,QAAQ,MAAM;AAEvD,WAAK,YAAA;AAGL,WAAK,MAAM,aAAa,cAAc,MAAM,OAAO,MAAM;AAAA,IAC3D,SACO,OAAO;AACZ,cAAQ,MAAM,2BAA2B,KAAK;AAAA,IAChD;AAAA,EACF;AAAA;AAAA,EAGQ,mBAAmB,OAAmB;AAC5C,UAAM,SAAS,KAAK,eAAA;AAEpB,UAAM,SAAS,MAAM;AAErB,UAAM,kBAAkB,WAAW,UAAW,kBAAkB,YAAW,iCAAQ,SAAS;AAG5F,QAAI,iBAAiB;AACnB;AAAA,IACF;AAEA,SAAK,YAAA;AAAA,EACP;AAAA;AAAA,EAGO,UAAU;;AACf,eAAK,0BAAL;AACA,SAAK,wBAAwB;AAC7B,SAAK,YAAA;AAAA,EACP;AACF;"}
1
+ {"version":3,"file":"emoji.es.js","sources":["../../../src/modules/emoji.ts"],"sourcesContent":["import type { EmojiMartData } from '@emoji-mart/data'\nimport type { computePosition } from '@floating-ui/dom'\nimport type { Picker } from 'emoji-mart'\nimport type TypeToolbar from 'quill/modules/toolbar'\nimport type FluentEditor from '../fluent-editor'\nimport { debounce } from '../utils/debounce'\n\nexport interface EmojiModuleOptions {\n emojiData?: EmojiMartData\n EmojiPicker?: new (props: any) => Picker\n emojiPickerPosition?: typeof computePosition\n theme?: string\n locale?: string\n set?: string\n skinTonePosition?: string\n previewPosition?: string\n searchPosition?: string\n categories?: string[]\n maxFrequentRows?: number\n perLine?: number\n navPosition?: string\n noCountryFlags?: boolean\n dynamicWidth?: boolean\n}\n\nconst DEFAULT_OPTIONS: EmojiModuleOptions = {\n // @ts-ignore\n emojiData: window.emojiData,\n // @ts-ignore\n EmojiPicker: window.EmojiPicker,\n // @ts-ignore\n emojiPickerPosition: window.emojiPickerPosition,\n theme: 'light',\n set: 'native',\n skinTonePosition: 'none',\n previewPosition: 'bottom',\n searchPosition: 'sticky',\n categories: ['frequent', 'people', 'nature', 'foods', 'activity', 'places', 'objects', 'symbols', 'flags'],\n maxFrequentRows: 2,\n perLine: 8,\n navPosition: 'top',\n noCountryFlags: false,\n dynamicWidth: false,\n}\n\nconst PICKER_DOM_ID = 'emoji-picker'\n\nconst LOCALE_MAP = {\n 'zh-CN': 'zh',\n 'en-US': 'en',\n} as const\n\nclass EmojiModule {\n private readonly quill: FluentEditor\n private readonly options: EmojiModuleOptions\n private picker: HTMLElement | null = null\n private isPickerVisible = false\n private cleanupResizeObserver: (() => void) | null = null\n\n constructor(quill: FluentEditor, options: EmojiModuleOptions = {}) {\n this.quill = quill\n\n this.options = { ...DEFAULT_OPTIONS, ...options }\n\n const toolbar = this.quill.getModule('toolbar') as TypeToolbar\n\n if (toolbar) {\n toolbar.addHandler('emoji', () => {\n if (this.isPickerVisible) {\n this.closeDialog()\n }\n else {\n this.openDialog()\n }\n })\n }\n }\n\n private getEmojiButton() {\n return document.querySelector('.ql-emoji') as HTMLElement | null\n }\n\n private async updatePickerPosition() {\n const button = this.getEmojiButton()\n const pickerElement = document.getElementById(PICKER_DOM_ID)\n\n if (!button || !this.picker || !pickerElement) {\n return\n }\n\n const { emojiPickerPosition } = this.options\n\n try {\n const { x, y } = await emojiPickerPosition(button, pickerElement)\n this.picker.style.top = `${y}px`\n this.picker.style.left = `${x}px`\n }\n catch (error) {\n console.warn('Failed to compute picker position:', error)\n }\n }\n\n // 监听容器大小变化,更新表情选择弹窗位置\n private setupContainerResizeObserver() {\n const container = this.quill.root.parentElement\n if (!container) {\n return null\n }\n\n const debouncedUpdate = debounce(() => {\n this.updatePickerPosition()\n }, 100)\n\n const resizeObserver = new ResizeObserver(() => {\n debouncedUpdate()\n })\n\n resizeObserver.observe(container)\n\n return () => {\n resizeObserver.disconnect()\n debouncedUpdate.cancel()\n }\n }\n\n // 创建表情选择弹窗\n private createPicker() {\n const { EmojiPicker, emojiData, ...options } = this.options\n\n const pickerConfig = {\n // emoji-mart 与 tiny-editor 国际化的的 locale 不一致使用 LOCALE_MAP 转换\n locale: LOCALE_MAP[this.quill.lang] ?? 'en',\n data: emojiData,\n ...options,\n onEmojiSelect: this.handleEmojiSelect.bind(this),\n onClickOutside: this.handleClickOutside.bind(this),\n }\n\n const picker = new EmojiPicker(pickerConfig) as unknown as HTMLElement\n\n // 设置样式和属性\n picker.id = PICKER_DOM_ID\n picker.style.position = 'absolute'\n picker.style.zIndex = '1000'\n\n return picker\n }\n\n // 打开表情弹窗\n public openDialog() {\n if (this.picker) {\n return\n }\n\n try {\n this.picker = this.createPicker()\n document.body.appendChild(this.picker)\n\n this.updatePickerPosition()\n this.cleanupResizeObserver = this.setupContainerResizeObserver()\n this.isPickerVisible = true\n }\n catch (error) {\n console.error('Failed to open emoji picker:', error)\n this.closeDialog()\n }\n }\n\n // 关闭表情弹窗\n public closeDialog() {\n if (!this.picker) {\n return\n }\n\n this.isPickerVisible = false\n this.picker.remove()\n this.picker = null\n\n this.cleanupResizeObserver?.()\n this.cleanupResizeObserver = null\n }\n\n // 处理表情选择事件\n private handleEmojiSelect(emoji: { native: string }) {\n const selection = this.quill.getSelection(true)\n if (!selection) {\n console.warn('No selection available for emoji insertion')\n return\n }\n\n try {\n // 记录插入位置\n const insertIndex = selection.index\n this.quill.insertText(insertIndex, emoji.native, 'user')\n\n this.closeDialog()\n\n // 设置光标到表情符号后面\n this.quill.setSelection(insertIndex + emoji.native.length)\n }\n catch (error) {\n console.error('Failed to insert emoji:', error)\n }\n }\n\n // 处理外部点击事件\n private handleClickOutside(event: MouseEvent) {\n const button = this.getEmojiButton()\n\n const target = event.target\n\n const isClickOnButton = target === button || (target instanceof Element && button?.contains(target))\n\n // 如果点击的是表情符号按钮或其子元素,则不关闭选择器\n if (isClickOnButton) {\n return\n }\n\n this.closeDialog()\n }\n\n // 销毁模块,清理资源\n public destroy() {\n this.cleanupResizeObserver?.()\n this.cleanupResizeObserver = null\n this.closeDialog()\n }\n}\n\nexport { EmojiModule }\n"],"names":[],"mappings":";;;;AAyBA,MAAM,kBAAsC;AAAA;AAAA,EAE1C,WAAW,OAAO;AAAA;AAAA,EAElB,aAAa,OAAO;AAAA;AAAA,EAEpB,qBAAqB,OAAO;AAAA,EAC5B,OAAO;AAAA,EACP,KAAK;AAAA,EACL,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,YAAY,CAAC,YAAY,UAAU,UAAU,SAAS,YAAY,UAAU,WAAW,WAAW,OAAO;AAAA,EACzG,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,cAAc;AAChB;AAEA,MAAM,gBAAgB;AAEtB,MAAM,aAAa;AAAA,EACjB,SAAS;AAAA,EACT,SAAS;AACX;AAEA,MAAM,YAAY;AAAA,EAOhB,YAAY,OAAqB,UAA8B,IAAI;AANlD;AACA;AACT,kCAA6B;AAC7B,2CAAkB;AAClB,iDAA6C;AAGnD,SAAK,QAAQ;AAEb,SAAK,UAAU,EAAE,GAAG,iBAAiB,GAAG,QAAA;AAExC,UAAM,UAAU,KAAK,MAAM,UAAU,SAAS;AAE9C,QAAI,SAAS;AACX,cAAQ,WAAW,SAAS,MAAM;AAChC,YAAI,KAAK,iBAAiB;AACxB,eAAK,YAAA;AAAA,QACP,OACK;AACH,eAAK,WAAA;AAAA,QACP;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,iBAAiB;AACvB,WAAO,SAAS,cAAc,WAAW;AAAA,EAC3C;AAAA,EAEA,MAAc,uBAAuB;AACnC,UAAM,SAAS,KAAK,eAAA;AACpB,UAAM,gBAAgB,SAAS,eAAe,aAAa;AAE3D,QAAI,CAAC,UAAU,CAAC,KAAK,UAAU,CAAC,eAAe;AAC7C;AAAA,IACF;AAEA,UAAM,EAAE,wBAAwB,KAAK;AAErC,QAAI;AACF,YAAM,EAAE,GAAG,EAAA,IAAM,MAAM,oBAAoB,QAAQ,aAAa;AAChE,WAAK,OAAO,MAAM,MAAM,GAAG,CAAC;AAC5B,WAAK,OAAO,MAAM,OAAO,GAAG,CAAC;AAAA,IAC/B,SACO,OAAO;AACZ,cAAQ,KAAK,sCAAsC,KAAK;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA,EAGQ,+BAA+B;AACrC,UAAM,YAAY,KAAK,MAAM,KAAK;AAClC,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,SAAS,MAAM;AACrC,WAAK,qBAAA;AAAA,IACP,GAAG,GAAG;AAEN,UAAM,iBAAiB,IAAI,eAAe,MAAM;AAC9C,sBAAA;AAAA,IACF,CAAC;AAED,mBAAe,QAAQ,SAAS;AAEhC,WAAO,MAAM;AACX,qBAAe,WAAA;AACf,sBAAgB,OAAA;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EAGQ,eAAe;AACrB,UAAM,EAAE,aAAa,WAAW,GAAG,QAAA,IAAY,KAAK;AAEpD,UAAM,eAAe;AAAA;AAAA,MAEnB,QAAQ,WAAW,KAAK,MAAM,IAAI,KAAK;AAAA,MACvC,MAAM;AAAA,MACN,GAAG;AAAA,MACH,eAAe,KAAK,kBAAkB,KAAK,IAAI;AAAA,MAC/C,gBAAgB,KAAK,mBAAmB,KAAK,IAAI;AAAA,IAAA;AAGnD,UAAM,SAAS,IAAI,YAAY,YAAY;AAG3C,WAAO,KAAK;AACZ,WAAO,MAAM,WAAW;AACxB,WAAO,MAAM,SAAS;AAEtB,WAAO;AAAA,EACT;AAAA;AAAA,EAGO,aAAa;AAClB,QAAI,KAAK,QAAQ;AACf;AAAA,IACF;AAEA,QAAI;AACF,WAAK,SAAS,KAAK,aAAA;AACnB,eAAS,KAAK,YAAY,KAAK,MAAM;AAErC,WAAK,qBAAA;AACL,WAAK,wBAAwB,KAAK,6BAAA;AAClC,WAAK,kBAAkB;AAAA,IACzB,SACO,OAAO;AACZ,cAAQ,MAAM,gCAAgC,KAAK;AACnD,WAAK,YAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA,EAGO,cAAc;;AACnB,QAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,IACF;AAEA,SAAK,kBAAkB;AACvB,SAAK,OAAO,OAAA;AACZ,SAAK,SAAS;AAEd,eAAK,0BAAL;AACA,SAAK,wBAAwB;AAAA,EAC/B;AAAA;AAAA,EAGQ,kBAAkB,OAA2B;AACnD,UAAM,YAAY,KAAK,MAAM,aAAa,IAAI;AAC9C,QAAI,CAAC,WAAW;AACd,cAAQ,KAAK,4CAA4C;AACzD;AAAA,IACF;AAEA,QAAI;AAEF,YAAM,cAAc,UAAU;AAC9B,WAAK,MAAM,WAAW,aAAa,MAAM,QAAQ,MAAM;AAEvD,WAAK,YAAA;AAGL,WAAK,MAAM,aAAa,cAAc,MAAM,OAAO,MAAM;AAAA,IAC3D,SACO,OAAO;AACZ,cAAQ,MAAM,2BAA2B,KAAK;AAAA,IAChD;AAAA,EACF;AAAA;AAAA,EAGQ,mBAAmB,OAAmB;AAC5C,UAAM,SAAS,KAAK,eAAA;AAEpB,UAAM,SAAS,MAAM;AAErB,UAAM,kBAAkB,WAAW,UAAW,kBAAkB,YAAW,iCAAQ,SAAS;AAG5F,QAAI,iBAAiB;AACnB;AAAA,IACF;AAEA,SAAK,YAAA;AAAA,EACP;AAAA;AAAA,EAGO,UAAU;;AACf,eAAK,0BAAL;AACA,SAAK,wBAAwB;AAC7B,SAAK,YAAA;AAAA,EACP;AACF;"}
@@ -222,13 +222,13 @@ function handleInsertIcon(blot, selectedNodes) {
222
222
  const height = Number.parseInt(heightStr.replace(/[^\d.]/g, ""), 10) || 500;
223
223
  let iconList = [];
224
224
  const { deps } = getAllConfigs(blot.quill);
225
- iconList = deps.nodeIconList.nodeIconList;
225
+ iconList = deps.nodeIconList.nodeIconList ? deps.nodeIconList.nodeIconList : deps.nodeIconList;
226
226
  const leftUpControl = blot.domNode.querySelector(".ql-mind-map-left-up-control");
227
227
  let iconPanel = leftUpControl.querySelector(".ql-mind-map-icon-panel");
228
228
  if (!iconPanel) {
229
229
  iconPanel = document.createElement("div");
230
230
  iconPanel.className = "ql-mind-map-icon-panel";
231
- iconList.forEach((group) => {
231
+ iconList == null ? void 0 : iconList.forEach((group) => {
232
232
  const groupContainer = document.createElement("div");
233
233
  groupContainer.className = "ql-mind-map-icon-group-container";
234
234
  group.list.forEach((icon) => {
@@ -1 +1 @@
1
- {"version":3,"file":"control-panel.es.js","sources":["../../../../../src/modules/mind-map/modules/control-panel.ts"],"sourcesContent":["import type FluentEditor from '../../../core/fluent-editor'\nimport type MindMapPlaceholderBlot from '../formats/mind-map-blot'\nimport { CHANGE_LANGUAGE_EVENT } from '../../../config'\nimport { I18N } from '../../../modules/i18n'\nimport { getAllConfigs } from '../config-utils'\nimport { registerMindMapI18N } from '../i18n'\nimport { backIcon, catalogOrganizationIcon, contractIcon, fishboneIcon, fitIcon, forwardIcon, insertChildNodeIcon, insertIconIcon, insertNodeIcon, insertParentNodeIcon, logicalStructureIcon, mindMapIcon, organizationStructureIcon, removeNodeIcon, screenReduceIcon, screenTypeIcon, setLayoutIcon, timelineIcon, zoomInIcon, zoomOutIcon } from '../icons'\n\nclass MindMapControlPanelHandler {\n private texts: Record<string, string>\n private lang: string\n getText(key: keyof Record<string, string>): string {\n return this.texts[key]\n }\n\n constructor(private quill: FluentEditor, private blot: MindMapPlaceholderBlot) {\n const i18nModule = this.quill.getModule('i18n') as I18N\n registerMindMapI18N(I18N)\n this.lang = i18nModule.options.lang\n this.texts = this.resolveTexts()\n this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, (lang: string) => {\n this.lang = lang\n this.texts = this.resolveTexts()\n this.updateControlPanelTexts()\n })\n }\n\n resolveTexts() {\n const textKeys = [\n 'zoomOutTitle',\n 'zoomInTitle',\n 'fitTitle',\n 'backTitle',\n 'forwardTitle',\n 'inserChildNodeTitle',\n 'inserNodeTitle',\n 'insertIconTitle',\n 'inserParentNodeTitle',\n 'removeNodeTitle',\n 'setLayoutTitle',\n 'logicalStructureLayout',\n 'catalogOrganizationLayout',\n 'mindMapLayout',\n 'organizationStructureLayout',\n 'timelineLayout',\n 'fishboneLayout',\n 'panelStatusTitle',\n 'screenTypeTitle',\n ]\n\n return textKeys.reduce((acc, key) => {\n if (!key.includes('Title')) {\n acc[key] = I18N.parserText(`mindMap.layout.${key.replace('Layout', '')}`, this.lang)\n }\n else {\n acc[key] = I18N.parserText(`mindMap.controlPanel.${key}`, this.lang)\n }\n return acc\n }, {} as Record<string, string>)\n }\n\n updateControlPanelTexts() {\n const controlItems = this.blot.domNode.querySelectorAll('.ql-mind-map-control-item')\n\n const controlItemMap: Record<string, string> = {\n 'zoom-out': 'zoomOutTitle',\n 'zoom-in': 'zoomInTitle',\n 'fit': 'fitTitle',\n 'back': 'backTitle',\n 'forward': 'forwardTitle',\n 'insert-child-node': 'inserChildNodeTitle',\n 'insert-node': 'inserNodeTitle',\n 'insert-icon': 'insertIconTitle',\n 'insert-parent-node': 'inserParentNodeTitle',\n 'remove-node': 'removeNodeTitle',\n 'set-layout-icon': 'setLayoutTitle',\n 'panel-status': 'panelStatusTitle',\n 'screen-type': 'screenTypeTitle',\n }\n\n controlItems.forEach((item) => {\n const controlType = (item as HTMLElement).dataset.controlType\n if (controlType && controlItemMap[controlType] && this.texts[controlItemMap[controlType]]) {\n (item as HTMLElement).title = this.texts[controlItemMap[controlType]]\n }\n })\n }\n}\n\nconst controlPanelHandlers = new WeakMap<MindMapPlaceholderBlot, MindMapControlPanelHandler>()\n\nconst DISABLED_OPACITY = '0.5'\nconst ENABLED_OPACITY = '1'\nexport function createControlPanel(blot: MindMapPlaceholderBlot, quill: FluentEditor): void {\n let isStart = true\n let isEnd = true\n let selectedNodes: any[] = []\n blot.mindMap.on('node_active', (...args: unknown[]) => {\n selectedNodes = Array.isArray(args[1]) ? args[1] : []\n })\n // 中间的控制面板\n const controlPanel = document.createElement('div')\n controlPanel.className = 'ql-mind-map-control'\n // 右上的控制面板\n const controlRightUpPanel = document.createElement('div')\n controlRightUpPanel.className = 'ql-mind-map-right-up-control'\n // 左上的控制面板\n const controlLeftUpPanel = document.createElement('div')\n controlLeftUpPanel.className = 'ql-mind-map-left-up-control'\n\n const handler = new MindMapControlPanelHandler(quill, blot)\n controlPanelHandlers.set(blot, handler)\n\n const zoomOutBtn = createControlItem('zoom-out', handler.getText('zoomOutTitle'), () => handleZoomOut(blot))\n const zoomInBtn = createControlItem('zoom-in', handler.getText('zoomInTitle'), () => handleZoomIn(blot))\n const resetBtn = createControlItem('fit', handler.getText('fitTitle'), () => handleResetZoom(blot))\n const backBtn = createControlItem('back', handler.getText('backTitle'), () => {\n if (!isStart) {\n blot.mindMap.execCommand('BACK')\n }\n })\n const forwardBtn = createControlItem('forward', handler.getText('forwardTitle'), () => {\n if (!isEnd) {\n blot.mindMap.execCommand('FORWARD')\n }\n })\n const insertChildNode = createControlItem('insert-child-node', handler.getText('inserChildNodeTitle'), () => handleInsertChildNode(blot))\n const insertNode = createControlItem('insert-node', handler.getText('inserNodeTitle'), () => handleInsertNode(blot))\n const insertParentNode = createControlItem('insert-parent-node', handler.getText('inserParentNodeTitle'), () => handleInsertParentNode(blot))\n const removeNode = createControlItem('remove-node', handler.getText('removeNodeTitle'), () => handleRemoveNode(blot))\n const insertIconBtn = createControlItem('insert-icon', handler.getText('insertIconTitle'), () => handleInsertIcon(blot, selectedNodes))\n const setLayoutBtn = createControlItem('set-layout-icon', handler.getText('setLayoutTitle'), () => handleSetLayoutBtn(blot))\n const panelStatusBtn = createControlItem('panel-status', handler.getText('panelStatusTitle'))\n const screenTypeBtn = createControlItem('screen-type', handler.getText('screenTypeTitle'), () => handleScreenTypeBtn(blot))\n const updateButtonState = (index: number, len: number) => {\n isStart = index <= 0\n isEnd = index >= len - 1\n backBtn.style.cursor = isStart ? 'not-allowed' : 'pointer'\n backBtn.style.opacity = isStart ? DISABLED_OPACITY : ENABLED_OPACITY\n forwardBtn.style.cursor = isEnd ? 'not-allowed' : 'pointer'\n forwardBtn.style.opacity = isEnd ? DISABLED_OPACITY : ENABLED_OPACITY\n }\n\n blot.mindMap.on('back_forward', (index: number, len: number) => {\n updateButtonState(index, len)\n })\n controlPanel.append(zoomOutBtn, zoomInBtn, resetBtn, screenTypeBtn, backBtn, forwardBtn)\n blot.domNode.appendChild(controlPanel)\n controlRightUpPanel.append(panelStatusBtn)\n blot.domNode.appendChild(controlRightUpPanel)\n controlLeftUpPanel.append(insertChildNode, insertNode, insertParentNode, removeNode, insertIconBtn, setLayoutBtn)\n blot.domNode.appendChild(controlLeftUpPanel)\n}\n\nfunction createControlItem(iconClass: string, title: string, onClick?: () => void, disabled = false) {\n const controlItem = document.createElement('div')\n controlItem.className = 'ql-mind-map-control-item'\n controlItem.title = title\n controlItem.dataset.controlType = iconClass\n controlItem.style.cursor = disabled ? 'not-allowed' : 'pointer'\n controlItem.style.opacity = disabled ? DISABLED_OPACITY : ENABLED_OPACITY\n\n const iconMap: Record<string, string> = {\n 'back': backIcon,\n 'forward': forwardIcon,\n 'zoom-out': zoomOutIcon,\n 'zoom-in': zoomInIcon,\n 'fit': fitIcon,\n 'insert-child-node': insertChildNodeIcon,\n 'insert-node': insertNodeIcon,\n 'insert-parent-node': insertParentNodeIcon,\n 'remove-node': removeNodeIcon,\n 'insert-icon': insertIconIcon,\n 'set-layout-icon': setLayoutIcon,\n 'screen-type': screenTypeIcon,\n 'panel-status': contractIcon,\n }\n\n const icon = document.createElement('i')\n icon.innerHTML = iconMap[iconClass] || ''\n controlItem.appendChild(icon)\n\n if (!disabled) {\n controlItem.addEventListener('click', onClick)\n }\n\n return controlItem\n}\n\nfunction handleInsertChildNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_CHILD_NODE')\n}\n\nfunction handleInsertNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_NODE')\n}\n\nfunction handleInsertParentNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_PARENT_NODE')\n}\n\nfunction handleRemoveNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('REMOVE_CURRENT_NODE')\n}\n\nfunction handleZoomIn(blot: MindMapPlaceholderBlot): void {\n if (blot.mindMap && blot.mindMap.view) {\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const cx = containerRect.width / 2\n const cy = containerRect.height / 2\n blot.mindMap.view.enlarge(cx, cy, false)\n blot.zoomCount++\n }\n}\n\nfunction handleZoomOut(blot: MindMapPlaceholderBlot): void {\n if (blot.mindMap && blot.mindMap.view) {\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const cx = containerRect.width / 2\n const cy = containerRect.height / 2\n blot.mindMap.view.narrow(cx, cy, false)\n blot.zoomCount--\n }\n}\n\nfunction handleResetZoom(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.renderer.setRootNodeCenter()\n if (!blot.mindMap || !blot.mindMap.view || blot.zoomCount === 0) return\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const centerX = containerRect.width / 2\n const centerY = containerRect.height / 2\n const operationCount = Math.abs(blot.zoomCount)\n const isEnlarge = blot.zoomCount < 0\n for (let i = 0; i < operationCount; i++) {\n if (isEnlarge) {\n blot.mindMap.view.enlarge(centerX, centerY, false)\n }\n else {\n blot.mindMap.view.narrow(centerX, centerY, false)\n }\n }\n blot.zoomCount = 0\n}\n\nfunction handleInsertIcon(blot: MindMapPlaceholderBlot, selectedNodes: any[]): void {\n (blot as any).selectedNodes = selectedNodes\n const heightStr = blot.domNode.getAttribute('height') || '500px'\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\n let iconList = []\n const { deps } = getAllConfigs(blot.quill)\n iconList = deps.nodeIconList.nodeIconList\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\n let iconPanel = leftUpControl.querySelector('.ql-mind-map-icon-panel') as HTMLElement\n if (!iconPanel) {\n iconPanel = document.createElement('div')\n iconPanel.className = 'ql-mind-map-icon-panel'\n\n iconList.forEach((group) => {\n const groupContainer = document.createElement('div')\n groupContainer.className = 'ql-mind-map-icon-group-container'\n\n group.list.forEach((icon: { icon: string, name: string }) => {\n const iconItem = document.createElement('div')\n iconItem.className = 'ql-mind-map-icon-item'\n iconItem.innerHTML = icon.icon\n\n iconItem.addEventListener('click', () => {\n const currentSelectedNodes = (blot as any).selectedNodes || []\n if (currentSelectedNodes.length > 0) {\n const node = currentSelectedNodes[0]\n\n if (node.getData('icon') && node.getData('icon')[0] === `${group.type}_${icon.name}`) {\n node.setIcon([])\n }\n else {\n node.setIcon([`${group.type}_${icon.name}`])\n }\n blot.data = blot.mindMap.getData({})\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\n }\n iconPanel.style.display = 'none'\n })\n groupContainer.appendChild(iconItem)\n })\n iconPanel.appendChild(groupContainer)\n })\n if (height < 395) {\n iconPanel.style.height = `${height - 130}px`\n }\n else {\n iconPanel.style.height = '270px'\n }\n leftUpControl.appendChild(iconPanel)\n }\n else {\n if (height < 395) {\n iconPanel.style.height = `${height - 130}px`\n }\n else {\n iconPanel.style.height = '270px'\n }\n iconPanel.style.display = 'block'\n }\n\n const handleOutsideClick = (e: MouseEvent) => {\n let insertIconBtn: HTMLElement | null = null\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\n\n controlItems.forEach((item) => {\n if ((item as HTMLElement).dataset.controlType === 'insert-icon') {\n insertIconBtn = item as HTMLElement\n }\n })\n\n if (!iconPanel.contains(e.target as Node) && (!insertIconBtn || !insertIconBtn.contains(e.target as Node))) {\n iconPanel.style.display = 'none'\n document.removeEventListener('click', handleOutsideClick)\n }\n }\n document.removeEventListener('click', handleOutsideClick)\n document.addEventListener('click', handleOutsideClick)\n}\n\nfunction handleSetLayoutBtn(blot: MindMapPlaceholderBlot): void {\n const handler = controlPanelHandlers.get(blot)\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\n let layoutPanel = leftUpControl.querySelector('.ql-mind-map-layout-panel') as HTMLElement\n const heightStr = blot.domNode.getAttribute('height') || '500'\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\n\n if (!layoutPanel) {\n layoutPanel = document.createElement('div')\n layoutPanel.className = 'ql-mind-map-layout-panel'\n\n const layouts = [\n {\n name: 'logicalStructure',\n displayName: handler?.getText('logicalStructureLayout'),\n icon: logicalStructureIcon,\n },\n {\n name: 'catalogOrganization',\n displayName: handler?.getText('catalogOrganizationLayout'),\n icon: catalogOrganizationIcon,\n },\n {\n name: 'mindMap',\n displayName: handler?.getText('mindMapLayout'),\n icon: mindMapIcon,\n },\n {\n name: 'organizationStructure',\n displayName: handler?.getText('organizationStructureLayout'),\n icon: organizationStructureIcon,\n },\n {\n name: 'timeline',\n displayName: handler?.getText('timelineLayout'),\n icon: timelineIcon,\n },\n {\n name: 'fishbone',\n displayName: handler?.getText('fishboneLayout'),\n icon: fishboneIcon,\n },\n ]\n\n layouts.forEach((layout) => {\n const layoutItem = document.createElement('div')\n layoutItem.className = 'ql-mind-map-layout-item'\n\n const iconContainer = document.createElement('div')\n iconContainer.className = 'ql-mind-map-layout-icon-container'\n\n const img = document.createElement('div')\n img.className = 'ql-mind-map-layout-icon'\n img.innerHTML = layout.icon\n img.style.display = 'flex'\n img.style.alignItems = 'center'\n img.style.justifyContent = 'center'\n const svgElement = img.querySelector('svg')\n\n svgElement.style.maxWidth = '100%'\n svgElement.style.maxHeight = '100%'\n svgElement.style.width = 'auto'\n svgElement.style.height = 'auto'\n svgElement.removeAttribute('width')\n svgElement.removeAttribute('height')\n\n iconContainer.appendChild(img)\n\n const nameText = document.createElement('div')\n nameText.className = 'ql-mind-map-layout-name'\n nameText.textContent = layout.displayName\n\n layoutItem.appendChild(iconContainer)\n layoutItem.appendChild(nameText)\n layoutItem.addEventListener('click', () => {\n blot.mindMap.setLayout(layout.name)\n blot.data = blot.mindMap.getData({})\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\n layoutPanel.style.display = 'none'\n })\n layoutPanel.appendChild(layoutItem)\n })\n leftUpControl.appendChild(layoutPanel)\n if (height < 395) {\n layoutPanel.style.height = `${height - 130}px`\n }\n else {\n layoutPanel.style.height = '270px'\n }\n }\n else {\n if (height < 395) {\n layoutPanel.style.height = `${height - 130}px`\n }\n else {\n layoutPanel.style.height = '270px'\n }\n layoutPanel.style.display = 'flex'\n }\n\n const handleOutsideClick = (e: MouseEvent) => {\n let setLayoutBtn: HTMLElement | null = null\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\n\n setLayoutBtn = Array.from(controlItems).find(item => item.getAttribute('data-control-type') === 'set-layout-icon') as HTMLElement | null\n\n if (!layoutPanel.contains(e.target as Node) && (!setLayoutBtn || !setLayoutBtn.contains(e.target as Node))) {\n layoutPanel.style.display = 'none'\n document.removeEventListener('click', handleOutsideClick)\n }\n }\n document.removeEventListener('click', handleOutsideClick)\n document.addEventListener('click', handleOutsideClick)\n}\n\nfunction handleScreenTypeBtn(blot: MindMapPlaceholderBlot): void {\n const screenTypeBtn = blot.domNode.querySelector('[data-control-type=\"screen-type\"]') as HTMLElement | null\n if (!screenTypeBtn || !blot.domNode) return\n\n const mindMapContainer = blot.domNode\n const isFullscreen = mindMapContainer.style.position === 'fixed'\n\n if (isFullscreen) {\n const originalPosition = mindMapContainer.getAttribute('data-original-position')\n const originalWidth = mindMapContainer.getAttribute('data-original-width')\n const originalHeight = mindMapContainer.getAttribute('data-original-height')\n if (originalWidth && originalHeight) {\n mindMapContainer.style.position = originalPosition\n mindMapContainer.style.width = originalWidth\n mindMapContainer.style.height = originalHeight\n mindMapContainer.style.zIndex = '0'\n }\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenTypeIcon\n }\n }\n else {\n mindMapContainer.setAttribute('data-original-position', mindMapContainer.style.position || '')\n mindMapContainer.setAttribute('data-original-width', mindMapContainer.style.width || '')\n mindMapContainer.setAttribute('data-original-height', mindMapContainer.style.height || '')\n mindMapContainer.style.position = 'fixed'\n mindMapContainer.style.top = '0'\n mindMapContainer.style.left = '0'\n mindMapContainer.style.width = '100vw'\n mindMapContainer.style.height = '100vh'\n mindMapContainer.style.zIndex = '100'\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenReduceIcon\n }\n }\n blot.mindMap.renderer.setRootNodeCenter()\n blot.mindMap.resize()\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"control-panel.es.js","sources":["../../../../../src/modules/mind-map/modules/control-panel.ts"],"sourcesContent":["import type FluentEditor from '../../../core/fluent-editor'\nimport type MindMapPlaceholderBlot from '../formats/mind-map-blot'\nimport { CHANGE_LANGUAGE_EVENT } from '../../../config'\nimport { I18N } from '../../../modules/i18n'\nimport { getAllConfigs } from '../config-utils'\nimport { registerMindMapI18N } from '../i18n'\nimport { backIcon, catalogOrganizationIcon, contractIcon, fishboneIcon, fitIcon, forwardIcon, insertChildNodeIcon, insertIconIcon, insertNodeIcon, insertParentNodeIcon, logicalStructureIcon, mindMapIcon, organizationStructureIcon, removeNodeIcon, screenReduceIcon, screenTypeIcon, setLayoutIcon, timelineIcon, zoomInIcon, zoomOutIcon } from '../icons'\n\nclass MindMapControlPanelHandler {\n private texts: Record<string, string>\n private lang: string\n getText(key: keyof Record<string, string>): string {\n return this.texts[key]\n }\n\n constructor(private quill: FluentEditor, private blot: MindMapPlaceholderBlot) {\n const i18nModule = this.quill.getModule('i18n') as I18N\n registerMindMapI18N(I18N)\n this.lang = i18nModule.options.lang\n this.texts = this.resolveTexts()\n this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, (lang: string) => {\n this.lang = lang\n this.texts = this.resolveTexts()\n this.updateControlPanelTexts()\n })\n }\n\n resolveTexts() {\n const textKeys = [\n 'zoomOutTitle',\n 'zoomInTitle',\n 'fitTitle',\n 'backTitle',\n 'forwardTitle',\n 'inserChildNodeTitle',\n 'inserNodeTitle',\n 'insertIconTitle',\n 'inserParentNodeTitle',\n 'removeNodeTitle',\n 'setLayoutTitle',\n 'logicalStructureLayout',\n 'catalogOrganizationLayout',\n 'mindMapLayout',\n 'organizationStructureLayout',\n 'timelineLayout',\n 'fishboneLayout',\n 'panelStatusTitle',\n 'screenTypeTitle',\n ]\n\n return textKeys.reduce((acc, key) => {\n if (!key.includes('Title')) {\n acc[key] = I18N.parserText(`mindMap.layout.${key.replace('Layout', '')}`, this.lang)\n }\n else {\n acc[key] = I18N.parserText(`mindMap.controlPanel.${key}`, this.lang)\n }\n return acc\n }, {} as Record<string, string>)\n }\n\n updateControlPanelTexts() {\n const controlItems = this.blot.domNode.querySelectorAll('.ql-mind-map-control-item')\n\n const controlItemMap: Record<string, string> = {\n 'zoom-out': 'zoomOutTitle',\n 'zoom-in': 'zoomInTitle',\n 'fit': 'fitTitle',\n 'back': 'backTitle',\n 'forward': 'forwardTitle',\n 'insert-child-node': 'inserChildNodeTitle',\n 'insert-node': 'inserNodeTitle',\n 'insert-icon': 'insertIconTitle',\n 'insert-parent-node': 'inserParentNodeTitle',\n 'remove-node': 'removeNodeTitle',\n 'set-layout-icon': 'setLayoutTitle',\n 'panel-status': 'panelStatusTitle',\n 'screen-type': 'screenTypeTitle',\n }\n\n controlItems.forEach((item) => {\n const controlType = (item as HTMLElement).dataset.controlType\n if (controlType && controlItemMap[controlType] && this.texts[controlItemMap[controlType]]) {\n (item as HTMLElement).title = this.texts[controlItemMap[controlType]]\n }\n })\n }\n}\n\nconst controlPanelHandlers = new WeakMap<MindMapPlaceholderBlot, MindMapControlPanelHandler>()\n\nconst DISABLED_OPACITY = '0.5'\nconst ENABLED_OPACITY = '1'\nexport function createControlPanel(blot: MindMapPlaceholderBlot, quill: FluentEditor): void {\n let isStart = true\n let isEnd = true\n let selectedNodes: any[] = []\n blot.mindMap.on('node_active', (...args: unknown[]) => {\n selectedNodes = Array.isArray(args[1]) ? args[1] : []\n })\n // 中间的控制面板\n const controlPanel = document.createElement('div')\n controlPanel.className = 'ql-mind-map-control'\n // 右上的控制面板\n const controlRightUpPanel = document.createElement('div')\n controlRightUpPanel.className = 'ql-mind-map-right-up-control'\n // 左上的控制面板\n const controlLeftUpPanel = document.createElement('div')\n controlLeftUpPanel.className = 'ql-mind-map-left-up-control'\n\n const handler = new MindMapControlPanelHandler(quill, blot)\n controlPanelHandlers.set(blot, handler)\n\n const zoomOutBtn = createControlItem('zoom-out', handler.getText('zoomOutTitle'), () => handleZoomOut(blot))\n const zoomInBtn = createControlItem('zoom-in', handler.getText('zoomInTitle'), () => handleZoomIn(blot))\n const resetBtn = createControlItem('fit', handler.getText('fitTitle'), () => handleResetZoom(blot))\n const backBtn = createControlItem('back', handler.getText('backTitle'), () => {\n if (!isStart) {\n blot.mindMap.execCommand('BACK')\n }\n })\n const forwardBtn = createControlItem('forward', handler.getText('forwardTitle'), () => {\n if (!isEnd) {\n blot.mindMap.execCommand('FORWARD')\n }\n })\n const insertChildNode = createControlItem('insert-child-node', handler.getText('inserChildNodeTitle'), () => handleInsertChildNode(blot))\n const insertNode = createControlItem('insert-node', handler.getText('inserNodeTitle'), () => handleInsertNode(blot))\n const insertParentNode = createControlItem('insert-parent-node', handler.getText('inserParentNodeTitle'), () => handleInsertParentNode(blot))\n const removeNode = createControlItem('remove-node', handler.getText('removeNodeTitle'), () => handleRemoveNode(blot))\n const insertIconBtn = createControlItem('insert-icon', handler.getText('insertIconTitle'), () => handleInsertIcon(blot, selectedNodes))\n const setLayoutBtn = createControlItem('set-layout-icon', handler.getText('setLayoutTitle'), () => handleSetLayoutBtn(blot))\n const panelStatusBtn = createControlItem('panel-status', handler.getText('panelStatusTitle'))\n const screenTypeBtn = createControlItem('screen-type', handler.getText('screenTypeTitle'), () => handleScreenTypeBtn(blot))\n const updateButtonState = (index: number, len: number) => {\n isStart = index <= 0\n isEnd = index >= len - 1\n backBtn.style.cursor = isStart ? 'not-allowed' : 'pointer'\n backBtn.style.opacity = isStart ? DISABLED_OPACITY : ENABLED_OPACITY\n forwardBtn.style.cursor = isEnd ? 'not-allowed' : 'pointer'\n forwardBtn.style.opacity = isEnd ? DISABLED_OPACITY : ENABLED_OPACITY\n }\n\n blot.mindMap.on('back_forward', (index: number, len: number) => {\n updateButtonState(index, len)\n })\n controlPanel.append(zoomOutBtn, zoomInBtn, resetBtn, screenTypeBtn, backBtn, forwardBtn)\n blot.domNode.appendChild(controlPanel)\n controlRightUpPanel.append(panelStatusBtn)\n blot.domNode.appendChild(controlRightUpPanel)\n controlLeftUpPanel.append(insertChildNode, insertNode, insertParentNode, removeNode, insertIconBtn, setLayoutBtn)\n blot.domNode.appendChild(controlLeftUpPanel)\n}\n\nfunction createControlItem(iconClass: string, title: string, onClick?: () => void, disabled = false) {\n const controlItem = document.createElement('div')\n controlItem.className = 'ql-mind-map-control-item'\n controlItem.title = title\n controlItem.dataset.controlType = iconClass\n controlItem.style.cursor = disabled ? 'not-allowed' : 'pointer'\n controlItem.style.opacity = disabled ? DISABLED_OPACITY : ENABLED_OPACITY\n\n const iconMap: Record<string, string> = {\n 'back': backIcon,\n 'forward': forwardIcon,\n 'zoom-out': zoomOutIcon,\n 'zoom-in': zoomInIcon,\n 'fit': fitIcon,\n 'insert-child-node': insertChildNodeIcon,\n 'insert-node': insertNodeIcon,\n 'insert-parent-node': insertParentNodeIcon,\n 'remove-node': removeNodeIcon,\n 'insert-icon': insertIconIcon,\n 'set-layout-icon': setLayoutIcon,\n 'screen-type': screenTypeIcon,\n 'panel-status': contractIcon,\n }\n\n const icon = document.createElement('i')\n icon.innerHTML = iconMap[iconClass] || ''\n controlItem.appendChild(icon)\n\n if (!disabled) {\n controlItem.addEventListener('click', onClick)\n }\n\n return controlItem\n}\n\nfunction handleInsertChildNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_CHILD_NODE')\n}\n\nfunction handleInsertNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_NODE')\n}\n\nfunction handleInsertParentNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_PARENT_NODE')\n}\n\nfunction handleRemoveNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('REMOVE_CURRENT_NODE')\n}\n\nfunction handleZoomIn(blot: MindMapPlaceholderBlot): void {\n if (blot.mindMap && blot.mindMap.view) {\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const cx = containerRect.width / 2\n const cy = containerRect.height / 2\n blot.mindMap.view.enlarge(cx, cy, false)\n blot.zoomCount++\n }\n}\n\nfunction handleZoomOut(blot: MindMapPlaceholderBlot): void {\n if (blot.mindMap && blot.mindMap.view) {\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const cx = containerRect.width / 2\n const cy = containerRect.height / 2\n blot.mindMap.view.narrow(cx, cy, false)\n blot.zoomCount--\n }\n}\n\nfunction handleResetZoom(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.renderer.setRootNodeCenter()\n if (!blot.mindMap || !blot.mindMap.view || blot.zoomCount === 0) return\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const centerX = containerRect.width / 2\n const centerY = containerRect.height / 2\n const operationCount = Math.abs(blot.zoomCount)\n const isEnlarge = blot.zoomCount < 0\n for (let i = 0; i < operationCount; i++) {\n if (isEnlarge) {\n blot.mindMap.view.enlarge(centerX, centerY, false)\n }\n else {\n blot.mindMap.view.narrow(centerX, centerY, false)\n }\n }\n blot.zoomCount = 0\n}\n\nfunction handleInsertIcon(blot: MindMapPlaceholderBlot, selectedNodes: any[]): void {\n (blot as any).selectedNodes = selectedNodes\n const heightStr = blot.domNode.getAttribute('height') || '500px'\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\n let iconList = []\n const { deps } = getAllConfigs(blot.quill)\n iconList = deps.nodeIconList.nodeIconList ? deps.nodeIconList.nodeIconList : deps.nodeIconList\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\n let iconPanel = leftUpControl.querySelector('.ql-mind-map-icon-panel') as HTMLElement\n if (!iconPanel) {\n iconPanel = document.createElement('div')\n iconPanel.className = 'ql-mind-map-icon-panel'\n iconList?.forEach((group) => {\n const groupContainer = document.createElement('div')\n groupContainer.className = 'ql-mind-map-icon-group-container'\n\n group.list.forEach((icon: { icon: string, name: string }) => {\n const iconItem = document.createElement('div')\n iconItem.className = 'ql-mind-map-icon-item'\n iconItem.innerHTML = icon.icon\n\n iconItem.addEventListener('click', () => {\n const currentSelectedNodes = (blot as any).selectedNodes || []\n if (currentSelectedNodes.length > 0) {\n const node = currentSelectedNodes[0]\n\n if (node.getData('icon') && node.getData('icon')[0] === `${group.type}_${icon.name}`) {\n node.setIcon([])\n }\n else {\n node.setIcon([`${group.type}_${icon.name}`])\n }\n blot.data = blot.mindMap.getData({})\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\n }\n iconPanel.style.display = 'none'\n })\n groupContainer.appendChild(iconItem)\n })\n iconPanel.appendChild(groupContainer)\n })\n if (height < 395) {\n iconPanel.style.height = `${height - 130}px`\n }\n else {\n iconPanel.style.height = '270px'\n }\n leftUpControl.appendChild(iconPanel)\n }\n else {\n if (height < 395) {\n iconPanel.style.height = `${height - 130}px`\n }\n else {\n iconPanel.style.height = '270px'\n }\n iconPanel.style.display = 'block'\n }\n\n const handleOutsideClick = (e: MouseEvent) => {\n let insertIconBtn: HTMLElement | null = null\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\n\n controlItems.forEach((item) => {\n if ((item as HTMLElement).dataset.controlType === 'insert-icon') {\n insertIconBtn = item as HTMLElement\n }\n })\n\n if (!iconPanel.contains(e.target as Node) && (!insertIconBtn || !insertIconBtn.contains(e.target as Node))) {\n iconPanel.style.display = 'none'\n document.removeEventListener('click', handleOutsideClick)\n }\n }\n document.removeEventListener('click', handleOutsideClick)\n document.addEventListener('click', handleOutsideClick)\n}\n\nfunction handleSetLayoutBtn(blot: MindMapPlaceholderBlot): void {\n const handler = controlPanelHandlers.get(blot)\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\n let layoutPanel = leftUpControl.querySelector('.ql-mind-map-layout-panel') as HTMLElement\n const heightStr = blot.domNode.getAttribute('height') || '500'\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\n\n if (!layoutPanel) {\n layoutPanel = document.createElement('div')\n layoutPanel.className = 'ql-mind-map-layout-panel'\n\n const layouts = [\n {\n name: 'logicalStructure',\n displayName: handler?.getText('logicalStructureLayout'),\n icon: logicalStructureIcon,\n },\n {\n name: 'catalogOrganization',\n displayName: handler?.getText('catalogOrganizationLayout'),\n icon: catalogOrganizationIcon,\n },\n {\n name: 'mindMap',\n displayName: handler?.getText('mindMapLayout'),\n icon: mindMapIcon,\n },\n {\n name: 'organizationStructure',\n displayName: handler?.getText('organizationStructureLayout'),\n icon: organizationStructureIcon,\n },\n {\n name: 'timeline',\n displayName: handler?.getText('timelineLayout'),\n icon: timelineIcon,\n },\n {\n name: 'fishbone',\n displayName: handler?.getText('fishboneLayout'),\n icon: fishboneIcon,\n },\n ]\n\n layouts.forEach((layout) => {\n const layoutItem = document.createElement('div')\n layoutItem.className = 'ql-mind-map-layout-item'\n\n const iconContainer = document.createElement('div')\n iconContainer.className = 'ql-mind-map-layout-icon-container'\n\n const img = document.createElement('div')\n img.className = 'ql-mind-map-layout-icon'\n img.innerHTML = layout.icon\n img.style.display = 'flex'\n img.style.alignItems = 'center'\n img.style.justifyContent = 'center'\n const svgElement = img.querySelector('svg')\n\n svgElement.style.maxWidth = '100%'\n svgElement.style.maxHeight = '100%'\n svgElement.style.width = 'auto'\n svgElement.style.height = 'auto'\n svgElement.removeAttribute('width')\n svgElement.removeAttribute('height')\n\n iconContainer.appendChild(img)\n\n const nameText = document.createElement('div')\n nameText.className = 'ql-mind-map-layout-name'\n nameText.textContent = layout.displayName\n\n layoutItem.appendChild(iconContainer)\n layoutItem.appendChild(nameText)\n layoutItem.addEventListener('click', () => {\n blot.mindMap.setLayout(layout.name)\n blot.data = blot.mindMap.getData({})\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\n layoutPanel.style.display = 'none'\n })\n layoutPanel.appendChild(layoutItem)\n })\n leftUpControl.appendChild(layoutPanel)\n if (height < 395) {\n layoutPanel.style.height = `${height - 130}px`\n }\n else {\n layoutPanel.style.height = '270px'\n }\n }\n else {\n if (height < 395) {\n layoutPanel.style.height = `${height - 130}px`\n }\n else {\n layoutPanel.style.height = '270px'\n }\n layoutPanel.style.display = 'flex'\n }\n\n const handleOutsideClick = (e: MouseEvent) => {\n let setLayoutBtn: HTMLElement | null = null\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\n\n setLayoutBtn = Array.from(controlItems).find(item => item.getAttribute('data-control-type') === 'set-layout-icon') as HTMLElement | null\n\n if (!layoutPanel.contains(e.target as Node) && (!setLayoutBtn || !setLayoutBtn.contains(e.target as Node))) {\n layoutPanel.style.display = 'none'\n document.removeEventListener('click', handleOutsideClick)\n }\n }\n document.removeEventListener('click', handleOutsideClick)\n document.addEventListener('click', handleOutsideClick)\n}\n\nfunction handleScreenTypeBtn(blot: MindMapPlaceholderBlot): void {\n const screenTypeBtn = blot.domNode.querySelector('[data-control-type=\"screen-type\"]') as HTMLElement | null\n if (!screenTypeBtn || !blot.domNode) return\n\n const mindMapContainer = blot.domNode\n const isFullscreen = mindMapContainer.style.position === 'fixed'\n\n if (isFullscreen) {\n const originalPosition = mindMapContainer.getAttribute('data-original-position')\n const originalWidth = mindMapContainer.getAttribute('data-original-width')\n const originalHeight = mindMapContainer.getAttribute('data-original-height')\n if (originalWidth && originalHeight) {\n mindMapContainer.style.position = originalPosition\n mindMapContainer.style.width = originalWidth\n mindMapContainer.style.height = originalHeight\n mindMapContainer.style.zIndex = '0'\n }\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenTypeIcon\n }\n }\n else {\n mindMapContainer.setAttribute('data-original-position', mindMapContainer.style.position || '')\n mindMapContainer.setAttribute('data-original-width', mindMapContainer.style.width || '')\n mindMapContainer.setAttribute('data-original-height', mindMapContainer.style.height || '')\n mindMapContainer.style.position = 'fixed'\n mindMapContainer.style.top = '0'\n mindMapContainer.style.left = '0'\n mindMapContainer.style.width = '100vw'\n mindMapContainer.style.height = '100vh'\n mindMapContainer.style.zIndex = '100'\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenReduceIcon\n }\n }\n blot.mindMap.renderer.setRootNodeCenter()\n blot.mindMap.resize()\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ function merge(target, ...sources) {
2
+ if (!sources.length) return target;
3
+ const isObject = (obj) => obj !== null && (typeof obj === "object" || typeof obj === "function");
4
+ const isPlain = (obj) => {
5
+ if (!isObject(obj)) return false;
6
+ const proto = Object.getPrototypeOf(obj);
7
+ return proto === Object.prototype || proto === null;
8
+ };
9
+ for (const src of sources) {
10
+ if (!isObject(src)) continue;
11
+ for (const key in src) {
12
+ if (!Object.prototype.hasOwnProperty.call(src, key)) continue;
13
+ const oldVal = target[key];
14
+ const newVal = src[key];
15
+ if (isPlain(newVal) && (oldVal === void 0 || isPlain(oldVal))) {
16
+ target[key] = merge(oldVal || {}, newVal);
17
+ } else {
18
+ target[key] = newVal;
19
+ }
20
+ }
21
+ }
22
+ return target;
23
+ }
24
+ export {
25
+ merge
26
+ };
27
+ //# sourceMappingURL=merge.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.es.js","sources":["../../../src/utils/merge.ts"],"sourcesContent":["/**\n * 深合并任意多个普通对象\n * @param {object} target 目标对象(会被修改)\n * @param {...object} sources 任意多个来源对象\n * @returns {object} 返回合并后的 target\n */\nexport function merge(target, ...sources) {\n if (!sources.length) return target\n\n const isObject = obj =>\n obj !== null && (typeof obj === 'object' || typeof obj === 'function')\n\n const isPlain = (obj) => {\n if (!isObject(obj)) return false\n const proto = Object.getPrototypeOf(obj)\n return proto === Object.prototype || proto === null\n }\n\n for (const src of sources) {\n if (!isObject(src)) continue\n\n for (const key in src) {\n if (!Object.prototype.hasOwnProperty.call(src, key)) continue\n\n const oldVal = target[key]\n const newVal = src[key]\n\n // 递归合并纯对象,否则直接覆盖\n if (isPlain(newVal) && (oldVal === undefined || isPlain(oldVal))) {\n target[key] = merge(oldVal || {}, newVal)\n }\n else {\n target[key] = newVal // 数组、函数、原始值等直接覆盖\n }\n }\n }\n return target\n}\n"],"names":[],"mappings":"AAMO,SAAS,MAAM,WAAW,SAAS;AACxC,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,QAAM,WAAW,SACf,QAAQ,SAAS,OAAO,QAAQ,YAAY,OAAO,QAAQ;AAE7D,QAAM,UAAU,CAAC,QAAQ;AACvB,QAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAC3B,UAAM,QAAQ,OAAO,eAAe,GAAG;AACvC,WAAO,UAAU,OAAO,aAAa,UAAU;AAAA,EACjD;AAEA,aAAW,OAAO,SAAS;AACzB,QAAI,CAAC,SAAS,GAAG,EAAG;AAEpB,eAAW,OAAO,KAAK;AACrB,UAAI,CAAC,OAAO,UAAU,eAAe,KAAK,KAAK,GAAG,EAAG;AAErD,YAAM,SAAS,OAAO,GAAG;AACzB,YAAM,SAAS,IAAI,GAAG;AAGtB,UAAI,QAAQ,MAAM,MAAM,WAAW,UAAa,QAAQ,MAAM,IAAI;AAChE,eAAO,GAAG,IAAI,MAAM,UAAU,CAAA,GAAI,MAAM;AAAA,MAC1C,OACK;AACH,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;"}
@@ -3,8 +3,8 @@ var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
6
- const lodashEs = require("lodash-es");
7
6
  const Quill = require("quill");
7
+ const merge = require("../../utils/merge.cjs.js");
8
8
  const image = require("./image.cjs.js");
9
9
  const options = require("./options.cjs.js");
10
10
  require("./specs/index.cjs.js");
@@ -22,7 +22,7 @@ class BlotFormatter {
22
22
  this.hide();
23
23
  });
24
24
  this.quill = quill;
25
- this.options = lodashEs.merge({}, options.default, options$1, { arrayMerge: dontMerge });
25
+ this.options = merge.merge({}, options.default, options$1, { arrayMerge: dontMerge });
26
26
  if (options$1.allowInvalidUrl !== void 0) {
27
27
  this.options.allowInvalidUrl = options$1.allowInvalidUrl;
28
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"blot-formatter.cjs.js","sources":["../../../../src/modules/custom-image/blot-formatter.ts"],"sourcesContent":["import type FluentEditor from '../../core/fluent-editor'\nimport type { Action } from './actions'\nimport type { BlotFormatterOptions } from './options'\nimport type { BlotSpec } from './specs'\nimport { merge as deepmerge } from 'lodash-es'\nimport Quill from 'quill'\nimport { CustomImage } from './image'\nimport DefaultOptions from './options'\nimport { CustomImageSpec } from './specs'\n\nconst dontMerge = (_destination: Array<any>, source: Array<any>) => source\n\nexport class BlotFormatter {\n options: BlotFormatterOptions\n currentSpec: BlotSpec\n specs: BlotSpec[]\n overlay: HTMLElement\n actions: Action[]\n observer: MutationObserver\n\n static register() {\n Quill.register({\n 'formats/image': CustomImage,\n 'modules/image-spec': CustomImageSpec,\n }, true)\n }\n\n constructor(public quill: FluentEditor, options: Partial<BlotFormatterOptions> = {}) {\n this.options = deepmerge({}, DefaultOptions, options, { arrayMerge: dontMerge })\n if (options.allowInvalidUrl !== undefined) {\n this.options.allowInvalidUrl = options.allowInvalidUrl\n }\n CustomImage.setOptions(this.options.allowInvalidUrl)\n this.currentSpec = null\n this.actions = []\n this.overlay = document.createElement('div')\n this.overlay.classList.add(this.options.overlay.className)\n if (this.options.overlay.style) {\n Object.assign(this.overlay.style, this.options.overlay.style)\n }\n\n // disable native image resizing on firefox\n document.execCommand('enableObjectResizing', false, 'false') // eslint-disable-next-line-line no-undef\n this.quill.root.addEventListener('click', this.onClick)\n this.specs = this.options.specs.map((SpecClass: any) => new SpecClass(this))\n this.specs.forEach(spec => spec.init())\n }\n\n show(spec: BlotSpec) {\n this.currentSpec = spec\n this.currentSpec.setSelection()\n this.setUserSelect('none')\n this.quill.root.parentNode.appendChild(this.overlay)\n this.repositionOverlay()\n this.createActions(spec)\n\n // fix: 图片对齐之后,虚线外框应该跟随移动\n const imageDom = spec.getTargetElement()\n const win: any = window\n const MutationObserver: typeof window.MutationObserver = win.MutationObserver || win.WebKitMutationObserver || win.MozMutationObserver\n const element = imageDom.parentNode\n this.observer = new MutationObserver((mutationList) => {\n for (const mutation of mutationList) {\n const target = mutation.target as HTMLElement\n const image = target.querySelector('img')\n if (image) {\n this.repositionOverlay()\n }\n }\n })\n this.observer.observe(element, {\n attributes: true,\n attributeFilter: ['class'],\n attributeOldValue: true,\n subtree: true,\n })\n }\n\n hide() {\n if (!this.currentSpec) {\n return\n }\n\n const imgDom = this.currentSpec.getTargetElement()\n if (imgDom) {\n imgDom.classList.remove('current-select-img')\n }\n\n this.currentSpec.onHide()\n this.currentSpec = null\n this.quill.root.parentNode.removeChild(this.overlay)\n this.overlay.style.setProperty('display', 'none')\n this.setUserSelect('')\n this.destroyActions()\n }\n\n update() {\n this.repositionOverlay()\n this.actions.forEach(action => action.onUpdate())\n }\n\n createActions(spec: BlotSpec) {\n this.actions = spec.getActions().map((ActionClass: any) => {\n const action: Action = new ActionClass(this)\n action.onCreate()\n return action\n })\n }\n\n destroyActions() {\n this.actions.forEach((action: Action) => action.onDestroy())\n this.actions = []\n }\n\n repositionOverlay() {\n if (!this.currentSpec) {\n return\n }\n\n const overlayTarget = this.currentSpec.getOverlayElement()\n if (!overlayTarget) {\n return\n }\n\n const parent = this.quill.root.parentElement\n const specRect = overlayTarget.getBoundingClientRect()\n const parentRect = parent.getBoundingClientRect()\n\n Object.assign(this.overlay.style, {\n display: 'block',\n left: `${specRect.left - parentRect.left - 1 + parent.scrollLeft}px`,\n top: `${specRect.top - parentRect.top + parent.scrollTop}px`,\n width: `${specRect.width}px`,\n height: `${specRect.height}px`,\n })\n }\n\n setUserSelect(value: string) {\n const props: string[] = [\n 'userSelect',\n 'mozUserSelect',\n 'webkitUserSelect',\n 'msUserSelect',\n ]\n\n props.forEach((prop: string) => {\n // set on contenteditable element and <html>\n this.quill.root.style.setProperty(prop, value)\n if (document.documentElement) {\n document.documentElement.style.setProperty(prop, value)\n }\n })\n }\n\n onClick = () => {\n this.hide()\n }\n}\n"],"names":["options","deepmerge","DefaultOptions","CustomImage","CustomImageSpec","image"],"mappings":"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"}
1
+ {"version":3,"file":"blot-formatter.cjs.js","sources":["../../../../src/modules/custom-image/blot-formatter.ts"],"sourcesContent":["import type FluentEditor from '../../core/fluent-editor'\nimport type { Action } from './actions'\nimport type { BlotFormatterOptions } from './options'\nimport type { BlotSpec } from './specs'\nimport Quill from 'quill'\nimport { merge as deepmerge } from '../../utils/merge'\nimport { CustomImage } from './image'\nimport DefaultOptions from './options'\nimport { CustomImageSpec } from './specs'\n\nconst dontMerge = (_destination: Array<any>, source: Array<any>) => source\n\nexport class BlotFormatter {\n options: BlotFormatterOptions\n currentSpec: BlotSpec\n specs: BlotSpec[]\n overlay: HTMLElement\n actions: Action[]\n observer: MutationObserver\n\n static register() {\n Quill.register({\n 'formats/image': CustomImage,\n 'modules/image-spec': CustomImageSpec,\n }, true)\n }\n\n constructor(public quill: FluentEditor, options: Partial<BlotFormatterOptions> = {}) {\n this.options = deepmerge({}, DefaultOptions, options, { arrayMerge: dontMerge })\n if (options.allowInvalidUrl !== undefined) {\n this.options.allowInvalidUrl = options.allowInvalidUrl\n }\n CustomImage.setOptions(this.options.allowInvalidUrl)\n this.currentSpec = null\n this.actions = []\n this.overlay = document.createElement('div')\n this.overlay.classList.add(this.options.overlay.className)\n if (this.options.overlay.style) {\n Object.assign(this.overlay.style, this.options.overlay.style)\n }\n\n // disable native image resizing on firefox\n document.execCommand('enableObjectResizing', false, 'false') // eslint-disable-next-line-line no-undef\n this.quill.root.addEventListener('click', this.onClick)\n this.specs = this.options.specs.map((SpecClass: any) => new SpecClass(this))\n this.specs.forEach(spec => spec.init())\n }\n\n show(spec: BlotSpec) {\n this.currentSpec = spec\n this.currentSpec.setSelection()\n this.setUserSelect('none')\n this.quill.root.parentNode.appendChild(this.overlay)\n this.repositionOverlay()\n this.createActions(spec)\n\n // fix: 图片对齐之后,虚线外框应该跟随移动\n const imageDom = spec.getTargetElement()\n const win: any = window\n const MutationObserver: typeof window.MutationObserver = win.MutationObserver || win.WebKitMutationObserver || win.MozMutationObserver\n const element = imageDom.parentNode\n this.observer = new MutationObserver((mutationList) => {\n for (const mutation of mutationList) {\n const target = mutation.target as HTMLElement\n const image = target.querySelector('img')\n if (image) {\n this.repositionOverlay()\n }\n }\n })\n this.observer.observe(element, {\n attributes: true,\n attributeFilter: ['class'],\n attributeOldValue: true,\n subtree: true,\n })\n }\n\n hide() {\n if (!this.currentSpec) {\n return\n }\n\n const imgDom = this.currentSpec.getTargetElement()\n if (imgDom) {\n imgDom.classList.remove('current-select-img')\n }\n\n this.currentSpec.onHide()\n this.currentSpec = null\n this.quill.root.parentNode.removeChild(this.overlay)\n this.overlay.style.setProperty('display', 'none')\n this.setUserSelect('')\n this.destroyActions()\n }\n\n update() {\n this.repositionOverlay()\n this.actions.forEach(action => action.onUpdate())\n }\n\n createActions(spec: BlotSpec) {\n this.actions = spec.getActions().map((ActionClass: any) => {\n const action: Action = new ActionClass(this)\n action.onCreate()\n return action\n })\n }\n\n destroyActions() {\n this.actions.forEach((action: Action) => action.onDestroy())\n this.actions = []\n }\n\n repositionOverlay() {\n if (!this.currentSpec) {\n return\n }\n\n const overlayTarget = this.currentSpec.getOverlayElement()\n if (!overlayTarget) {\n return\n }\n\n const parent = this.quill.root.parentElement\n const specRect = overlayTarget.getBoundingClientRect()\n const parentRect = parent.getBoundingClientRect()\n\n Object.assign(this.overlay.style, {\n display: 'block',\n left: `${specRect.left - parentRect.left - 1 + parent.scrollLeft}px`,\n top: `${specRect.top - parentRect.top + parent.scrollTop}px`,\n width: `${specRect.width}px`,\n height: `${specRect.height}px`,\n })\n }\n\n setUserSelect(value: string) {\n const props: string[] = [\n 'userSelect',\n 'mozUserSelect',\n 'webkitUserSelect',\n 'msUserSelect',\n ]\n\n props.forEach((prop: string) => {\n // set on contenteditable element and <html>\n this.quill.root.style.setProperty(prop, value)\n if (document.documentElement) {\n document.documentElement.style.setProperty(prop, value)\n }\n })\n }\n\n onClick = () => {\n this.hide()\n }\n}\n"],"names":["options","deepmerge","DefaultOptions","CustomImage","CustomImageSpec","image"],"mappings":"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"}
@@ -3,7 +3,7 @@ var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
6
- const lodashEs = require("lodash-es");
6
+ const debounce = require("../utils/debounce.cjs.js");
7
7
  const DEFAULT_OPTIONS = {
8
8
  // @ts-ignore
9
9
  emojiData: window.emojiData,
@@ -72,7 +72,7 @@ class EmojiModule {
72
72
  if (!container) {
73
73
  return null;
74
74
  }
75
- const debouncedUpdate = lodashEs.debounce(() => {
75
+ const debouncedUpdate = debounce.debounce(() => {
76
76
  this.updatePickerPosition();
77
77
  }, 100);
78
78
  const resizeObserver = new ResizeObserver(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"emoji.cjs.js","sources":["../../../src/modules/emoji.ts"],"sourcesContent":["import type { EmojiMartData } from '@emoji-mart/data'\nimport type { computePosition } from '@floating-ui/dom'\nimport type { Picker } from 'emoji-mart'\nimport type TypeToolbar from 'quill/modules/toolbar'\nimport type FluentEditor from '../fluent-editor'\nimport { debounce } from 'lodash-es'\n\nexport interface EmojiModuleOptions {\n emojiData?: EmojiMartData\n EmojiPicker?: new (props: any) => Picker\n emojiPickerPosition?: typeof computePosition\n theme?: string\n locale?: string\n set?: string\n skinTonePosition?: string\n previewPosition?: string\n searchPosition?: string\n categories?: string[]\n maxFrequentRows?: number\n perLine?: number\n navPosition?: string\n noCountryFlags?: boolean\n dynamicWidth?: boolean\n}\n\nconst DEFAULT_OPTIONS: EmojiModuleOptions = {\n // @ts-ignore\n emojiData: window.emojiData,\n // @ts-ignore\n EmojiPicker: window.EmojiPicker,\n // @ts-ignore\n emojiPickerPosition: window.emojiPickerPosition,\n theme: 'light',\n set: 'native',\n skinTonePosition: 'none',\n previewPosition: 'bottom',\n searchPosition: 'sticky',\n categories: ['frequent', 'people', 'nature', 'foods', 'activity', 'places', 'objects', 'symbols', 'flags'],\n maxFrequentRows: 2,\n perLine: 8,\n navPosition: 'top',\n noCountryFlags: false,\n dynamicWidth: false,\n}\n\nconst PICKER_DOM_ID = 'emoji-picker'\n\nconst LOCALE_MAP = {\n 'zh-CN': 'zh',\n 'en-US': 'en',\n} as const\n\nclass EmojiModule {\n private readonly quill: FluentEditor\n private readonly options: EmojiModuleOptions\n private picker: HTMLElement | null = null\n private isPickerVisible = false\n private cleanupResizeObserver: (() => void) | null = null\n\n constructor(quill: FluentEditor, options: EmojiModuleOptions = {}) {\n this.quill = quill\n\n this.options = { ...DEFAULT_OPTIONS, ...options }\n\n const toolbar = this.quill.getModule('toolbar') as TypeToolbar\n\n if (toolbar) {\n toolbar.addHandler('emoji', () => {\n if (this.isPickerVisible) {\n this.closeDialog()\n }\n else {\n this.openDialog()\n }\n })\n }\n }\n\n private getEmojiButton() {\n return document.querySelector('.ql-emoji') as HTMLElement | null\n }\n\n private async updatePickerPosition() {\n const button = this.getEmojiButton()\n const pickerElement = document.getElementById(PICKER_DOM_ID)\n\n if (!button || !this.picker || !pickerElement) {\n return\n }\n\n const { emojiPickerPosition } = this.options\n\n try {\n const { x, y } = await emojiPickerPosition(button, pickerElement)\n this.picker.style.top = `${y}px`\n this.picker.style.left = `${x}px`\n }\n catch (error) {\n console.warn('Failed to compute picker position:', error)\n }\n }\n\n // 监听容器大小变化,更新表情选择弹窗位置\n private setupContainerResizeObserver() {\n const container = this.quill.root.parentElement\n if (!container) {\n return null\n }\n\n const debouncedUpdate = debounce(() => {\n this.updatePickerPosition()\n }, 100)\n\n const resizeObserver = new ResizeObserver(() => {\n debouncedUpdate()\n })\n\n resizeObserver.observe(container)\n\n return () => {\n resizeObserver.disconnect()\n debouncedUpdate.cancel()\n }\n }\n\n // 创建表情选择弹窗\n private createPicker() {\n const { EmojiPicker, emojiData, ...options } = this.options\n\n const pickerConfig = {\n // emoji-mart 与 tiny-editor 国际化的的 locale 不一致使用 LOCALE_MAP 转换\n locale: LOCALE_MAP[this.quill.lang] ?? 'en',\n data: emojiData,\n ...options,\n onEmojiSelect: this.handleEmojiSelect.bind(this),\n onClickOutside: this.handleClickOutside.bind(this),\n }\n\n const picker = new EmojiPicker(pickerConfig) as unknown as HTMLElement\n\n // 设置样式和属性\n picker.id = PICKER_DOM_ID\n picker.style.position = 'absolute'\n picker.style.zIndex = '1000'\n\n return picker\n }\n\n // 打开表情弹窗\n public openDialog() {\n if (this.picker) {\n return\n }\n\n try {\n this.picker = this.createPicker()\n document.body.appendChild(this.picker)\n\n this.updatePickerPosition()\n this.cleanupResizeObserver = this.setupContainerResizeObserver()\n this.isPickerVisible = true\n }\n catch (error) {\n console.error('Failed to open emoji picker:', error)\n this.closeDialog()\n }\n }\n\n // 关闭表情弹窗\n public closeDialog() {\n if (!this.picker) {\n return\n }\n\n this.isPickerVisible = false\n this.picker.remove()\n this.picker = null\n\n this.cleanupResizeObserver?.()\n this.cleanupResizeObserver = null\n }\n\n // 处理表情选择事件\n private handleEmojiSelect(emoji: { native: string }) {\n const selection = this.quill.getSelection(true)\n if (!selection) {\n console.warn('No selection available for emoji insertion')\n return\n }\n\n try {\n // 记录插入位置\n const insertIndex = selection.index\n this.quill.insertText(insertIndex, emoji.native, 'user')\n\n this.closeDialog()\n\n // 设置光标到表情符号后面\n this.quill.setSelection(insertIndex + emoji.native.length)\n }\n catch (error) {\n console.error('Failed to insert emoji:', error)\n }\n }\n\n // 处理外部点击事件\n private handleClickOutside(event: MouseEvent) {\n const button = this.getEmojiButton()\n\n const target = event.target\n\n const isClickOnButton = target === button || (target instanceof Element && button?.contains(target))\n\n // 如果点击的是表情符号按钮或其子元素,则不关闭选择器\n if (isClickOnButton) {\n return\n }\n\n this.closeDialog()\n }\n\n // 销毁模块,清理资源\n public destroy() {\n this.cleanupResizeObserver?.()\n this.cleanupResizeObserver = null\n this.closeDialog()\n }\n}\n\nexport { EmojiModule }\n"],"names":["debounce"],"mappings":"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"}
1
+ {"version":3,"file":"emoji.cjs.js","sources":["../../../src/modules/emoji.ts"],"sourcesContent":["import type { EmojiMartData } from '@emoji-mart/data'\nimport type { computePosition } from '@floating-ui/dom'\nimport type { Picker } from 'emoji-mart'\nimport type TypeToolbar from 'quill/modules/toolbar'\nimport type FluentEditor from '../fluent-editor'\nimport { debounce } from '../utils/debounce'\n\nexport interface EmojiModuleOptions {\n emojiData?: EmojiMartData\n EmojiPicker?: new (props: any) => Picker\n emojiPickerPosition?: typeof computePosition\n theme?: string\n locale?: string\n set?: string\n skinTonePosition?: string\n previewPosition?: string\n searchPosition?: string\n categories?: string[]\n maxFrequentRows?: number\n perLine?: number\n navPosition?: string\n noCountryFlags?: boolean\n dynamicWidth?: boolean\n}\n\nconst DEFAULT_OPTIONS: EmojiModuleOptions = {\n // @ts-ignore\n emojiData: window.emojiData,\n // @ts-ignore\n EmojiPicker: window.EmojiPicker,\n // @ts-ignore\n emojiPickerPosition: window.emojiPickerPosition,\n theme: 'light',\n set: 'native',\n skinTonePosition: 'none',\n previewPosition: 'bottom',\n searchPosition: 'sticky',\n categories: ['frequent', 'people', 'nature', 'foods', 'activity', 'places', 'objects', 'symbols', 'flags'],\n maxFrequentRows: 2,\n perLine: 8,\n navPosition: 'top',\n noCountryFlags: false,\n dynamicWidth: false,\n}\n\nconst PICKER_DOM_ID = 'emoji-picker'\n\nconst LOCALE_MAP = {\n 'zh-CN': 'zh',\n 'en-US': 'en',\n} as const\n\nclass EmojiModule {\n private readonly quill: FluentEditor\n private readonly options: EmojiModuleOptions\n private picker: HTMLElement | null = null\n private isPickerVisible = false\n private cleanupResizeObserver: (() => void) | null = null\n\n constructor(quill: FluentEditor, options: EmojiModuleOptions = {}) {\n this.quill = quill\n\n this.options = { ...DEFAULT_OPTIONS, ...options }\n\n const toolbar = this.quill.getModule('toolbar') as TypeToolbar\n\n if (toolbar) {\n toolbar.addHandler('emoji', () => {\n if (this.isPickerVisible) {\n this.closeDialog()\n }\n else {\n this.openDialog()\n }\n })\n }\n }\n\n private getEmojiButton() {\n return document.querySelector('.ql-emoji') as HTMLElement | null\n }\n\n private async updatePickerPosition() {\n const button = this.getEmojiButton()\n const pickerElement = document.getElementById(PICKER_DOM_ID)\n\n if (!button || !this.picker || !pickerElement) {\n return\n }\n\n const { emojiPickerPosition } = this.options\n\n try {\n const { x, y } = await emojiPickerPosition(button, pickerElement)\n this.picker.style.top = `${y}px`\n this.picker.style.left = `${x}px`\n }\n catch (error) {\n console.warn('Failed to compute picker position:', error)\n }\n }\n\n // 监听容器大小变化,更新表情选择弹窗位置\n private setupContainerResizeObserver() {\n const container = this.quill.root.parentElement\n if (!container) {\n return null\n }\n\n const debouncedUpdate = debounce(() => {\n this.updatePickerPosition()\n }, 100)\n\n const resizeObserver = new ResizeObserver(() => {\n debouncedUpdate()\n })\n\n resizeObserver.observe(container)\n\n return () => {\n resizeObserver.disconnect()\n debouncedUpdate.cancel()\n }\n }\n\n // 创建表情选择弹窗\n private createPicker() {\n const { EmojiPicker, emojiData, ...options } = this.options\n\n const pickerConfig = {\n // emoji-mart 与 tiny-editor 国际化的的 locale 不一致使用 LOCALE_MAP 转换\n locale: LOCALE_MAP[this.quill.lang] ?? 'en',\n data: emojiData,\n ...options,\n onEmojiSelect: this.handleEmojiSelect.bind(this),\n onClickOutside: this.handleClickOutside.bind(this),\n }\n\n const picker = new EmojiPicker(pickerConfig) as unknown as HTMLElement\n\n // 设置样式和属性\n picker.id = PICKER_DOM_ID\n picker.style.position = 'absolute'\n picker.style.zIndex = '1000'\n\n return picker\n }\n\n // 打开表情弹窗\n public openDialog() {\n if (this.picker) {\n return\n }\n\n try {\n this.picker = this.createPicker()\n document.body.appendChild(this.picker)\n\n this.updatePickerPosition()\n this.cleanupResizeObserver = this.setupContainerResizeObserver()\n this.isPickerVisible = true\n }\n catch (error) {\n console.error('Failed to open emoji picker:', error)\n this.closeDialog()\n }\n }\n\n // 关闭表情弹窗\n public closeDialog() {\n if (!this.picker) {\n return\n }\n\n this.isPickerVisible = false\n this.picker.remove()\n this.picker = null\n\n this.cleanupResizeObserver?.()\n this.cleanupResizeObserver = null\n }\n\n // 处理表情选择事件\n private handleEmojiSelect(emoji: { native: string }) {\n const selection = this.quill.getSelection(true)\n if (!selection) {\n console.warn('No selection available for emoji insertion')\n return\n }\n\n try {\n // 记录插入位置\n const insertIndex = selection.index\n this.quill.insertText(insertIndex, emoji.native, 'user')\n\n this.closeDialog()\n\n // 设置光标到表情符号后面\n this.quill.setSelection(insertIndex + emoji.native.length)\n }\n catch (error) {\n console.error('Failed to insert emoji:', error)\n }\n }\n\n // 处理外部点击事件\n private handleClickOutside(event: MouseEvent) {\n const button = this.getEmojiButton()\n\n const target = event.target\n\n const isClickOnButton = target === button || (target instanceof Element && button?.contains(target))\n\n // 如果点击的是表情符号按钮或其子元素,则不关闭选择器\n if (isClickOnButton) {\n return\n }\n\n this.closeDialog()\n }\n\n // 销毁模块,清理资源\n public destroy() {\n this.cleanupResizeObserver?.()\n this.cleanupResizeObserver = null\n this.closeDialog()\n }\n}\n\nexport { EmojiModule }\n"],"names":["debounce"],"mappings":";;;;;;AAyBA,MAAM,kBAAsC;AAAA;AAAA,EAE1C,WAAW,OAAO;AAAA;AAAA,EAElB,aAAa,OAAO;AAAA;AAAA,EAEpB,qBAAqB,OAAO;AAAA,EAC5B,OAAO;AAAA,EACP,KAAK;AAAA,EACL,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,YAAY,CAAC,YAAY,UAAU,UAAU,SAAS,YAAY,UAAU,WAAW,WAAW,OAAO;AAAA,EACzG,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,cAAc;AAChB;AAEA,MAAM,gBAAgB;AAEtB,MAAM,aAAa;AAAA,EACjB,SAAS;AAAA,EACT,SAAS;AACX;AAEA,MAAM,YAAY;AAAA,EAOhB,YAAY,OAAqB,UAA8B,IAAI;AANlD;AACA;AACT,kCAA6B;AAC7B,2CAAkB;AAClB,iDAA6C;AAGnD,SAAK,QAAQ;AAEb,SAAK,UAAU,EAAE,GAAG,iBAAiB,GAAG,QAAA;AAExC,UAAM,UAAU,KAAK,MAAM,UAAU,SAAS;AAE9C,QAAI,SAAS;AACX,cAAQ,WAAW,SAAS,MAAM;AAChC,YAAI,KAAK,iBAAiB;AACxB,eAAK,YAAA;AAAA,QACP,OACK;AACH,eAAK,WAAA;AAAA,QACP;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,iBAAiB;AACvB,WAAO,SAAS,cAAc,WAAW;AAAA,EAC3C;AAAA,EAEA,MAAc,uBAAuB;AACnC,UAAM,SAAS,KAAK,eAAA;AACpB,UAAM,gBAAgB,SAAS,eAAe,aAAa;AAE3D,QAAI,CAAC,UAAU,CAAC,KAAK,UAAU,CAAC,eAAe;AAC7C;AAAA,IACF;AAEA,UAAM,EAAE,wBAAwB,KAAK;AAErC,QAAI;AACF,YAAM,EAAE,GAAG,EAAA,IAAM,MAAM,oBAAoB,QAAQ,aAAa;AAChE,WAAK,OAAO,MAAM,MAAM,GAAG,CAAC;AAC5B,WAAK,OAAO,MAAM,OAAO,GAAG,CAAC;AAAA,IAC/B,SACO,OAAO;AACZ,cAAQ,KAAK,sCAAsC,KAAK;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA,EAGQ,+BAA+B;AACrC,UAAM,YAAY,KAAK,MAAM,KAAK;AAClC,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkBA,SAAAA,SAAS,MAAM;AACrC,WAAK,qBAAA;AAAA,IACP,GAAG,GAAG;AAEN,UAAM,iBAAiB,IAAI,eAAe,MAAM;AAC9C,sBAAA;AAAA,IACF,CAAC;AAED,mBAAe,QAAQ,SAAS;AAEhC,WAAO,MAAM;AACX,qBAAe,WAAA;AACf,sBAAgB,OAAA;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EAGQ,eAAe;AACrB,UAAM,EAAE,aAAa,WAAW,GAAG,QAAA,IAAY,KAAK;AAEpD,UAAM,eAAe;AAAA;AAAA,MAEnB,QAAQ,WAAW,KAAK,MAAM,IAAI,KAAK;AAAA,MACvC,MAAM;AAAA,MACN,GAAG;AAAA,MACH,eAAe,KAAK,kBAAkB,KAAK,IAAI;AAAA,MAC/C,gBAAgB,KAAK,mBAAmB,KAAK,IAAI;AAAA,IAAA;AAGnD,UAAM,SAAS,IAAI,YAAY,YAAY;AAG3C,WAAO,KAAK;AACZ,WAAO,MAAM,WAAW;AACxB,WAAO,MAAM,SAAS;AAEtB,WAAO;AAAA,EACT;AAAA;AAAA,EAGO,aAAa;AAClB,QAAI,KAAK,QAAQ;AACf;AAAA,IACF;AAEA,QAAI;AACF,WAAK,SAAS,KAAK,aAAA;AACnB,eAAS,KAAK,YAAY,KAAK,MAAM;AAErC,WAAK,qBAAA;AACL,WAAK,wBAAwB,KAAK,6BAAA;AAClC,WAAK,kBAAkB;AAAA,IACzB,SACO,OAAO;AACZ,cAAQ,MAAM,gCAAgC,KAAK;AACnD,WAAK,YAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA,EAGO,cAAc;;AACnB,QAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,IACF;AAEA,SAAK,kBAAkB;AACvB,SAAK,OAAO,OAAA;AACZ,SAAK,SAAS;AAEd,eAAK,0BAAL;AACA,SAAK,wBAAwB;AAAA,EAC/B;AAAA;AAAA,EAGQ,kBAAkB,OAA2B;AACnD,UAAM,YAAY,KAAK,MAAM,aAAa,IAAI;AAC9C,QAAI,CAAC,WAAW;AACd,cAAQ,KAAK,4CAA4C;AACzD;AAAA,IACF;AAEA,QAAI;AAEF,YAAM,cAAc,UAAU;AAC9B,WAAK,MAAM,WAAW,aAAa,MAAM,QAAQ,MAAM;AAEvD,WAAK,YAAA;AAGL,WAAK,MAAM,aAAa,cAAc,MAAM,OAAO,MAAM;AAAA,IAC3D,SACO,OAAO;AACZ,cAAQ,MAAM,2BAA2B,KAAK;AAAA,IAChD;AAAA,EACF;AAAA;AAAA,EAGQ,mBAAmB,OAAmB;AAC5C,UAAM,SAAS,KAAK,eAAA;AAEpB,UAAM,SAAS,MAAM;AAErB,UAAM,kBAAkB,WAAW,UAAW,kBAAkB,YAAW,iCAAQ,SAAS;AAG5F,QAAI,iBAAiB;AACnB;AAAA,IACF;AAEA,SAAK,YAAA;AAAA,EACP;AAAA;AAAA,EAGO,UAAU;;AACf,eAAK,0BAAL;AACA,SAAK,wBAAwB;AAC7B,SAAK,YAAA;AAAA,EACP;AACF;;"}
@@ -224,13 +224,13 @@ function handleInsertIcon(blot, selectedNodes) {
224
224
  const height = Number.parseInt(heightStr.replace(/[^\d.]/g, ""), 10) || 500;
225
225
  let iconList = [];
226
226
  const { deps } = configUtils.getAllConfigs(blot.quill);
227
- iconList = deps.nodeIconList.nodeIconList;
227
+ iconList = deps.nodeIconList.nodeIconList ? deps.nodeIconList.nodeIconList : deps.nodeIconList;
228
228
  const leftUpControl = blot.domNode.querySelector(".ql-mind-map-left-up-control");
229
229
  let iconPanel = leftUpControl.querySelector(".ql-mind-map-icon-panel");
230
230
  if (!iconPanel) {
231
231
  iconPanel = document.createElement("div");
232
232
  iconPanel.className = "ql-mind-map-icon-panel";
233
- iconList.forEach((group) => {
233
+ iconList == null ? void 0 : iconList.forEach((group) => {
234
234
  const groupContainer = document.createElement("div");
235
235
  groupContainer.className = "ql-mind-map-icon-group-container";
236
236
  group.list.forEach((icon) => {
@@ -1 +1 @@
1
- {"version":3,"file":"control-panel.cjs.js","sources":["../../../../../src/modules/mind-map/modules/control-panel.ts"],"sourcesContent":["import type FluentEditor from '../../../core/fluent-editor'\nimport type MindMapPlaceholderBlot from '../formats/mind-map-blot'\nimport { CHANGE_LANGUAGE_EVENT } from '../../../config'\nimport { I18N } from '../../../modules/i18n'\nimport { getAllConfigs } from '../config-utils'\nimport { registerMindMapI18N } from '../i18n'\nimport { backIcon, catalogOrganizationIcon, contractIcon, fishboneIcon, fitIcon, forwardIcon, insertChildNodeIcon, insertIconIcon, insertNodeIcon, insertParentNodeIcon, logicalStructureIcon, mindMapIcon, organizationStructureIcon, removeNodeIcon, screenReduceIcon, screenTypeIcon, setLayoutIcon, timelineIcon, zoomInIcon, zoomOutIcon } from '../icons'\n\nclass MindMapControlPanelHandler {\n private texts: Record<string, string>\n private lang: string\n getText(key: keyof Record<string, string>): string {\n return this.texts[key]\n }\n\n constructor(private quill: FluentEditor, private blot: MindMapPlaceholderBlot) {\n const i18nModule = this.quill.getModule('i18n') as I18N\n registerMindMapI18N(I18N)\n this.lang = i18nModule.options.lang\n this.texts = this.resolveTexts()\n this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, (lang: string) => {\n this.lang = lang\n this.texts = this.resolveTexts()\n this.updateControlPanelTexts()\n })\n }\n\n resolveTexts() {\n const textKeys = [\n 'zoomOutTitle',\n 'zoomInTitle',\n 'fitTitle',\n 'backTitle',\n 'forwardTitle',\n 'inserChildNodeTitle',\n 'inserNodeTitle',\n 'insertIconTitle',\n 'inserParentNodeTitle',\n 'removeNodeTitle',\n 'setLayoutTitle',\n 'logicalStructureLayout',\n 'catalogOrganizationLayout',\n 'mindMapLayout',\n 'organizationStructureLayout',\n 'timelineLayout',\n 'fishboneLayout',\n 'panelStatusTitle',\n 'screenTypeTitle',\n ]\n\n return textKeys.reduce((acc, key) => {\n if (!key.includes('Title')) {\n acc[key] = I18N.parserText(`mindMap.layout.${key.replace('Layout', '')}`, this.lang)\n }\n else {\n acc[key] = I18N.parserText(`mindMap.controlPanel.${key}`, this.lang)\n }\n return acc\n }, {} as Record<string, string>)\n }\n\n updateControlPanelTexts() {\n const controlItems = this.blot.domNode.querySelectorAll('.ql-mind-map-control-item')\n\n const controlItemMap: Record<string, string> = {\n 'zoom-out': 'zoomOutTitle',\n 'zoom-in': 'zoomInTitle',\n 'fit': 'fitTitle',\n 'back': 'backTitle',\n 'forward': 'forwardTitle',\n 'insert-child-node': 'inserChildNodeTitle',\n 'insert-node': 'inserNodeTitle',\n 'insert-icon': 'insertIconTitle',\n 'insert-parent-node': 'inserParentNodeTitle',\n 'remove-node': 'removeNodeTitle',\n 'set-layout-icon': 'setLayoutTitle',\n 'panel-status': 'panelStatusTitle',\n 'screen-type': 'screenTypeTitle',\n }\n\n controlItems.forEach((item) => {\n const controlType = (item as HTMLElement).dataset.controlType\n if (controlType && controlItemMap[controlType] && this.texts[controlItemMap[controlType]]) {\n (item as HTMLElement).title = this.texts[controlItemMap[controlType]]\n }\n })\n }\n}\n\nconst controlPanelHandlers = new WeakMap<MindMapPlaceholderBlot, MindMapControlPanelHandler>()\n\nconst DISABLED_OPACITY = '0.5'\nconst ENABLED_OPACITY = '1'\nexport function createControlPanel(blot: MindMapPlaceholderBlot, quill: FluentEditor): void {\n let isStart = true\n let isEnd = true\n let selectedNodes: any[] = []\n blot.mindMap.on('node_active', (...args: unknown[]) => {\n selectedNodes = Array.isArray(args[1]) ? args[1] : []\n })\n // 中间的控制面板\n const controlPanel = document.createElement('div')\n controlPanel.className = 'ql-mind-map-control'\n // 右上的控制面板\n const controlRightUpPanel = document.createElement('div')\n controlRightUpPanel.className = 'ql-mind-map-right-up-control'\n // 左上的控制面板\n const controlLeftUpPanel = document.createElement('div')\n controlLeftUpPanel.className = 'ql-mind-map-left-up-control'\n\n const handler = new MindMapControlPanelHandler(quill, blot)\n controlPanelHandlers.set(blot, handler)\n\n const zoomOutBtn = createControlItem('zoom-out', handler.getText('zoomOutTitle'), () => handleZoomOut(blot))\n const zoomInBtn = createControlItem('zoom-in', handler.getText('zoomInTitle'), () => handleZoomIn(blot))\n const resetBtn = createControlItem('fit', handler.getText('fitTitle'), () => handleResetZoom(blot))\n const backBtn = createControlItem('back', handler.getText('backTitle'), () => {\n if (!isStart) {\n blot.mindMap.execCommand('BACK')\n }\n })\n const forwardBtn = createControlItem('forward', handler.getText('forwardTitle'), () => {\n if (!isEnd) {\n blot.mindMap.execCommand('FORWARD')\n }\n })\n const insertChildNode = createControlItem('insert-child-node', handler.getText('inserChildNodeTitle'), () => handleInsertChildNode(blot))\n const insertNode = createControlItem('insert-node', handler.getText('inserNodeTitle'), () => handleInsertNode(blot))\n const insertParentNode = createControlItem('insert-parent-node', handler.getText('inserParentNodeTitle'), () => handleInsertParentNode(blot))\n const removeNode = createControlItem('remove-node', handler.getText('removeNodeTitle'), () => handleRemoveNode(blot))\n const insertIconBtn = createControlItem('insert-icon', handler.getText('insertIconTitle'), () => handleInsertIcon(blot, selectedNodes))\n const setLayoutBtn = createControlItem('set-layout-icon', handler.getText('setLayoutTitle'), () => handleSetLayoutBtn(blot))\n const panelStatusBtn = createControlItem('panel-status', handler.getText('panelStatusTitle'))\n const screenTypeBtn = createControlItem('screen-type', handler.getText('screenTypeTitle'), () => handleScreenTypeBtn(blot))\n const updateButtonState = (index: number, len: number) => {\n isStart = index <= 0\n isEnd = index >= len - 1\n backBtn.style.cursor = isStart ? 'not-allowed' : 'pointer'\n backBtn.style.opacity = isStart ? DISABLED_OPACITY : ENABLED_OPACITY\n forwardBtn.style.cursor = isEnd ? 'not-allowed' : 'pointer'\n forwardBtn.style.opacity = isEnd ? DISABLED_OPACITY : ENABLED_OPACITY\n }\n\n blot.mindMap.on('back_forward', (index: number, len: number) => {\n updateButtonState(index, len)\n })\n controlPanel.append(zoomOutBtn, zoomInBtn, resetBtn, screenTypeBtn, backBtn, forwardBtn)\n blot.domNode.appendChild(controlPanel)\n controlRightUpPanel.append(panelStatusBtn)\n blot.domNode.appendChild(controlRightUpPanel)\n controlLeftUpPanel.append(insertChildNode, insertNode, insertParentNode, removeNode, insertIconBtn, setLayoutBtn)\n blot.domNode.appendChild(controlLeftUpPanel)\n}\n\nfunction createControlItem(iconClass: string, title: string, onClick?: () => void, disabled = false) {\n const controlItem = document.createElement('div')\n controlItem.className = 'ql-mind-map-control-item'\n controlItem.title = title\n controlItem.dataset.controlType = iconClass\n controlItem.style.cursor = disabled ? 'not-allowed' : 'pointer'\n controlItem.style.opacity = disabled ? DISABLED_OPACITY : ENABLED_OPACITY\n\n const iconMap: Record<string, string> = {\n 'back': backIcon,\n 'forward': forwardIcon,\n 'zoom-out': zoomOutIcon,\n 'zoom-in': zoomInIcon,\n 'fit': fitIcon,\n 'insert-child-node': insertChildNodeIcon,\n 'insert-node': insertNodeIcon,\n 'insert-parent-node': insertParentNodeIcon,\n 'remove-node': removeNodeIcon,\n 'insert-icon': insertIconIcon,\n 'set-layout-icon': setLayoutIcon,\n 'screen-type': screenTypeIcon,\n 'panel-status': contractIcon,\n }\n\n const icon = document.createElement('i')\n icon.innerHTML = iconMap[iconClass] || ''\n controlItem.appendChild(icon)\n\n if (!disabled) {\n controlItem.addEventListener('click', onClick)\n }\n\n return controlItem\n}\n\nfunction handleInsertChildNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_CHILD_NODE')\n}\n\nfunction handleInsertNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_NODE')\n}\n\nfunction handleInsertParentNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_PARENT_NODE')\n}\n\nfunction handleRemoveNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('REMOVE_CURRENT_NODE')\n}\n\nfunction handleZoomIn(blot: MindMapPlaceholderBlot): void {\n if (blot.mindMap && blot.mindMap.view) {\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const cx = containerRect.width / 2\n const cy = containerRect.height / 2\n blot.mindMap.view.enlarge(cx, cy, false)\n blot.zoomCount++\n }\n}\n\nfunction handleZoomOut(blot: MindMapPlaceholderBlot): void {\n if (blot.mindMap && blot.mindMap.view) {\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const cx = containerRect.width / 2\n const cy = containerRect.height / 2\n blot.mindMap.view.narrow(cx, cy, false)\n blot.zoomCount--\n }\n}\n\nfunction handleResetZoom(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.renderer.setRootNodeCenter()\n if (!blot.mindMap || !blot.mindMap.view || blot.zoomCount === 0) return\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const centerX = containerRect.width / 2\n const centerY = containerRect.height / 2\n const operationCount = Math.abs(blot.zoomCount)\n const isEnlarge = blot.zoomCount < 0\n for (let i = 0; i < operationCount; i++) {\n if (isEnlarge) {\n blot.mindMap.view.enlarge(centerX, centerY, false)\n }\n else {\n blot.mindMap.view.narrow(centerX, centerY, false)\n }\n }\n blot.zoomCount = 0\n}\n\nfunction handleInsertIcon(blot: MindMapPlaceholderBlot, selectedNodes: any[]): void {\n (blot as any).selectedNodes = selectedNodes\n const heightStr = blot.domNode.getAttribute('height') || '500px'\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\n let iconList = []\n const { deps } = getAllConfigs(blot.quill)\n iconList = deps.nodeIconList.nodeIconList\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\n let iconPanel = leftUpControl.querySelector('.ql-mind-map-icon-panel') as HTMLElement\n if (!iconPanel) {\n iconPanel = document.createElement('div')\n iconPanel.className = 'ql-mind-map-icon-panel'\n\n iconList.forEach((group) => {\n const groupContainer = document.createElement('div')\n groupContainer.className = 'ql-mind-map-icon-group-container'\n\n group.list.forEach((icon: { icon: string, name: string }) => {\n const iconItem = document.createElement('div')\n iconItem.className = 'ql-mind-map-icon-item'\n iconItem.innerHTML = icon.icon\n\n iconItem.addEventListener('click', () => {\n const currentSelectedNodes = (blot as any).selectedNodes || []\n if (currentSelectedNodes.length > 0) {\n const node = currentSelectedNodes[0]\n\n if (node.getData('icon') && node.getData('icon')[0] === `${group.type}_${icon.name}`) {\n node.setIcon([])\n }\n else {\n node.setIcon([`${group.type}_${icon.name}`])\n }\n blot.data = blot.mindMap.getData({})\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\n }\n iconPanel.style.display = 'none'\n })\n groupContainer.appendChild(iconItem)\n })\n iconPanel.appendChild(groupContainer)\n })\n if (height < 395) {\n iconPanel.style.height = `${height - 130}px`\n }\n else {\n iconPanel.style.height = '270px'\n }\n leftUpControl.appendChild(iconPanel)\n }\n else {\n if (height < 395) {\n iconPanel.style.height = `${height - 130}px`\n }\n else {\n iconPanel.style.height = '270px'\n }\n iconPanel.style.display = 'block'\n }\n\n const handleOutsideClick = (e: MouseEvent) => {\n let insertIconBtn: HTMLElement | null = null\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\n\n controlItems.forEach((item) => {\n if ((item as HTMLElement).dataset.controlType === 'insert-icon') {\n insertIconBtn = item as HTMLElement\n }\n })\n\n if (!iconPanel.contains(e.target as Node) && (!insertIconBtn || !insertIconBtn.contains(e.target as Node))) {\n iconPanel.style.display = 'none'\n document.removeEventListener('click', handleOutsideClick)\n }\n }\n document.removeEventListener('click', handleOutsideClick)\n document.addEventListener('click', handleOutsideClick)\n}\n\nfunction handleSetLayoutBtn(blot: MindMapPlaceholderBlot): void {\n const handler = controlPanelHandlers.get(blot)\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\n let layoutPanel = leftUpControl.querySelector('.ql-mind-map-layout-panel') as HTMLElement\n const heightStr = blot.domNode.getAttribute('height') || '500'\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\n\n if (!layoutPanel) {\n layoutPanel = document.createElement('div')\n layoutPanel.className = 'ql-mind-map-layout-panel'\n\n const layouts = [\n {\n name: 'logicalStructure',\n displayName: handler?.getText('logicalStructureLayout'),\n icon: logicalStructureIcon,\n },\n {\n name: 'catalogOrganization',\n displayName: handler?.getText('catalogOrganizationLayout'),\n icon: catalogOrganizationIcon,\n },\n {\n name: 'mindMap',\n displayName: handler?.getText('mindMapLayout'),\n icon: mindMapIcon,\n },\n {\n name: 'organizationStructure',\n displayName: handler?.getText('organizationStructureLayout'),\n icon: organizationStructureIcon,\n },\n {\n name: 'timeline',\n displayName: handler?.getText('timelineLayout'),\n icon: timelineIcon,\n },\n {\n name: 'fishbone',\n displayName: handler?.getText('fishboneLayout'),\n icon: fishboneIcon,\n },\n ]\n\n layouts.forEach((layout) => {\n const layoutItem = document.createElement('div')\n layoutItem.className = 'ql-mind-map-layout-item'\n\n const iconContainer = document.createElement('div')\n iconContainer.className = 'ql-mind-map-layout-icon-container'\n\n const img = document.createElement('div')\n img.className = 'ql-mind-map-layout-icon'\n img.innerHTML = layout.icon\n img.style.display = 'flex'\n img.style.alignItems = 'center'\n img.style.justifyContent = 'center'\n const svgElement = img.querySelector('svg')\n\n svgElement.style.maxWidth = '100%'\n svgElement.style.maxHeight = '100%'\n svgElement.style.width = 'auto'\n svgElement.style.height = 'auto'\n svgElement.removeAttribute('width')\n svgElement.removeAttribute('height')\n\n iconContainer.appendChild(img)\n\n const nameText = document.createElement('div')\n nameText.className = 'ql-mind-map-layout-name'\n nameText.textContent = layout.displayName\n\n layoutItem.appendChild(iconContainer)\n layoutItem.appendChild(nameText)\n layoutItem.addEventListener('click', () => {\n blot.mindMap.setLayout(layout.name)\n blot.data = blot.mindMap.getData({})\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\n layoutPanel.style.display = 'none'\n })\n layoutPanel.appendChild(layoutItem)\n })\n leftUpControl.appendChild(layoutPanel)\n if (height < 395) {\n layoutPanel.style.height = `${height - 130}px`\n }\n else {\n layoutPanel.style.height = '270px'\n }\n }\n else {\n if (height < 395) {\n layoutPanel.style.height = `${height - 130}px`\n }\n else {\n layoutPanel.style.height = '270px'\n }\n layoutPanel.style.display = 'flex'\n }\n\n const handleOutsideClick = (e: MouseEvent) => {\n let setLayoutBtn: HTMLElement | null = null\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\n\n setLayoutBtn = Array.from(controlItems).find(item => item.getAttribute('data-control-type') === 'set-layout-icon') as HTMLElement | null\n\n if (!layoutPanel.contains(e.target as Node) && (!setLayoutBtn || !setLayoutBtn.contains(e.target as Node))) {\n layoutPanel.style.display = 'none'\n document.removeEventListener('click', handleOutsideClick)\n }\n }\n document.removeEventListener('click', handleOutsideClick)\n document.addEventListener('click', handleOutsideClick)\n}\n\nfunction handleScreenTypeBtn(blot: MindMapPlaceholderBlot): void {\n const screenTypeBtn = blot.domNode.querySelector('[data-control-type=\"screen-type\"]') as HTMLElement | null\n if (!screenTypeBtn || !blot.domNode) return\n\n const mindMapContainer = blot.domNode\n const isFullscreen = mindMapContainer.style.position === 'fixed'\n\n if (isFullscreen) {\n const originalPosition = mindMapContainer.getAttribute('data-original-position')\n const originalWidth = mindMapContainer.getAttribute('data-original-width')\n const originalHeight = mindMapContainer.getAttribute('data-original-height')\n if (originalWidth && originalHeight) {\n mindMapContainer.style.position = originalPosition\n mindMapContainer.style.width = originalWidth\n mindMapContainer.style.height = originalHeight\n mindMapContainer.style.zIndex = '0'\n }\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenTypeIcon\n }\n }\n else {\n mindMapContainer.setAttribute('data-original-position', mindMapContainer.style.position || '')\n mindMapContainer.setAttribute('data-original-width', mindMapContainer.style.width || '')\n mindMapContainer.setAttribute('data-original-height', mindMapContainer.style.height || '')\n mindMapContainer.style.position = 'fixed'\n mindMapContainer.style.top = '0'\n mindMapContainer.style.left = '0'\n mindMapContainer.style.width = '100vw'\n mindMapContainer.style.height = '100vh'\n mindMapContainer.style.zIndex = '100'\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenReduceIcon\n }\n }\n blot.mindMap.renderer.setRootNodeCenter()\n blot.mindMap.resize()\n}\n"],"names":["registerMindMapI18N","I18N","CHANGE_LANGUAGE_EVENT","index","backIcon","forwardIcon","zoomOutIcon","zoomInIcon","fitIcon","insertChildNodeIcon","insertNodeIcon","insertParentNodeIcon","removeNodeIcon","insertIconIcon","setLayoutIcon","screenTypeIcon","contractIcon","getAllConfigs","logicalStructureIcon","catalogOrganizationIcon","mindMapIcon","organizationStructureIcon","timelineIcon","fishboneIcon","screenReduceIcon"],"mappings":"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"}
1
+ {"version":3,"file":"control-panel.cjs.js","sources":["../../../../../src/modules/mind-map/modules/control-panel.ts"],"sourcesContent":["import type FluentEditor from '../../../core/fluent-editor'\nimport type MindMapPlaceholderBlot from '../formats/mind-map-blot'\nimport { CHANGE_LANGUAGE_EVENT } from '../../../config'\nimport { I18N } from '../../../modules/i18n'\nimport { getAllConfigs } from '../config-utils'\nimport { registerMindMapI18N } from '../i18n'\nimport { backIcon, catalogOrganizationIcon, contractIcon, fishboneIcon, fitIcon, forwardIcon, insertChildNodeIcon, insertIconIcon, insertNodeIcon, insertParentNodeIcon, logicalStructureIcon, mindMapIcon, organizationStructureIcon, removeNodeIcon, screenReduceIcon, screenTypeIcon, setLayoutIcon, timelineIcon, zoomInIcon, zoomOutIcon } from '../icons'\n\nclass MindMapControlPanelHandler {\n private texts: Record<string, string>\n private lang: string\n getText(key: keyof Record<string, string>): string {\n return this.texts[key]\n }\n\n constructor(private quill: FluentEditor, private blot: MindMapPlaceholderBlot) {\n const i18nModule = this.quill.getModule('i18n') as I18N\n registerMindMapI18N(I18N)\n this.lang = i18nModule.options.lang\n this.texts = this.resolveTexts()\n this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, (lang: string) => {\n this.lang = lang\n this.texts = this.resolveTexts()\n this.updateControlPanelTexts()\n })\n }\n\n resolveTexts() {\n const textKeys = [\n 'zoomOutTitle',\n 'zoomInTitle',\n 'fitTitle',\n 'backTitle',\n 'forwardTitle',\n 'inserChildNodeTitle',\n 'inserNodeTitle',\n 'insertIconTitle',\n 'inserParentNodeTitle',\n 'removeNodeTitle',\n 'setLayoutTitle',\n 'logicalStructureLayout',\n 'catalogOrganizationLayout',\n 'mindMapLayout',\n 'organizationStructureLayout',\n 'timelineLayout',\n 'fishboneLayout',\n 'panelStatusTitle',\n 'screenTypeTitle',\n ]\n\n return textKeys.reduce((acc, key) => {\n if (!key.includes('Title')) {\n acc[key] = I18N.parserText(`mindMap.layout.${key.replace('Layout', '')}`, this.lang)\n }\n else {\n acc[key] = I18N.parserText(`mindMap.controlPanel.${key}`, this.lang)\n }\n return acc\n }, {} as Record<string, string>)\n }\n\n updateControlPanelTexts() {\n const controlItems = this.blot.domNode.querySelectorAll('.ql-mind-map-control-item')\n\n const controlItemMap: Record<string, string> = {\n 'zoom-out': 'zoomOutTitle',\n 'zoom-in': 'zoomInTitle',\n 'fit': 'fitTitle',\n 'back': 'backTitle',\n 'forward': 'forwardTitle',\n 'insert-child-node': 'inserChildNodeTitle',\n 'insert-node': 'inserNodeTitle',\n 'insert-icon': 'insertIconTitle',\n 'insert-parent-node': 'inserParentNodeTitle',\n 'remove-node': 'removeNodeTitle',\n 'set-layout-icon': 'setLayoutTitle',\n 'panel-status': 'panelStatusTitle',\n 'screen-type': 'screenTypeTitle',\n }\n\n controlItems.forEach((item) => {\n const controlType = (item as HTMLElement).dataset.controlType\n if (controlType && controlItemMap[controlType] && this.texts[controlItemMap[controlType]]) {\n (item as HTMLElement).title = this.texts[controlItemMap[controlType]]\n }\n })\n }\n}\n\nconst controlPanelHandlers = new WeakMap<MindMapPlaceholderBlot, MindMapControlPanelHandler>()\n\nconst DISABLED_OPACITY = '0.5'\nconst ENABLED_OPACITY = '1'\nexport function createControlPanel(blot: MindMapPlaceholderBlot, quill: FluentEditor): void {\n let isStart = true\n let isEnd = true\n let selectedNodes: any[] = []\n blot.mindMap.on('node_active', (...args: unknown[]) => {\n selectedNodes = Array.isArray(args[1]) ? args[1] : []\n })\n // 中间的控制面板\n const controlPanel = document.createElement('div')\n controlPanel.className = 'ql-mind-map-control'\n // 右上的控制面板\n const controlRightUpPanel = document.createElement('div')\n controlRightUpPanel.className = 'ql-mind-map-right-up-control'\n // 左上的控制面板\n const controlLeftUpPanel = document.createElement('div')\n controlLeftUpPanel.className = 'ql-mind-map-left-up-control'\n\n const handler = new MindMapControlPanelHandler(quill, blot)\n controlPanelHandlers.set(blot, handler)\n\n const zoomOutBtn = createControlItem('zoom-out', handler.getText('zoomOutTitle'), () => handleZoomOut(blot))\n const zoomInBtn = createControlItem('zoom-in', handler.getText('zoomInTitle'), () => handleZoomIn(blot))\n const resetBtn = createControlItem('fit', handler.getText('fitTitle'), () => handleResetZoom(blot))\n const backBtn = createControlItem('back', handler.getText('backTitle'), () => {\n if (!isStart) {\n blot.mindMap.execCommand('BACK')\n }\n })\n const forwardBtn = createControlItem('forward', handler.getText('forwardTitle'), () => {\n if (!isEnd) {\n blot.mindMap.execCommand('FORWARD')\n }\n })\n const insertChildNode = createControlItem('insert-child-node', handler.getText('inserChildNodeTitle'), () => handleInsertChildNode(blot))\n const insertNode = createControlItem('insert-node', handler.getText('inserNodeTitle'), () => handleInsertNode(blot))\n const insertParentNode = createControlItem('insert-parent-node', handler.getText('inserParentNodeTitle'), () => handleInsertParentNode(blot))\n const removeNode = createControlItem('remove-node', handler.getText('removeNodeTitle'), () => handleRemoveNode(blot))\n const insertIconBtn = createControlItem('insert-icon', handler.getText('insertIconTitle'), () => handleInsertIcon(blot, selectedNodes))\n const setLayoutBtn = createControlItem('set-layout-icon', handler.getText('setLayoutTitle'), () => handleSetLayoutBtn(blot))\n const panelStatusBtn = createControlItem('panel-status', handler.getText('panelStatusTitle'))\n const screenTypeBtn = createControlItem('screen-type', handler.getText('screenTypeTitle'), () => handleScreenTypeBtn(blot))\n const updateButtonState = (index: number, len: number) => {\n isStart = index <= 0\n isEnd = index >= len - 1\n backBtn.style.cursor = isStart ? 'not-allowed' : 'pointer'\n backBtn.style.opacity = isStart ? DISABLED_OPACITY : ENABLED_OPACITY\n forwardBtn.style.cursor = isEnd ? 'not-allowed' : 'pointer'\n forwardBtn.style.opacity = isEnd ? DISABLED_OPACITY : ENABLED_OPACITY\n }\n\n blot.mindMap.on('back_forward', (index: number, len: number) => {\n updateButtonState(index, len)\n })\n controlPanel.append(zoomOutBtn, zoomInBtn, resetBtn, screenTypeBtn, backBtn, forwardBtn)\n blot.domNode.appendChild(controlPanel)\n controlRightUpPanel.append(panelStatusBtn)\n blot.domNode.appendChild(controlRightUpPanel)\n controlLeftUpPanel.append(insertChildNode, insertNode, insertParentNode, removeNode, insertIconBtn, setLayoutBtn)\n blot.domNode.appendChild(controlLeftUpPanel)\n}\n\nfunction createControlItem(iconClass: string, title: string, onClick?: () => void, disabled = false) {\n const controlItem = document.createElement('div')\n controlItem.className = 'ql-mind-map-control-item'\n controlItem.title = title\n controlItem.dataset.controlType = iconClass\n controlItem.style.cursor = disabled ? 'not-allowed' : 'pointer'\n controlItem.style.opacity = disabled ? DISABLED_OPACITY : ENABLED_OPACITY\n\n const iconMap: Record<string, string> = {\n 'back': backIcon,\n 'forward': forwardIcon,\n 'zoom-out': zoomOutIcon,\n 'zoom-in': zoomInIcon,\n 'fit': fitIcon,\n 'insert-child-node': insertChildNodeIcon,\n 'insert-node': insertNodeIcon,\n 'insert-parent-node': insertParentNodeIcon,\n 'remove-node': removeNodeIcon,\n 'insert-icon': insertIconIcon,\n 'set-layout-icon': setLayoutIcon,\n 'screen-type': screenTypeIcon,\n 'panel-status': contractIcon,\n }\n\n const icon = document.createElement('i')\n icon.innerHTML = iconMap[iconClass] || ''\n controlItem.appendChild(icon)\n\n if (!disabled) {\n controlItem.addEventListener('click', onClick)\n }\n\n return controlItem\n}\n\nfunction handleInsertChildNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_CHILD_NODE')\n}\n\nfunction handleInsertNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_NODE')\n}\n\nfunction handleInsertParentNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_PARENT_NODE')\n}\n\nfunction handleRemoveNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('REMOVE_CURRENT_NODE')\n}\n\nfunction handleZoomIn(blot: MindMapPlaceholderBlot): void {\n if (blot.mindMap && blot.mindMap.view) {\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const cx = containerRect.width / 2\n const cy = containerRect.height / 2\n blot.mindMap.view.enlarge(cx, cy, false)\n blot.zoomCount++\n }\n}\n\nfunction handleZoomOut(blot: MindMapPlaceholderBlot): void {\n if (blot.mindMap && blot.mindMap.view) {\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const cx = containerRect.width / 2\n const cy = containerRect.height / 2\n blot.mindMap.view.narrow(cx, cy, false)\n blot.zoomCount--\n }\n}\n\nfunction handleResetZoom(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.renderer.setRootNodeCenter()\n if (!blot.mindMap || !blot.mindMap.view || blot.zoomCount === 0) return\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const centerX = containerRect.width / 2\n const centerY = containerRect.height / 2\n const operationCount = Math.abs(blot.zoomCount)\n const isEnlarge = blot.zoomCount < 0\n for (let i = 0; i < operationCount; i++) {\n if (isEnlarge) {\n blot.mindMap.view.enlarge(centerX, centerY, false)\n }\n else {\n blot.mindMap.view.narrow(centerX, centerY, false)\n }\n }\n blot.zoomCount = 0\n}\n\nfunction handleInsertIcon(blot: MindMapPlaceholderBlot, selectedNodes: any[]): void {\n (blot as any).selectedNodes = selectedNodes\n const heightStr = blot.domNode.getAttribute('height') || '500px'\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\n let iconList = []\n const { deps } = getAllConfigs(blot.quill)\n iconList = deps.nodeIconList.nodeIconList ? deps.nodeIconList.nodeIconList : deps.nodeIconList\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\n let iconPanel = leftUpControl.querySelector('.ql-mind-map-icon-panel') as HTMLElement\n if (!iconPanel) {\n iconPanel = document.createElement('div')\n iconPanel.className = 'ql-mind-map-icon-panel'\n iconList?.forEach((group) => {\n const groupContainer = document.createElement('div')\n groupContainer.className = 'ql-mind-map-icon-group-container'\n\n group.list.forEach((icon: { icon: string, name: string }) => {\n const iconItem = document.createElement('div')\n iconItem.className = 'ql-mind-map-icon-item'\n iconItem.innerHTML = icon.icon\n\n iconItem.addEventListener('click', () => {\n const currentSelectedNodes = (blot as any).selectedNodes || []\n if (currentSelectedNodes.length > 0) {\n const node = currentSelectedNodes[0]\n\n if (node.getData('icon') && node.getData('icon')[0] === `${group.type}_${icon.name}`) {\n node.setIcon([])\n }\n else {\n node.setIcon([`${group.type}_${icon.name}`])\n }\n blot.data = blot.mindMap.getData({})\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\n }\n iconPanel.style.display = 'none'\n })\n groupContainer.appendChild(iconItem)\n })\n iconPanel.appendChild(groupContainer)\n })\n if (height < 395) {\n iconPanel.style.height = `${height - 130}px`\n }\n else {\n iconPanel.style.height = '270px'\n }\n leftUpControl.appendChild(iconPanel)\n }\n else {\n if (height < 395) {\n iconPanel.style.height = `${height - 130}px`\n }\n else {\n iconPanel.style.height = '270px'\n }\n iconPanel.style.display = 'block'\n }\n\n const handleOutsideClick = (e: MouseEvent) => {\n let insertIconBtn: HTMLElement | null = null\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\n\n controlItems.forEach((item) => {\n if ((item as HTMLElement).dataset.controlType === 'insert-icon') {\n insertIconBtn = item as HTMLElement\n }\n })\n\n if (!iconPanel.contains(e.target as Node) && (!insertIconBtn || !insertIconBtn.contains(e.target as Node))) {\n iconPanel.style.display = 'none'\n document.removeEventListener('click', handleOutsideClick)\n }\n }\n document.removeEventListener('click', handleOutsideClick)\n document.addEventListener('click', handleOutsideClick)\n}\n\nfunction handleSetLayoutBtn(blot: MindMapPlaceholderBlot): void {\n const handler = controlPanelHandlers.get(blot)\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\n let layoutPanel = leftUpControl.querySelector('.ql-mind-map-layout-panel') as HTMLElement\n const heightStr = blot.domNode.getAttribute('height') || '500'\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\n\n if (!layoutPanel) {\n layoutPanel = document.createElement('div')\n layoutPanel.className = 'ql-mind-map-layout-panel'\n\n const layouts = [\n {\n name: 'logicalStructure',\n displayName: handler?.getText('logicalStructureLayout'),\n icon: logicalStructureIcon,\n },\n {\n name: 'catalogOrganization',\n displayName: handler?.getText('catalogOrganizationLayout'),\n icon: catalogOrganizationIcon,\n },\n {\n name: 'mindMap',\n displayName: handler?.getText('mindMapLayout'),\n icon: mindMapIcon,\n },\n {\n name: 'organizationStructure',\n displayName: handler?.getText('organizationStructureLayout'),\n icon: organizationStructureIcon,\n },\n {\n name: 'timeline',\n displayName: handler?.getText('timelineLayout'),\n icon: timelineIcon,\n },\n {\n name: 'fishbone',\n displayName: handler?.getText('fishboneLayout'),\n icon: fishboneIcon,\n },\n ]\n\n layouts.forEach((layout) => {\n const layoutItem = document.createElement('div')\n layoutItem.className = 'ql-mind-map-layout-item'\n\n const iconContainer = document.createElement('div')\n iconContainer.className = 'ql-mind-map-layout-icon-container'\n\n const img = document.createElement('div')\n img.className = 'ql-mind-map-layout-icon'\n img.innerHTML = layout.icon\n img.style.display = 'flex'\n img.style.alignItems = 'center'\n img.style.justifyContent = 'center'\n const svgElement = img.querySelector('svg')\n\n svgElement.style.maxWidth = '100%'\n svgElement.style.maxHeight = '100%'\n svgElement.style.width = 'auto'\n svgElement.style.height = 'auto'\n svgElement.removeAttribute('width')\n svgElement.removeAttribute('height')\n\n iconContainer.appendChild(img)\n\n const nameText = document.createElement('div')\n nameText.className = 'ql-mind-map-layout-name'\n nameText.textContent = layout.displayName\n\n layoutItem.appendChild(iconContainer)\n layoutItem.appendChild(nameText)\n layoutItem.addEventListener('click', () => {\n blot.mindMap.setLayout(layout.name)\n blot.data = blot.mindMap.getData({})\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\n layoutPanel.style.display = 'none'\n })\n layoutPanel.appendChild(layoutItem)\n })\n leftUpControl.appendChild(layoutPanel)\n if (height < 395) {\n layoutPanel.style.height = `${height - 130}px`\n }\n else {\n layoutPanel.style.height = '270px'\n }\n }\n else {\n if (height < 395) {\n layoutPanel.style.height = `${height - 130}px`\n }\n else {\n layoutPanel.style.height = '270px'\n }\n layoutPanel.style.display = 'flex'\n }\n\n const handleOutsideClick = (e: MouseEvent) => {\n let setLayoutBtn: HTMLElement | null = null\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\n\n setLayoutBtn = Array.from(controlItems).find(item => item.getAttribute('data-control-type') === 'set-layout-icon') as HTMLElement | null\n\n if (!layoutPanel.contains(e.target as Node) && (!setLayoutBtn || !setLayoutBtn.contains(e.target as Node))) {\n layoutPanel.style.display = 'none'\n document.removeEventListener('click', handleOutsideClick)\n }\n }\n document.removeEventListener('click', handleOutsideClick)\n document.addEventListener('click', handleOutsideClick)\n}\n\nfunction handleScreenTypeBtn(blot: MindMapPlaceholderBlot): void {\n const screenTypeBtn = blot.domNode.querySelector('[data-control-type=\"screen-type\"]') as HTMLElement | null\n if (!screenTypeBtn || !blot.domNode) return\n\n const mindMapContainer = blot.domNode\n const isFullscreen = mindMapContainer.style.position === 'fixed'\n\n if (isFullscreen) {\n const originalPosition = mindMapContainer.getAttribute('data-original-position')\n const originalWidth = mindMapContainer.getAttribute('data-original-width')\n const originalHeight = mindMapContainer.getAttribute('data-original-height')\n if (originalWidth && originalHeight) {\n mindMapContainer.style.position = originalPosition\n mindMapContainer.style.width = originalWidth\n mindMapContainer.style.height = originalHeight\n mindMapContainer.style.zIndex = '0'\n }\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenTypeIcon\n }\n }\n else {\n mindMapContainer.setAttribute('data-original-position', mindMapContainer.style.position || '')\n mindMapContainer.setAttribute('data-original-width', mindMapContainer.style.width || '')\n mindMapContainer.setAttribute('data-original-height', mindMapContainer.style.height || '')\n mindMapContainer.style.position = 'fixed'\n mindMapContainer.style.top = '0'\n mindMapContainer.style.left = '0'\n mindMapContainer.style.width = '100vw'\n mindMapContainer.style.height = '100vh'\n mindMapContainer.style.zIndex = '100'\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenReduceIcon\n }\n }\n blot.mindMap.renderer.setRootNodeCenter()\n blot.mindMap.resize()\n}\n"],"names":["registerMindMapI18N","I18N","CHANGE_LANGUAGE_EVENT","index","backIcon","forwardIcon","zoomOutIcon","zoomInIcon","fitIcon","insertChildNodeIcon","insertNodeIcon","insertParentNodeIcon","removeNodeIcon","insertIconIcon","setLayoutIcon","screenTypeIcon","contractIcon","getAllConfigs","logicalStructureIcon","catalogOrganizationIcon","mindMapIcon","organizationStructureIcon","timelineIcon","fishboneIcon","screenReduceIcon"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ function merge(target, ...sources) {
4
+ if (!sources.length) return target;
5
+ const isObject = (obj) => obj !== null && (typeof obj === "object" || typeof obj === "function");
6
+ const isPlain = (obj) => {
7
+ if (!isObject(obj)) return false;
8
+ const proto = Object.getPrototypeOf(obj);
9
+ return proto === Object.prototype || proto === null;
10
+ };
11
+ for (const src of sources) {
12
+ if (!isObject(src)) continue;
13
+ for (const key in src) {
14
+ if (!Object.prototype.hasOwnProperty.call(src, key)) continue;
15
+ const oldVal = target[key];
16
+ const newVal = src[key];
17
+ if (isPlain(newVal) && (oldVal === void 0 || isPlain(oldVal))) {
18
+ target[key] = merge(oldVal || {}, newVal);
19
+ } else {
20
+ target[key] = newVal;
21
+ }
22
+ }
23
+ }
24
+ return target;
25
+ }
26
+ exports.merge = merge;
27
+ //# sourceMappingURL=merge.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.cjs.js","sources":["../../../src/utils/merge.ts"],"sourcesContent":["/**\n * 深合并任意多个普通对象\n * @param {object} target 目标对象(会被修改)\n * @param {...object} sources 任意多个来源对象\n * @returns {object} 返回合并后的 target\n */\nexport function merge(target, ...sources) {\n if (!sources.length) return target\n\n const isObject = obj =>\n obj !== null && (typeof obj === 'object' || typeof obj === 'function')\n\n const isPlain = (obj) => {\n if (!isObject(obj)) return false\n const proto = Object.getPrototypeOf(obj)\n return proto === Object.prototype || proto === null\n }\n\n for (const src of sources) {\n if (!isObject(src)) continue\n\n for (const key in src) {\n if (!Object.prototype.hasOwnProperty.call(src, key)) continue\n\n const oldVal = target[key]\n const newVal = src[key]\n\n // 递归合并纯对象,否则直接覆盖\n if (isPlain(newVal) && (oldVal === undefined || isPlain(oldVal))) {\n target[key] = merge(oldVal || {}, newVal)\n }\n else {\n target[key] = newVal // 数组、函数、原始值等直接覆盖\n }\n }\n }\n return target\n}\n"],"names":[],"mappings":";;AAMO,SAAS,MAAM,WAAW,SAAS;AACxC,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,QAAM,WAAW,SACf,QAAQ,SAAS,OAAO,QAAQ,YAAY,OAAO,QAAQ;AAE7D,QAAM,UAAU,CAAC,QAAQ;AACvB,QAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAC3B,UAAM,QAAQ,OAAO,eAAe,GAAG;AACvC,WAAO,UAAU,OAAO,aAAa,UAAU;AAAA,EACjD;AAEA,aAAW,OAAO,SAAS;AACzB,QAAI,CAAC,SAAS,GAAG,EAAG;AAEpB,eAAW,OAAO,KAAK;AACrB,UAAI,CAAC,OAAO,UAAU,eAAe,KAAK,KAAK,GAAG,EAAG;AAErD,YAAM,SAAS,OAAO,GAAG;AACzB,YAAM,SAAS,IAAI,GAAG;AAGtB,UAAI,QAAQ,MAAM,MAAM,WAAW,UAAa,QAAQ,MAAM,IAAI;AAChE,eAAO,GAAG,IAAI,MAAM,UAAU,CAAA,GAAI,MAAM;AAAA,MAC1C,OACK;AACH,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@opentiny/fluent-editor",
3
3
  "type": "module",
4
- "version": "4.0.0-alpha.12",
4
+ "version": "4.0.0-alpha.13",
5
5
  "description": "A rich text editor based on Quill 2.0, which extends rich modules and formats on the basis of Quill. It's powerful and out-of-the-box.",
6
6
  "author": "OpenTiny Team",
7
7
  "license": "MIT",
@@ -23,13 +23,23 @@
23
23
  "opentiny",
24
24
  "fluent-editor"
25
25
  ],
26
- "main": "lib/index.cjs.js",
26
+ "main": "es/index.es.js",
27
27
  "module": "es/index.es.js",
28
28
  "types": "types/index.d.ts",
29
29
  "dependencies": {
30
- "lodash-es": "^4.17.15",
31
30
  "quill": "^2.0.0",
32
31
  "quill-easy-color": "^0.0.10",
33
32
  "quill-shortcut-key": "^0.0.5"
33
+ },
34
+ "exports": {
35
+ ".": {
36
+ "import": "./es/index.es.js",
37
+ "require": "./lib/index.cjs.js",
38
+ "types": "./types/index.d.ts"
39
+ },
40
+ "./style.css": "./style.css",
41
+ "./flow-chart.css": "./flow-chart.css",
42
+ "./mind-map.css": "./mind-map.css",
43
+ "./package.json": "./package.json"
34
44
  }
35
45
  }
@@ -16,10 +16,10 @@ export interface BackgroundConfig {
16
16
  opacity?: number;
17
17
  }
18
18
  export interface FlowChartDeps {
19
- SimpleMindMap: any;
20
- Themes: any;
21
- Drag: any;
22
- Export: any;
19
+ LogicFlow: any;
20
+ DndPanel: any;
21
+ SelectionSelect: any;
22
+ Snapshot: any;
23
23
  }
24
24
  export interface FlowChartOptions {
25
25
  grid?: boolean | GridOptions;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 深合并任意多个普通对象
3
+ * @param {object} target 目标对象(会被修改)
4
+ * @param {...object} sources 任意多个来源对象
5
+ * @returns {object} 返回合并后的 target
6
+ */
7
+ export declare function merge(target: any, ...sources: any[]): any;