forked from projects/fipamo
ro
1e37580869
dropped in js from the old site to begin the process of wiring up the API, but this time around, scripts will be served directly in browswer rather than being transpiled through NPM/Babel, eliminating the need for NPM. also scripting will new modularized and served specifically for the requirements of the page loading it. no more front loading everything. only script that is needed for that page will be retrieved. if no scripting is needed, none will be loaded. The only casualty so far has been syntax highlighting due to prismjs still being a common js module, but either this will be replaced with another library or a custom syntax enginge will be created at a later date
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);
|
|
});
|
|
}
|
|
}
|