1 import * as Dates from "../services/dates";
3 let autoSaveFrequency = 30;
6 let draftErroring = false;
17 this.draftsEnabled = elem.getAttribute('drafts-enabled') === 'true';
18 this.editorType = elem.getAttribute('editor-type');
19 this.pageId= Number(elem.getAttribute('page-id'));
20 this.isNewDraft = Number(elem.getAttribute('page-new-draft')) === 1;
21 this.isUpdateDraft = Number(elem.getAttribute('page-update-draft')) === 1;
23 if (this.pageId !== 0 && this.draftsEnabled) {
24 window.setTimeout(() => {
29 if (this.isUpdateDraft || this.isNewDraft) {
30 this.draftText = trans('entities.pages_editing_draft');
32 this.draftText = trans('entities.pages_editing_page');
35 // Listen to save events from editor
36 window.$events.listen('editor-save-draft', this.saveDraft);
37 window.$events.listen('editor-save-page', this.savePage);
39 // Listen to content changes from the editor
40 window.$events.listen('editor-html-change', html => {
41 this.editorHTML = html;
43 window.$events.listen('editor-markdown-change', markdown => {
44 this.editorMarkdown = markdown;
50 editorType: 'wysiwyg',
66 currentContent.title = document.getElementById('name').value.trim();
67 currentContent.html = this.editorHTML;
69 autoSave = window.setInterval(() => {
70 // Return if manually saved recently to prevent bombarding the server
71 if (Date.now() - lastSave < (1000 * autoSaveFrequency)/2) return;
72 let newTitle = document.getElementById('name').value.trim();
73 let newHtml = this.editorHTML;
75 if (newTitle !== currentContent.title || newHtml !== currentContent.html) {
76 currentContent.html = newHtml;
77 currentContent.title = newTitle;
81 }, 1000 * autoSaveFrequency);
85 if (!this.draftsEnabled) return;
88 name: document.getElementById('name').value.trim(),
92 if (this.editorType === 'markdown') data.markdown = this.editorMarkdown;
94 let url = window.baseUrl(`/ajax/page/${this.pageId}/save-draft`);
95 window.$http.put(url, data).then(response => {
96 draftErroring = false;
97 if (!this.isNewDraft) this.isUpdateDraft = true;
98 this.draftNotifyChange(`${response.data.message } ${Dates.utcTimeStampToLocalTime(response.data.timestamp)}`);
99 lastSave = Date.now();
101 if (draftErroring) return;
102 window.$events.emit('error', trans('errors.page_draft_autosave_fail'));
103 draftErroring = true;
108 this.$el.closest('form').submit();
111 draftNotifyChange(text) {
112 this.draftText = text;
113 this.draftUpdated = true;
114 window.setTimeout(() => {
115 this.draftUpdated = false;
120 let url = window.baseUrl(`/ajax/page/${this.pageId}`);
121 window.$http.get(url).then(response => {
122 if (autoSave) window.clearInterval(autoSave);
124 this.draftText = trans('entities.pages_editing_page');
125 this.isUpdateDraft = false;
126 window.$events.emit('editor-html-update', response.data.html);
127 window.$events.emit('editor-markdown-update', response.data.markdown || response.data.html);
129 document.getElementById('name').value = response.data.name;
130 window.setTimeout(() => {
131 this.startAutoSave();
133 window.$events.emit('success', trans('entities.pages_draft_discarded'));
140 changeSummaryShort() {
141 let len = this.changeSummary.length;
142 if (len === 0) return trans('entities.pages_edit_set_changelog');
143 if (len <= 16) return this.changeSummary;
144 return this.changeSummary.slice(0, 16) + '...';
149 mounted, data, methods, computed,