forked from projects/fipamo
229 lines
6.6 KiB
JavaScript
229 lines
6.6 KiB
JavaScript
|
//TOOLS
|
||
|
import FipamoAdminAPI, {
|
||
|
TASK_PAGE_CREATE,
|
||
|
TASK_PAGE_EDIT,
|
||
|
TASK_PAGE_DELETE
|
||
|
} from '../../libraries/FipamoAdminAPI.js';
|
||
|
import Maintenance from './MaintenanceManager.js';
|
||
|
import * as DataEvent from '../events/DataEvent.js';
|
||
|
import PageActions from '../actions/PageActions.js';
|
||
|
import * as EditorEvent from '../events/EditorEvent.js';
|
||
|
//import TinyDatePicker from 'tiny-date-picker'; TODO: Reactivate for scheduled publishing
|
||
|
import TextEditor from '../ui/TextEditor.js';
|
||
|
import Notfications from '../ui/Notifications.js';
|
||
|
import FileManager from '../ui/FileManager.js';
|
||
|
const notify = new Notfications();
|
||
|
export default class PostEditor {
|
||
|
//--------------------------
|
||
|
// constructor
|
||
|
//--------------------------
|
||
|
constructor() {
|
||
|
this.processing = false;
|
||
|
let self = 'this';
|
||
|
this.admin = new FipamoAdminAPI(null, document.getElementById('notify-progress'));
|
||
|
this.mm = new Maintenance(null, null);
|
||
|
this.urlPieces = document.URL.split('/');
|
||
|
this.post = [];
|
||
|
this.postID = null;
|
||
|
this.postUUID = null;
|
||
|
this.postLayout = null;
|
||
|
this.fm = null;
|
||
|
if (document.querySelector('[role="file-manager"]').getAttribute('data-index')) {
|
||
|
this.postID = document
|
||
|
.querySelector('[role="file-manager"]')
|
||
|
.getAttribute('data-index');
|
||
|
this.postUUID = document
|
||
|
.querySelector('[role="file-manager"]')
|
||
|
.getAttribute('data-uuid');
|
||
|
this.postLayout = document
|
||
|
.querySelector('[role="file-manager"]')
|
||
|
.getAttribute('data-layout');
|
||
|
}
|
||
|
if (document.getElementById('edit')) {
|
||
|
this.editor = new TextEditor(
|
||
|
document.getElementById('edit'),
|
||
|
document.querySelector('[role="file-manager"]').offsetHeight +
|
||
|
document.querySelector('[role="page-meta"]').offsetHeight +
|
||
|
document.querySelector('[role="text-editor"]').offsetHeight
|
||
|
);
|
||
|
this.editor.addListener(
|
||
|
EditorEvent.EDITOR_DELETE,
|
||
|
() => this.handleEditorOptions(EditorEvent.EDITOR_DELETE),
|
||
|
false
|
||
|
);
|
||
|
this.editor.addListener(
|
||
|
EditorEvent.EDITOR_UPLOAD_POST_IMAGE,
|
||
|
() => this.handleEditorOptions(EditorEvent.EDITOR_UPLOAD_POST_IMAGE),
|
||
|
false
|
||
|
);
|
||
|
this.editor.addListener(
|
||
|
EditorEvent.EDITOR_UPDATE,
|
||
|
() => this.handleEditorOptions(EditorEvent.EDITOR_UPDATE),
|
||
|
false
|
||
|
);
|
||
|
this.editor.addListener(
|
||
|
EditorEvent.EDITOR_SAVE,
|
||
|
() => this.handleEditorOptions(EditorEvent.EDITOR_SAVE),
|
||
|
false
|
||
|
);
|
||
|
document.getElementById('post-image-upload').addEventListener(
|
||
|
'change',
|
||
|
e => {
|
||
|
this.handleImageUpload(e.target.id, e.target.files);
|
||
|
},
|
||
|
false
|
||
|
);
|
||
|
/*
|
||
|
TinyDatePicker(document.getElementById('post-date'), {
|
||
|
mode: 'dp-below',
|
||
|
format() {
|
||
|
//return self.dateUtils.getDate('origin', date);
|
||
|
}
|
||
|
});
|
||
|
*/
|
||
|
|
||
|
this.start();
|
||
|
}
|
||
|
}
|
||
|
//--------------------------
|
||
|
// methods
|
||
|
//--------------------------
|
||
|
start() {
|
||
|
if (document.querySelector('[role="file-drop"]')) {
|
||
|
//insert fileManager here
|
||
|
this.fm = new FileManager(
|
||
|
document.querySelector('[role="file-drop"]'),
|
||
|
document.getElementById('page-files-upload'),
|
||
|
document.querySelector('[role="page-images-list"]'),
|
||
|
document.querySelector('[role="page-files-list"]')
|
||
|
);
|
||
|
var optionButtons = document.querySelectorAll('.post-option-btn');
|
||
|
for (var i = 0, length = optionButtons.length; i < length; i++) {
|
||
|
optionButtons[i].addEventListener(
|
||
|
'click',
|
||
|
e => this.handlePostOptions(e),
|
||
|
false
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
//--------------------------
|
||
|
// event handlers
|
||
|
//--------------------------
|
||
|
handlePostOptions(e) {
|
||
|
let currentOption = null;
|
||
|
switch (e.target.id) {
|
||
|
case 'option-page-icon':
|
||
|
case 'option-menu-pin':
|
||
|
currentOption = document.getElementById('option-menu-pin');
|
||
|
break;
|
||
|
case 'option-feature-icon':
|
||
|
case 'option-feature':
|
||
|
currentOption = document.getElementById('option-feature');
|
||
|
break;
|
||
|
case 'option-published-icon':
|
||
|
case 'option-published':
|
||
|
currentOption = document.getElementById('option-published');
|
||
|
break;
|
||
|
}
|
||
|
if (currentOption != null) {
|
||
|
let active = currentOption.getAttribute('data-active');
|
||
|
active == 'false'
|
||
|
? currentOption.setAttribute('data-active', 'true')
|
||
|
: currentOption.setAttribute('data-active', 'false');
|
||
|
}
|
||
|
}
|
||
|
handleEditorOptions(e) {
|
||
|
if (this.processing) return;
|
||
|
let self = this;
|
||
|
switch (e) {
|
||
|
case EditorEvent.EDITOR_SAVE:
|
||
|
case EditorEvent.EDITOR_UPDATE:
|
||
|
var task = '';
|
||
|
e === EditorEvent.EDITOR_SAVE
|
||
|
? (task = TASK_PAGE_CREATE)
|
||
|
: (task = TASK_PAGE_EDIT);
|
||
|
new PageActions().collectInfo(this.fm.getFileOrder()).then(page => {
|
||
|
self.processing = true;
|
||
|
notify.alert('Writing down changes', null);
|
||
|
self.admin
|
||
|
.pageActions(task, page)
|
||
|
.then(r => {
|
||
|
self.processing = false;
|
||
|
if (
|
||
|
r.type === DataEvent.PAGE_ERROR ||
|
||
|
r.type === DataEvent.API_REQUEST_LAME
|
||
|
) {
|
||
|
notify.alert(r.message, false);
|
||
|
} else {
|
||
|
if (r.type === DataEvent.PAGE_UPDATED) {
|
||
|
notify.alert(r.message, true);
|
||
|
} else {
|
||
|
notify.alert(r.message, true);
|
||
|
window.location = '/dashboard/page/edit/' + r.id;
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
.catch(err => {
|
||
|
self.processing = false;
|
||
|
notify.alert(err, false);
|
||
|
});
|
||
|
});
|
||
|
break;
|
||
|
case EditorEvent.EDITOR_DELETE:
|
||
|
if (this.postLayout === 'index') {
|
||
|
notify.alert('Index cannot be deleted', false);
|
||
|
return;
|
||
|
}
|
||
|
if (confirm("AYE! You know you're deleting this post, right?")) {
|
||
|
new PageActions()
|
||
|
.collectInfo(this.fm.getFileOrder())
|
||
|
.then(page => {
|
||
|
self.processing = true;
|
||
|
this.admin
|
||
|
.pageActions(TASK_PAGE_DELETE, page)
|
||
|
.then(() => {
|
||
|
self.processing = false;
|
||
|
window.location = '/dashboard/pages';
|
||
|
})
|
||
|
.catch(err => {
|
||
|
self.processing = false;
|
||
|
notify.alert(err, false);
|
||
|
});
|
||
|
})
|
||
|
.catch(() => {});
|
||
|
} else {
|
||
|
// Do nothing!
|
||
|
}
|
||
|
break;
|
||
|
case EditorEvent.EDITOR_UPLOAD_POST_IMAGE:
|
||
|
document.getElementById('post-image-upload').click();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
handleImageUpload(type, files) {
|
||
|
let self = this;
|
||
|
notify.alert('Uploading Image', null);
|
||
|
let upload = new FormData();
|
||
|
upload.enctype = 'multipart/form-data';
|
||
|
upload.append('upload_files[]', files[0], files[0].name);
|
||
|
this.mm
|
||
|
.filesUpload(files[0].type, upload)
|
||
|
.then(result => {
|
||
|
if (result.message == 'File Uploaded. Great!') {
|
||
|
self.editor.notify(
|
||
|
EditorEvent.EDITOR_UPLOAD_POST_IMAGE,
|
||
|
result.filePath
|
||
|
);
|
||
|
notify.alert('Image Added to Entry', true);
|
||
|
} else {
|
||
|
notify.alert('Uh oh. Image not added', false);
|
||
|
}
|
||
|
})
|
||
|
.catch(() => {
|
||
|
notify.alert('Uh oh. Image not added', false);
|
||
|
});
|
||
|
}
|
||
|
}
|