@opentiny/fluent-editor 3.23.1 → 3.23.3

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.
Files changed (51) hide show
  1. package/README.md +3 -1
  2. package/es/attributors/font-style.es.js +1 -1
  3. package/es/attributors/font-style.es.js.map +1 -1
  4. package/es/config/index.es.js +15 -1
  5. package/es/config/index.es.js.map +1 -1
  6. package/es/custom-image/image.es.js +1 -1
  7. package/es/custom-image/image.es.js.map +1 -1
  8. package/es/custom-uploader.es.js +13 -2
  9. package/es/custom-uploader.es.js.map +1 -1
  10. package/es/fluent-editor.es.js +1 -0
  11. package/es/fluent-editor.es.js.map +1 -1
  12. package/es/index.es.js +15 -1
  13. package/es/index.es.js.map +1 -1
  14. package/es/mathlive/formats.es.js +3 -32
  15. package/es/mathlive/formats.es.js.map +1 -1
  16. package/es/mathlive/index.es.js +23 -6
  17. package/es/mathlive/index.es.js.map +1 -1
  18. package/es/mathlive/tooltip.es.js +5 -5
  19. package/es/mathlive/tooltip.es.js.map +1 -1
  20. package/es/table/modules/table-operation-menu.es.js +25 -15
  21. package/es/table/modules/table-operation-menu.es.js.map +1 -1
  22. package/lib/attributors/font-style.cjs.js +1 -1
  23. package/lib/attributors/font-style.cjs.js.map +1 -1
  24. package/lib/config/index.cjs.js +13 -0
  25. package/lib/config/index.cjs.js.map +1 -1
  26. package/lib/custom-image/image.cjs.js +1 -1
  27. package/lib/custom-image/image.cjs.js.map +1 -1
  28. package/lib/custom-uploader.cjs.js +13 -2
  29. package/lib/custom-uploader.cjs.js.map +1 -1
  30. package/lib/fluent-editor.cjs.js +1 -0
  31. package/lib/fluent-editor.cjs.js.map +1 -1
  32. package/lib/index.cjs.js +14 -0
  33. package/lib/index.cjs.js.map +1 -1
  34. package/lib/mathlive/formats.cjs.js +3 -32
  35. package/lib/mathlive/formats.cjs.js.map +1 -1
  36. package/lib/mathlive/index.cjs.js +22 -5
  37. package/lib/mathlive/index.cjs.js.map +1 -1
  38. package/lib/mathlive/tooltip.cjs.js +6 -6
  39. package/lib/mathlive/tooltip.cjs.js.map +1 -1
  40. package/lib/table/modules/table-operation-menu.cjs.js +25 -15
  41. package/lib/table/modules/table-operation-menu.cjs.js.map +1 -1
  42. package/package.json +1 -1
  43. package/style.css +3 -37
  44. package/types/attributors/font-style.d.ts +1 -1
  45. package/types/config/index.d.ts +1 -0
  46. package/types/config/types/editor-config.interface.d.ts +8 -1
  47. package/types/custom-uploader.d.ts +1 -0
  48. package/types/mathlive/formats.d.ts +2 -7
  49. package/types/mathlive/index.d.ts +5 -4
  50. package/types/mathlive/tooltip.d.ts +4 -2
  51. package/types/table/modules/table-operation-menu.d.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../../src/mathlive/index.ts"],"sourcesContent":["import type Quill from 'quill'\r\nimport { Module } from 'quill'\r\nimport MathliveTooltip from './tooltip'\r\n\r\nexport default class MathliveModule extends Module<boolean> {\r\n tooltip: MathliveTooltip\r\n constructor(quill: Quill, options?: boolean) {\r\n super(quill, options)\r\n // @ts-ignore\r\n quill.root.quill = quill\r\n this.tooltip = new MathliveTooltip(quill)\r\n }\r\n\r\n async createDialog(value?: string) {\r\n this.tooltip.edit(value)\r\n }\r\n}\r\n"],"names":["Module","MathliveTooltip"],"mappings":";;;;AAIA,MAAqB,uBAAuBA,MAAAA,OAAgB;AAAA,EAE1D,YAAY,OAAc,SAAmB;AAC3C,UAAM,OAAO,OAAO;AAEpB,UAAM,KAAK,QAAQ;AACd,SAAA,UAAU,IAAIC,QAAA,QAAgB,KAAK;AAAA,EAC1C;AAAA,EAEA,MAAM,aAAa,OAAgB;AAC5B,SAAA,QAAQ,KAAK,KAAK;AAAA,EACzB;AACF;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../src/mathlive/index.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport MathliveBlot from './formats'\r\nimport MathliveTooltip from './tooltip'\r\n\r\nexport default class MathliveModule {\r\n tooltip: MathliveTooltip\r\n constructor(public quill: Quill) {\r\n this.tooltip = new MathliveTooltip(quill)\r\n\r\n this.quill.root.addEventListener(\r\n 'click',\r\n (e: MouseEvent) => {\r\n if (!this.quill.isEnabled()) return\r\n const path = e.composedPath() as HTMLElement[]\r\n if (!path || path.length <= 0) return\r\n\r\n const mathliveNode = path.find(node => node.tagName && node.tagName.toUpperCase() === MathliveBlot.tagName.toUpperCase() && node.classList.contains(MathliveBlot.className))\r\n const mathliveBlot = Quill.find(mathliveNode) as MathliveBlot | null\r\n if (mathliveBlot) {\r\n const { value, mode } = MathliveBlot.value(mathliveBlot.domNode)\r\n if (mode === 'dialog') {\r\n this.createDialog(value)\r\n }\r\n }\r\n },\r\n true,\r\n )\r\n }\r\n\r\n createDialog(value?: string) {\r\n this.tooltip.edit(value)\r\n }\r\n}\r\n"],"names":["MathliveTooltip","MathliveBlot"],"mappings":";;;;;AAIA,MAAqB,eAAe;AAAA,EAElC,YAAmB,OAAc;AAAd,SAAA,QAAA;AACZ,SAAA,UAAU,IAAIA,QAAA,QAAgB,KAAK;AAExC,SAAK,MAAM,KAAK;AAAA,MACd;AAAA,MACA,CAAC,MAAkB;AACjB,YAAI,CAAC,KAAK,MAAM,UAAa,EAAA;AACvB,cAAA,OAAO,EAAE;AACf,YAAI,CAAC,QAAQ,KAAK,UAAU,EAAG;AAE/B,cAAM,eAAe,KAAK,KAAK,UAAQ,KAAK,WAAW,KAAK,QAAQ,kBAAkBC,gBAAa,QAAQ,iBAAiB,KAAK,UAAU,SAASA,QAAAA,QAAa,SAAS,CAAC;AACrK,cAAA,eAAe,MAAM,KAAK,YAAY;AAC5C,YAAI,cAAc;AAChB,gBAAM,EAAE,OAAO,SAASA,QAAa,QAAA,MAAM,aAAa,OAAO;AAC/D,cAAI,SAAS,UAAU;AACrB,iBAAK,aAAa,KAAK;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,aAAa,OAAgB;AACtB,SAAA,QAAQ,KAAK,KAAK;AAAA,EACzB;AACF;;"}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
- const core = require("quill/core");
4
- const Emitter = require("quill/core/emitter");
5
- const Tooltip = require("quill/ui/tooltip");
3
+ const Quill = require("quill");
4
+ const Delta = Quill.import("delta");
5
+ const Tooltip = Quill.import("ui/tooltip");
6
6
  const _MathliveTooltip = class _MathliveTooltip extends Tooltip {
7
7
  constructor(quill, boundsContainer) {
8
8
  super(quill, boundsContainer);
@@ -52,9 +52,9 @@ const _MathliveTooltip = class _MathliveTooltip extends Tooltip {
52
52
  const inputValue = this.mathliveDom.value;
53
53
  if (!inputValue) return;
54
54
  const index = range ? range.index : this.quill.getLength() - 1;
55
- const delta = new core.Delta().retain(index).delete(this.editValue ? 1 : (range == null ? void 0 : range.length) || 0).insert({ mathlive: { value: inputValue, mode: "dialog" } });
56
- this.quill.updateContents(delta, Emitter.sources.USER);
57
- this.quill.setSelection(index + 1, Emitter.sources.USER);
55
+ const delta = new Delta().retain(index).delete(this.editValue ? 1 : (range == null ? void 0 : range.length) || 0).insert({ mathlive: { value: inputValue, mode: "dialog" } });
56
+ this.quill.updateContents(delta, Quill.sources.USER);
57
+ this.quill.setSelection(index + 1, Quill.sources.SILENT);
58
58
  this.hide();
59
59
  }
60
60
  position(reference) {
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.cjs.js","sources":["../../../src/mathlive/tooltip.ts"],"sourcesContent":["import type { MathfieldElement } from 'mathlive'\r\nimport type Quill from 'quill'\r\nimport type { Bounds } from 'quill/core/selection'\r\nimport { Delta } from 'quill/core'\r\nimport Emitter from 'quill/core/emitter'\r\nimport Tooltip from 'quill/ui/tooltip'\r\n\r\nexport default class MathliveTooltip extends Tooltip {\r\n static TEMPLATE = ``\r\n\r\n mathliveDom: MathfieldElement\r\n editValue?: string\r\n\r\n constructor(quill: Quill, boundsContainer?: HTMLElement) {\r\n super(quill, boundsContainer)\r\n this.mathliveDom = document.createElement('math-field') as MathfieldElement\r\n this.mathliveDom.classList.add('ql-math-field')\r\n this.root.appendChild(this.mathliveDom)\r\n this.root.classList.add('math-field-tooltip')\r\n this.listen()\r\n }\r\n\r\n listen() {\r\n this.mathliveDom.addEventListener('blur', (event) => {\r\n this.hide()\r\n })\r\n this.root.addEventListener('keydown', (event) => {\r\n if (event.key === 'Enter') {\r\n event.preventDefault()\r\n this.save()\r\n }\r\n else if (event.key === 'Escape') {\r\n event.preventDefault()\r\n this.cancel()\r\n }\r\n })\r\n }\r\n\r\n cancel() {\r\n this.hide()\r\n this.restoreFocus()\r\n }\r\n\r\n edit(value?: string) {\r\n this.editValue = value\r\n this.root.classList.remove('ql-hidden')\r\n this.root.classList.add('ql-editing')\r\n this.mathliveDom.setValue(value || '')\r\n const range = this.quill.getSelection()\r\n const bounds = range ? this.quill.getBounds(range) : null\r\n if (bounds != null) {\r\n this.position(bounds)\r\n }\r\n this.show()\r\n this.mathliveDom.focus()\r\n }\r\n\r\n restoreFocus() {\r\n this.mathliveDom.blur()\r\n this.quill.focus({ preventScroll: true })\r\n }\r\n\r\n save() {\r\n const range = this.quill.getSelection(true)\r\n const inputValue = this.mathliveDom.value\r\n if (!inputValue) return\r\n const index = range ? range.index : this.quill.getLength() - 1\r\n const delta = new Delta()\r\n .retain(index)\r\n .delete(this.editValue ? 1 : range?.length || 0)\r\n .insert({ mathlive: { value: inputValue, mode: 'dialog' } })\r\n this.quill.updateContents(delta, Emitter.sources.USER)\r\n this.quill.setSelection(index + 1, Emitter.sources.USER)\r\n this.hide()\r\n }\r\n\r\n position(reference: Bounds) {\r\n const adjustedReference = { ...reference }\r\n adjustedReference.left = reference.left + this.root.offsetWidth / 2 - reference.width / 2\r\n return super.position(adjustedReference)\r\n }\r\n}\r\n"],"names":["Delta"],"mappings":";;;;;AAOA,MAAqB,mBAArB,MAAqB,yBAAwB,QAAQ;AAAA,EAMnD,YAAY,OAAc,iBAA+B;AACvD,UAAM,OAAO,eAAe;AACvB,SAAA,cAAc,SAAS,cAAc,YAAY;AACjD,SAAA,YAAY,UAAU,IAAI,eAAe;AACzC,SAAA,KAAK,YAAY,KAAK,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,oBAAoB;AAC5C,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,SAAS;AACP,SAAK,YAAY,iBAAiB,QAAQ,CAAC,UAAU;AACnD,WAAK,KAAK;AAAA,IAAA,CACX;AACD,SAAK,KAAK,iBAAiB,WAAW,CAAC,UAAU;AAC3C,UAAA,MAAM,QAAQ,SAAS;AACzB,cAAM,eAAe;AACrB,aAAK,KAAK;AAAA,MAAA,WAEH,MAAM,QAAQ,UAAU;AAC/B,cAAM,eAAe;AACrB,aAAK,OAAO;AAAA,MACd;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,SAAS;AACP,SAAK,KAAK;AACV,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,KAAK,OAAgB;AACnB,SAAK,YAAY;AACZ,SAAA,KAAK,UAAU,OAAO,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,YAAY;AAC/B,SAAA,YAAY,SAAS,SAAS,EAAE;AAC/B,UAAA,QAAQ,KAAK,MAAM,aAAa;AACtC,UAAM,SAAS,QAAQ,KAAK,MAAM,UAAU,KAAK,IAAI;AACrD,QAAI,UAAU,MAAM;AAClB,WAAK,SAAS,MAAM;AAAA,IACtB;AACA,SAAK,KAAK;AACV,SAAK,YAAY;EACnB;AAAA,EAEA,eAAe;AACb,SAAK,YAAY;AACjB,SAAK,MAAM,MAAM,EAAE,eAAe,KAAM,CAAA;AAAA,EAC1C;AAAA,EAEA,OAAO;AACL,UAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AACpC,UAAA,aAAa,KAAK,YAAY;AACpC,QAAI,CAAC,WAAY;AACjB,UAAM,QAAQ,QAAQ,MAAM,QAAQ,KAAK,MAAM,UAAc,IAAA;AACvD,UAAA,QAAQ,IAAIA,KAAA,MAAA,EACf,OAAO,KAAK,EACZ,OAAO,KAAK,YAAY,KAAI,+BAAO,WAAU,CAAC,EAC9C,OAAO,EAAE,UAAU,EAAE,OAAO,YAAY,MAAM,SAAS,EAAA,CAAG;AAC7D,SAAK,MAAM,eAAe,OAAO,QAAQ,QAAQ,IAAI;AACrD,SAAK,MAAM,aAAa,QAAQ,GAAG,QAAQ,QAAQ,IAAI;AACvD,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,SAAS,WAAmB;AACpB,UAAA,oBAAoB,EAAE,GAAG;AACb,sBAAA,OAAO,UAAU,OAAO,KAAK,KAAK,cAAc,IAAI,UAAU,QAAQ;AACjF,WAAA,MAAM,SAAS,iBAAiB;AAAA,EACzC;AACF;AAzEE,iBAAO,WAAW;AADpB,IAAqB,kBAArB;;"}
1
+ {"version":3,"file":"tooltip.cjs.js","sources":["../../../src/mathlive/tooltip.ts"],"sourcesContent":["import type { MathfieldElement } from 'mathlive'\r\nimport type { Bounds } from 'quill/core/selection'\r\nimport type TypeTooltip from 'quill/ui/tooltip'\r\nimport Quill from 'quill'\r\n\r\nconst Delta = Quill.import('delta')\r\nconst Tooltip = Quill.import('ui/tooltip') as typeof TypeTooltip\r\nexport default class MathliveTooltip extends Tooltip {\r\n static TEMPLATE = ``\r\n\r\n mathliveDom: MathfieldElement\r\n editValue?: string\r\n\r\n constructor(quill: Quill, boundsContainer?: HTMLElement) {\r\n super(quill, boundsContainer)\r\n this.mathliveDom = document.createElement('math-field') as MathfieldElement\r\n this.mathliveDom.classList.add('ql-math-field')\r\n this.root.appendChild(this.mathliveDom)\r\n this.root.classList.add('math-field-tooltip')\r\n this.listen()\r\n }\r\n\r\n listen() {\r\n this.mathliveDom.addEventListener('blur', (event) => {\r\n this.hide()\r\n })\r\n this.root.addEventListener('keydown', (event) => {\r\n if (event.key === 'Enter') {\r\n event.preventDefault()\r\n this.save()\r\n }\r\n else if (event.key === 'Escape') {\r\n event.preventDefault()\r\n this.cancel()\r\n }\r\n })\r\n }\r\n\r\n cancel() {\r\n this.hide()\r\n this.restoreFocus()\r\n }\r\n\r\n edit(value?: string) {\r\n this.editValue = value\r\n this.root.classList.remove('ql-hidden')\r\n this.root.classList.add('ql-editing')\r\n this.mathliveDom.setValue(value || '')\r\n const range = this.quill.getSelection()\r\n const bounds = range ? this.quill.getBounds(range) : null\r\n if (bounds != null) {\r\n this.position(bounds)\r\n }\r\n this.show()\r\n this.mathliveDom.focus()\r\n }\r\n\r\n restoreFocus() {\r\n this.mathliveDom.blur()\r\n this.quill.focus({ preventScroll: true })\r\n }\r\n\r\n save() {\r\n const range = this.quill.getSelection(true)\r\n const inputValue = this.mathliveDom.value\r\n if (!inputValue) return\r\n const index = range ? range.index : this.quill.getLength() - 1\r\n const delta = new Delta()\r\n .retain(index)\r\n .delete(this.editValue ? 1 : range?.length || 0)\r\n .insert({ mathlive: { value: inputValue, mode: 'dialog' } })\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(index + 1, Quill.sources.SILENT)\r\n this.hide()\r\n }\r\n\r\n position(reference: Bounds) {\r\n const adjustedReference = { ...reference }\r\n adjustedReference.left = reference.left + this.root.offsetWidth / 2 - reference.width / 2\r\n return super.position(adjustedReference)\r\n }\r\n}\r\n"],"names":[],"mappings":";;;AAKA,MAAM,QAAQ,MAAM,OAAO,OAAO;AAClC,MAAM,UAAU,MAAM,OAAO,YAAY;AACzC,MAAqB,mBAArB,MAAqB,yBAAwB,QAAQ;AAAA,EAMnD,YAAY,OAAc,iBAA+B;AACvD,UAAM,OAAO,eAAe;AACvB,SAAA,cAAc,SAAS,cAAc,YAAY;AACjD,SAAA,YAAY,UAAU,IAAI,eAAe;AACzC,SAAA,KAAK,YAAY,KAAK,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,oBAAoB;AAC5C,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,SAAS;AACP,SAAK,YAAY,iBAAiB,QAAQ,CAAC,UAAU;AACnD,WAAK,KAAK;AAAA,IAAA,CACX;AACD,SAAK,KAAK,iBAAiB,WAAW,CAAC,UAAU;AAC3C,UAAA,MAAM,QAAQ,SAAS;AACzB,cAAM,eAAe;AACrB,aAAK,KAAK;AAAA,MAAA,WAEH,MAAM,QAAQ,UAAU;AAC/B,cAAM,eAAe;AACrB,aAAK,OAAO;AAAA,MACd;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,SAAS;AACP,SAAK,KAAK;AACV,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,KAAK,OAAgB;AACnB,SAAK,YAAY;AACZ,SAAA,KAAK,UAAU,OAAO,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,YAAY;AAC/B,SAAA,YAAY,SAAS,SAAS,EAAE;AAC/B,UAAA,QAAQ,KAAK,MAAM,aAAa;AACtC,UAAM,SAAS,QAAQ,KAAK,MAAM,UAAU,KAAK,IAAI;AACrD,QAAI,UAAU,MAAM;AAClB,WAAK,SAAS,MAAM;AAAA,IACtB;AACA,SAAK,KAAK;AACV,SAAK,YAAY;EACnB;AAAA,EAEA,eAAe;AACb,SAAK,YAAY;AACjB,SAAK,MAAM,MAAM,EAAE,eAAe,KAAM,CAAA;AAAA,EAC1C;AAAA,EAEA,OAAO;AACL,UAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AACpC,UAAA,aAAa,KAAK,YAAY;AACpC,QAAI,CAAC,WAAY;AACjB,UAAM,QAAQ,QAAQ,MAAM,QAAQ,KAAK,MAAM,UAAc,IAAA;AACvD,UAAA,QAAQ,IAAI,MAAA,EACf,OAAO,KAAK,EACZ,OAAO,KAAK,YAAY,KAAI,+BAAO,WAAU,CAAC,EAC9C,OAAO,EAAE,UAAU,EAAE,OAAO,YAAY,MAAM,SAAS,EAAA,CAAG;AAC7D,SAAK,MAAM,eAAe,OAAO,MAAM,QAAQ,IAAI;AACnD,SAAK,MAAM,aAAa,QAAQ,GAAG,MAAM,QAAQ,MAAM;AACvD,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,SAAS,WAAmB;AACpB,UAAA,oBAAoB,EAAE,GAAG;AACb,sBAAA,OAAO,UAAU,OAAO,KAAK,KAAK,cAAc,IAAI,UAAU,QAAQ;AACjF,WAAA,MAAM,SAAS,iBAAiB;AAAA,EACzC;AACF;AAzEE,iBAAO,WAAW;AADpB,IAAqB,kBAArB;;"}
@@ -45,21 +45,21 @@ class TableOperationMenu {
45
45
  },
46
46
  copyTable: {
47
47
  text: langText["copy-table"],
48
- handler() {
48
+ async handler() {
49
49
  this.tableColumnTool.destroy();
50
50
  this.tableScrollBar.destroy();
51
51
  this.tableSelection.clearSelection();
52
52
  const dom = this.table.cloneNode(true);
53
53
  const trArr = dom.querySelectorAll("tr[data-row]");
54
54
  trArr.forEach((tr) => tr.removeAttribute("data-row"));
55
- dom.style.position = "fixed";
56
- dom.style.top = 0;
57
- dom.style.left = 0;
58
- dom.style.clip = "rect(0,0,0,0)";
59
- document.body.appendChild(dom);
60
55
  this.setCopyRange(dom);
61
- document.execCommand("copy");
62
- dom.remove();
56
+ const blob = new Blob([dom.outerHTML], { type: "text/html" });
57
+ const clipboardItem = new ClipboardItem({ "text/html": blob });
58
+ try {
59
+ await navigator.clipboard.write([clipboardItem]);
60
+ } catch (_e) {
61
+ throw new Error("Failed to write to clipboard.");
62
+ }
63
63
  }
64
64
  },
65
65
  cutCells: {
@@ -271,15 +271,19 @@ class TableOperationMenu {
271
271
  "left": `${leftPos}px`,
272
272
  "top": `${topPos}px`,
273
273
  "min-height": `${tableConfig.MENU_MIN_HEIGHT}px`,
274
- "width": `${tableConfig.MENU_WIDTH}px`
274
+ "max-height": `${winHeight - topPos}px`,
275
+ "width": `${tableConfig.MENU_WIDTH}px`,
276
+ "overflow-y": "auto"
275
277
  };
276
- if (menuHeight + top > winHeight && menuHeight < winHeight) {
278
+ if (menuHeight + top > winHeight || topPos > winHeight / 2) {
277
279
  delete cssContent.top;
280
+ cssContent["max-height"] = `${winHeight - 20}px`;
278
281
  cssContent.bottom = "10px";
279
282
  }
280
283
  this.domNode = document.createElement("div");
281
284
  this.domNode.classList.add("qlbt-operation-menu");
282
285
  index.css(this.domNode, cssContent);
286
+ const fragment = document.createDocumentFragment();
283
287
  for (const name in this.menuItems) {
284
288
  if (this.menuItems[name]) {
285
289
  const item = { ...this.DEFAULT_MENU[name], ...this.menuItems[name] };
@@ -289,9 +293,10 @@ class TableOperationMenu {
289
293
  } else {
290
294
  dom.addEventListener("mouseup", item.handler.bind(this), false);
291
295
  }
292
- this.domNode.appendChild(dom);
296
+ fragment.appendChild(dom);
293
297
  }
294
298
  }
299
+ this.domNode.appendChild(fragment);
295
300
  if (this.options.color && this.options.color !== false) {
296
301
  this.domNode.appendChild(dividingCreator());
297
302
  this.domNode.appendChild(subTitleCreator(this.colorSubTitle));
@@ -342,18 +347,23 @@ class TableOperationMenu {
342
347
  menuItemCreator({ text }) {
343
348
  const node = document.createElement("div");
344
349
  node.classList.add("qlbt-operation-menu-item");
350
+ node.style.height = `${tableConfig.MENU_ITEM_HEIGHT}px`;
345
351
  node.textContent = text;
346
352
  return node;
347
353
  }
348
- onCopy(operation) {
354
+ async onCopy(operation) {
349
355
  const { selectedTds } = this.tableSelection;
350
356
  const virtualTable = this.createVirtualTable(selectedTds, operation);
351
- document.body.appendChild(virtualTable);
352
357
  this.setCopyRange(virtualTable);
353
358
  this.tableSelection.preSelectedTable = virtualTable;
354
359
  this.tableSelection.preSelectedTds = selectedTds;
355
- document.execCommand("copy");
356
- virtualTable.remove();
360
+ const blob = new Blob([this.tableSelection.preSelectedTable.outerHTML], { type: "text/html" });
361
+ const clipboardItem = new ClipboardItem({ "text/html": blob });
362
+ try {
363
+ await navigator.clipboard.write([clipboardItem]);
364
+ } catch (_e) {
365
+ throw new Error("Failed to write to clipboard.");
366
+ }
357
367
  if (operation === "cut") {
358
368
  const tableContainer = Quill.find(this.table);
359
369
  tableContainer.emptyCells(selectedTds);
@@ -1 +1 @@
1
- {"version":3,"file":"table-operation-menu.cjs.js","sources":["../../../../src/table/modules/table-operation-menu.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { CHANGE_LANGUAGE_EVENT } from '../../config'\r\nimport {\r\n ERROR_LIMIT,\r\n MENU_ITEM_HEIGHT,\r\n MENU_MIN_HEIGHT,\r\n MENU_WIDTH,\r\n OPERATE_MENU_COLORPICKER_CLASS,\r\n OPERATE_MENU_COLORPICKER_ITEM_CLASS,\r\n OPERATE_MENU_DIVIDING_CLASS,\r\n OPERATE_MENU_ITEM_CLASS,\r\n OPERATE_MENU_SUBTITLE_CLASS,\r\n} from '../table-config'\r\nimport { arrayFrom, css, elementRemove, getRelativeRect } from '../utils'\r\n\r\nconst DEFAULT_CELL_COLORS = ['white', 'red', 'yellow', 'blue']\r\nconst NODE_EVENT_MAP = new WeakMap()\r\nexport default class TableOperationMenu {\r\n tableSelection: any\r\n table: any\r\n quill: any\r\n options: any\r\n menuItems: any\r\n tableColumnTool: any\r\n tableScrollBar: any\r\n boundary: any\r\n selectedTds: any\r\n destroyHandler: any\r\n columnToolCells: any\r\n colorSubTitle: any\r\n cellColors: any\r\n domNode: any\r\n DEFAULT_COLOR_SUBTITLE: string\r\n DEFAULT_MENU: Record<string, {\r\n text: string\r\n handler: () => void\r\n }>\r\n\r\n constructor(params, quill, options) {\r\n const betterTableModule = quill.getModule('better-table')\r\n this.tableSelection = betterTableModule.tableSelection\r\n this.table = params.table\r\n this.quill = quill\r\n this.options = options\r\n this.setDefaultMenu()\r\n this.menuItems = { ...this.DEFAULT_MENU, ...options.items }\r\n this.tableColumnTool = betterTableModule.columnTool\r\n // this.tableRowTool = betterTableModule.rowTool\r\n this.tableScrollBar = betterTableModule.tableScrollBar\r\n this.boundary = this.tableSelection.boundary\r\n this.selectedTds = this.tableSelection.selectedTds\r\n this.destroyHandler = this.destroy.bind(this)\r\n this.columnToolCells = this.tableColumnTool.colToolCells()\r\n this.DEFAULT_COLOR_SUBTITLE = this.quill.options.langText['sub-title-bg-color']\r\n this.colorSubTitle\r\n = options.color && options.color.text\r\n ? options.color.text\r\n : this.DEFAULT_COLOR_SUBTITLE\r\n this.cellColors\r\n = options.color && options.color.colors\r\n ? options.color.colors\r\n : DEFAULT_CELL_COLORS\r\n\r\n this.menuInitial(params)\r\n this.mount()\r\n document.addEventListener('click', this.destroyHandler, false)\r\n this.quill.on(CHANGE_LANGUAGE_EVENT, () => {\r\n this.destroy()\r\n this.DEFAULT_COLOR_SUBTITLE = this.quill.options.langText['sub-title-bg-color']\r\n this.setDefaultMenu()\r\n })\r\n }\r\n\r\n setDefaultMenu() {\r\n const langText = this.quill.options.langText\r\n this.DEFAULT_MENU = {\r\n copyCells: {\r\n text: langText['copy-cells'],\r\n handler() {\r\n this.onCopy('copy')\r\n },\r\n },\r\n copyTable: {\r\n text: langText['copy-table'],\r\n handler() {\r\n this.tableColumnTool.destroy()\r\n this.tableScrollBar.destroy()\r\n this.tableSelection.clearSelection()\r\n const dom = this.table.cloneNode(true)\r\n const trArr = dom.querySelectorAll('tr[data-row]')\r\n trArr.forEach(tr => tr.removeAttribute('data-row'))\r\n dom.style.position = 'fixed'\r\n dom.style.top = 0\r\n dom.style.left = 0\r\n dom.style.clip = 'rect(0,0,0,0)'\r\n document.body.appendChild(dom)\r\n this.setCopyRange(dom)\r\n document.execCommand('copy')\r\n dom.remove()\r\n },\r\n },\r\n cutCells: {\r\n text: langText['cut-cells'],\r\n handler() {\r\n this.onCopy('cut')\r\n },\r\n },\r\n emptyCells: {\r\n text: langText['empty-cells'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n const { selectedTds } = this.tableSelection\r\n tableContainer.emptyCells(selectedTds)\r\n },\r\n },\r\n insertColumnRight: {\r\n text: langText['insert-column-right'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n const colIndex = getColToolCellIndexByBoundary(\r\n this.columnToolCells,\r\n this.boundary,\r\n (cellRect, boundary) => {\r\n return Math.abs(cellRect.x + cellRect.width - boundary.x1) <= ERROR_LIMIT\r\n },\r\n this.quill.root.parentNode,\r\n )\r\n\r\n const newColumn = tableContainer.insertColumn(this.boundary, colIndex, true, this.quill.root.parentNode)\r\n\r\n this.tableColumnTool.updateColToolCells()\r\n this.quill.update(Quill.sources.USER)\r\n // fix: the scroll bar will go to the top when insert row/column to the table\r\n // this.quill.setSelection(\r\n // this.quill.getIndex(newColumn[0]),\r\n // 0,\r\n // Quill.sources.SILENT\r\n // )\r\n this.tableSelection.setSelection(\r\n newColumn[0].domNode.getBoundingClientRect(),\r\n newColumn[0].domNode.getBoundingClientRect(),\r\n )\r\n\r\n setTimeout(() => this.tableScrollBar.updateScrollBar())\r\n },\r\n },\r\n insertColumnLeft: {\r\n text: langText['insert-column-left'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n const colIndex = getColToolCellIndexByBoundary(\r\n this.columnToolCells,\r\n this.boundary,\r\n (cellRect, boundary) => {\r\n return Math.abs(cellRect.x - boundary.x) <= ERROR_LIMIT\r\n },\r\n this.quill.root.parentNode,\r\n )\r\n\r\n const newColumn = tableContainer.insertColumn(this.boundary, colIndex, false, this.quill.root.parentNode)\r\n\r\n this.tableColumnTool.updateColToolCells()\r\n this.quill.update(Quill.sources.USER)\r\n // this.quill.setSelection(\r\n // this.quill.getIndex(newColumn[0]),\r\n // 0,\r\n // Quill.sources.SILENT\r\n // )\r\n this.tableSelection.setSelection(\r\n newColumn[0].domNode.getBoundingClientRect(),\r\n newColumn[0].domNode.getBoundingClientRect(),\r\n )\r\n\r\n setTimeout(() => this.tableScrollBar.updateScrollBar())\r\n },\r\n },\r\n insertRowUp: {\r\n text: langText['insert-row-up'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n const affectedCells = tableContainer.insertRow(this.boundary, false, this.quill.root.parentNode)\r\n\r\n this.tableColumnTool.updateRowToolCells()\r\n this.quill.update(Quill.sources.USER)\r\n // this.quill.setSelection(\r\n // this.quill.getIndex(affectedCells[0]),\r\n // 0,\r\n // Quill.sources.SILENT\r\n // )\r\n this.tableSelection.setSelection(\r\n affectedCells[0].domNode.getBoundingClientRect(),\r\n affectedCells[0].domNode.getBoundingClientRect(),\r\n )\r\n\r\n setTimeout(() => this.tableScrollBar.resetTableHeight(this.table))\r\n },\r\n },\r\n insertRowDown: {\r\n text: langText['insert-row-down'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n const affectedCells = tableContainer.insertRow(this.boundary, true, this.quill.root.parentNode)\r\n\r\n this.tableColumnTool.updateRowToolCells()\r\n this.quill.update(Quill.sources.USER)\r\n // this.quill.setSelection(\r\n // this.quill.getIndex(affectedCells[0]),\r\n // 0,\r\n // Quill.sources.SILENT\r\n // )\r\n this.tableSelection.setSelection(\r\n affectedCells[0].domNode.getBoundingClientRect(),\r\n affectedCells[0].domNode.getBoundingClientRect(),\r\n )\r\n\r\n setTimeout(() => this.tableScrollBar.resetTableHeight(this.table))\r\n },\r\n },\r\n mergeCells: {\r\n text: langText['merge-cells'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n // compute merged Cell rowspan, equal to length of selected rows\r\n const rowspan = tableContainer.rows().reduce((sum, row) => {\r\n const rowRect = getRelativeRect(row.domNode.getBoundingClientRect(), this.quill.root.parentNode)\r\n if (\r\n rowRect.y > this.boundary.y - ERROR_LIMIT\r\n && rowRect.y + rowRect.height < this.boundary.y + this.boundary.height + ERROR_LIMIT\r\n ) {\r\n sum += 1\r\n }\r\n return sum\r\n }, 0)\r\n\r\n // compute merged cell colspan, equal to length of selected cols\r\n const colspan = this.columnToolCells.reduce((sum, cell) => {\r\n const cellRect = getRelativeRect(cell.getBoundingClientRect(), this.quill.root.parentNode)\r\n if (\r\n cellRect.x > this.boundary.x - ERROR_LIMIT\r\n && cellRect.x + cellRect.width < this.boundary.x + this.boundary.width + ERROR_LIMIT\r\n ) {\r\n sum += 1\r\n }\r\n return sum\r\n }, 0)\r\n\r\n const mergedCell = tableContainer.mergeCells(\r\n this.boundary,\r\n this.selectedTds,\r\n rowspan,\r\n colspan,\r\n this.quill.root.parentNode,\r\n )\r\n this.quill.update(Quill.sources.USER)\r\n this.tableSelection.setSelection(\r\n mergedCell.domNode.getBoundingClientRect(),\r\n mergedCell.domNode.getBoundingClientRect(),\r\n )\r\n },\r\n },\r\n unmergeCells: {\r\n text: langText['unmerge-cells'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n tableContainer.unmergeCells(this.selectedTds, this.quill.root.parentNode)\r\n this.quill.update(Quill.sources.USER)\r\n this.tableSelection.clearSelection()\r\n },\r\n },\r\n deleteColumn: {\r\n text: langText['delete-column'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n const colIndexes = getColToolCellIndexesByBoundary(\r\n this.columnToolCells,\r\n this.boundary,\r\n (cellRect, boundary) => {\r\n return cellRect.x + ERROR_LIMIT > boundary.x && cellRect.x + cellRect.width - ERROR_LIMIT < boundary.x1\r\n },\r\n this.quill.root.parentNode,\r\n )\r\n\r\n const isDeleteTable = tableContainer.deleteColumns(this.boundary, colIndexes, this.quill.root.parentNode)\r\n if (!isDeleteTable) {\r\n this.tableColumnTool.updateColToolCells()\r\n this.quill.update(Quill.sources.USER)\r\n this.tableSelection.clearSelection()\r\n }\r\n\r\n setTimeout(() => this.tableScrollBar.updateScrollBar())\r\n },\r\n },\r\n deleteRow: {\r\n text: langText['delete-row'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n const isDeleteTable = tableContainer.deleteRow(this.boundary, this.quill.root.parentNode)\r\n if (!isDeleteTable) {\r\n this.tableColumnTool.updateRowToolCells()\r\n this.quill.update(Quill.sources.USER)\r\n this.tableSelection.clearSelection()\r\n }\r\n },\r\n },\r\n deleteTable: {\r\n text: langText['delete-table'],\r\n handler() {\r\n const betterTableModule = this.quill.getModule('better-table')\r\n const tableContainer = Quill.find(this.table)\r\n betterTableModule.hideTableTools()\r\n tableContainer.remove()\r\n this.quill.update(Quill.sources.USER)\r\n // fix: 右键菜单删除表格后编辑器失焦\r\n this.quill.focus()\r\n },\r\n },\r\n }\r\n }\r\n\r\n mount() {\r\n this.quill.root.parentNode.appendChild(this.domNode)\r\n }\r\n\r\n destroy() {\r\n const menuItems = arrayFrom(\r\n this.domNode.querySelectorAll(`.${OPERATE_MENU_ITEM_CLASS}`),\r\n )\r\n const colorPickerItems = arrayFrom(\r\n this.domNode.querySelectorAll(`.${OPERATE_MENU_COLORPICKER_ITEM_CLASS}`),\r\n )\r\n const nodes = menuItems.concat(colorPickerItems)\r\n\r\n nodes.forEach((node) => {\r\n if (NODE_EVENT_MAP.has(node)) {\r\n const unregister = NODE_EVENT_MAP.get(node)\r\n\r\n if (unregister && typeof unregister === 'function') {\r\n unregister()\r\n }\r\n }\r\n })\r\n\r\n elementRemove(this.domNode)\r\n document.removeEventListener('mousedown', this.destroyHandler, false)\r\n\r\n return null\r\n }\r\n\r\n menuInitial({ cell, left, top }) {\r\n const rowspan = cell.getAttribute('rowspan')\r\n const colspan = cell.getAttribute('colspan')\r\n const winHeight = window.innerHeight || Math.max(document.documentElement.clientHeight, document.body.clientHeight)\r\n const num = Object.keys(this.menuItems) || []\r\n const menuHeight = MENU_ITEM_HEIGHT * num.length || MENU_MIN_HEIGHT\r\n const transformOffset = checkAndGetViewPointChange(this.quill.root.parentNode, left, top)\r\n const leftPos = left - transformOffset.offsetX\r\n const topPos = top - transformOffset.offsetY\r\n const cssContent = {\r\n 'left': `${leftPos}px`,\r\n 'top': `${topPos}px`,\r\n 'min-height': `${MENU_MIN_HEIGHT}px`,\r\n 'width': `${MENU_WIDTH}px`,\r\n }\r\n\r\n if (menuHeight + top > winHeight && menuHeight < winHeight) {\r\n delete cssContent.top\r\n cssContent.bottom = '10px'\r\n }\r\n\r\n this.domNode = document.createElement('div')\r\n this.domNode.classList.add('qlbt-operation-menu')\r\n css(this.domNode, cssContent)\r\n\r\n for (const name in this.menuItems) {\r\n if (this.menuItems[name]) {\r\n const item = { ...this.DEFAULT_MENU[name], ...this.menuItems[name] }\r\n const dom = this.menuItemCreator(item)\r\n if (\r\n (name === 'mergeCells' && this.tableSelection.selectedTds.length === 1)\r\n || (name === 'unmergeCells' && rowspan === 1 && colspan === 1)\r\n ) {\r\n dom.classList.add('qlbt-operation-menu-disabled')\r\n }\r\n else {\r\n dom.addEventListener('mouseup', item.handler.bind(this), false)\r\n }\r\n this.domNode.appendChild(dom)\r\n }\r\n }\r\n\r\n // if colors option is false, disabled bg color\r\n if (this.options.color && this.options.color !== false) {\r\n this.domNode.appendChild(dividingCreator())\r\n this.domNode.appendChild(subTitleCreator(this.colorSubTitle))\r\n this.domNode.appendChild(this.colorsItemCreator(this.cellColors))\r\n }\r\n\r\n // create dividing line\r\n function dividingCreator() {\r\n const dividing = document.createElement('div')\r\n dividing.classList.add(OPERATE_MENU_DIVIDING_CLASS)\r\n return dividing\r\n }\r\n\r\n // create subtitle for menu\r\n function subTitleCreator(title) {\r\n const subTitle = document.createElement('div')\r\n subTitle.classList.add(OPERATE_MENU_SUBTITLE_CLASS)\r\n subTitle.textContent = title\r\n return subTitle\r\n }\r\n }\r\n\r\n colorsItemCreator(colors) {\r\n const self = this\r\n const node = document.createElement('div')\r\n node.classList.add(OPERATE_MENU_COLORPICKER_CLASS)\r\n\r\n colors.forEach((color) => {\r\n const colorBox = colorBoxCreator(color)\r\n node.appendChild(colorBox)\r\n })\r\n\r\n function colorBoxCreator(color) {\r\n const box = document.createElement('div')\r\n box.classList.add(OPERATE_MENU_COLORPICKER_ITEM_CLASS)\r\n box.setAttribute('data-color', color)\r\n box.style.backgroundColor = color\r\n\r\n const clickHandler = function () {\r\n const selectedTds = self.tableSelection.selectedTds\r\n if (selectedTds && selectedTds.length > 0) {\r\n selectedTds.forEach((tableCell) => {\r\n tableCell.domNode.children[0].setAttribute('data-parent-bg', color)\r\n tableCell.format('cell-bg', color)\r\n })\r\n }\r\n }\r\n\r\n box.addEventListener('click', clickHandler, false)\r\n\r\n NODE_EVENT_MAP.set(box, () => {\r\n box.removeEventListener('click', clickHandler, false)\r\n })\r\n\r\n return box\r\n }\r\n\r\n return node\r\n }\r\n\r\n menuItemCreator({ text }) {\r\n const node = document.createElement('div')\r\n node.classList.add('qlbt-operation-menu-item')\r\n node.textContent = text\r\n // node.addEventListener('click', handler.bind(this), false)\r\n return node\r\n }\r\n\r\n onCopy(operation) {\r\n const { selectedTds } = this.tableSelection\r\n const virtualTable = this.createVirtualTable(selectedTds, operation)\r\n document.body.appendChild(virtualTable)\r\n this.setCopyRange(virtualTable)\r\n this.tableSelection.preSelectedTable = virtualTable\r\n this.tableSelection.preSelectedTds = selectedTds\r\n document.execCommand('copy')\r\n virtualTable.remove()\r\n if (operation === 'cut') {\r\n const tableContainer = Quill.find(this.table)\r\n tableContainer.emptyCells(selectedTds)\r\n }\r\n }\r\n\r\n createVirtualTable(selectedTds, _operation) {\r\n const virtualTable: any = document.createElement('table')\r\n virtualTable.style.position = 'fixed'\r\n virtualTable.style.top = 0\r\n virtualTable.style.left = 0\r\n virtualTable.style.clip = 'rect(0,0,0,0)'\r\n let preParentSign = ''\r\n let virtualTr = null\r\n selectedTds.forEach((selectedCell) => {\r\n const { domNode, parent } = selectedCell\r\n const currentParentSign = parent.domNode.getAttribute('data-row')\r\n const rowspan = domNode.firstChild.dataset.rowspan\r\n const colspan = domNode.firstChild.dataset.colspan\r\n const row = domNode.firstChild.dataset.row\r\n const cell = domNode.firstChild.dataset.cell\r\n\r\n selectedCell.dataCell = cell\r\n selectedCell.dataRow = row\r\n selectedCell.dataColSpan = colspan\r\n selectedCell.dataRowSpan = rowspan\r\n\r\n if (currentParentSign !== preParentSign) {\r\n if (preParentSign !== '') {\r\n virtualTable.appendChild(virtualTr)\r\n }\r\n virtualTr = document.createElement('tr')\r\n preParentSign = currentParentSign\r\n }\r\n\r\n const domNodeWidth = domNode.offsetWidth\r\n const cloneNode = domNode.cloneNode(true)\r\n cloneNode.setAttribute('width', domNodeWidth)\r\n\r\n virtualTr.appendChild(cloneNode)\r\n })\r\n virtualTable.appendChild(virtualTr)\r\n return virtualTable\r\n }\r\n\r\n setCopyRange(selectedNodes) {\r\n const range = document.createRange()\r\n const windowSelectionRange = window.getSelection()\r\n range.selectNodeContents(selectedNodes)\r\n windowSelectionRange.removeAllRanges()\r\n windowSelectionRange.addRange(range)\r\n }\r\n\r\n groupTableCell(selectedTds) {\r\n const rowGroup = []\r\n let dataRow = ''\r\n let preDataRow = ''\r\n let index = 0\r\n selectedTds.forEach((tableCell) => {\r\n dataRow = tableCell.parent.domNode.getAttribute('data-row')\r\n\r\n if (dataRow !== preDataRow) {\r\n if (preDataRow !== '') {\r\n index++\r\n }\r\n rowGroup[index] = []\r\n preDataRow = dataRow\r\n }\r\n\r\n rowGroup[index].push(tableCell)\r\n })\r\n return rowGroup\r\n }\r\n}\r\n\r\nfunction getColToolCellIndexByBoundary(cells, boundary, conditionFn, container) {\r\n return cells.reduce((findIndex, cell) => {\r\n const cellRect = getRelativeRect(cell.getBoundingClientRect(), container)\r\n if (conditionFn(cellRect, boundary)) {\r\n findIndex = cells.indexOf(cell)\r\n }\r\n return findIndex\r\n }, false)\r\n}\r\n\r\nfunction getColToolCellIndexesByBoundary(cells, boundary, conditionFn, container) {\r\n return cells.reduce((findIndexes, cell) => {\r\n const cellRect = getRelativeRect(cell.getBoundingClientRect(), container)\r\n if (conditionFn(cellRect, boundary)) {\r\n findIndexes.push(cells.indexOf(cell))\r\n }\r\n return findIndexes\r\n }, [])\r\n}\r\n\r\nfunction checkAndGetViewPointChange(parentContainer: HTMLElement, left: number, top: number) {\r\n if (!parentContainer) {\r\n return {\r\n offsetX: 0,\r\n offsetY: 0,\r\n }\r\n }\r\n // 模拟一个元素测预测位置和最终位置是否符合,如果不符合则是有transform等造成的偏移\r\n const testEl = document.createElement('div')\r\n css(testEl, {\r\n opacity: '0',\r\n position: 'fixed',\r\n left: `${left}px`,\r\n top: `${top}px`,\r\n width: '1px',\r\n height: '1px',\r\n zIndex: '-999999',\r\n })\r\n parentContainer.appendChild(testEl)\r\n const testElPosition = testEl.getBoundingClientRect()\r\n parentContainer.removeChild(testEl)\r\n return {\r\n offsetX: testElPosition.left - left,\r\n offsetY: testElPosition.top - top,\r\n }\r\n}\r\n"],"names":["CHANGE_LANGUAGE_EVENT","ERROR_LIMIT","getRelativeRect","arrayFrom","OPERATE_MENU_ITEM_CLASS","OPERATE_MENU_COLORPICKER_ITEM_CLASS","elementRemove","MENU_ITEM_HEIGHT","MENU_MIN_HEIGHT","MENU_WIDTH","css","OPERATE_MENU_DIVIDING_CLASS","OPERATE_MENU_SUBTITLE_CLASS","OPERATE_MENU_COLORPICKER_CLASS","index"],"mappings":"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"}
1
+ {"version":3,"file":"table-operation-menu.cjs.js","sources":["../../../../src/table/modules/table-operation-menu.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { CHANGE_LANGUAGE_EVENT } from '../../config'\r\nimport {\r\n ERROR_LIMIT,\r\n MENU_ITEM_HEIGHT,\r\n MENU_MIN_HEIGHT,\r\n MENU_WIDTH,\r\n OPERATE_MENU_COLORPICKER_CLASS,\r\n OPERATE_MENU_COLORPICKER_ITEM_CLASS,\r\n OPERATE_MENU_DIVIDING_CLASS,\r\n OPERATE_MENU_ITEM_CLASS,\r\n OPERATE_MENU_SUBTITLE_CLASS,\r\n} from '../table-config'\r\nimport { arrayFrom, css, elementRemove, getRelativeRect } from '../utils'\r\n\r\nconst DEFAULT_CELL_COLORS = ['white', 'red', 'yellow', 'blue']\r\nconst NODE_EVENT_MAP = new WeakMap()\r\nexport default class TableOperationMenu {\r\n tableSelection: any\r\n table: any\r\n quill: any\r\n options: any\r\n menuItems: any\r\n tableColumnTool: any\r\n tableScrollBar: any\r\n boundary: any\r\n selectedTds: any\r\n destroyHandler: any\r\n columnToolCells: any\r\n colorSubTitle: any\r\n cellColors: any\r\n domNode: any\r\n DEFAULT_COLOR_SUBTITLE: string\r\n DEFAULT_MENU: Record<string, {\r\n text: string\r\n handler: () => void\r\n }>\r\n\r\n constructor(params, quill, options) {\r\n const betterTableModule = quill.getModule('better-table')\r\n this.tableSelection = betterTableModule.tableSelection\r\n this.table = params.table\r\n this.quill = quill\r\n this.options = options\r\n this.setDefaultMenu()\r\n this.menuItems = { ...this.DEFAULT_MENU, ...options.items }\r\n this.tableColumnTool = betterTableModule.columnTool\r\n // this.tableRowTool = betterTableModule.rowTool\r\n this.tableScrollBar = betterTableModule.tableScrollBar\r\n this.boundary = this.tableSelection.boundary\r\n this.selectedTds = this.tableSelection.selectedTds\r\n this.destroyHandler = this.destroy.bind(this)\r\n this.columnToolCells = this.tableColumnTool.colToolCells()\r\n this.DEFAULT_COLOR_SUBTITLE = this.quill.options.langText['sub-title-bg-color']\r\n this.colorSubTitle\r\n = options.color && options.color.text\r\n ? options.color.text\r\n : this.DEFAULT_COLOR_SUBTITLE\r\n this.cellColors\r\n = options.color && options.color.colors\r\n ? options.color.colors\r\n : DEFAULT_CELL_COLORS\r\n\r\n this.menuInitial(params)\r\n this.mount()\r\n document.addEventListener('click', this.destroyHandler, false)\r\n this.quill.on(CHANGE_LANGUAGE_EVENT, () => {\r\n this.destroy()\r\n this.DEFAULT_COLOR_SUBTITLE = this.quill.options.langText['sub-title-bg-color']\r\n this.setDefaultMenu()\r\n })\r\n }\r\n\r\n setDefaultMenu() {\r\n const langText = this.quill.options.langText\r\n this.DEFAULT_MENU = {\r\n copyCells: {\r\n text: langText['copy-cells'],\r\n handler() {\r\n this.onCopy('copy')\r\n },\r\n },\r\n copyTable: {\r\n text: langText['copy-table'],\r\n async handler() {\r\n this.tableColumnTool.destroy()\r\n this.tableScrollBar.destroy()\r\n this.tableSelection.clearSelection()\r\n const dom = this.table.cloneNode(true)\r\n const trArr = dom.querySelectorAll('tr[data-row]')\r\n trArr.forEach(tr => tr.removeAttribute('data-row'))\r\n this.setCopyRange(dom)\r\n const blob = new Blob([dom.outerHTML], { type: 'text/html' })\r\n const clipboardItem = new ClipboardItem({ 'text/html': blob })\r\n try {\r\n await navigator.clipboard.write([clipboardItem])\r\n }\r\n catch (_e) {\r\n throw new Error('Failed to write to clipboard.')\r\n }\r\n },\r\n },\r\n cutCells: {\r\n text: langText['cut-cells'],\r\n handler() {\r\n this.onCopy('cut')\r\n },\r\n },\r\n emptyCells: {\r\n text: langText['empty-cells'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n const { selectedTds } = this.tableSelection\r\n tableContainer.emptyCells(selectedTds)\r\n },\r\n },\r\n insertColumnRight: {\r\n text: langText['insert-column-right'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n const colIndex = getColToolCellIndexByBoundary(\r\n this.columnToolCells,\r\n this.boundary,\r\n (cellRect, boundary) => {\r\n return Math.abs(cellRect.x + cellRect.width - boundary.x1) <= ERROR_LIMIT\r\n },\r\n this.quill.root.parentNode,\r\n )\r\n\r\n const newColumn = tableContainer.insertColumn(this.boundary, colIndex, true, this.quill.root.parentNode)\r\n\r\n this.tableColumnTool.updateColToolCells()\r\n this.quill.update(Quill.sources.USER)\r\n // fix: the scroll bar will go to the top when insert row/column to the table\r\n // this.quill.setSelection(\r\n // this.quill.getIndex(newColumn[0]),\r\n // 0,\r\n // Quill.sources.SILENT\r\n // )\r\n this.tableSelection.setSelection(\r\n newColumn[0].domNode.getBoundingClientRect(),\r\n newColumn[0].domNode.getBoundingClientRect(),\r\n )\r\n\r\n setTimeout(() => this.tableScrollBar.updateScrollBar())\r\n },\r\n },\r\n insertColumnLeft: {\r\n text: langText['insert-column-left'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n const colIndex = getColToolCellIndexByBoundary(\r\n this.columnToolCells,\r\n this.boundary,\r\n (cellRect, boundary) => {\r\n return Math.abs(cellRect.x - boundary.x) <= ERROR_LIMIT\r\n },\r\n this.quill.root.parentNode,\r\n )\r\n\r\n const newColumn = tableContainer.insertColumn(this.boundary, colIndex, false, this.quill.root.parentNode)\r\n\r\n this.tableColumnTool.updateColToolCells()\r\n this.quill.update(Quill.sources.USER)\r\n // this.quill.setSelection(\r\n // this.quill.getIndex(newColumn[0]),\r\n // 0,\r\n // Quill.sources.SILENT\r\n // )\r\n this.tableSelection.setSelection(\r\n newColumn[0].domNode.getBoundingClientRect(),\r\n newColumn[0].domNode.getBoundingClientRect(),\r\n )\r\n\r\n setTimeout(() => this.tableScrollBar.updateScrollBar())\r\n },\r\n },\r\n insertRowUp: {\r\n text: langText['insert-row-up'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n const affectedCells = tableContainer.insertRow(this.boundary, false, this.quill.root.parentNode)\r\n\r\n this.tableColumnTool.updateRowToolCells()\r\n this.quill.update(Quill.sources.USER)\r\n // this.quill.setSelection(\r\n // this.quill.getIndex(affectedCells[0]),\r\n // 0,\r\n // Quill.sources.SILENT\r\n // )\r\n this.tableSelection.setSelection(\r\n affectedCells[0].domNode.getBoundingClientRect(),\r\n affectedCells[0].domNode.getBoundingClientRect(),\r\n )\r\n\r\n setTimeout(() => this.tableScrollBar.resetTableHeight(this.table))\r\n },\r\n },\r\n insertRowDown: {\r\n text: langText['insert-row-down'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n const affectedCells = tableContainer.insertRow(this.boundary, true, this.quill.root.parentNode)\r\n\r\n this.tableColumnTool.updateRowToolCells()\r\n this.quill.update(Quill.sources.USER)\r\n // this.quill.setSelection(\r\n // this.quill.getIndex(affectedCells[0]),\r\n // 0,\r\n // Quill.sources.SILENT\r\n // )\r\n this.tableSelection.setSelection(\r\n affectedCells[0].domNode.getBoundingClientRect(),\r\n affectedCells[0].domNode.getBoundingClientRect(),\r\n )\r\n\r\n setTimeout(() => this.tableScrollBar.resetTableHeight(this.table))\r\n },\r\n },\r\n mergeCells: {\r\n text: langText['merge-cells'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n // compute merged Cell rowspan, equal to length of selected rows\r\n const rowspan = tableContainer.rows().reduce((sum, row) => {\r\n const rowRect = getRelativeRect(row.domNode.getBoundingClientRect(), this.quill.root.parentNode)\r\n if (\r\n rowRect.y > this.boundary.y - ERROR_LIMIT\r\n && rowRect.y + rowRect.height < this.boundary.y + this.boundary.height + ERROR_LIMIT\r\n ) {\r\n sum += 1\r\n }\r\n return sum\r\n }, 0)\r\n\r\n // compute merged cell colspan, equal to length of selected cols\r\n const colspan = this.columnToolCells.reduce((sum, cell) => {\r\n const cellRect = getRelativeRect(cell.getBoundingClientRect(), this.quill.root.parentNode)\r\n if (\r\n cellRect.x > this.boundary.x - ERROR_LIMIT\r\n && cellRect.x + cellRect.width < this.boundary.x + this.boundary.width + ERROR_LIMIT\r\n ) {\r\n sum += 1\r\n }\r\n return sum\r\n }, 0)\r\n\r\n const mergedCell = tableContainer.mergeCells(\r\n this.boundary,\r\n this.selectedTds,\r\n rowspan,\r\n colspan,\r\n this.quill.root.parentNode,\r\n )\r\n this.quill.update(Quill.sources.USER)\r\n this.tableSelection.setSelection(\r\n mergedCell.domNode.getBoundingClientRect(),\r\n mergedCell.domNode.getBoundingClientRect(),\r\n )\r\n },\r\n },\r\n unmergeCells: {\r\n text: langText['unmerge-cells'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n tableContainer.unmergeCells(this.selectedTds, this.quill.root.parentNode)\r\n this.quill.update(Quill.sources.USER)\r\n this.tableSelection.clearSelection()\r\n },\r\n },\r\n deleteColumn: {\r\n text: langText['delete-column'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n const colIndexes = getColToolCellIndexesByBoundary(\r\n this.columnToolCells,\r\n this.boundary,\r\n (cellRect, boundary) => {\r\n return cellRect.x + ERROR_LIMIT > boundary.x && cellRect.x + cellRect.width - ERROR_LIMIT < boundary.x1\r\n },\r\n this.quill.root.parentNode,\r\n )\r\n\r\n const isDeleteTable = tableContainer.deleteColumns(this.boundary, colIndexes, this.quill.root.parentNode)\r\n if (!isDeleteTable) {\r\n this.tableColumnTool.updateColToolCells()\r\n this.quill.update(Quill.sources.USER)\r\n this.tableSelection.clearSelection()\r\n }\r\n\r\n setTimeout(() => this.tableScrollBar.updateScrollBar())\r\n },\r\n },\r\n deleteRow: {\r\n text: langText['delete-row'],\r\n handler() {\r\n const tableContainer = Quill.find(this.table)\r\n const isDeleteTable = tableContainer.deleteRow(this.boundary, this.quill.root.parentNode)\r\n if (!isDeleteTable) {\r\n this.tableColumnTool.updateRowToolCells()\r\n this.quill.update(Quill.sources.USER)\r\n this.tableSelection.clearSelection()\r\n }\r\n },\r\n },\r\n deleteTable: {\r\n text: langText['delete-table'],\r\n handler() {\r\n const betterTableModule = this.quill.getModule('better-table')\r\n const tableContainer = Quill.find(this.table)\r\n betterTableModule.hideTableTools()\r\n tableContainer.remove()\r\n this.quill.update(Quill.sources.USER)\r\n // fix: 右键菜单删除表格后编辑器失焦\r\n this.quill.focus()\r\n },\r\n },\r\n }\r\n }\r\n\r\n mount() {\r\n this.quill.root.parentNode.appendChild(this.domNode)\r\n }\r\n\r\n destroy() {\r\n const menuItems = arrayFrom(\r\n this.domNode.querySelectorAll(`.${OPERATE_MENU_ITEM_CLASS}`),\r\n )\r\n const colorPickerItems = arrayFrom(\r\n this.domNode.querySelectorAll(`.${OPERATE_MENU_COLORPICKER_ITEM_CLASS}`),\r\n )\r\n const nodes = menuItems.concat(colorPickerItems)\r\n\r\n nodes.forEach((node) => {\r\n if (NODE_EVENT_MAP.has(node)) {\r\n const unregister = NODE_EVENT_MAP.get(node)\r\n\r\n if (unregister && typeof unregister === 'function') {\r\n unregister()\r\n }\r\n }\r\n })\r\n\r\n elementRemove(this.domNode)\r\n document.removeEventListener('mousedown', this.destroyHandler, false)\r\n\r\n return null\r\n }\r\n\r\n menuInitial({ cell, left, top }) {\r\n const rowspan = cell.getAttribute('rowspan')\r\n const colspan = cell.getAttribute('colspan')\r\n const winHeight = window.innerHeight || Math.max(document.documentElement.clientHeight, document.body.clientHeight)\r\n const num = Object.keys(this.menuItems) || []\r\n const menuHeight = MENU_ITEM_HEIGHT * num.length || MENU_MIN_HEIGHT\r\n const transformOffset = checkAndGetViewPointChange(this.quill.root.parentNode, left, top)\r\n const leftPos = left - transformOffset.offsetX\r\n const topPos = top - transformOffset.offsetY\r\n\r\n const cssContent = {\r\n 'left': `${leftPos}px`,\r\n 'top': `${topPos}px`,\r\n 'min-height': `${MENU_MIN_HEIGHT}px`,\r\n 'max-height': `${winHeight - topPos}px`,\r\n 'width': `${MENU_WIDTH}px`,\r\n 'overflow-y': 'auto',\r\n }\r\n // fix: 处理菜单超出屏幕\r\n if (menuHeight + top > winHeight || topPos > winHeight / 2) {\r\n delete cssContent.top\r\n cssContent['max-height'] = `${winHeight - 20}px`\r\n cssContent.bottom = '10px'\r\n }\r\n\r\n this.domNode = document.createElement('div')\r\n this.domNode.classList.add('qlbt-operation-menu')\r\n css(this.domNode, cssContent)\r\n const fragment = document.createDocumentFragment()\r\n\r\n for (const name in this.menuItems) {\r\n if (this.menuItems[name]) {\r\n const item = { ...this.DEFAULT_MENU[name], ...this.menuItems[name] }\r\n const dom = this.menuItemCreator(item)\r\n if (\r\n (name === 'mergeCells' && this.tableSelection.selectedTds.length === 1)\r\n || (name === 'unmergeCells' && rowspan === 1 && colspan === 1)\r\n ) {\r\n dom.classList.add('qlbt-operation-menu-disabled')\r\n }\r\n else {\r\n dom.addEventListener('mouseup', item.handler.bind(this), false)\r\n }\r\n fragment.appendChild(dom)\r\n }\r\n }\r\n this.domNode.appendChild(fragment)\r\n\r\n // if colors option is false, disabled bg color\r\n if (this.options.color && this.options.color !== false) {\r\n this.domNode.appendChild(dividingCreator())\r\n this.domNode.appendChild(subTitleCreator(this.colorSubTitle))\r\n this.domNode.appendChild(this.colorsItemCreator(this.cellColors))\r\n }\r\n\r\n // create dividing line\r\n function dividingCreator() {\r\n const dividing = document.createElement('div')\r\n dividing.classList.add(OPERATE_MENU_DIVIDING_CLASS)\r\n return dividing\r\n }\r\n\r\n // create subtitle for menu\r\n function subTitleCreator(title) {\r\n const subTitle = document.createElement('div')\r\n subTitle.classList.add(OPERATE_MENU_SUBTITLE_CLASS)\r\n subTitle.textContent = title\r\n return subTitle\r\n }\r\n }\r\n\r\n colorsItemCreator(colors) {\r\n const self = this\r\n const node = document.createElement('div')\r\n node.classList.add(OPERATE_MENU_COLORPICKER_CLASS)\r\n\r\n colors.forEach((color) => {\r\n const colorBox = colorBoxCreator(color)\r\n node.appendChild(colorBox)\r\n })\r\n\r\n function colorBoxCreator(color) {\r\n const box = document.createElement('div')\r\n box.classList.add(OPERATE_MENU_COLORPICKER_ITEM_CLASS)\r\n box.setAttribute('data-color', color)\r\n box.style.backgroundColor = color\r\n\r\n const clickHandler = function () {\r\n const selectedTds = self.tableSelection.selectedTds\r\n if (selectedTds && selectedTds.length > 0) {\r\n selectedTds.forEach((tableCell) => {\r\n tableCell.domNode.children[0].setAttribute('data-parent-bg', color)\r\n tableCell.format('cell-bg', color)\r\n })\r\n }\r\n }\r\n\r\n box.addEventListener('click', clickHandler, false)\r\n\r\n NODE_EVENT_MAP.set(box, () => {\r\n box.removeEventListener('click', clickHandler, false)\r\n })\r\n\r\n return box\r\n }\r\n\r\n return node\r\n }\r\n\r\n menuItemCreator({ text }) {\r\n const node = document.createElement('div')\r\n node.classList.add('qlbt-operation-menu-item')\r\n node.style.height = `${MENU_ITEM_HEIGHT}px`\r\n node.textContent = text\r\n // node.addEventListener('click', handler.bind(this), false)\r\n return node\r\n }\r\n\r\n async onCopy(operation) {\r\n const { selectedTds } = this.tableSelection\r\n const virtualTable = this.createVirtualTable(selectedTds, operation)\r\n this.setCopyRange(virtualTable)\r\n this.tableSelection.preSelectedTable = virtualTable\r\n this.tableSelection.preSelectedTds = selectedTds\r\n const blob = new Blob([this.tableSelection.preSelectedTable.outerHTML], { type: 'text/html' })\r\n const clipboardItem = new ClipboardItem({ 'text/html': blob })\r\n try {\r\n await navigator.clipboard.write([clipboardItem])\r\n }\r\n catch (_e) {\r\n throw new Error('Failed to write to clipboard.')\r\n }\r\n if (operation === 'cut') {\r\n const tableContainer = Quill.find(this.table)\r\n tableContainer.emptyCells(selectedTds)\r\n }\r\n }\r\n\r\n createVirtualTable(selectedTds, _operation) {\r\n const virtualTable: any = document.createElement('table')\r\n virtualTable.style.position = 'fixed'\r\n virtualTable.style.top = 0\r\n virtualTable.style.left = 0\r\n virtualTable.style.clip = 'rect(0,0,0,0)'\r\n let preParentSign = ''\r\n let virtualTr = null\r\n selectedTds.forEach((selectedCell) => {\r\n const { domNode, parent } = selectedCell\r\n const currentParentSign = parent.domNode.getAttribute('data-row')\r\n const rowspan = domNode.firstChild.dataset.rowspan\r\n const colspan = domNode.firstChild.dataset.colspan\r\n const row = domNode.firstChild.dataset.row\r\n const cell = domNode.firstChild.dataset.cell\r\n\r\n selectedCell.dataCell = cell\r\n selectedCell.dataRow = row\r\n selectedCell.dataColSpan = colspan\r\n selectedCell.dataRowSpan = rowspan\r\n\r\n if (currentParentSign !== preParentSign) {\r\n if (preParentSign !== '') {\r\n virtualTable.appendChild(virtualTr)\r\n }\r\n virtualTr = document.createElement('tr')\r\n preParentSign = currentParentSign\r\n }\r\n\r\n const domNodeWidth = domNode.offsetWidth\r\n const cloneNode = domNode.cloneNode(true)\r\n cloneNode.setAttribute('width', domNodeWidth)\r\n\r\n virtualTr.appendChild(cloneNode)\r\n })\r\n virtualTable.appendChild(virtualTr)\r\n return virtualTable\r\n }\r\n\r\n setCopyRange(selectedNodes) {\r\n const range = document.createRange()\r\n const windowSelectionRange = window.getSelection()\r\n range.selectNodeContents(selectedNodes)\r\n windowSelectionRange.removeAllRanges()\r\n windowSelectionRange.addRange(range)\r\n }\r\n\r\n groupTableCell(selectedTds) {\r\n const rowGroup = []\r\n let dataRow = ''\r\n let preDataRow = ''\r\n let index = 0\r\n selectedTds.forEach((tableCell) => {\r\n dataRow = tableCell.parent.domNode.getAttribute('data-row')\r\n\r\n if (dataRow !== preDataRow) {\r\n if (preDataRow !== '') {\r\n index++\r\n }\r\n rowGroup[index] = []\r\n preDataRow = dataRow\r\n }\r\n\r\n rowGroup[index].push(tableCell)\r\n })\r\n return rowGroup\r\n }\r\n}\r\n\r\nfunction getColToolCellIndexByBoundary(cells, boundary, conditionFn, container) {\r\n return cells.reduce((findIndex, cell) => {\r\n const cellRect = getRelativeRect(cell.getBoundingClientRect(), container)\r\n if (conditionFn(cellRect, boundary)) {\r\n findIndex = cells.indexOf(cell)\r\n }\r\n return findIndex\r\n }, false)\r\n}\r\n\r\nfunction getColToolCellIndexesByBoundary(cells, boundary, conditionFn, container) {\r\n return cells.reduce((findIndexes, cell) => {\r\n const cellRect = getRelativeRect(cell.getBoundingClientRect(), container)\r\n if (conditionFn(cellRect, boundary)) {\r\n findIndexes.push(cells.indexOf(cell))\r\n }\r\n return findIndexes\r\n }, [])\r\n}\r\n\r\nfunction checkAndGetViewPointChange(parentContainer: HTMLElement, left: number, top: number) {\r\n if (!parentContainer) {\r\n return {\r\n offsetX: 0,\r\n offsetY: 0,\r\n }\r\n }\r\n // 模拟一个元素测预测位置和最终位置是否符合,如果不符合则是有transform等造成的偏移\r\n const testEl = document.createElement('div')\r\n css(testEl, {\r\n opacity: '0',\r\n position: 'fixed',\r\n left: `${left}px`,\r\n top: `${top}px`,\r\n width: '1px',\r\n height: '1px',\r\n zIndex: '-999999',\r\n })\r\n parentContainer.appendChild(testEl)\r\n const testElPosition = testEl.getBoundingClientRect()\r\n parentContainer.removeChild(testEl)\r\n return {\r\n offsetX: testElPosition.left - left,\r\n offsetY: testElPosition.top - top,\r\n }\r\n}\r\n"],"names":["CHANGE_LANGUAGE_EVENT","ERROR_LIMIT","getRelativeRect","arrayFrom","OPERATE_MENU_ITEM_CLASS","OPERATE_MENU_COLORPICKER_ITEM_CLASS","elementRemove","MENU_ITEM_HEIGHT","MENU_MIN_HEIGHT","MENU_WIDTH","css","OPERATE_MENU_DIVIDING_CLASS","OPERATE_MENU_SUBTITLE_CLASS","OPERATE_MENU_COLORPICKER_CLASS","index"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentiny/fluent-editor",
3
- "version": "3.23.1",
3
+ "version": "3.23.3",
4
4
  "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.",
5
5
  "author": "OpenTiny Team",
6
6
  "license": "MIT",
package/style.css CHANGED
@@ -3626,9 +3626,9 @@ li.unchecked > .ql-ui {
3626
3626
  display: none;
3627
3627
  }
3628
3628
  .ql-tooltip.math-field-tooltip {
3629
- border: none !important;
3630
- z-index: 10 !important;
3631
- padding: 0 !important;
3629
+ border: none;
3630
+ z-index: 10;
3631
+ padding: 0;
3632
3632
  }
3633
3633
  .ql-tooltip.math-field-tooltip::before {
3634
3634
  display: none;
@@ -4919,38 +4919,4 @@ li.unchecked > .ql-ui {
4919
4919
  }
4920
4920
  .image-preview__overlay .icon-maxmize:before {
4921
4921
  content: url('data:image/svg+xml;utf8,<svg t="1642681601748" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2834" width="20" height="20"><path d="M460.8 940.8h-320l262.4-262.4c12.8-12.8 12.8-38.4 0-51.2-12.8-19.2-38.4-19.2-57.6 0l-262.4 262.4v-345.6c0-19.2-19.2-38.4-38.4-38.4s-38.4 19.2-38.4 38.4v364.8c0 51.2 38.4 115.2 96 115.2h358.4c19.2 0 38.4-19.2 38.4-38.4 0-25.6-19.2-44.8-38.4-44.8zM940.8 6.4h-377.6c-19.2 0-38.4 19.2-38.4 38.4s19.2 38.4 38.4 38.4h320l-268.8 262.4c-12.8 12.8-12.8 38.4 0 57.6 19.2 12.8 44.8 12.8 57.6 0l262.4-262.4v320c0 19.2 19.2 38.4 38.4 38.4s38.4-19.2 38.4-38.4v-352c6.4-64-25.6-102.4-70.4-102.4z" p-id="2835"></path></svg>');
4922
- }
4923
- /* Set content font-families */
4924
- .ql-font-songti {
4925
- font-family: "宋体", "SimSun";
4926
- }
4927
- .ql-font-yahei {
4928
- font-family: "微软雅黑", "Microsoft YaHei";
4929
- }
4930
- .ql-font-kaiti {
4931
- font-family: "楷体", "楷体_GB2312", "SimKa";
4932
- }
4933
- .ql-font-heiti {
4934
- font-family: "黑体", "SimHei";
4935
- }
4936
- .ql-font-lishu {
4937
- font-family: "隶书", "SimLi";
4938
- }
4939
- .ql-font-mono {
4940
- font-family: "andale mono";
4941
- }
4942
- .ql-font-arial {
4943
- font-family: arial, helvetica, sans-serif;
4944
- }
4945
- .ql-font-arialblack {
4946
- font-family: "arial black", "avant garde";
4947
- }
4948
- .ql-font-comic {
4949
- font-family: "comic sans ms";
4950
- }
4951
- .ql-font-impact {
4952
- font-family: "impact", "chicago";
4953
- }
4954
- .ql-font-times {
4955
- font-family: "times new roman";
4956
4922
  }
@@ -1 +1 @@
1
- export declare const FontStyle: import('parchment').StyleAttributor;
1
+ export declare const FontStyle: import('parchment').ClassAttributor;
@@ -1,4 +1,5 @@
1
1
  export * from './editor.config';
2
+ export * from './editor.utils';
2
3
  export declare const ICONS_CONFIG: {
3
4
  [key: string]: any;
4
5
  };
@@ -12,10 +12,17 @@ export interface IEditorConfig extends QuillOptions {
12
12
  autoProtocol?: boolean | string;
13
13
  editorPaste?: any;
14
14
  uploadOption?: {
15
- imageUploadToServer?: boolean;
15
+ imageUpload?: ({ file, callback, editor }: {
16
+ file: any;
17
+ callback: any;
18
+ editor: any;
19
+ }) => void;
16
20
  imageAccept?: Array<string>[] | string;
17
21
  fileAccept?: Array<string>[] | string;
18
22
  isVideoPlay?: boolean;
23
+ maxSize?: Number;
24
+ success?: (file: File) => void;
25
+ fail?: (file: File) => void;
19
26
  };
20
27
  screenshot?: Partial<ScreenShotOptions>;
21
28
  lang?: string;
@@ -14,6 +14,7 @@ declare class CustomUploader extends Uploader {
14
14
  quill: any;
15
15
  options: any;
16
16
  upload(range: any, files: any, isFile?: any): void;
17
+ isAllowedFileSize: (maxSize: number, file: File) => boolean;
17
18
  isAllowedFileType: (accept: Array<string> | string, file: File) => boolean;
18
19
  handleUploadFile(range: any, files: any, _hasRejectedFile: any): void;
19
20
  insertFileToEditor(range: Range, file: File, { code, message, data }: InsertFileData): void;
@@ -1,17 +1,14 @@
1
1
  import { MathfieldElement } from 'mathlive';
2
2
  import { Root } from 'parchment';
3
- import { default as Quill } from 'quill';
4
3
 
5
4
  declare const Parchment: typeof import("parchment");
6
5
  type MathliveBlotMode = 'dialog' | 'only-read';
7
6
  export default class MathliveBlot extends Parchment.EmbedBlot {
7
+ domNode: MathfieldElement;
8
8
  static blotName: string;
9
9
  static tagName: string;
10
10
  static className: string;
11
- quill?: Quill;
12
- initFlag: boolean;
13
11
  mode: MathliveBlotMode;
14
- constructor(scroll: Root, domNode: Node);
15
12
  static create(obj: {
16
13
  value: string;
17
14
  mode: MathliveBlotMode;
@@ -20,9 +17,7 @@ export default class MathliveBlot extends Parchment.EmbedBlot {
20
17
  value: string;
21
18
  mode: string;
22
19
  };
23
- value(): any;
24
- init(): void;
20
+ constructor(scroll: Root, domNode: MathfieldElement);
25
21
  html(): string;
26
- findQuillInstance(): Quill;
27
22
  }
28
23
  export {};
@@ -1,8 +1,9 @@
1
- import { default as Quill, Module } from 'quill';
1
+ import { default as Quill } from 'quill';
2
2
  import { default as MathliveTooltip } from './tooltip';
3
3
 
4
- export default class MathliveModule extends Module<boolean> {
4
+ export default class MathliveModule {
5
+ quill: Quill;
5
6
  tooltip: MathliveTooltip;
6
- constructor(quill: Quill, options?: boolean);
7
- createDialog(value?: string): Promise<void>;
7
+ constructor(quill: Quill);
8
+ createDialog(value?: string): void;
8
9
  }
@@ -1,8 +1,9 @@
1
1
  import { MathfieldElement } from 'mathlive';
2
- import { default as Quill } from 'quill';
3
2
  import { Bounds } from 'quill/core/selection';
4
- import { default as Tooltip } from 'quill/ui/tooltip';
3
+ import { default as TypeTooltip } from 'quill/ui/tooltip';
4
+ import { default as Quill } from 'quill';
5
5
 
6
+ declare const Tooltip: typeof TypeTooltip;
6
7
  export default class MathliveTooltip extends Tooltip {
7
8
  static TEMPLATE: string;
8
9
  mathliveDom: MathfieldElement;
@@ -15,3 +16,4 @@ export default class MathliveTooltip extends Tooltip {
15
16
  save(): void;
16
17
  position(reference: Bounds): number;
17
18
  }
19
+ export {};
@@ -31,7 +31,7 @@ export default class TableOperationMenu {
31
31
  menuItemCreator({ text }: {
32
32
  text: any;
33
33
  }): HTMLDivElement;
34
- onCopy(operation: any): void;
34
+ onCopy(operation: any): Promise<void>;
35
35
  createVirtualTable(selectedTds: any, _operation: any): any;
36
36
  setCopyRange(selectedNodes: any): void;
37
37
  groupTableCell(selectedTds: any): any[];