@ckeditor/ckeditor5-autosave 41.1.0 → 41.3.0-alpha.0
Sign up to get free protection for your applications and to get access to all the features.
- package/build/autosave.js +1 -1
- package/dist/content-index.css +4 -0
- package/dist/editor-index.css +4 -0
- package/dist/index.css +4 -0
- package/dist/index.js +236 -0
- package/dist/index.js.map +1 -0
- package/dist/types/augmentation.d.ts +18 -0
- package/dist/types/autosave.d.ts +219 -0
- package/dist/types/index.d.ts +9 -0
- package/lang/translations/he.po +1 -1
- package/package.json +3 -2
package/build/autosave.js
CHANGED
@@ -2,4 +2,4 @@
|
|
2
2
|
/*!
|
3
3
|
* @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
4
4
|
* For licensing, see LICENSE.md.
|
5
|
-
*/(()=>{var t={
|
5
|
+
*/(()=>{var t={782:(t,e,i)=>{t.exports=i(237)("./src/core.js")},584:(t,e,i)=>{t.exports=i(237)("./src/utils.js")},237:t=>{"use strict";t.exports=CKEditor5.dll}},e={};function i(n){var s=e[n];if(void 0!==s)return s.exports;var o=e[n]={exports:{}};return t[n](o,o.exports,i),o.exports}i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var n={};(()=>{"use strict";i.r(n),i.d(n,{Autosave:()=>D});var t=i(782),e=i(584);const s=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)};const o="object"==typeof global&&global&&global.Object===Object&&global;var r="object"==typeof self&&self&&self.Object===Object&&self;const a=o||r||Function("return this")();const c=function(){return a.Date.now()};var u=/\s/;const l=function(t){for(var e=t.length;e--&&u.test(t.charAt(e)););return e};var d=/^\s+/;const h=function(t){return t?t.slice(0,l(t)+1).replace(d,""):t};const v=a.Symbol;var f=Object.prototype,m=f.hasOwnProperty,g=f.toString,_=v?v.toStringTag:void 0;const p=function(t){var e=m.call(t,_),i=t[_];try{t[_]=void 0;var n=!0}catch(t){}var s=g.call(t);return n&&(e?t[_]=i:delete t[_]),s};var b=Object.prototype.toString;const y=function(t){return b.call(t)};var S=v?v.toStringTag:void 0;const T=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":S&&S in Object(t)?p(t):y(t)};const j=function(t){return null!=t&&"object"==typeof t};const w=function(t){return"symbol"==typeof t||j(t)&&"[object Symbol]"==T(t)};var O=/^[-+]0x[0-9a-f]+$/i,P=/^0b[01]+$/i,A=/^0o[0-7]+$/i,x=parseInt;const E=function(t){if("number"==typeof t)return t;if(w(t))return NaN;if(s(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=s(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=h(t);var i=P.test(t);return i||A.test(t)?x(t.slice(2),i?2:8):O.test(t)?NaN:+t};var N=Math.max,I=Math.min;const C=function(t,e,i){var n,o,r,a,u,l,d=0,h=!1,v=!1,f=!0;if("function"!=typeof t)throw new TypeError("Expected a function");function m(e){var i=n,s=o;return n=o=void 0,d=e,a=t.apply(s,i)}function g(t){var i=t-l;return void 0===l||i>=e||i<0||v&&t-d>=r}function _(){var t=c();if(g(t))return p(t);u=setTimeout(_,function(t){var i=e-(t-l);return v?I(i,r-(t-d)):i}(t))}function p(t){return u=void 0,f&&n?m(t):(n=o=void 0,a)}function b(){var t=c(),i=g(t);if(n=arguments,o=this,l=t,i){if(void 0===u)return function(t){return d=t,u=setTimeout(_,e),h?m(t):a}(l);if(v)return clearTimeout(u),u=setTimeout(_,e),m(l)}return void 0===u&&(u=setTimeout(_,e)),a}return e=E(e)||0,s(i)&&(h=!!i.leading,r=(v="maxWait"in i)?N(E(i.maxWait)||0,e):r,f="trailing"in i?!!i.trailing:f),b.cancel=function(){void 0!==u&&clearTimeout(u),d=0,n=l=o=u=void 0},b.flush=function(){return void 0===u?a:p(c())},b};class D extends t.Plugin{static get pluginName(){return"Autosave"}static get requires(){return[t.PendingActions]}constructor(i){super(i),this._action=null;const n=i.config.get("autosave")||{},s=n.waitingTime||1e3;this.set("state","synchronized"),this._debouncedSave=C(this._save.bind(this),s),this._lastDocumentVersion=i.model.document.version,this._savePromise=null,this._domEmitter=new((0,e.DomEmitterMixin)()),this._config=n,this._pendingActions=i.plugins.get(t.PendingActions),this._makeImmediateSave=!1}init(){const t=this.editor,e=t.model.document;this.listenTo(t,"ready",(()=>{this.listenTo(e,"change:data",((t,e)=>{this._saveCallbacks.length&&e.isLocal&&("synchronized"===this.state&&(this.state="waiting",this._setPendingAction()),"waiting"===this.state&&this._debouncedSave())}))})),this.listenTo(t,"destroy",(()=>this._flush()),{priority:"highest"}),this._domEmitter.listenTo(window,"beforeunload",((t,e)=>{this._pendingActions.hasAny&&(e.returnValue=this._pendingActions.first.message)}))}destroy(){this._domEmitter.stopListening(),super.destroy()}save(){return this._debouncedSave.cancel(),this._save()}_flush(){this._debouncedSave.flush()}_save(){return this._savePromise?(this._makeImmediateSave=this.editor.model.document.version>this._lastDocumentVersion,this._savePromise):(this._setPendingAction(),this.state="saving",this._lastDocumentVersion=this.editor.model.document.version,this._savePromise=Promise.resolve().then((()=>Promise.all(this._saveCallbacks.map((t=>t(this.editor)))))).finally((()=>{this._savePromise=null})).then((()=>{if(this._makeImmediateSave)return this._makeImmediateSave=!1,this._save();this.editor.model.document.version>this._lastDocumentVersion?(this.state="waiting",this._debouncedSave()):(this.state="synchronized",this._pendingActions.remove(this._action),this._action=null)})).catch((t=>{throw this.state="error",this.state="saving",this._debouncedSave(),t})),this._savePromise)}_setPendingAction(){const t=this.editor.t;this._action||(this._action=this._pendingActions.add(t("Saving changes")))}get _saveCallbacks(){const t=[];return this.adapter&&this.adapter.save&&t.push(this.adapter.save),this._config.save&&t.push(this._config.save),t}}})(),(window.CKEditor5=window.CKEditor5||{}).autosave=n})();
|
package/dist/index.css
ADDED
package/dist/index.js
ADDED
@@ -0,0 +1,236 @@
|
|
1
|
+
/**
|
2
|
+
* @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
3
|
+
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
4
|
+
*/
|
5
|
+
import { Plugin, PendingActions } from '@ckeditor/ckeditor5-core/dist/index.js';
|
6
|
+
import { DomEmitterMixin } from '@ckeditor/ckeditor5-utils/dist/index.js';
|
7
|
+
import { debounce } from 'lodash-es';
|
8
|
+
|
9
|
+
/**
|
10
|
+
* @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
11
|
+
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
12
|
+
*/
|
13
|
+
/**
|
14
|
+
* @module autosave/autosave
|
15
|
+
*/
|
16
|
+
/* globals window */
|
17
|
+
/**
|
18
|
+
* The {@link module:autosave/autosave~Autosave} plugin allows you to automatically save the data (e.g. send it to the server)
|
19
|
+
* when needed (when the user changed the content).
|
20
|
+
*
|
21
|
+
* It listens to the {@link module:engine/model/document~Document#event:change:data `editor.model.document#change:data`}
|
22
|
+
* and `window#beforeunload` events and calls the
|
23
|
+
* {@link module:autosave/autosave~AutosaveAdapter#save `config.autosave.save()`} function.
|
24
|
+
*
|
25
|
+
* ```ts
|
26
|
+
* ClassicEditor
|
27
|
+
* .create( document.querySelector( '#editor' ), {
|
28
|
+
* plugins: [ ArticlePluginSet, Autosave ],
|
29
|
+
* toolbar: [ 'heading', '|', 'bold', 'italic', 'link', 'bulletedList', 'numberedList', 'blockQuote', 'undo', 'redo' ],
|
30
|
+
* image: {
|
31
|
+
* toolbar: [ 'imageStyle:block', 'imageStyle:side', '|', 'toggleImageCaption', 'imageTextAlternative' ],
|
32
|
+
* },
|
33
|
+
* autosave: {
|
34
|
+
* save( editor: Editor ) {
|
35
|
+
* // The saveData() function must return a promise
|
36
|
+
* // which should be resolved when the data is successfully saved.
|
37
|
+
* return saveData( editor.getData() );
|
38
|
+
* }
|
39
|
+
* }
|
40
|
+
* } );
|
41
|
+
* ```
|
42
|
+
*
|
43
|
+
* Read more about this feature in the {@glink features/autosave Autosave} feature guide.
|
44
|
+
*/
|
45
|
+
class Autosave extends Plugin {
|
46
|
+
/**
|
47
|
+
* @inheritDoc
|
48
|
+
*/
|
49
|
+
static get pluginName() {
|
50
|
+
return 'Autosave';
|
51
|
+
}
|
52
|
+
/**
|
53
|
+
* @inheritDoc
|
54
|
+
*/
|
55
|
+
static get requires() {
|
56
|
+
return [PendingActions];
|
57
|
+
}
|
58
|
+
/**
|
59
|
+
* @inheritDoc
|
60
|
+
*/
|
61
|
+
constructor(editor) {
|
62
|
+
super(editor);
|
63
|
+
/**
|
64
|
+
* An action that will be added to the pending action manager for actions happening in that plugin.
|
65
|
+
*/
|
66
|
+
this._action = null;
|
67
|
+
const config = editor.config.get('autosave') || {};
|
68
|
+
// A minimum amount of time that needs to pass after the last action.
|
69
|
+
// After that time the provided save callbacks are being called.
|
70
|
+
const waitingTime = config.waitingTime || 1000;
|
71
|
+
this.set('state', 'synchronized');
|
72
|
+
this._debouncedSave = debounce(this._save.bind(this), waitingTime);
|
73
|
+
this._lastDocumentVersion = editor.model.document.version;
|
74
|
+
this._savePromise = null;
|
75
|
+
this._domEmitter = new (DomEmitterMixin())();
|
76
|
+
this._config = config;
|
77
|
+
this._pendingActions = editor.plugins.get(PendingActions);
|
78
|
+
this._makeImmediateSave = false;
|
79
|
+
}
|
80
|
+
/**
|
81
|
+
* @inheritDoc
|
82
|
+
*/
|
83
|
+
init() {
|
84
|
+
const editor = this.editor;
|
85
|
+
const doc = editor.model.document;
|
86
|
+
// Add the listener only after the editor is initialized to prevent firing save callback on data init.
|
87
|
+
this.listenTo(editor, 'ready', () => {
|
88
|
+
this.listenTo(doc, 'change:data', (evt, batch) => {
|
89
|
+
if (!this._saveCallbacks.length) {
|
90
|
+
return;
|
91
|
+
}
|
92
|
+
if (!batch.isLocal) {
|
93
|
+
return;
|
94
|
+
}
|
95
|
+
if (this.state === 'synchronized') {
|
96
|
+
this.state = 'waiting';
|
97
|
+
// Set pending action already when we are waiting for the autosave callback.
|
98
|
+
this._setPendingAction();
|
99
|
+
}
|
100
|
+
if (this.state === 'waiting') {
|
101
|
+
this._debouncedSave();
|
102
|
+
}
|
103
|
+
// If the plugin is in `saving` state, it will change its state later basing on the `document.version`.
|
104
|
+
// If the `document.version` will be higher than stored `#_lastDocumentVersion`, then it means, that some `change:data`
|
105
|
+
// event has fired in the meantime.
|
106
|
+
});
|
107
|
+
});
|
108
|
+
// Flush on the editor's destroy listener with the highest priority to ensure that
|
109
|
+
// `editor.getData()` will be called before plugins are destroyed.
|
110
|
+
this.listenTo(editor, 'destroy', () => this._flush(), { priority: 'highest' });
|
111
|
+
// It's not possible to easy test it because karma uses `beforeunload` event
|
112
|
+
// to warn before full page reload and this event cannot be dispatched manually.
|
113
|
+
/* istanbul ignore next -- @preserve */
|
114
|
+
this._domEmitter.listenTo(window, 'beforeunload', (evtInfo, domEvt) => {
|
115
|
+
if (this._pendingActions.hasAny) {
|
116
|
+
domEvt.returnValue = this._pendingActions.first.message;
|
117
|
+
}
|
118
|
+
});
|
119
|
+
}
|
120
|
+
/**
|
121
|
+
* @inheritDoc
|
122
|
+
*/
|
123
|
+
destroy() {
|
124
|
+
// There's no need for canceling or flushing the throttled save, as
|
125
|
+
// it's done on the editor's destroy event with the highest priority.
|
126
|
+
this._domEmitter.stopListening();
|
127
|
+
super.destroy();
|
128
|
+
}
|
129
|
+
/**
|
130
|
+
* Immediately calls autosave callback. All previously queued (debounced) callbacks are cleared. If there is already an autosave
|
131
|
+
* callback in progress, then the requested save will be performed immediately after the current callback finishes.
|
132
|
+
*
|
133
|
+
* @returns A promise that will be resolved when the autosave callback is finished.
|
134
|
+
*/
|
135
|
+
save() {
|
136
|
+
this._debouncedSave.cancel();
|
137
|
+
return this._save();
|
138
|
+
}
|
139
|
+
/**
|
140
|
+
* Invokes the remaining `_save()` method call.
|
141
|
+
*/
|
142
|
+
_flush() {
|
143
|
+
this._debouncedSave.flush();
|
144
|
+
}
|
145
|
+
/**
|
146
|
+
* If the adapter is set and a new document version exists,
|
147
|
+
* the `_save()` method creates a pending action and calls the `adapter.save()` method.
|
148
|
+
* It waits for the result and then removes the created pending action.
|
149
|
+
*
|
150
|
+
* @returns A promise that will be resolved when the autosave callback is finished.
|
151
|
+
*/
|
152
|
+
_save() {
|
153
|
+
if (this._savePromise) {
|
154
|
+
this._makeImmediateSave = this.editor.model.document.version > this._lastDocumentVersion;
|
155
|
+
return this._savePromise;
|
156
|
+
}
|
157
|
+
// Make sure there is a pending action (in case if `_save()` was called through manual `save()` call).
|
158
|
+
this._setPendingAction();
|
159
|
+
this.state = 'saving';
|
160
|
+
this._lastDocumentVersion = this.editor.model.document.version;
|
161
|
+
// Wait one promise cycle to be sure that save callbacks are not called inside a conversion or when the editor's state changes.
|
162
|
+
this._savePromise = Promise.resolve()
|
163
|
+
// Make autosave callback.
|
164
|
+
.then(() => Promise.all(this._saveCallbacks.map(cb => cb(this.editor))))
|
165
|
+
// When the autosave callback is finished, always clear `this._savePromise`, no matter if it was successful or not.
|
166
|
+
.finally(() => {
|
167
|
+
this._savePromise = null;
|
168
|
+
})
|
169
|
+
// If the save was successful, we have three scenarios:
|
170
|
+
//
|
171
|
+
// 1. If a save was requested when an autosave callback was already processed, we need to immediately call
|
172
|
+
// another autosave callback. In this case, `this._savePromise` will not be resolved until the next callback is done.
|
173
|
+
// 2. Otherwise, if changes happened to the model, make a delayed autosave callback (like the change just happened).
|
174
|
+
// 3. If no changes happened to the model, return to the `synchronized` state.
|
175
|
+
.then(() => {
|
176
|
+
if (this._makeImmediateSave) {
|
177
|
+
this._makeImmediateSave = false;
|
178
|
+
// Start another autosave callback. Return a promise that will be resolved after the new autosave callback.
|
179
|
+
// This way promises returned by `_save()` will not be resolved until all changes are saved.
|
180
|
+
//
|
181
|
+
// If `save()` was called when another (most often automatic) autosave callback was already processed,
|
182
|
+
// the promise returned by `save()` call will be resolved only after new changes have been saved.
|
183
|
+
//
|
184
|
+
// Note that it would not work correctly if `this._savePromise` is not cleared.
|
185
|
+
return this._save();
|
186
|
+
}
|
187
|
+
else {
|
188
|
+
if (this.editor.model.document.version > this._lastDocumentVersion) {
|
189
|
+
this.state = 'waiting';
|
190
|
+
this._debouncedSave();
|
191
|
+
}
|
192
|
+
else {
|
193
|
+
this.state = 'synchronized';
|
194
|
+
this._pendingActions.remove(this._action);
|
195
|
+
this._action = null;
|
196
|
+
}
|
197
|
+
}
|
198
|
+
})
|
199
|
+
// In case of an error, retry the autosave callback after a delay (and also throw the original error).
|
200
|
+
.catch(err => {
|
201
|
+
// Change state to `error` so that listeners handling autosave error can be called.
|
202
|
+
this.state = 'error';
|
203
|
+
// Then, immediately change to the `saving` state as described above.
|
204
|
+
// Being in the `saving` state ensures that the autosave callback won't be delayed further by the `change:data` listener.
|
205
|
+
this.state = 'saving';
|
206
|
+
this._debouncedSave();
|
207
|
+
throw err;
|
208
|
+
});
|
209
|
+
return this._savePromise;
|
210
|
+
}
|
211
|
+
/**
|
212
|
+
* Creates a pending action if it is not set already.
|
213
|
+
*/
|
214
|
+
_setPendingAction() {
|
215
|
+
const t = this.editor.t;
|
216
|
+
if (!this._action) {
|
217
|
+
this._action = this._pendingActions.add(t('Saving changes'));
|
218
|
+
}
|
219
|
+
}
|
220
|
+
/**
|
221
|
+
* Saves callbacks.
|
222
|
+
*/
|
223
|
+
get _saveCallbacks() {
|
224
|
+
const saveCallbacks = [];
|
225
|
+
if (this.adapter && this.adapter.save) {
|
226
|
+
saveCallbacks.push(this.adapter.save);
|
227
|
+
}
|
228
|
+
if (this._config.save) {
|
229
|
+
saveCallbacks.push(this._config.save);
|
230
|
+
}
|
231
|
+
return saveCallbacks;
|
232
|
+
}
|
233
|
+
}
|
234
|
+
|
235
|
+
export { Autosave };
|
236
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["index.js","../src/autosave.ts"],"names":[],"mappings":"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","file":"index.js.map","sourcesContent":["import { Plugin, PendingActions } from '@ckeditor/ckeditor5-core/dist/index.js';\nimport { DomEmitterMixin } from '@ckeditor/ckeditor5-utils/dist/index.js';\nimport { debounce } from 'lodash-es';\n\n/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n/**\n * @module autosave/autosave\n */\n/* globals window */\n/**\n * The {@link module:autosave/autosave~Autosave} plugin allows you to automatically save the data (e.g. send it to the server)\n * when needed (when the user changed the content).\n *\n * It listens to the {@link module:engine/model/document~Document#event:change:data `editor.model.document#change:data`}\n * and `window#beforeunload` events and calls the\n * {@link module:autosave/autosave~AutosaveAdapter#save `config.autosave.save()`} function.\n *\n * ```ts\n * ClassicEditor\n * \t.create( document.querySelector( '#editor' ), {\n * \t\tplugins: [ ArticlePluginSet, Autosave ],\n * \t\ttoolbar: [ 'heading', '|', 'bold', 'italic', 'link', 'bulletedList', 'numberedList', 'blockQuote', 'undo', 'redo' ],\n * \t\timage: {\n * \t\t\ttoolbar: [ 'imageStyle:block', 'imageStyle:side', '|', 'toggleImageCaption', 'imageTextAlternative' ],\n * \t\t},\n * \t\tautosave: {\n * \t\t\tsave( editor: Editor ) {\n * \t\t\t\t// The saveData() function must return a promise\n * \t\t\t\t// which should be resolved when the data is successfully saved.\n * \t\t\t\treturn saveData( editor.getData() );\n * \t\t\t}\n * \t\t}\n * \t} );\n * ```\n *\n * Read more about this feature in the {@glink features/autosave Autosave} feature guide.\n */\nclass Autosave extends Plugin {\n /**\n * @inheritDoc\n */\n static get pluginName() {\n return 'Autosave';\n }\n /**\n * @inheritDoc\n */\n static get requires() {\n return [PendingActions];\n }\n /**\n * @inheritDoc\n */\n constructor(editor) {\n super(editor);\n /**\n * An action that will be added to the pending action manager for actions happening in that plugin.\n */\n this._action = null;\n const config = editor.config.get('autosave') || {};\n // A minimum amount of time that needs to pass after the last action.\n // After that time the provided save callbacks are being called.\n const waitingTime = config.waitingTime || 1000;\n this.set('state', 'synchronized');\n this._debouncedSave = debounce(this._save.bind(this), waitingTime);\n this._lastDocumentVersion = editor.model.document.version;\n this._savePromise = null;\n this._domEmitter = new (DomEmitterMixin())();\n this._config = config;\n this._pendingActions = editor.plugins.get(PendingActions);\n this._makeImmediateSave = false;\n }\n /**\n * @inheritDoc\n */\n init() {\n const editor = this.editor;\n const doc = editor.model.document;\n // Add the listener only after the editor is initialized to prevent firing save callback on data init.\n this.listenTo(editor, 'ready', () => {\n this.listenTo(doc, 'change:data', (evt, batch) => {\n if (!this._saveCallbacks.length) {\n return;\n }\n if (!batch.isLocal) {\n return;\n }\n if (this.state === 'synchronized') {\n this.state = 'waiting';\n // Set pending action already when we are waiting for the autosave callback.\n this._setPendingAction();\n }\n if (this.state === 'waiting') {\n this._debouncedSave();\n }\n // If the plugin is in `saving` state, it will change its state later basing on the `document.version`.\n // If the `document.version` will be higher than stored `#_lastDocumentVersion`, then it means, that some `change:data`\n // event has fired in the meantime.\n });\n });\n // Flush on the editor's destroy listener with the highest priority to ensure that\n // `editor.getData()` will be called before plugins are destroyed.\n this.listenTo(editor, 'destroy', () => this._flush(), { priority: 'highest' });\n // It's not possible to easy test it because karma uses `beforeunload` event\n // to warn before full page reload and this event cannot be dispatched manually.\n /* istanbul ignore next -- @preserve */\n this._domEmitter.listenTo(window, 'beforeunload', (evtInfo, domEvt) => {\n if (this._pendingActions.hasAny) {\n domEvt.returnValue = this._pendingActions.first.message;\n }\n });\n }\n /**\n * @inheritDoc\n */\n destroy() {\n // There's no need for canceling or flushing the throttled save, as\n // it's done on the editor's destroy event with the highest priority.\n this._domEmitter.stopListening();\n super.destroy();\n }\n /**\n * Immediately calls autosave callback. All previously queued (debounced) callbacks are cleared. If there is already an autosave\n * callback in progress, then the requested save will be performed immediately after the current callback finishes.\n *\n * @returns A promise that will be resolved when the autosave callback is finished.\n */\n save() {\n this._debouncedSave.cancel();\n return this._save();\n }\n /**\n * Invokes the remaining `_save()` method call.\n */\n _flush() {\n this._debouncedSave.flush();\n }\n /**\n * If the adapter is set and a new document version exists,\n * the `_save()` method creates a pending action and calls the `adapter.save()` method.\n * It waits for the result and then removes the created pending action.\n *\n * @returns A promise that will be resolved when the autosave callback is finished.\n */\n _save() {\n if (this._savePromise) {\n this._makeImmediateSave = this.editor.model.document.version > this._lastDocumentVersion;\n return this._savePromise;\n }\n // Make sure there is a pending action (in case if `_save()` was called through manual `save()` call).\n this._setPendingAction();\n this.state = 'saving';\n this._lastDocumentVersion = this.editor.model.document.version;\n // Wait one promise cycle to be sure that save callbacks are not called inside a conversion or when the editor's state changes.\n this._savePromise = Promise.resolve()\n // Make autosave callback.\n .then(() => Promise.all(this._saveCallbacks.map(cb => cb(this.editor))))\n // When the autosave callback is finished, always clear `this._savePromise`, no matter if it was successful or not.\n .finally(() => {\n this._savePromise = null;\n })\n // If the save was successful, we have three scenarios:\n //\n // 1. If a save was requested when an autosave callback was already processed, we need to immediately call\n // another autosave callback. In this case, `this._savePromise` will not be resolved until the next callback is done.\n // 2. Otherwise, if changes happened to the model, make a delayed autosave callback (like the change just happened).\n // 3. If no changes happened to the model, return to the `synchronized` state.\n .then(() => {\n if (this._makeImmediateSave) {\n this._makeImmediateSave = false;\n // Start another autosave callback. Return a promise that will be resolved after the new autosave callback.\n // This way promises returned by `_save()` will not be resolved until all changes are saved.\n //\n // If `save()` was called when another (most often automatic) autosave callback was already processed,\n // the promise returned by `save()` call will be resolved only after new changes have been saved.\n //\n // Note that it would not work correctly if `this._savePromise` is not cleared.\n return this._save();\n }\n else {\n if (this.editor.model.document.version > this._lastDocumentVersion) {\n this.state = 'waiting';\n this._debouncedSave();\n }\n else {\n this.state = 'synchronized';\n this._pendingActions.remove(this._action);\n this._action = null;\n }\n }\n })\n // In case of an error, retry the autosave callback after a delay (and also throw the original error).\n .catch(err => {\n // Change state to `error` so that listeners handling autosave error can be called.\n this.state = 'error';\n // Then, immediately change to the `saving` state as described above.\n // Being in the `saving` state ensures that the autosave callback won't be delayed further by the `change:data` listener.\n this.state = 'saving';\n this._debouncedSave();\n throw err;\n });\n return this._savePromise;\n }\n /**\n * Creates a pending action if it is not set already.\n */\n _setPendingAction() {\n const t = this.editor.t;\n if (!this._action) {\n this._action = this._pendingActions.add(t('Saving changes'));\n }\n }\n /**\n * Saves callbacks.\n */\n get _saveCallbacks() {\n const saveCallbacks = [];\n if (this.adapter && this.adapter.save) {\n saveCallbacks.push(this.adapter.save);\n }\n if (this._config.save) {\n saveCallbacks.push(this._config.save);\n }\n return saveCallbacks;\n }\n}\n\nexport { Autosave };\n//# sourceMappingURL=index.js.map\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module autosave/autosave\n */\n\nimport {\n\tPlugin,\n\tPendingActions,\n\ttype Editor,\n\ttype PendingAction,\n\ttype EditorDestroyEvent,\n\ttype EditorReadyEvent\n} from 'ckeditor5/src/core.js';\n\nimport { DomEmitterMixin, type DomEmitter } from 'ckeditor5/src/utils.js';\n\nimport type { DocumentChangeEvent } from 'ckeditor5/src/engine.js';\n\nimport { debounce, type DebouncedFunc } from 'lodash-es';\n\n/* globals window */\n\n/**\n * The {@link module:autosave/autosave~Autosave} plugin allows you to automatically save the data (e.g. send it to the server)\n * when needed (when the user changed the content).\n *\n * It listens to the {@link module:engine/model/document~Document#event:change:data `editor.model.document#change:data`}\n * and `window#beforeunload` events and calls the\n * {@link module:autosave/autosave~AutosaveAdapter#save `config.autosave.save()`} function.\n *\n * ```ts\n * ClassicEditor\n * \t.create( document.querySelector( '#editor' ), {\n * \t\tplugins: [ ArticlePluginSet, Autosave ],\n * \t\ttoolbar: [ 'heading', '|', 'bold', 'italic', 'link', 'bulletedList', 'numberedList', 'blockQuote', 'undo', 'redo' ],\n * \t\timage: {\n * \t\t\ttoolbar: [ 'imageStyle:block', 'imageStyle:side', '|', 'toggleImageCaption', 'imageTextAlternative' ],\n * \t\t},\n * \t\tautosave: {\n * \t\t\tsave( editor: Editor ) {\n * \t\t\t\t// The saveData() function must return a promise\n * \t\t\t\t// which should be resolved when the data is successfully saved.\n * \t\t\t\treturn saveData( editor.getData() );\n * \t\t\t}\n * \t\t}\n * \t} );\n * ```\n *\n * Read more about this feature in the {@glink features/autosave Autosave} feature guide.\n */\nexport default class Autosave extends Plugin {\n\t/**\n\t * The adapter is an object with a `save()` method. That method will be called whenever\n\t * the data changes. It might be called some time after the change,\n\t * since the event is throttled for performance reasons.\n\t */\n\n\tpublic adapter?: AutosaveAdapter;\n\n\t/**\n\t * The state of this plugin.\n\t *\n\t * The plugin can be in the following states:\n\t *\n\t * * synchronized – When all changes are saved.\n\t * * waiting – When the plugin is waiting for other changes before calling `adapter#save()` and `config.autosave.save()`.\n\t * * saving – When the provided save method is called and the plugin waits for the response.\n\t * * error &ndash When the provided save method will throw an error. This state immediately changes to the `saving` state and\n\t * the save method will be called again in the short period of time.\n\t *\n\t * @observable\n\t * @readonly\n\t */\n\tdeclare public state: 'synchronized' | 'waiting' | 'saving' | 'error';\n\n\t/**\n\t * Debounced save method. The `save()` method is called the specified `waitingTime` after `debouncedSave()` is called,\n\t * unless a new action happens in the meantime.\n\t */\n\tprivate _debouncedSave: DebouncedFunc<( () => void )>;\n\n\t/**\n\t * The last saved document version.\n\t */\n\tprivate _lastDocumentVersion: number;\n\n\t/**\n\t * Promise used for asynchronous save calls.\n\t *\n\t * Created to handle the autosave call to an external data source. It resolves when that call is finished. It is re-used if\n\t * save is called before the promise has been resolved. It is set to `null` if there is no call in progress.\n\t */\n\tprivate _savePromise: Promise<void> | null;\n\n\t/**\n\t * DOM emitter.\n\t */\n\tprivate _domEmitter: DomEmitter;\n\n\t/**\n\t * The configuration of this plugins.\n\t */\n\tprivate _config: AutosaveConfig;\n\n\t/**\n\t * Editor's pending actions manager.\n\t */\n\tprivate _pendingActions: PendingActions;\n\n\t/**\n\t * Informs whether there should be another autosave callback performed, immediately after current autosave callback finishes.\n\t *\n\t * This is set to `true` when there is a save request while autosave callback is already being processed\n\t * and the model has changed since the last save.\n\t */\n\tprivate _makeImmediateSave: boolean;\n\n\t/**\n\t * An action that will be added to the pending action manager for actions happening in that plugin.\n\t */\n\tprivate _action: PendingAction | null = null;\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic static get pluginName() {\n\t\treturn 'Autosave' as const;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic static get requires() {\n\t\treturn [ PendingActions ] as const;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( editor: Editor ) {\n\t\tsuper( editor );\n\n\t\tconst config: AutosaveConfig = editor.config.get( 'autosave' ) || {};\n\n\t\t// A minimum amount of time that needs to pass after the last action.\n\t\t// After that time the provided save callbacks are being called.\n\t\tconst waitingTime = config.waitingTime || 1000;\n\n\t\tthis.set( 'state', 'synchronized' );\n\n\t\tthis._debouncedSave = debounce( this._save.bind( this ), waitingTime );\n\t\tthis._lastDocumentVersion = editor.model.document.version;\n\t\tthis._savePromise = null;\n\t\tthis._domEmitter = new ( DomEmitterMixin() )();\n\t\tthis._config = config;\n\t\tthis._pendingActions = editor.plugins.get( PendingActions );\n\t\tthis._makeImmediateSave = false;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic init(): void {\n\t\tconst editor = this.editor;\n\t\tconst doc = editor.model.document;\n\n\t\t// Add the listener only after the editor is initialized to prevent firing save callback on data init.\n\t\tthis.listenTo<EditorReadyEvent>( editor, 'ready', () => {\n\t\t\tthis.listenTo<DocumentChangeEvent>( doc, 'change:data', ( evt, batch ) => {\n\t\t\t\tif ( !this._saveCallbacks.length ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( !batch.isLocal ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( this.state === 'synchronized' ) {\n\t\t\t\t\tthis.state = 'waiting';\n\t\t\t\t\t// Set pending action already when we are waiting for the autosave callback.\n\t\t\t\t\tthis._setPendingAction();\n\t\t\t\t}\n\n\t\t\t\tif ( this.state === 'waiting' ) {\n\t\t\t\t\tthis._debouncedSave();\n\t\t\t\t}\n\n\t\t\t\t// If the plugin is in `saving` state, it will change its state later basing on the `document.version`.\n\t\t\t\t// If the `document.version` will be higher than stored `#_lastDocumentVersion`, then it means, that some `change:data`\n\t\t\t\t// event has fired in the meantime.\n\t\t\t} );\n\t\t} );\n\n\t\t// Flush on the editor's destroy listener with the highest priority to ensure that\n\t\t// `editor.getData()` will be called before plugins are destroyed.\n\t\tthis.listenTo<EditorDestroyEvent>( editor, 'destroy', () => this._flush(), { priority: 'highest' } );\n\n\t\t// It's not possible to easy test it because karma uses `beforeunload` event\n\t\t// to warn before full page reload and this event cannot be dispatched manually.\n\t\t/* istanbul ignore next -- @preserve */\n\t\tthis._domEmitter.listenTo( window, 'beforeunload', ( evtInfo, domEvt ) => {\n\t\t\tif ( this._pendingActions.hasAny ) {\n\t\t\t\tdomEvt.returnValue = this._pendingActions.first!.message;\n\t\t\t}\n\t\t} );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic override destroy(): void {\n\t\t// There's no need for canceling or flushing the throttled save, as\n\t\t// it's done on the editor's destroy event with the highest priority.\n\n\t\tthis._domEmitter.stopListening();\n\t\tsuper.destroy();\n\t}\n\n\t/**\n\t * Immediately calls autosave callback. All previously queued (debounced) callbacks are cleared. If there is already an autosave\n\t * callback in progress, then the requested save will be performed immediately after the current callback finishes.\n\t *\n\t * @returns A promise that will be resolved when the autosave callback is finished.\n\t */\n\tpublic save(): Promise<void> {\n\t\tthis._debouncedSave.cancel();\n\n\t\treturn this._save();\n\t}\n\n\t/**\n\t * Invokes the remaining `_save()` method call.\n\t */\n\tprivate _flush(): void {\n\t\tthis._debouncedSave.flush();\n\t}\n\n\t/**\n\t * If the adapter is set and a new document version exists,\n\t * the `_save()` method creates a pending action and calls the `adapter.save()` method.\n\t * It waits for the result and then removes the created pending action.\n\t *\n\t * @returns A promise that will be resolved when the autosave callback is finished.\n\t */\n\tprivate _save(): Promise<void> {\n\t\tif ( this._savePromise ) {\n\t\t\tthis._makeImmediateSave = this.editor.model.document.version > this._lastDocumentVersion;\n\n\t\t\treturn this._savePromise;\n\t\t}\n\n\t\t// Make sure there is a pending action (in case if `_save()` was called through manual `save()` call).\n\t\tthis._setPendingAction();\n\n\t\tthis.state = 'saving';\n\t\tthis._lastDocumentVersion = this.editor.model.document.version;\n\n\t\t// Wait one promise cycle to be sure that save callbacks are not called inside a conversion or when the editor's state changes.\n\t\tthis._savePromise = Promise.resolve()\n\t\t\t// Make autosave callback.\n\t\t\t.then( () => Promise.all(\n\t\t\t\tthis._saveCallbacks.map( cb => cb( this.editor ) )\n\t\t\t) )\n\t\t\t// When the autosave callback is finished, always clear `this._savePromise`, no matter if it was successful or not.\n\t\t\t.finally( () => {\n\t\t\t\tthis._savePromise = null;\n\t\t\t} )\n\t\t\t// If the save was successful, we have three scenarios:\n\t\t\t//\n\t\t\t// 1. If a save was requested when an autosave callback was already processed, we need to immediately call\n\t\t\t// another autosave callback. In this case, `this._savePromise` will not be resolved until the next callback is done.\n\t\t\t// 2. Otherwise, if changes happened to the model, make a delayed autosave callback (like the change just happened).\n\t\t\t// 3. If no changes happened to the model, return to the `synchronized` state.\n\t\t\t.then( () => {\n\t\t\t\tif ( this._makeImmediateSave ) {\n\t\t\t\t\tthis._makeImmediateSave = false;\n\n\t\t\t\t\t// Start another autosave callback. Return a promise that will be resolved after the new autosave callback.\n\t\t\t\t\t// This way promises returned by `_save()` will not be resolved until all changes are saved.\n\t\t\t\t\t//\n\t\t\t\t\t// If `save()` was called when another (most often automatic) autosave callback was already processed,\n\t\t\t\t\t// the promise returned by `save()` call will be resolved only after new changes have been saved.\n\t\t\t\t\t//\n\t\t\t\t\t// Note that it would not work correctly if `this._savePromise` is not cleared.\n\t\t\t\t\treturn this._save();\n\t\t\t\t} else {\n\t\t\t\t\tif ( this.editor.model.document.version > this._lastDocumentVersion ) {\n\t\t\t\t\t\tthis.state = 'waiting';\n\t\t\t\t\t\tthis._debouncedSave();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.state = 'synchronized';\n\t\t\t\t\t\tthis._pendingActions.remove( this._action! );\n\t\t\t\t\t\tthis._action = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} )\n\t\t\t// In case of an error, retry the autosave callback after a delay (and also throw the original error).\n\t\t\t.catch( err => {\n\t\t\t\t// Change state to `error` so that listeners handling autosave error can be called.\n\t\t\t\tthis.state = 'error';\n\t\t\t\t// Then, immediately change to the `saving` state as described above.\n\t\t\t\t// Being in the `saving` state ensures that the autosave callback won't be delayed further by the `change:data` listener.\n\t\t\t\tthis.state = 'saving';\n\n\t\t\t\tthis._debouncedSave();\n\n\t\t\t\tthrow err;\n\t\t\t} );\n\n\t\treturn this._savePromise;\n\t}\n\n\t/**\n\t * Creates a pending action if it is not set already.\n\t */\n\tprivate _setPendingAction(): void {\n\t\tconst t = this.editor.t;\n\n\t\tif ( !this._action ) {\n\t\t\tthis._action = this._pendingActions.add( t( 'Saving changes' ) );\n\t\t}\n\t}\n\n\t/**\n\t * Saves callbacks.\n\t */\n\tprivate get _saveCallbacks(): Array<( editor: Editor ) => Promise<unknown>> {\n\t\tconst saveCallbacks: Array<( editor: Editor ) => Promise<unknown>> = [];\n\n\t\tif ( this.adapter && this.adapter.save ) {\n\t\t\tsaveCallbacks.push( this.adapter.save );\n\t\t}\n\n\t\tif ( this._config.save ) {\n\t\t\tsaveCallbacks.push( this._config.save );\n\t\t}\n\n\t\treturn saveCallbacks;\n\t}\n}\n\n/**\n * An interface that requires the `save()` method.\n *\n * Used by {@link module:autosave/autosave~Autosave#adapter}.\n */\nexport interface AutosaveAdapter {\n\n\t/**\n\t * The method that will be called when the data changes. It should return a promise (e.g. in case of saving content to the database),\n\t * so the autosave plugin will wait for that action before removing it from pending actions.\n\t */\n\tsave( editor: Editor ): Promise<unknown>;\n}\n\n/**\n * The configuration of the {@link module:autosave/autosave~Autosave autosave feature}.\n *\n * ```ts\n * ClassicEditor\n * \t.create( editorElement, {\n * \t\tautosave: {\n * \t\t\tsave( editor: Editor ) {\n * \t\t\t\t// The saveData() function must return a promise\n * \t\t\t\t// which should be resolved when the data is successfully saved.\n * \t\t\t\treturn saveData( editor.getData() );\n * \t\t\t}\n * \t\t}\n * \t} );\n * \t.then( ... )\n * \t.catch( ... );\n * ```\n *\n * See {@link module:core/editor/editorconfig~EditorConfig all editor configuration options}.\n *\n * See also the demo of the {@glink features/autosave autosave feature}.\n */\nexport interface AutosaveConfig {\n\n\t/**\n\t * The callback to be executed when the data needs to be saved.\n\t *\n\t * This function must return a promise which should be resolved when the data is successfully saved.\n\t *\n\t * ```ts\n\t * ClassicEditor\n\t * \t.create( editorElement, {\n\t * \t\tautosave: {\n\t * \t\t\tsave( editor: Editor ) {\n\t * \t\t\t\treturn saveData( editor.getData() );\n\t * \t\t\t}\n\t * \t\t}\n\t * \t} );\n\t * \t.then( ... )\n\t * \t.catch( ... );\n\t * ```\n\t */\n\tsave?: ( editor: Editor ) => Promise<unknown>;\n\n\t/**\n\t * The minimum amount of time that needs to pass after the last action to call the provided callback.\n\t * By default it is 1000 ms.\n\t *\n\t * ```ts\n\t * ClassicEditor\n\t * \t.create( editorElement, {\n\t * \t\tautosave: {\n\t * \t\t\tsave( editor: Editor ) {\n\t * \t\t\t\treturn saveData( editor.getData() );\n\t * \t\t\t},\n\t * \t\t\twaitingTime: 2000\n\t * \t\t}\n\t * \t} );\n\t * \t.then( ... )\n\t * \t.catch( ... );\n\t * ```\n\t */\n\twaitingTime?: number;\n}\n"]}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
/**
|
2
|
+
* @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
3
|
+
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
4
|
+
*/
|
5
|
+
import type { Autosave, AutosaveConfig } from './index.js';
|
6
|
+
declare module '@ckeditor/ckeditor5-core' {
|
7
|
+
interface PluginsMap {
|
8
|
+
[Autosave.pluginName]: Autosave;
|
9
|
+
}
|
10
|
+
interface EditorConfig {
|
11
|
+
/**
|
12
|
+
* The configuration of the {@link module:autosave/autosave~Autosave autosave feature}.
|
13
|
+
*
|
14
|
+
* Read more in {@link module:autosave/autosave~AutosaveConfig}.
|
15
|
+
*/
|
16
|
+
autosave?: AutosaveConfig;
|
17
|
+
}
|
18
|
+
}
|
@@ -0,0 +1,219 @@
|
|
1
|
+
/**
|
2
|
+
* @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
3
|
+
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
4
|
+
*/
|
5
|
+
/**
|
6
|
+
* @module autosave/autosave
|
7
|
+
*/
|
8
|
+
import { Plugin, PendingActions, type Editor } from 'ckeditor5/src/core.js';
|
9
|
+
/**
|
10
|
+
* The {@link module:autosave/autosave~Autosave} plugin allows you to automatically save the data (e.g. send it to the server)
|
11
|
+
* when needed (when the user changed the content).
|
12
|
+
*
|
13
|
+
* It listens to the {@link module:engine/model/document~Document#event:change:data `editor.model.document#change:data`}
|
14
|
+
* and `window#beforeunload` events and calls the
|
15
|
+
* {@link module:autosave/autosave~AutosaveAdapter#save `config.autosave.save()`} function.
|
16
|
+
*
|
17
|
+
* ```ts
|
18
|
+
* ClassicEditor
|
19
|
+
* .create( document.querySelector( '#editor' ), {
|
20
|
+
* plugins: [ ArticlePluginSet, Autosave ],
|
21
|
+
* toolbar: [ 'heading', '|', 'bold', 'italic', 'link', 'bulletedList', 'numberedList', 'blockQuote', 'undo', 'redo' ],
|
22
|
+
* image: {
|
23
|
+
* toolbar: [ 'imageStyle:block', 'imageStyle:side', '|', 'toggleImageCaption', 'imageTextAlternative' ],
|
24
|
+
* },
|
25
|
+
* autosave: {
|
26
|
+
* save( editor: Editor ) {
|
27
|
+
* // The saveData() function must return a promise
|
28
|
+
* // which should be resolved when the data is successfully saved.
|
29
|
+
* return saveData( editor.getData() );
|
30
|
+
* }
|
31
|
+
* }
|
32
|
+
* } );
|
33
|
+
* ```
|
34
|
+
*
|
35
|
+
* Read more about this feature in the {@glink features/autosave Autosave} feature guide.
|
36
|
+
*/
|
37
|
+
export default class Autosave extends Plugin {
|
38
|
+
/**
|
39
|
+
* The adapter is an object with a `save()` method. That method will be called whenever
|
40
|
+
* the data changes. It might be called some time after the change,
|
41
|
+
* since the event is throttled for performance reasons.
|
42
|
+
*/
|
43
|
+
adapter?: AutosaveAdapter;
|
44
|
+
/**
|
45
|
+
* The state of this plugin.
|
46
|
+
*
|
47
|
+
* The plugin can be in the following states:
|
48
|
+
*
|
49
|
+
* * synchronized – When all changes are saved.
|
50
|
+
* * waiting – When the plugin is waiting for other changes before calling `adapter#save()` and `config.autosave.save()`.
|
51
|
+
* * saving – When the provided save method is called and the plugin waits for the response.
|
52
|
+
* * error &ndash When the provided save method will throw an error. This state immediately changes to the `saving` state and
|
53
|
+
* the save method will be called again in the short period of time.
|
54
|
+
*
|
55
|
+
* @observable
|
56
|
+
* @readonly
|
57
|
+
*/
|
58
|
+
state: 'synchronized' | 'waiting' | 'saving' | 'error';
|
59
|
+
/**
|
60
|
+
* Debounced save method. The `save()` method is called the specified `waitingTime` after `debouncedSave()` is called,
|
61
|
+
* unless a new action happens in the meantime.
|
62
|
+
*/
|
63
|
+
private _debouncedSave;
|
64
|
+
/**
|
65
|
+
* The last saved document version.
|
66
|
+
*/
|
67
|
+
private _lastDocumentVersion;
|
68
|
+
/**
|
69
|
+
* Promise used for asynchronous save calls.
|
70
|
+
*
|
71
|
+
* Created to handle the autosave call to an external data source. It resolves when that call is finished. It is re-used if
|
72
|
+
* save is called before the promise has been resolved. It is set to `null` if there is no call in progress.
|
73
|
+
*/
|
74
|
+
private _savePromise;
|
75
|
+
/**
|
76
|
+
* DOM emitter.
|
77
|
+
*/
|
78
|
+
private _domEmitter;
|
79
|
+
/**
|
80
|
+
* The configuration of this plugins.
|
81
|
+
*/
|
82
|
+
private _config;
|
83
|
+
/**
|
84
|
+
* Editor's pending actions manager.
|
85
|
+
*/
|
86
|
+
private _pendingActions;
|
87
|
+
/**
|
88
|
+
* Informs whether there should be another autosave callback performed, immediately after current autosave callback finishes.
|
89
|
+
*
|
90
|
+
* This is set to `true` when there is a save request while autosave callback is already being processed
|
91
|
+
* and the model has changed since the last save.
|
92
|
+
*/
|
93
|
+
private _makeImmediateSave;
|
94
|
+
/**
|
95
|
+
* An action that will be added to the pending action manager for actions happening in that plugin.
|
96
|
+
*/
|
97
|
+
private _action;
|
98
|
+
/**
|
99
|
+
* @inheritDoc
|
100
|
+
*/
|
101
|
+
static get pluginName(): "Autosave";
|
102
|
+
/**
|
103
|
+
* @inheritDoc
|
104
|
+
*/
|
105
|
+
static get requires(): readonly [typeof PendingActions];
|
106
|
+
/**
|
107
|
+
* @inheritDoc
|
108
|
+
*/
|
109
|
+
constructor(editor: Editor);
|
110
|
+
/**
|
111
|
+
* @inheritDoc
|
112
|
+
*/
|
113
|
+
init(): void;
|
114
|
+
/**
|
115
|
+
* @inheritDoc
|
116
|
+
*/
|
117
|
+
destroy(): void;
|
118
|
+
/**
|
119
|
+
* Immediately calls autosave callback. All previously queued (debounced) callbacks are cleared. If there is already an autosave
|
120
|
+
* callback in progress, then the requested save will be performed immediately after the current callback finishes.
|
121
|
+
*
|
122
|
+
* @returns A promise that will be resolved when the autosave callback is finished.
|
123
|
+
*/
|
124
|
+
save(): Promise<void>;
|
125
|
+
/**
|
126
|
+
* Invokes the remaining `_save()` method call.
|
127
|
+
*/
|
128
|
+
private _flush;
|
129
|
+
/**
|
130
|
+
* If the adapter is set and a new document version exists,
|
131
|
+
* the `_save()` method creates a pending action and calls the `adapter.save()` method.
|
132
|
+
* It waits for the result and then removes the created pending action.
|
133
|
+
*
|
134
|
+
* @returns A promise that will be resolved when the autosave callback is finished.
|
135
|
+
*/
|
136
|
+
private _save;
|
137
|
+
/**
|
138
|
+
* Creates a pending action if it is not set already.
|
139
|
+
*/
|
140
|
+
private _setPendingAction;
|
141
|
+
/**
|
142
|
+
* Saves callbacks.
|
143
|
+
*/
|
144
|
+
private get _saveCallbacks();
|
145
|
+
}
|
146
|
+
/**
|
147
|
+
* An interface that requires the `save()` method.
|
148
|
+
*
|
149
|
+
* Used by {@link module:autosave/autosave~Autosave#adapter}.
|
150
|
+
*/
|
151
|
+
export interface AutosaveAdapter {
|
152
|
+
/**
|
153
|
+
* The method that will be called when the data changes. It should return a promise (e.g. in case of saving content to the database),
|
154
|
+
* so the autosave plugin will wait for that action before removing it from pending actions.
|
155
|
+
*/
|
156
|
+
save(editor: Editor): Promise<unknown>;
|
157
|
+
}
|
158
|
+
/**
|
159
|
+
* The configuration of the {@link module:autosave/autosave~Autosave autosave feature}.
|
160
|
+
*
|
161
|
+
* ```ts
|
162
|
+
* ClassicEditor
|
163
|
+
* .create( editorElement, {
|
164
|
+
* autosave: {
|
165
|
+
* save( editor: Editor ) {
|
166
|
+
* // The saveData() function must return a promise
|
167
|
+
* // which should be resolved when the data is successfully saved.
|
168
|
+
* return saveData( editor.getData() );
|
169
|
+
* }
|
170
|
+
* }
|
171
|
+
* } );
|
172
|
+
* .then( ... )
|
173
|
+
* .catch( ... );
|
174
|
+
* ```
|
175
|
+
*
|
176
|
+
* See {@link module:core/editor/editorconfig~EditorConfig all editor configuration options}.
|
177
|
+
*
|
178
|
+
* See also the demo of the {@glink features/autosave autosave feature}.
|
179
|
+
*/
|
180
|
+
export interface AutosaveConfig {
|
181
|
+
/**
|
182
|
+
* The callback to be executed when the data needs to be saved.
|
183
|
+
*
|
184
|
+
* This function must return a promise which should be resolved when the data is successfully saved.
|
185
|
+
*
|
186
|
+
* ```ts
|
187
|
+
* ClassicEditor
|
188
|
+
* .create( editorElement, {
|
189
|
+
* autosave: {
|
190
|
+
* save( editor: Editor ) {
|
191
|
+
* return saveData( editor.getData() );
|
192
|
+
* }
|
193
|
+
* }
|
194
|
+
* } );
|
195
|
+
* .then( ... )
|
196
|
+
* .catch( ... );
|
197
|
+
* ```
|
198
|
+
*/
|
199
|
+
save?: (editor: Editor) => Promise<unknown>;
|
200
|
+
/**
|
201
|
+
* The minimum amount of time that needs to pass after the last action to call the provided callback.
|
202
|
+
* By default it is 1000 ms.
|
203
|
+
*
|
204
|
+
* ```ts
|
205
|
+
* ClassicEditor
|
206
|
+
* .create( editorElement, {
|
207
|
+
* autosave: {
|
208
|
+
* save( editor: Editor ) {
|
209
|
+
* return saveData( editor.getData() );
|
210
|
+
* },
|
211
|
+
* waitingTime: 2000
|
212
|
+
* }
|
213
|
+
* } );
|
214
|
+
* .then( ... )
|
215
|
+
* .catch( ... );
|
216
|
+
* ```
|
217
|
+
*/
|
218
|
+
waitingTime?: number;
|
219
|
+
}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
/**
|
2
|
+
* @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
3
|
+
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
4
|
+
*/
|
5
|
+
/**
|
6
|
+
* @module autosave
|
7
|
+
*/
|
8
|
+
export { default as Autosave, type AutosaveConfig } from './autosave.js';
|
9
|
+
import './augmentation.js';
|
package/lang/translations/he.po
CHANGED
@@ -14,7 +14,7 @@ msgid ""
|
|
14
14
|
msgstr ""
|
15
15
|
"Language-Team: Hebrew (https://app.transifex.com/ckeditor/teams/11143/he/)\n"
|
16
16
|
"Language: he\n"
|
17
|
-
"Plural-Forms: nplurals=
|
17
|
+
"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n"
|
18
18
|
"Content-Type: text/plain; charset=UTF-8\n"
|
19
19
|
|
20
20
|
msgctxt "A message that the data is being saved."
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@ckeditor/ckeditor5-autosave",
|
3
|
-
"version": "41.
|
3
|
+
"version": "41.3.0-alpha.0",
|
4
4
|
"description": "Autosave feature for CKEditor 5.",
|
5
5
|
"keywords": [
|
6
6
|
"ckeditor",
|
@@ -13,7 +13,7 @@
|
|
13
13
|
"type": "module",
|
14
14
|
"main": "src/index.js",
|
15
15
|
"dependencies": {
|
16
|
-
"ckeditor5": "41.
|
16
|
+
"ckeditor5": "41.3.0-alpha.0",
|
17
17
|
"lodash-es": "4.17.21"
|
18
18
|
},
|
19
19
|
"author": "CKSource (http://cksource.com/)",
|
@@ -26,6 +26,7 @@
|
|
26
26
|
"directory": "packages/ckeditor5-autosave"
|
27
27
|
},
|
28
28
|
"files": [
|
29
|
+
"dist",
|
29
30
|
"lang",
|
30
31
|
"src/**/*.js",
|
31
32
|
"src/**/*.d.ts",
|