2017-03-03 20:17:49 +00:00
|
|
|
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
|
|
|
|
//
|
|
|
|
// This software (Documize Community Edition) is licensed under
|
|
|
|
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
|
|
|
|
//
|
|
|
|
// You can operate outside the AGPL restrictions by purchasing
|
|
|
|
// Documize Enterprise Edition and obtaining a commercial license
|
|
|
|
// by contacting <sales@documize.com>.
|
|
|
|
//
|
|
|
|
// https://documize.com
|
|
|
|
|
2017-11-16 13:28:05 +00:00
|
|
|
import { Promise as EmberPromise } from 'rsvp';
|
|
|
|
import { inject as service } from '@ember/service';
|
2018-05-29 18:26:04 +01:00
|
|
|
import Notifier from '../../../mixins/notifier';
|
2017-11-16 13:28:05 +00:00
|
|
|
import Controller from '@ember/controller';
|
2017-03-03 20:17:49 +00:00
|
|
|
|
2018-12-06 14:10:00 +00:00
|
|
|
export default Controller.extend(Notifier, {
|
2017-11-16 13:28:05 +00:00
|
|
|
documentService: service('document'),
|
|
|
|
templateService: service('template'),
|
|
|
|
sectionService: service('section'),
|
|
|
|
linkService: service('link'),
|
2018-10-23 13:47:00 +01:00
|
|
|
router: service(),
|
2018-12-18 19:03:34 +00:00
|
|
|
sidebarTab: 'toc',
|
2018-10-23 13:47:00 +01:00
|
|
|
queryParams: ['currentPageId', 'source'],
|
2017-03-03 20:17:49 +00:00
|
|
|
|
|
|
|
actions: {
|
2018-12-18 19:03:34 +00:00
|
|
|
onSidebarChange(tab) {
|
|
|
|
this.set('sidebarTab', tab);
|
|
|
|
},
|
|
|
|
|
2018-01-22 10:31:03 +00:00
|
|
|
onShowPage(pageId) {
|
2018-05-29 18:26:04 +01:00
|
|
|
this.get('browser').scrollTo(`#page-${pageId}`);
|
2018-01-22 10:31:03 +00:00
|
|
|
},
|
|
|
|
|
2017-03-03 20:17:49 +00:00
|
|
|
onSaveDocument(doc) {
|
2018-05-29 18:26:04 +01:00
|
|
|
this.get('documentService').save(doc).then(() => {
|
2018-12-05 13:44:10 +00:00
|
|
|
this.notifySuccess('Saved');
|
2018-05-29 18:26:04 +01:00
|
|
|
});
|
2017-12-04 14:47:44 +00:00
|
|
|
this.get('browser').setTitle(doc.get('name'));
|
|
|
|
this.get('browser').setMetaDescription(doc.get('excerpt'));
|
2017-03-03 20:17:49 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
onCopyPage(pageId, targetDocumentId) {
|
2017-12-14 16:48:12 +00:00
|
|
|
let documentId = this.get('document.id');
|
2017-03-03 20:17:49 +00:00
|
|
|
this.get('documentService').copyPage(documentId, pageId, targetDocumentId).then(() => {
|
|
|
|
|
|
|
|
// refresh data if copied to same document
|
|
|
|
if (documentId === targetDocumentId) {
|
2017-03-09 17:18:50 +00:00
|
|
|
this.set('pageId', '');
|
2017-08-08 11:24:21 +01:00
|
|
|
this.get('target._routerMicrolib').refresh();
|
2017-05-10 08:13:53 +01:00
|
|
|
|
2017-12-14 16:48:12 +00:00
|
|
|
this.get('linkService').getDocumentLinks(this.get('document.id')).then((links) => {
|
|
|
|
this.set('links', links);
|
2017-05-10 08:13:53 +01:00
|
|
|
});
|
2017-03-03 20:17:49 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
onMovePage(pageId, targetDocumentId) {
|
2017-12-14 16:48:12 +00:00
|
|
|
let documentId = this.get('document.id');
|
2017-03-03 20:17:49 +00:00
|
|
|
|
|
|
|
this.get('documentService').copyPage(documentId, pageId, targetDocumentId).then(() => {
|
|
|
|
this.send('onPageDeleted', { id: pageId, children: false });
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
onSavePage(page, meta) {
|
2018-01-22 10:31:03 +00:00
|
|
|
let document = this.get('document');
|
|
|
|
let documentId = document.get('id');
|
|
|
|
let constants = this.get('constants');
|
|
|
|
|
2018-11-21 11:53:12 +00:00
|
|
|
// Cannot change locked documents.
|
2018-11-16 19:18:10 +00:00
|
|
|
if (document.get('protection') === constants.ProtectionType.Lock) {
|
2018-11-21 11:53:12 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Detect stale data situation and reload page.
|
|
|
|
// Happens when you are saving section edits that
|
|
|
|
// has just been approved.
|
|
|
|
// TODO: really need a better way than this
|
|
|
|
if (page.get('id') === page.get('relativeId')) {
|
|
|
|
window.location.reload();
|
2018-01-22 10:31:03 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Go ahead and save edits as normal
|
2017-03-03 20:17:49 +00:00
|
|
|
let model = {
|
|
|
|
page: page.toJSON({ includeId: true }),
|
|
|
|
meta: meta.toJSON({ includeId: true })
|
|
|
|
};
|
|
|
|
|
2018-01-22 10:31:03 +00:00
|
|
|
this.get('documentService').updatePage(documentId, page.get('id'), model).then((/*up*/) => {
|
2018-12-05 13:44:10 +00:00
|
|
|
this.notifySuccess('Saved');
|
2018-05-29 18:26:04 +01:00
|
|
|
|
2018-01-22 10:31:03 +00:00
|
|
|
this.get('documentService').fetchPages(documentId, this.get('session.user.id')).then((pages) => {
|
2017-12-18 09:54:09 +00:00
|
|
|
this.set('pages', pages);
|
2018-01-22 10:31:03 +00:00
|
|
|
this.get('linkService').getDocumentLinks(documentId).then((links) => {
|
2017-12-18 09:54:09 +00:00
|
|
|
this.set('links', links);
|
|
|
|
});
|
2017-05-10 08:13:53 +01:00
|
|
|
});
|
2017-03-03 20:17:49 +00:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
onPageDeleted(deletePage) {
|
2017-12-14 16:48:12 +00:00
|
|
|
let documentId = this.get('document.id');
|
2017-03-03 20:17:49 +00:00
|
|
|
let deleteId = deletePage.id;
|
|
|
|
let deleteChildren = deletePage.children;
|
|
|
|
let pendingChanges = [];
|
2018-05-29 18:26:04 +01:00
|
|
|
|
2018-01-22 10:31:03 +00:00
|
|
|
let pages = this.get('pages');
|
|
|
|
let pageIndex = _.findIndex(pages, function(i) { return i.get('page.id') === deleteId; });
|
|
|
|
let item = pages[pageIndex];
|
2017-03-03 20:17:49 +00:00
|
|
|
|
|
|
|
// select affected pages
|
|
|
|
for (var i = pageIndex + 1; i < pages.get('length'); i++) {
|
2018-01-22 10:31:03 +00:00
|
|
|
if (i === pageIndex + 1 && pages[i].get('page.level') === item.get('page.level')) break;
|
|
|
|
if (pages[i].get('page.level') <= item.get('page.level')) break;
|
2017-03-03 20:17:49 +00:00
|
|
|
|
2018-01-22 10:31:03 +00:00
|
|
|
pendingChanges.push({ pageId: pages[i].get('page.id'), level: pages[i].get('page.level') - 1 });
|
2017-03-03 20:17:49 +00:00
|
|
|
}
|
|
|
|
|
2018-01-25 13:20:22 +00:00
|
|
|
this.set('currentPageId', null);
|
|
|
|
|
2017-03-03 20:17:49 +00:00
|
|
|
if (deleteChildren) {
|
2018-01-22 10:31:03 +00:00
|
|
|
pendingChanges.push({ pageId: deleteId });
|
2017-03-03 20:17:49 +00:00
|
|
|
|
|
|
|
this.get('documentService').deletePages(documentId, deleteId, pendingChanges).then(() => {
|
2018-01-22 10:31:03 +00:00
|
|
|
this.get('documentService').fetchPages(this.get('document.id'), this.get('session.user.id')).then((pages) => {
|
2018-05-29 18:26:04 +01:00
|
|
|
this.set('pages', pages);
|
2018-01-22 10:31:03 +00:00
|
|
|
});
|
2017-03-03 20:17:49 +00:00
|
|
|
});
|
|
|
|
} else {
|
|
|
|
this.get('documentService').deletePage(documentId, deleteId).then(() => {
|
2018-01-22 10:31:03 +00:00
|
|
|
this.get('documentService').fetchPages(this.get('document.id'), this.get('session.user.id')).then((pages) => {
|
|
|
|
this.set('pages', pages);
|
|
|
|
});
|
2017-03-03 20:17:49 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
onInsertSection(data) {
|
2017-11-16 13:28:05 +00:00
|
|
|
return new EmberPromise((resolve) => {
|
2017-12-14 16:48:12 +00:00
|
|
|
this.get('documentService').addPage(this.get('document.id'), data).then((newPage) => {
|
2017-03-03 20:17:49 +00:00
|
|
|
let data = this.get('store').normalize('page', newPage);
|
|
|
|
this.get('store').push(data);
|
2018-12-05 13:44:10 +00:00
|
|
|
this.notifySuccess('Inserted');
|
2017-03-03 20:17:49 +00:00
|
|
|
|
2018-01-22 10:31:03 +00:00
|
|
|
this.get('documentService').fetchPages(this.get('document.id'), this.get('session.user.id')).then((pages) => {
|
2017-12-14 16:48:12 +00:00
|
|
|
this.set('pages', pages);
|
2018-01-22 10:31:03 +00:00
|
|
|
this.eventBus.publish('documentPageAdded', newPage.id);
|
2017-03-04 19:20:01 +00:00
|
|
|
|
2017-03-04 21:07:39 +00:00
|
|
|
if (newPage.pageType === 'tab') {
|
2017-03-04 19:20:01 +00:00
|
|
|
this.transitionToRoute('document.section',
|
2017-12-14 16:48:12 +00:00
|
|
|
this.get('folder.id'),
|
|
|
|
this.get('folder.slug'),
|
|
|
|
this.get('document.id'),
|
|
|
|
this.get('document.slug'),
|
2017-03-04 19:20:01 +00:00
|
|
|
newPage.id);
|
2017-03-04 21:07:39 +00:00
|
|
|
} else {
|
2018-01-25 13:20:22 +00:00
|
|
|
this.set('currentPageId', newPage.id);
|
|
|
|
resolve(newPage.id);
|
2017-03-04 19:20:01 +00:00
|
|
|
}
|
2017-03-03 20:17:49 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2017-03-04 21:07:39 +00:00
|
|
|
onSavePageAsBlock(block) {
|
2017-11-16 13:28:05 +00:00
|
|
|
return new EmberPromise((resolve) => {
|
2017-03-04 21:07:39 +00:00
|
|
|
this.get('sectionService').addBlock(block).then(() => {
|
|
|
|
resolve();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2017-03-07 14:39:06 +00:00
|
|
|
onDocumentDelete() {
|
2017-12-14 16:48:12 +00:00
|
|
|
this.get('documentService').deleteDocument(this.get('document.id')).then(() => {
|
|
|
|
this.transitionToRoute('folder', this.get('folder.id'), this.get('folder.slug'));
|
2017-03-07 14:39:06 +00:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
onSaveTemplate(name, desc) {
|
2018-05-29 18:26:04 +01:00
|
|
|
this.get('templateService').saveAsTemplate(this.get('document.id'), name, desc).then(function () {
|
2018-12-05 13:44:10 +00:00
|
|
|
this.notifySuccess('Template saved');
|
2018-05-29 18:26:04 +01:00
|
|
|
});
|
2017-03-07 14:39:06 +00:00
|
|
|
},
|
|
|
|
|
2018-01-22 10:31:03 +00:00
|
|
|
onPageSequenceChange(currentPageId, changes) {
|
|
|
|
this.set('currentPageId', currentPageId);
|
2018-06-01 11:49:09 +01:00
|
|
|
|
2017-12-14 16:48:12 +00:00
|
|
|
this.get('documentService').changePageSequence(this.get('document.id'), changes).then(() => {
|
2018-01-22 10:31:03 +00:00
|
|
|
this.get('documentService').fetchPages(this.get('document.id'), this.get('session.user.id')).then( (pages) => {
|
2018-05-29 18:26:04 +01:00
|
|
|
this.set('pages', pages);
|
2017-03-03 20:17:49 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2018-01-22 10:31:03 +00:00
|
|
|
onPageLevelChange(currentPageId, changes) {
|
|
|
|
this.set('currentPageId', currentPageId);
|
2018-06-01 11:49:09 +01:00
|
|
|
|
2017-12-14 16:48:12 +00:00
|
|
|
this.get('documentService').changePageLevel(this.get('document.id'), changes).then(() => {
|
2018-01-22 10:31:03 +00:00
|
|
|
this.get('documentService').fetchPages(this.get('document.id'), this.get('session.user.id')).then( (pages) => {
|
2018-05-29 18:26:04 +01:00
|
|
|
this.set('pages', pages);
|
2017-03-03 20:17:49 +00:00
|
|
|
});
|
|
|
|
});
|
2017-03-07 16:10:13 +00:00
|
|
|
},
|
|
|
|
|
2017-09-21 15:48:00 +01:00
|
|
|
onTagChange(tags) {
|
2017-12-14 16:48:12 +00:00
|
|
|
let doc = this.get('document');
|
2017-09-21 15:48:00 +01:00
|
|
|
doc.set('tags', tags);
|
2018-05-29 18:26:04 +01:00
|
|
|
this.get('documentService').save(doc).then(()=> {
|
2018-12-05 13:44:10 +00:00
|
|
|
this.notifySuccess('Saved');
|
2018-05-29 18:26:04 +01:00
|
|
|
});
|
2017-12-11 13:45:56 +00:00
|
|
|
},
|
2018-01-22 10:31:03 +00:00
|
|
|
|
2018-10-23 13:47:00 +01:00
|
|
|
onEditMeta() {
|
|
|
|
if (!this.get('permissions.documentEdit')) return;
|
|
|
|
|
|
|
|
this.get('router').transitionTo('document.settings', {queryParams: {tab: 'general'}});
|
|
|
|
},
|
|
|
|
|
2018-06-15 14:25:05 +01:00
|
|
|
refresh(reloadPage) {
|
2018-04-05 14:25:15 +01:00
|
|
|
return new EmberPromise((resolve) => {
|
2018-06-06 13:59:12 +01:00
|
|
|
this.get('documentService').fetchDocumentData(this.get('document.id')).then((data) => {
|
|
|
|
this.set('document', data.document);
|
|
|
|
this.set('folders', data.folders);
|
|
|
|
this.set('folder', data.folder);
|
|
|
|
this.set('permissions', data.permissions);
|
|
|
|
this.set('roles', data.roles);
|
|
|
|
this.set('links', data.links);
|
|
|
|
this.set('versions', data.versions);
|
|
|
|
|
|
|
|
this.get('documentService').fetchPages(this.get('document.id'), this.get('session.user.id')).then((data) => {
|
|
|
|
this.set('pages', data);
|
|
|
|
|
|
|
|
this.get('sectionService').getSpaceBlocks(this.get('folder.id')).then((data) => {
|
|
|
|
this.set('blocks', data);
|
|
|
|
});
|
|
|
|
|
2018-06-15 14:25:05 +01:00
|
|
|
if (reloadPage) {
|
|
|
|
window.location.reload();
|
|
|
|
} else {
|
2018-06-06 13:59:12 +01:00
|
|
|
resolve();
|
2018-06-15 14:25:05 +01:00
|
|
|
}
|
2018-06-06 13:59:12 +01:00
|
|
|
});
|
2018-04-05 14:25:15 +01:00
|
|
|
});
|
2018-01-22 10:31:03 +00:00
|
|
|
});
|
2018-06-06 13:59:12 +01:00
|
|
|
}
|
2017-03-03 20:17:49 +00:00
|
|
|
}
|
|
|
|
});
|