@vueup/vue-quill 1.0.1 → 1.1.0

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,13 +1,13 @@
1
1
  /*!
2
- * VueQuill @vueup/vue-quill v1.0.1
2
+ * VueQuill @vueup/vue-quill v1.1.0
3
3
  * https://vueup.github.io/vue-quill/
4
4
  *
5
5
  * Includes quill v1.3.7
6
6
  * https://quilljs.com/
7
7
  *
8
- * Copyright (c) 2022 Ahmad Luthfi Masruri
8
+ * Copyright (c) 2023 Ahmad Luthfi Masruri
9
9
  * Released under the MIT license
10
- * Date: 2022-12-20T16:01:54.428Z
10
+ * Date: 2023-02-04T04:01:16.430Z
11
11
  */
12
12
  'use strict';
13
13
 
@@ -212,11 +212,14 @@ const QuillEditor = vue.defineComponent({
212
212
  }
213
213
  return Object.assign({}, props.globalOptions, props.options, clientOptions);
214
214
  };
215
+ const maybeClone = (delta) => {
216
+ return typeof delta === 'object' ? delta.slice() : delta;
217
+ };
215
218
  const deltaHasValuesOtherThanRetain = (delta) => {
216
- return Object.values(delta).some((v) => !v.retain);
219
+ return Object.values(delta.ops).some((v) => !v.retain || Object.keys(v).length !== 1);
217
220
  };
218
- // eslint-disable-next-line vue/no-setup-props-destructure
219
- let internalModel = props.content; // Doesn't need reactivity
221
+ // Doesn't need reactivity, but does need to be cloned to avoid deep mutations always registering as equal
222
+ let internalModel;
220
223
  const internalModelEquals = (against) => {
221
224
  if (typeof internalModel === typeof against) {
222
225
  if (against === internalModel) {
@@ -230,10 +233,7 @@ const QuillEditor = vue.defineComponent({
230
233
  return false;
231
234
  };
232
235
  const handleTextChange = (delta, oldContents, source) => {
233
- // Quill should never be null at this point because we receive an event
234
- // so content should not be undefined but let's make ts and eslint happy
235
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
236
- internalModel = getContents();
236
+ internalModel = maybeClone(getContents());
237
237
  // Update v-model:content when text changes
238
238
  if (!internalModelEquals(props.content)) {
239
239
  ctx.emit('update:content', internalModel);
@@ -302,6 +302,7 @@ const QuillEditor = vue.defineComponent({
302
302
  else {
303
303
  quill === null || quill === void 0 ? void 0 : quill.setContents(content, source);
304
304
  }
305
+ internalModel = maybeClone(content);
305
306
  };
306
307
  const getText = (index, length) => {
307
308
  var _a;
@@ -334,14 +335,13 @@ const QuillEditor = vue.defineComponent({
334
335
  vue.watch(() => props.content, (newContent) => {
335
336
  if (!quill || !newContent || internalModelEquals(newContent))
336
337
  return;
337
- internalModel = newContent;
338
338
  // Restore the selection and cursor position after updating the content
339
339
  const selection = quill.getSelection();
340
340
  if (selection) {
341
341
  vue.nextTick(() => quill === null || quill === void 0 ? void 0 : quill.setSelection(selection));
342
342
  }
343
343
  setContents(newContent);
344
- });
344
+ }, { deep: true });
345
345
  vue.watch(() => props.enable, (newValue) => {
346
346
  if (quill)
347
347
  quill.enable(newValue);
@@ -1,12 +1,12 @@
1
1
  /*!
2
- * VueQuill @vueup/vue-quill v1.0.1
2
+ * VueQuill @vueup/vue-quill v1.1.0
3
3
  * https://vueup.github.io/vue-quill/
4
4
  *
5
5
  * Includes quill v1.3.7
6
6
  * https://quilljs.com/
7
7
  *
8
- * Copyright (c) 2022 Ahmad Luthfi Masruri
8
+ * Copyright (c) 2023 Ahmad Luthfi Masruri
9
9
  * Released under the MIT license
10
- * Date: 2022-12-20T16:01:54.428Z
10
+ * Date: 2023-02-04T04:01:16.430Z
11
11
  */
12
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("quill"),t=require("quill-delta"),o=require("vue");function l(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var n=l(e),r=l(t);const i={essential:[[{header:[1,2,3,4,5,6,!1]}],["bold","italic","underline"],[{list:"ordered"},{list:"bullet"},{align:[]}],["blockquote","code-block","link"],[{color:[]},"clean"]],minimal:[[{header:1},{header:2}],["bold","italic","underline"],[{list:"ordered"},{list:"bullet"},{align:[]}]],full:[["bold","italic","underline","strike"],["blockquote","code-block"],[{header:1},{header:2}],[{list:"ordered"},{list:"bullet"}],[{script:"sub"},{script:"super"}],[{indent:"-1"},{indent:"+1"}],[{direction:"rtl"}],[{size:["small",!1,"large","huge"]}],[{header:[1,2,3,4,5,6,!1]}],[{color:[]},{background:[]}],[{font:[]}],[{align:[]}],["link","video","image"],["clean"]]},a=o.defineComponent({name:"QuillEditor",inheritAttrs:!1,props:{content:{type:[String,Object],default:()=>{}},contentType:{type:String,default:"delta",validator:e=>["delta","html","text"].includes(e)},enable:{type:Boolean,default:!0},readOnly:{type:Boolean,default:!1},placeholder:{type:String,required:!1},theme:{type:String,default:"snow",validator:e=>["snow","bubble",""].includes(e)},toolbar:{type:[String,Array,Object],required:!1,validator:e=>"string"!=typeof e||""===e||("#"===e.charAt(0)||-1!==Object.keys(i).indexOf(e))},modules:{type:Object,required:!1},options:{type:Object,required:!1},globalOptions:{type:Object,required:!1}},emits:["textChange","selectionChange","editorChange","update:content","focus","blur","ready"],setup:(e,t)=>{let l,r;o.onMounted((()=>{d()})),o.onBeforeUnmount((()=>{l=null}));const a=o.ref(),d=()=>{var o;if(a.value){if(r=s(),e.modules)if(Array.isArray(e.modules))for(const t of e.modules)n.register(`modules/${t.name}`,t.module);else n.register(`modules/${e.modules.name}`,e.modules.module);l=new n(a.value,r),g(e.content),l.on("text-change",b),l.on("selection-change",p),l.on("editor-change",h),"bubble"!==e.theme&&a.value.classList.remove("ql-bubble"),"snow"!==e.theme&&a.value.classList.remove("ql-snow"),null===(o=l.getModule("toolbar"))||void 0===o||o.container.addEventListener("mousedown",(e=>{e.preventDefault()})),t.emit("ready",l)}},s=()=>{const t={};if(""!==e.theme&&(t.theme=e.theme),e.readOnly&&(t.readOnly=e.readOnly),e.placeholder&&(t.placeholder=e.placeholder),e.toolbar&&""!==e.toolbar&&(t.modules={toolbar:(()=>{if("object"==typeof e.toolbar)return e.toolbar;if("string"==typeof e.toolbar){return"#"===e.toolbar.charAt(0)?e.toolbar:i[e.toolbar]}})()}),e.modules){const o=(()=>{var t,o;const l={};if(Array.isArray(e.modules))for(const n of e.modules)l[n.name]=null!==(t=n.options)&&void 0!==t?t:{};else l[e.modules.name]=null!==(o=e.modules.options)&&void 0!==o?o:{};return l})();t.modules=Object.assign({},t.modules,o)}return Object.assign({},e.globalOptions,e.options,t)};let u=e.content;const c=e=>{if(typeof u==typeof e){if(e===u)return!0;if("object"==typeof e&&"object"==typeof u)return t=u.diff(e),!Object.values(t).some((e=>!e.retain))}var t;return!1},b=(o,l,n)=>{u=v(),c(e.content)||t.emit("update:content",u),t.emit("textChange",{delta:o,oldContents:l,source:n})},m=o.ref(),p=(e,o,n)=>{m.value=!!(null==l?void 0:l.hasFocus()),t.emit("selectionChange",{range:e,oldRange:o,source:n})};o.watch(m,(e=>{t.emit(e?"focus":"blur",a)}));const h=(...e)=>{"text-change"===e[0]&&t.emit("editorChange",{name:e[0],delta:e[1],oldContents:e[2],source:e[3]}),"selection-change"===e[0]&&t.emit("editorChange",{name:e[0],range:e[1],oldRange:e[2],source:e[3]})},v=(t,o)=>"html"===e.contentType?x():"text"===e.contentType?f(t,o):null==l?void 0:l.getContents(t,o),g=(t,o="api")=>{"html"===e.contentType?T(t):"text"===e.contentType?y(t,o):null==l||l.setContents(t,o)},f=(e,t)=>{var o;return null!==(o=null==l?void 0:l.getText(e,t))&&void 0!==o?o:""},y=(e,t="api")=>{null==l||l.setText(e,t)},x=()=>{var e;return null!==(e=null==l?void 0:l.root.innerHTML)&&void 0!==e?e:""},T=e=>{l&&(l.root.innerHTML=e)};return o.watch((()=>e.content),(e=>{if(!l||!e||c(e))return;u=e;const t=l.getSelection();t&&o.nextTick((()=>null==l?void 0:l.setSelection(t))),g(e)})),o.watch((()=>e.enable),(e=>{l&&l.enable(e)})),{editor:a,getEditor:()=>a.value,getToolbar:()=>{var e;return null===(e=null==l?void 0:l.getModule("toolbar"))||void 0===e?void 0:e.container},getQuill:()=>{if(l)return l;throw'The quill editor hasn\'t been instantiated yet, \n make sure to call this method when the editor ready\n or use v-on:ready="onReady(quill)" event instead.'},getContents:v,setContents:g,getHTML:x,setHTML:T,pasteHTML:(e,t="api")=>{const o=null==l?void 0:l.clipboard.convert(e);o&&(null==l||l.setContents(o,t))},getText:f,setText:y,reinit:()=>{o.nextTick((()=>{var e;!t.slots.toolbar&&l&&(null===(e=l.getModule("toolbar"))||void 0===e||e.container.remove()),d()}))}}},render(){var e,t;return[null===(t=(e=this.$slots).toolbar)||void 0===t?void 0:t.call(e),o.h("div",{ref:"editor",...this.$attrs})]}});exports.Quill=n,exports.Delta=r,exports.QuillEditor=a;
12
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("quill"),t=require("quill-delta"),o=require("vue");function l(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var n=l(e),r=l(t);const i={essential:[[{header:[1,2,3,4,5,6,!1]}],["bold","italic","underline"],[{list:"ordered"},{list:"bullet"},{align:[]}],["blockquote","code-block","link"],[{color:[]},"clean"]],minimal:[[{header:1},{header:2}],["bold","italic","underline"],[{list:"ordered"},{list:"bullet"},{align:[]}]],full:[["bold","italic","underline","strike"],["blockquote","code-block"],[{header:1},{header:2}],[{list:"ordered"},{list:"bullet"}],[{script:"sub"},{script:"super"}],[{indent:"-1"},{indent:"+1"}],[{direction:"rtl"}],[{size:["small",!1,"large","huge"]}],[{header:[1,2,3,4,5,6,!1]}],[{color:[]},{background:[]}],[{font:[]}],[{align:[]}],["link","video","image"],["clean"]]},a=o.defineComponent({name:"QuillEditor",inheritAttrs:!1,props:{content:{type:[String,Object],default:()=>{}},contentType:{type:String,default:"delta",validator:e=>["delta","html","text"].includes(e)},enable:{type:Boolean,default:!0},readOnly:{type:Boolean,default:!1},placeholder:{type:String,required:!1},theme:{type:String,default:"snow",validator:e=>["snow","bubble",""].includes(e)},toolbar:{type:[String,Array,Object],required:!1,validator:e=>"string"!=typeof e||""===e||("#"===e.charAt(0)||-1!==Object.keys(i).indexOf(e))},modules:{type:Object,required:!1},options:{type:Object,required:!1},globalOptions:{type:Object,required:!1}},emits:["textChange","selectionChange","editorChange","update:content","focus","blur","ready"],setup:(e,t)=>{let l,r;o.onMounted((()=>{d()})),o.onBeforeUnmount((()=>{l=null}));const a=o.ref(),d=()=>{var o;if(a.value){if(r=s(),e.modules)if(Array.isArray(e.modules))for(const t of e.modules)n.register(`modules/${t.name}`,t.module);else n.register(`modules/${e.modules.name}`,e.modules.module);l=new n(a.value,r),f(e.content),l.on("text-change",p),l.on("selection-change",h),l.on("editor-change",g),"bubble"!==e.theme&&a.value.classList.remove("ql-bubble"),"snow"!==e.theme&&a.value.classList.remove("ql-snow"),null===(o=l.getModule("toolbar"))||void 0===o||o.container.addEventListener("mousedown",(e=>{e.preventDefault()})),t.emit("ready",l)}},s=()=>{const t={};if(""!==e.theme&&(t.theme=e.theme),e.readOnly&&(t.readOnly=e.readOnly),e.placeholder&&(t.placeholder=e.placeholder),e.toolbar&&""!==e.toolbar&&(t.modules={toolbar:(()=>{if("object"==typeof e.toolbar)return e.toolbar;if("string"==typeof e.toolbar){return"#"===e.toolbar.charAt(0)?e.toolbar:i[e.toolbar]}})()}),e.modules){const o=(()=>{var t,o;const l={};if(Array.isArray(e.modules))for(const n of e.modules)l[n.name]=null!==(t=n.options)&&void 0!==t?t:{};else l[e.modules.name]=null!==(o=e.modules.options)&&void 0!==o?o:{};return l})();t.modules=Object.assign({},t.modules,o)}return Object.assign({},e.globalOptions,e.options,t)},u=e=>"object"==typeof e?e.slice():e;let c;const b=e=>{if(typeof c==typeof e){if(e===c)return!0;if("object"==typeof e&&"object"==typeof c)return t=c.diff(e),!Object.values(t.ops).some((e=>!e.retain||1!==Object.keys(e).length))}var t;return!1},p=(o,l,n)=>{c=u(v()),b(e.content)||t.emit("update:content",c),t.emit("textChange",{delta:o,oldContents:l,source:n})},m=o.ref(),h=(e,o,n)=>{m.value=!!(null==l?void 0:l.hasFocus()),t.emit("selectionChange",{range:e,oldRange:o,source:n})};o.watch(m,(e=>{t.emit(e?"focus":"blur",a)}));const g=(...e)=>{"text-change"===e[0]&&t.emit("editorChange",{name:e[0],delta:e[1],oldContents:e[2],source:e[3]}),"selection-change"===e[0]&&t.emit("editorChange",{name:e[0],range:e[1],oldRange:e[2],source:e[3]})},v=(t,o)=>"html"===e.contentType?O():"text"===e.contentType?y(t,o):null==l?void 0:l.getContents(t,o),f=(t,o="api")=>{"html"===e.contentType?T(t):"text"===e.contentType?x(t,o):null==l||l.setContents(t,o),c=u(t)},y=(e,t)=>{var o;return null!==(o=null==l?void 0:l.getText(e,t))&&void 0!==o?o:""},x=(e,t="api")=>{null==l||l.setText(e,t)},O=()=>{var e;return null!==(e=null==l?void 0:l.root.innerHTML)&&void 0!==e?e:""},T=e=>{l&&(l.root.innerHTML=e)};return o.watch((()=>e.content),(e=>{if(!l||!e||b(e))return;const t=l.getSelection();t&&o.nextTick((()=>null==l?void 0:l.setSelection(t))),f(e)}),{deep:!0}),o.watch((()=>e.enable),(e=>{l&&l.enable(e)})),{editor:a,getEditor:()=>a.value,getToolbar:()=>{var e;return null===(e=null==l?void 0:l.getModule("toolbar"))||void 0===e?void 0:e.container},getQuill:()=>{if(l)return l;throw'The quill editor hasn\'t been instantiated yet, \n make sure to call this method when the editor ready\n or use v-on:ready="onReady(quill)" event instead.'},getContents:v,setContents:f,getHTML:O,setHTML:T,pasteHTML:(e,t="api")=>{const o=null==l?void 0:l.clipboard.convert(e);o&&(null==l||l.setContents(o,t))},getText:y,setText:x,reinit:()=>{o.nextTick((()=>{var e;!t.slots.toolbar&&l&&(null===(e=l.getModule("toolbar"))||void 0===e||e.container.remove()),d()}))}}},render(){var e,t;return[null===(t=(e=this.$slots).toolbar)||void 0===t?void 0:t.call(e),o.h("div",{ref:"editor",...this.$attrs})]}});exports.Quill=n,exports.Delta=r,exports.QuillEditor=a;
@@ -1,13 +1,13 @@
1
1
  /*!
2
- * VueQuill @vueup/vue-quill v1.0.1
2
+ * VueQuill @vueup/vue-quill v1.1.0
3
3
  * https://vueup.github.io/vue-quill/
4
4
  *
5
5
  * Includes quill v1.3.7
6
6
  * https://quilljs.com/
7
7
  *
8
- * Copyright (c) 2022 Ahmad Luthfi Masruri
8
+ * Copyright (c) 2023 Ahmad Luthfi Masruri
9
9
  * Released under the MIT license
10
- * Date: 2022-12-20T16:01:54.428Z
10
+ * Date: 2023-02-04T04:01:16.430Z
11
11
  */
12
12
  import { defineComponent, onMounted, onBeforeUnmount, ref, watch, nextTick, h } from 'vue';
13
13
 
@@ -18605,11 +18605,14 @@ const QuillEditor = defineComponent({
18605
18605
  }
18606
18606
  return Object.assign({}, props.globalOptions, props.options, clientOptions);
18607
18607
  };
18608
+ const maybeClone = (delta) => {
18609
+ return typeof delta === 'object' ? delta.slice() : delta;
18610
+ };
18608
18611
  const deltaHasValuesOtherThanRetain = (delta) => {
18609
- return Object.values(delta).some((v) => !v.retain);
18612
+ return Object.values(delta.ops).some((v) => !v.retain || Object.keys(v).length !== 1);
18610
18613
  };
18611
- // eslint-disable-next-line vue/no-setup-props-destructure
18612
- let internalModel = props.content; // Doesn't need reactivity
18614
+ // Doesn't need reactivity, but does need to be cloned to avoid deep mutations always registering as equal
18615
+ let internalModel;
18613
18616
  const internalModelEquals = (against) => {
18614
18617
  if (typeof internalModel === typeof against) {
18615
18618
  if (against === internalModel) {
@@ -18623,10 +18626,7 @@ const QuillEditor = defineComponent({
18623
18626
  return false;
18624
18627
  };
18625
18628
  const handleTextChange = (delta, oldContents, source) => {
18626
- // Quill should never be null at this point because we receive an event
18627
- // so content should not be undefined but let's make ts and eslint happy
18628
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
18629
- internalModel = getContents();
18629
+ internalModel = maybeClone(getContents());
18630
18630
  // Update v-model:content when text changes
18631
18631
  if (!internalModelEquals(props.content)) {
18632
18632
  ctx.emit('update:content', internalModel);
@@ -18695,6 +18695,7 @@ const QuillEditor = defineComponent({
18695
18695
  else {
18696
18696
  quill === null || quill === void 0 ? void 0 : quill.setContents(content, source);
18697
18697
  }
18698
+ internalModel = maybeClone(content);
18698
18699
  };
18699
18700
  const getText = (index, length) => {
18700
18701
  var _a;
@@ -18727,14 +18728,13 @@ const QuillEditor = defineComponent({
18727
18728
  watch(() => props.content, (newContent) => {
18728
18729
  if (!quill || !newContent || internalModelEquals(newContent))
18729
18730
  return;
18730
- internalModel = newContent;
18731
18731
  // Restore the selection and cursor position after updating the content
18732
18732
  const selection = quill.getSelection();
18733
18733
  if (selection) {
18734
18734
  nextTick(() => quill === null || quill === void 0 ? void 0 : quill.setSelection(selection));
18735
18735
  }
18736
18736
  setContents(newContent);
18737
- });
18737
+ }, { deep: true });
18738
18738
  watch(() => props.enable, (newValue) => {
18739
18739
  if (quill)
18740
18740
  quill.enable(newValue);