diff --git a/app/.jshintrc b/app/.jshintrc index 1558042f..f882703e 100644 --- a/app/.jshintrc +++ b/app/.jshintrc @@ -19,7 +19,8 @@ "Dropzone", "Sortable", "datetimepicker", - "Waypoint" + "Waypoint", + "velocity" ], "browser": true, "boss": true, diff --git a/app/app/components/document/document-page.js b/app/app/components/document/document-page.js index 589308f8..88729821 100644 --- a/app/app/components/document/document-page.js +++ b/app/app/components/document/document-page.js @@ -18,9 +18,17 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { sectionService: Ember.inject.service('section'), editMode: false, + didReceiveAttrs() { + let toEdit = this.get('toEdit'); + + if (toEdit === this.get('page.id')) { + this.send('onEdit'); + } + }, + actions: { - onAddBlock(block) { - this.attrs.onAddBlock(block); + onSavePageAsBlock(block) { + this.attrs.onSavePageAsBlock(block); }, onCopyPage(documentId) { diff --git a/app/app/components/document/document-view.js b/app/app/components/document/document-view.js index 17c7e058..e62c8606 100644 --- a/app/app/components/document/document-view.js +++ b/app/app/components/document/document-view.js @@ -13,12 +13,22 @@ import Ember from 'ember'; import NotifierMixin from '../../mixins/notifier'; import TooltipMixin from '../../mixins/tooltip'; +const { + computed, +} = Ember; + export default Ember.Component.extend(NotifierMixin, TooltipMixin, { documentService: Ember.inject.service('document'), sectionService: Ember.inject.service('section'), appMeta: Ember.inject.service(), link: Ember.inject.service(), + newSectionName: '', + newSectionNameMissing: computed.empty('newSectionName'), + newSectionLocation: '', + beforePage: '', + toEdit: '', + didReceiveAttrs() { this.get('sectionService').getSpaceBlocks(this.get('folder.id')).then((blocks) => { this.set('blocks', blocks); @@ -87,9 +97,36 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { }); }, + addSection(model) { + // calculate sequence of page (position in document) + let sequence = 0; + let beforePage = this.get('beforePage'); + + if (is.not.null(beforePage)) { + // get any page before the beforePage so we can insert this new section between them + let index = _.findIndex(this.get('pages'), function(p) { return p.get('id') === beforePage.get('id'); }); + let beforeBeforePage = this.get('pages')[index-1]; + + if (is.not.undefined(beforeBeforePage)) { + sequence = (beforePage.get('sequence') + beforeBeforePage.get('sequence')) / 2; + } else { + sequence = beforePage.get('sequence') / 2; + } + } + + model.page.sequence = sequence; + + this.send('onHideSectionWizard'); + + const promise = this.get('onInsertSection')(model); + promise.then((id) => { + this.set('toEdit', id); + }); + }, + actions: { - onAddBlock(block) { - this.attrs.onAddBlock(block); + onSavePageAsBlock(block) { + this.attrs.onSavePageAsBlock(block); }, onCopyPage(pageId, documentId) { @@ -100,19 +137,7 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { this.attrs.onMovePage(pageId, documentId); }, - onDeletePage(id, deleteChildren) { - let page = this.get('pages').findBy("id", id); - - if (is.undefined(page)) { - return; - } - - let params = { - id: id, - title: page.get('title'), - children: deleteChildren - }; - + onDeletePage(params) { this.attrs.onDeletePage(params); }, @@ -120,39 +145,104 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { this.attrs.onSavePage(page, meta); }, - ///////////////// move to page-wizard ??????????!!!!!!!!!!!!!!!!!!! + // Section wizard related onShowSectionWizard(page) { - if ($("#new-section-wizard").is(':visible') && $("#new-section-wizard").attr('data-page-id') === page.id) { + let beforePage = this.get('beforePage'); + + if (is.not.null(beforePage) && $("#new-section-wizard").is(':visible') && beforePage.get('id') === page.id) { this.send('onHideSectionWizard'); return; } - $("#new-section-wizard").attr('data-page-id', page.id); + this.set('newSectionLocation', page.id); + this.set('beforePage', page); + $("#new-section-wizard").insertAfter(`#add-section-button-${page.id}`); - $("#new-section-wizard").fadeIn(100, 'linear', function() { - }); + $("#new-section-wizard").velocity("transition.slideDownIn", {duration: 300, complete: + function() { + $("#new-section-name").focus(); + }}); }, onHideSectionWizard() { - $("#new-section-wizard").fadeOut(100, 'linear', function() { - }); + this.set('newSectionLocation', ''); + this.set('beforePage', null); + $("#new-section-wizard").velocity("transition.slideUpOut", { duration: 300 }); }, - onCancel() { - this.attrs.onCancel(); + onInsertSection(section) { + let sectionName = this.get('newSectionName'); + if (is.empty(sectionName)) { + $("#new-section-name").focus(); + return; + } + + let page = { + documentId: this.get('document.id'), + title: sectionName, + level: 1, + sequence: 0, // calculated elsewhere + body: "", + contentType: section.get('contentType'), + pageType: section.get('pageType') + }; + + let meta = { + documentId: this.get('document.id'), + rawBody: "", + config: "" + }; + + let model = { + page: page, + meta: meta + }; + + this.audit.record("added-section-" + page.contentType); + + this.addSection(model); }, - addSection(section) { - this.attrs.onAddSection(section); + onInsertBlock(block) { + let sectionName = this.get('newSectionName'); + if (is.empty(sectionName)) { + $("#new-section-name").focus(); + return; + } + + let page = { + documentId: this.get('document.id'), + title: `${block.get('title')}`, + level: 1, + sequence: 0, // calculated elsewhere + body: block.get('body'), + contentType: block.get('contentType'), + pageType: block.get('pageType'), + blockId: block.get('id') + }; + + let meta = { + documentId: this.get('document.id'), + rawBody: block.get('rawBody'), + config: block.get('config'), + externalSource: block.get('externalSource') + }; + + let model = { + page: page, + meta: meta + }; + + this.audit.record("added-content-block-" + block.get('contentType')); + + this.addSection(model); }, + // to test onDeleteBlock(id) { this.attrs.onDeleteBlock(id); }, - onInsertBlock(block) { - this.attrs.onInsertBlock(block); - } } }); diff --git a/app/app/components/document/page-heading.js b/app/app/components/document/page-heading.js index 81396647..0eddb42e 100644 --- a/app/app/components/document/page-heading.js +++ b/app/app/components/document/page-heading.js @@ -100,7 +100,7 @@ export default Ember.Component.extend(TooltipMixin, { this.attrs.onDeletePage(this.get('deleteChildren')); }, - onAddBlock() { + onSavePageAsBlock() { let page = this.get('page'); let titleElem = '#' + this.get('blockTitleId'); let blockTitle = this.get('blockTitle'); @@ -130,7 +130,8 @@ export default Ember.Component.extend(TooltipMixin, { externalSource: pm.get('externalSource') }; - this.attrs.onAddBlock(block); + this.attrs.onSavePageAsBlock(block); + this.set('menuOpen', false); this.set('blockTitle', ''); this.set('blockExcerpt', ''); diff --git a/app/app/pods/document/controller.js b/app/app/pods/document/controller.js index e4a7ea02..407e0ad3 100644 --- a/app/app/pods/document/controller.js +++ b/app/app/pods/document/controller.js @@ -21,6 +21,8 @@ export default Ember.Controller.extend(NotifierMixin, { pages: [], toggled: false, + // to test + // to test // Jump to the right part of the document. scrollToPage(pageId) { Ember.run.schedule('afterRender', function () { @@ -45,7 +47,7 @@ export default Ember.Controller.extend(NotifierMixin, { }, actions: { - toggleMenu() { + toggleSidebar() { this.set('toggled', !this.get('toggled')); }, @@ -60,20 +62,6 @@ export default Ember.Controller.extend(NotifierMixin, { this.showNotification('Saved'); }, - gotoPage(pageId) { - if (is.null(pageId)) { - return; - } - - this.scrollToPage(pageId); - }, - - onAddBlock(block) { - this.get('sectionService').addBlock(block).then(() => { - this.showNotification("Published"); - }); - }, - onCopyPage(pageId, targetDocumentId) { let documentId = this.get('model.document.id'); this.get('documentService').copyPage(documentId, pageId, targetDocumentId).then(() => { @@ -168,6 +156,88 @@ export default Ember.Controller.extend(NotifierMixin, { this.send('onPageLevelChange', pendingChanges); }); } + }, + + onInsertSection(data) { + return new Ember.RSVP.Promise((resolve) => { + this.get('documentService').addPage(this.get('model.document.id'), data).then((newPage) => { + let data = this.get('store').normalize('page', newPage); + this.get('store').push(data); + + this.get('documentService').getPages(this.get('model.document.id')).then((pages) => { + this.set('model.allPages', pages); + this.set('model.pages', pages.filterBy('pageType', 'section')); + this.set('model.tabs', pages.filterBy('pageType', 'tab')); + + resolve(newPage.id); + + // this.get('documentService').getPageMeta(this.get('model.document.id'), newPage.id).then(() => { + // console.log("ready to edit"); + // // this.transitionToRoute('document.edit', + // // this.get('model.folder.id'), + // // this.get('model.folder.slug'), + // // this.get('model.document.id'), + // // this.get('model.document.slug'), + // // newPage.id); + // }); + }); + }); + }); + }, + + // to test + onPageSequenceChange(changes) { + this.get('documentService').changePageSequence(this.get('model.document.id'), changes).then(() => { + _.each(changes, (change) => { + let pageContent = _.findWhere(this.get('model.pages'), { + id: change.pageId + }); + + if (is.not.undefined(pageContent)) { + pageContent.set('sequence', change.sequence); + } + }); + + this.set('model.pages', this.get('model.pages').sortBy('sequence')); + this.get('target.router').refresh(); + }); + }, + + // to test + onPageLevelChange(changes) { + this.get('documentService').changePageLevel(this.get('model.document.id'), changes).then(() => { + _.each(changes, (change) => { + let pageContent = _.findWhere(this.get('model.pages'), { + id: change.pageId + }); + + if (is.not.undefined(pageContent)) { + pageContent.set('level', change.level); + } + }); + + let pages = this.get('model.pages'); + pages = pages.sortBy('sequence'); + this.set('model.pages', []); + this.set('model.pages', pages); + this.get('target.router').refresh(); + }); + }, + + // to test + gotoPage(pageId) { + if (is.null(pageId)) { + return; + } + + this.scrollToPage(pageId); + }, + + // to test + onSavePageAsBlock(block) { + this.get('sectionService').addBlock(block).then(() => { + this.showNotification("Published"); + }); } } }); @@ -181,42 +251,6 @@ gotoPage(pageId) { this.scrollToPage(pageId); }, -onPageSequenceChange(changes) { - this.get('documentService').changePageSequence(this.get('model.document.id'), changes).then(() => { - _.each(changes, (change) => { - let pageContent = _.findWhere(this.get('model.pages'), { - id: change.pageId - }); - - if (is.not.undefined(pageContent)) { - pageContent.set('sequence', change.sequence); - } - }); - - this.set('model.pages', this.get('model.pages').sortBy('sequence')); - this.get('target.router').refresh(); - }); -}, - -onPageLevelChange(changes) { - this.get('documentService').changePageLevel(this.get('model.document.id'), changes).then(() => { - _.each(changes, (change) => { - let pageContent = _.findWhere(this.get('model.pages'), { - id: change.pageId - }); - - if (is.not.undefined(pageContent)) { - pageContent.set('level', change.level); - } - }); - - let pages = this.get('model.pages'); - pages = pages.sortBy('sequence'); - this.set('model.pages', []); - this.set('model.pages', pages); - this.get('target.router').refresh(); - }); -}, onSaveTemplate(name, desc) { this.get('templateService').saveAsTemplate(this.get('model.document.id'), name, desc).then(function () {}); @@ -228,50 +262,6 @@ onSaveMeta(doc) { }); }, -onAddSection(section) { - this.audit.record("added-section-" + section.get('contentType')); - - let page = { - documentId: this.get('model.document.id'), - title: `${section.get('title')}`, - level: 1, - sequence: 0, - body: "", - contentType: section.get('contentType'), - pageType: section.get('pageType') - }; - - let meta = { - documentId: this.get('model.document.id'), - rawBody: "", - config: "" - }; - - let model = { - page: page, - meta: meta - }; - - this.get('documentService').addPage(this.get('model.document.id'), model).then((newPage) => { - let data = this.get('store').normalize('page', newPage); - this.get('store').push(data); - - this.get('documentService').getPages(this.get('model.document.id')).then((pages) => { - this.set('model.pages', pages.filterBy('pageType', 'section')); - this.set('model.tabs', pages.filterBy('pageType', 'tab')); - - this.get('documentService').getPageMeta(this.get('model.document.id'), newPage.id).then(() => { - this.transitionToRoute('document.edit', - this.get('model.folder.id'), - this.get('model.folder.slug'), - this.get('model.document.id'), - this.get('model.document.slug'), - newPage.id); - }); - }); - }); -}, - onInsertBlock(block) { this.audit.record("added-content-block-" + block.get('contentType')); diff --git a/app/app/pods/document/template.hbs b/app/app/pods/document/template.hbs index d5c696bd..61bfb15d 100644 --- a/app/app/pods/document/template.hbs +++ b/app/app/pods/document/template.hbs @@ -46,13 +46,13 @@