diff --git a/.tern-project b/.tern-project new file mode 100644 index 00000000..fa48932d --- /dev/null +++ b/.tern-project @@ -0,0 +1,18 @@ +{ + "libs": [ + "browser", + "jquery", + "underscore", + "is", + "ember" + ], + "loadEagerly": [ + "app/app/*.js" + ], + "plugins": { + "requirejs": { + "baseURL": "./", + "paths": {} + } + } +} diff --git a/app/app/components/document/document-sidebar-toc.js b/app/app/components/document/document-sidebar-toc.js index e5dc1e87..4fc5a44c 100644 --- a/app/app/components/document/document-sidebar-toc.js +++ b/app/app/components/document/document-sidebar-toc.js @@ -12,6 +12,7 @@ import Ember from 'ember'; import NotifierMixin from '../../mixins/notifier'; import TooltipMixin from '../../mixins/tooltip'; +import tocUtil from '../../utils/toc'; export default Ember.Component.extend(NotifierMixin, TooltipMixin, { document: {}, @@ -77,332 +78,99 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { // Controls what user can do with the toc (left sidebar). // Identifies the target pages. setState(pageId) { - // defaults - this.set('tocTools.UpTarget', ""); - this.set('tocTools.DownTarget', ""); - this.set('tocTools.AllowIndent', false); - this.set('tocTools.AllowOutdent', false); - this.set('actionablePage', false); - this.set('upDisabled', true); - this.set('downDisabled', true); - this.set('indentDisabled', true); - this.set('outdentDisabled', true); + this.set('page', pageId); + + let toc = this.get('pages'); + let page = _.findWhere(toc, { id: pageId }); + + let state = tocUtil.getState(toc, page); if (!this.get('isEditor') || is.empty(pageId)) { - return; + state.actionablePage = state.upDisabled = state.downDisabled = state.indentDisabled = state.outdentDisabled = false; } - this.set('page', pageId); - - var toc = this.get('pages'); - var page = _.findWhere(toc, { - id: pageId - }); - - // handle root node - if (is.undefined(page) || page.level === 1) { - return; - } - - var index = _.indexOf(toc, page, false); - - if (index === -1) { - return; - } - - var upPage = toc[index - 1]; - var downPage = toc[index + 1]; - - if (_.isUndefined(upPage)) { - this.set('tocTools.UpTarget', ""); - } - - if (_.isUndefined(downPage)) { - this.set('tocTools.DownTarget', ""); - } - - // can we go up? - // can we indent? - if (!_.isUndefined(upPage)) { - // can only go up if someone is same or higher level? - var index2 = _.indexOf(toc, upPage, false); - - if (index2 !== -1) { - // up - for (var i = index2; i > 0; i--) { - if (page.level > toc[i].level) { - break; - } - - if (page.level === toc[i].level) { - this.set('tocTools.UpTarget', toc[i].id); - break; - } - } - - // indent? - for (var i2 = index2; i2 > 0; i2--) { - if (toc[i2].level < page.level) { - this.set('tocTools.AllowIndent', false); - break; - } - - if (page.level === toc[i2].level) { - this.set('tocTools.AllowIndent', true); - break; - } - } - } - - // if page above is root node then some things you can't do - if (upPage.level === 1) { - this.set('tocTools.AllowIndent', false); - this.set('tocTools.UpTarget', ""); - } - } - - // can we go down? - if (!_.isUndefined(downPage)) { - // can only go down if someone below is at our level or higher - var index3 = _.indexOf(toc, downPage, false); - - if (index3 !== -1) { - for (var i3 = index3; i3 < toc.length; i3++) { - if (toc[i3].level < page.level) { - break; - } - - if (page.level === toc[i3].level) { - this.set('tocTools.DownTarget', toc[i3].id); - break; - } - } - } - - if (page.level > downPage.level) { - this.set('tocTools.DownTarget', ""); - } - } - - // can we outdent? - this.set('tocTools.AllowOutdent', page.level > 2); - - this.set('upDisabled', this.get('tocTools.UpTarget') === ""); - this.set('downDisabled', this.get('tocTools.DownTarget') === ""); - this.set('indentDisabled', !this.get('tocTools.AllowIndent')); - this.set('outdentDisabled', !this.get('tocTools.AllowOutdent')); - - this.set('actionablePage', - is.not.empty(this.get('tocTools.UpTarget')) || - is.not.empty(this.get('tocTools.DownTarget')) || - this.get('tocTools.AllowIndent') || - this.get('tocTools.AllowOutdent')); + this.set('state', state); }, actions: { // Page up - above pages shunt down. pageUp() { - if (this.upDisabled) { + if (this.get('state.upDisabled')) { return; } - var pages = this.get('pages'); - var current = _.findWhere(pages, { - id: this.get('page') - }); - var page1 = _.findWhere(pages, { - id: this.tocTools.UpTarget - }); - var page2 = null; - var pendingChanges = []; + let state = this.get('state'); + let pages = this.get('pages'); + let page = _.findWhere(pages, { id: this.get('page') }); + let pendingChanges = tocUtil.moveUp(state, pages, page); - if (is.undefined(current) || is.undefined(page1)) { - return; - } + if (pendingChanges.length > 0) { + this.attrs.changePageSequence(pendingChanges); - var index1 = _.indexOf(pages, page1, false); - - if (index1 !== -1 && index1 > 1) { - page2 = pages[index1 - 1]; - } - - var sequence1 = page1.sequence; - var sequence2 = is.not.null(page2) ? page2.sequence : 1024; - - var index = _.indexOf(pages, current, false); - - if (index !== -1) { - var sequence = (sequence1 + sequence2) / 2; - - pendingChanges.push({ - pageId: current.id, - sequence: sequence - }); - - for (var i = index + 1; i < pages.length; i++) { - if (pages[i].level <= current.level) { - break; - } - - sequence = (sequence + page1.sequence) / 2; - - pendingChanges.push({ - pageId: pages[i].id, - sequence: sequence - }); - } - } - - this.attrs.changePageSequence(pendingChanges); - - this.send('onEntryClick', this.get('page')); - this.audit.record("moved-page-up"); - this.showNotification("Moved up"); + this.send('onEntryClick', this.get('page')); + this.audit.record("moved-page-up"); + this.showNotification("Moved up"); + } }, // Move down -- pages below shift up. pageDown() { - if (this.downDisabled) { + if (this.get('state.downDisabled')) { return; } + let state = this.get('state'); var pages = this.get('pages'); - var current = _.findWhere(pages, { - id: this.get('page') - }); - var pageIndex = _.indexOf(pages, current, false); - var downTarget = _.findWhere(pages, { - id: this.tocTools.DownTarget - }); - var downTargetIndex = _.indexOf(pages, downTarget, false); - var pendingChanges = []; + var page = _.findWhere(pages, { id: this.get('page') }); + let pendingChanges = tocUtil.moveDown(state, pages, page); - if (pageIndex === -1 || downTargetIndex === -1) { - return; - } + if (pendingChanges.length > 0) { + this.attrs.changePageSequence(pendingChanges); - var startingSequence = 0; - var upperSequence = 0; - var cutOff = _.rest(pages, downTargetIndex); - var siblings = _.reject(cutOff, function(p) { - return p.level !== current.level || p.id === current.id || p.id === downTarget.id; - }); - - if (siblings.length > 0) { - var aboveThisGuy = siblings[0]; - var belowThisGuy = pages[_.indexOf(pages, aboveThisGuy, false) - 1]; - - if (is.not.null(belowThisGuy) && belowThisGuy.level > current.level) { - startingSequence = (aboveThisGuy.sequence + belowThisGuy.sequence) / 2; - upperSequence = aboveThisGuy.sequence; - } else { - var otherGuy = pages[downTargetIndex + 1]; - - startingSequence = (otherGuy.sequence + downTarget.sequence) / 2; - upperSequence = otherGuy.sequence; - } - } else { - startingSequence = downTarget.sequence * 2; - upperSequence = startingSequence * 2; - } - - pendingChanges.push({ - pageId: current.id, - sequence: startingSequence - }); - - var sequence = (startingSequence + upperSequence) / 2; - - for (var i = pageIndex + 1; i < pages.length; i++) { - if (pages[i].level <= current.level) { - break; - } - - var sequence2 = (sequence + upperSequence) / 2; - - pendingChanges.push({ - pageId: pages[i].id, - sequence: sequence2 - }); - } - - this.attrs.changePageSequence(pendingChanges); - - this.send('onEntryClick', this.get('page')); - this.audit.record("moved-page-down"); - this.showNotification("Moved down"); + this.send('onEntryClick', this.get('page')); + this.audit.record("moved-page-down"); + this.showNotification("Moved down"); + } }, // Indent - changes a page from H2 to H3, etc. pageIndent() { - if (this.indentDisabled) { + if (this.get('state.indentDisabled')) { return; } + let state = this.get('state'); var pages = this.get('pages'); - var current = _.findWhere(pages, { - id: this.get('page') - }); - var pageIndex = _.indexOf(pages, current, false); - var pendingChanges = []; + var page = _.findWhere(pages, { id: this.get('page') }); + let pendingChanges = tocUtil.indent(state, pages, page); - pendingChanges.push({ - pageId: current.id, - level: current.level + 1 - }); + if (pendingChanges.length > 0) { + this.attrs.changePageLevel(pendingChanges); - for (var i = pageIndex + 1; i < pages.length; i++) { - if (pages[i].level <= current.level) { - break; - } - - pendingChanges.push({ - pageId: pages[i].id, - level: pages[i].level + 1 - }); - } - - this.attrs.changePageLevel(pendingChanges); - - this.showNotification("Indent"); - this.audit.record("changed-page-sequence"); - this.send('onEntryClick', this.get('page')); + this.showNotification("Indent"); + this.audit.record("changed-page-sequence"); + this.send('onEntryClick', this.get('page')); + } }, // Outdent - changes a page from H3 to H2, etc. pageOutdent() { - if (this.outdentDisabled) { + if (this.get('state.outdentDisabled')) { return; } + let state = this.get('state'); var pages = this.get('pages'); - var current = _.findWhere(pages, { - id: this.get('page') - }); - var pageIndex = _.indexOf(pages, current, false); - var pendingChanges = []; + var page = _.findWhere(pages, { id: this.get('page') }); + let pendingChanges = tocUtil.outdent(state, pages, page); - pendingChanges.push({ - pageId: current.id, - level: current.level - 1 - }); + if (pendingChanges.length > 0) { + this.attrs.changePageLevel(pendingChanges); - for (var i = pageIndex + 1; i < pages.length; i++) { - if (pages[i].level <= current.level) { - break; - } - - pendingChanges.push({ - pageId: pages[i].id, - level: pages[i].level - 1 - }); - } - - this.attrs.changePageLevel(pendingChanges); - - this.showNotification("Outdent"); - this.audit.record("changed-page-sequence"); - this.send('onEntryClick', this.get('page')); + this.showNotification("Outdent"); + this.audit.record("changed-page-sequence"); + this.send('onEntryClick', this.get('page')); + } }, onEntryClick(id) { diff --git a/app/app/components/document/index-entry.js b/app/app/components/document/index-entry.js index c0be4928..3c139660 100644 --- a/app/app/components/document/index-entry.js +++ b/app/app/components/document/index-entry.js @@ -16,14 +16,14 @@ export default Ember.Component.extend({ tagName: "li", classNames: ["item"], - indentLevel: Ember.computed('page', function() { - let nodeLevel = this.get('page.level'); - let indent = (nodeLevel - 1) * 20; - return indent; - }), + // indentLevel: Ember.computed('page', function() { + // let nodeLevel = this.get('page.level'); + // let indent = (nodeLevel - 1) * 20; + // return indent; + // }), didReceiveAttrs() { - this.set('classNames', ["item", "margin-left-" + this.get("indentLevel")]); + // this.set('classNames', ["item", "margin-left-" + this.get("page.tocIndent")]); }, actions: { @@ -31,4 +31,4 @@ export default Ember.Component.extend({ this.get('onClick')(id); } } -}); \ No newline at end of file +}); diff --git a/app/app/pods/document/wizard/controller.js b/app/app/pods/document/wizard/controller.js index b475e927..a67d82ee 100644 --- a/app/app/pods/document/wizard/controller.js +++ b/app/app/pods/document/wizard/controller.js @@ -19,7 +19,7 @@ export default Ember.Controller.extend(NotifierMixin, { let page = models.PageModel.create({ documentId: this.get('model.document.id'), title: `${section.title} Section`, - level: 2, + level: 1, sequence: 2048, body: "", contentType: section.contentType diff --git a/app/app/styles/color.scss b/app/app/styles/color.scss index 4c72392b..40c0151f 100644 --- a/app/app/styles/color.scss +++ b/app/app/styles/color.scss @@ -16,9 +16,9 @@ $color-primary: #084d85; $color-link: #5abc67; $color-attachment: #2180cc; $color-red: #d9493c; -$color-green: #5abc67; +$color-green: #1c962b; $color-blue: #084d85; -$color-gray: #99a2ac; +$color-gray: #8b9096; $color-background: #f8f8f8; $color-tooltip: #4c4c4c; $color-toast: #4c4c4c; diff --git a/app/app/styles/widget/widget-avatar.scss b/app/app/styles/widget/widget-avatar.scss index 9dd983be..94c88a52 100644 --- a/app/app/styles/widget/widget-avatar.scss +++ b/app/app/styles/widget/widget-avatar.scss @@ -1,6 +1,6 @@ .avatar { color: $color-white; - background-color: $color-stroke; + background-color: $color-gray; @include border-radius(20px); padding: 8px 0 0 0; letter-spacing: 1px; @@ -11,7 +11,7 @@ .avatar-large { color: $color-white; - background-color: $color-stroke; + background-color: $color-gray; @include border-radius(100px); height: 100px; width: 100px; diff --git a/app/app/templates/components/document/document-sidebar-toc.hbs b/app/app/templates/components/document/document-sidebar-toc.hbs index 5c2411e3..b471d11a 100644 --- a/app/app/templates/components/document/document-sidebar-toc.hbs +++ b/app/app/templates/components/document/document-sidebar-toc.hbs @@ -1,19 +1,19 @@