//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); }); } }