diff --git a/core/client/controllers/editor.js b/core/client/controllers/editor.js
new file mode 100644
index 0000000000..9d952ae634
--- /dev/null
+++ b/core/client/controllers/editor.js
@@ -0,0 +1,5 @@
+import EditorControllerMixin from 'ghost/mixins/editor-base-controller';
+
+var EditorController = Ember.ObjectController.extend(EditorControllerMixin);
+
+export default EditorController;
diff --git a/core/client/controllers/new.js b/core/client/controllers/new.js
new file mode 100644
index 0000000000..9d952ae634
--- /dev/null
+++ b/core/client/controllers/new.js
@@ -0,0 +1,5 @@
+import EditorControllerMixin from 'ghost/mixins/editor-base-controller';
+
+var EditorController = Ember.ObjectController.extend(EditorControllerMixin);
+
+export default EditorController;
diff --git a/core/client/controllers/post-settings-menu.js b/core/client/controllers/post-settings-menu.js
new file mode 100644
index 0000000000..64343624ce
--- /dev/null
+++ b/core/client/controllers/post-settings-menu.js
@@ -0,0 +1,138 @@
+import {parseDateString, formatDate} from 'ghost/utils/date-formatting';
+
+var PostSettingsMenuController = Ember.ObjectController.extend({
+ isStaticPage: function (key, val) {
+ var self = this;
+
+ if (arguments.length > 1) {
+ this.set('page', val ? 1 : 0);
+
+ return this.get('model').save().then(function () {
+ self.notifications.showSuccess('Successfully converted to ' + (val ? 'static page' : 'post'));
+
+ return !!self.get('page');
+ }, this.notifications.showErrors);
+ }
+
+ return !!this.get('page');
+ }.property('page'),
+
+ newSlugBinding: Ember.computed.oneWay('slug'),
+
+ slugPlaceholder: function () {
+ return this.get('model').generateSlug();
+ }.property('title'),
+
+ actions: {
+ updateSlug: function () {
+ var newSlug = this.get('newSlug'),
+ slug = this.get('slug'),
+ placeholder = this.get('slugPlaceholder'),
+ self = this;
+
+ newSlug = (!newSlug && placeholder) ? placeholder : newSlug;
+
+ // Ignore unchanged slugs
+ if (slug === newSlug) {
+ return;
+ }
+ //reset to model's slug on empty string
+ if (!newSlug) {
+ this.set('newSlug', slug);
+ return;
+ }
+
+ //Validation complete
+ this.set('slug', newSlug);
+
+ // If the model doesn't currently
+ // exist on the server
+ // then just update the model's value
+ if (!this.get('isNew')) {
+ return;
+ }
+
+ this.get('model').save().then(function () {
+ self.notifications.showSuccess('Permalink successfully changed to ' +
+ self.get('slug') + '.');
+ }, this.notifications.showErrors);
+ },
+
+ updatePublishedAt: function (userInput) {
+ var self = this,
+ errMessage = '',
+ newPubDate = formatDate(parseDateString(userInput)),
+ pubDate = this.get('publishedAt'),
+ newPubDateMoment,
+ pubDateMoment;
+
+ // if there is no new pub date, mark that until the post is published,
+ // when we'll fill in with the current time.
+ if (!newPubDate) {
+ this.set('publishedAt', '');
+ return;
+ }
+
+ // Check for missing time stamp on new data
+ // If no time specified, add a 12:00
+ if (newPubDate && !newPubDate.slice(-5).match(/\d+:\d\d/)) {
+ newPubDate += ' 12:00';
+ }
+
+ newPubDateMoment = parseDateString(newPubDate);
+
+ // If there was a published date already set
+ if (pubDate) {
+ // Check for missing time stamp on current model
+ // If no time specified, add a 12:00
+ if (!pubDate.slice(-5).match(/\d+:\d\d/)) {
+ pubDate += ' 12:00';
+ }
+
+ pubDateMoment = parseDateString(pubDate);
+
+ // Quit if the new date is the same
+ if (pubDateMoment.isSame(newPubDateMoment)) {
+ return;
+ }
+ }
+
+ // Validate new Published date
+ if (!newPubDateMoment.isValid() || newPubDate.substr(0, 12) === 'Invalid date') {
+ errMessage = 'Published Date must be a valid date with format: ' +
+ 'DD MMM YY @ HH:mm (e.g. 6 Dec 14 @ 15:00)';
+ }
+
+ if (newPubDateMoment.diff(new Date(), 'h') > 0) {
+ errMessage = 'Published Date cannot currently be in the future.';
+ }
+
+ if (errMessage) {
+ // Show error message
+ this.notifications.showError(errMessage);
+ //Hack to push a "change" when it's actually staying
+ // the same.
+ //This alerts the listener on post-settings-menu
+ this.notifyPropertyChange('publishedAt');
+ return;
+ }
+
+ //Validation complete
+ this.set('published_at', newPubDateMoment.toDate());
+
+ // If the model doesn't currently
+ // exist on the server
+ // then just update the model's value
+ if (!this.get('isNew')) {
+ return;
+ }
+
+ this.get('model').save().then(function () {
+ this.notifications.showSuccess('Publish date successfully changed to ' +
+ self.get('publishedAt') + '.');
+ }, this.notifications.showErrors);
+ }
+ }
+});
+
+export default PostSettingsMenuController;
diff --git a/core/client/controllers/posts/post.js b/core/client/controllers/posts/post.js
index 60a6c421c2..82ede268f7 100644
--- a/core/client/controllers/posts/post.js
+++ b/core/client/controllers/posts/post.js
@@ -1,176 +1,11 @@
-/* global console */
-import {parseDateString, formatDate} from 'ghost/utils/date-formatting';
-
var PostController = Ember.ObjectController.extend({
- //## Computed post properties
isPublished: Ember.computed.equal('status', 'published'),
- isDraft: Ember.computed.equal('status', 'draft'),
- /**
- * By default, a post will not change its publish state.
- * Only with a user-set value (via setSaveType action)
- * can the post's status change.
- */
- willPublish: function (key, val) {
- if (val) {
- return val;
- }
- return this.get('isPublished');
- }.property('isPublished'),
- isStaticPage: function (key, val) {
- var self = this;
-
- if (arguments.length > 1) {
- this.set('page', val ? 1 : 0);
-
- return this.get('model').save().then(function () {
- self.notifications.showSuccess('Successfully converted to ' + (val ? 'static page' : 'post'));
-
- return !!self.get('page');
- }, this.notifications.showErrors);
- }
-
- return !!this.get('page');
- }.property('page'),
-
- newSlugBinding: Ember.computed.oneWay('slug'),
-
- slugPlaceholder: function () {
- return this.get('model').generateSlug();
- }.property('title'),
actions: {
- save: function () {
- var status = this.get('willPublish') ? 'published' : 'draft',
- self = this;
-
- this.set('model.status', status);
- this.get('model').save().then(function () {
- console.log('saved');
- self.notifications.showSuccess('Post status saved as ' +
- self.get('model.status') + '.');
- }, this.notifications.showErrors);
- },
- setSaveType: function (newType) {
- if (newType === 'publish') {
- this.set('willPublish', true);
- } else if (newType === 'draft') {
- this.set('willPublish', false);
- } else {
- console.warn('Received invalid save type; ignoring.');
- }
- },
toggleFeatured: function () {
this.set('featured', !this.get('featured'));
this.get('model').save();
- },
- updateSlug: function () {
- var newSlug = this.get('newSlug'),
- slug = this.get('slug'),
- placeholder = this.get('slugPlaceholder'),
- self = this;
-
- newSlug = (!newSlug && placeholder) ? placeholder : newSlug;
-
- // Ignore unchanged slugs
- if (slug === newSlug) {
- return;
- }
- //reset to model's slug on empty string
- if (!newSlug) {
- this.set('newSlug', slug);
- return;
- }
-
- //Validation complete
- this.set('slug', newSlug);
-
- // If the model doesn't currently
- // exist on the server
- // then just update the model's value
- if (!this.get('isNew')) {
- return;
- }
-
- this.get('model').save().then(function () {
- self.notifications.showSuccess('Permalink successfully changed to ' +
- self.get('slug') + '.');
- }, this.notifications.showErrors);
- },
-
- updatePublishedAt: function (userInput) {
- var self = this,
- errMessage = '',
- newPubDate = formatDate(parseDateString(userInput)),
- pubDate = this.get('publishedAt'),
- newPubDateMoment,
- pubDateMoment;
-
- // if there is no new pub date, mark that until the post is published,
- // when we'll fill in with the current time.
- if (!newPubDate) {
- this.set('publishedAt', '');
- return;
- }
-
- // Check for missing time stamp on new data
- // If no time specified, add a 12:00
- if (newPubDate && !newPubDate.slice(-5).match(/\d+:\d\d/)) {
- newPubDate += ' 12:00';
- }
-
- newPubDateMoment = parseDateString(newPubDate);
-
- // If there was a published date already set
- if (pubDate) {
- // Check for missing time stamp on current model
- // If no time specified, add a 12:00
- if (!pubDate.slice(-5).match(/\d+:\d\d/)) {
- pubDate += ' 12:00';
- }
-
- pubDateMoment = parseDateString(pubDate);
-
- // Quit if the new date is the same
- if (pubDateMoment.isSame(newPubDateMoment)) {
- return;
- }
- }
-
- // Validate new Published date
- if (!newPubDateMoment.isValid() || newPubDate.substr(0, 12) === 'Invalid date') {
- errMessage = 'Published Date must be a valid date with format: ' +
- 'DD MMM YY @ HH:mm (e.g. 6 Dec 14 @ 15:00)';
- }
-
- if (newPubDateMoment.diff(new Date(), 'h') > 0) {
- errMessage = 'Published Date cannot currently be in the future.';
- }
-
- if (errMessage) {
- // Show error message
- this.notifications.showError(errMessage);
- //Hack to push a "change" when it's actually staying
- // the same.
- //This alerts the listener on post-settings-menu
- this.notifyPropertyChange('publishedAt');
- return;
- }
-
- //Validation complete
- this.set('published_at', newPubDateMoment.toDate());
-
- // If the model doesn't currently
- // exist on the server
- // then just update the model's value
- if (!this.get('isNew')) {
- return;
- }
-
- this.get('model').save().then(function () {
- this.notifications.showSuccess('Publish date successfully changed to ' +
- self.get('publishedAt') + '.');
- }, this.notifications.showErrors);
}
}
});
diff --git a/core/client/mixins/editor-base-controller.js b/core/client/mixins/editor-base-controller.js
new file mode 100644
index 0000000000..6add1ac137
--- /dev/null
+++ b/core/client/mixins/editor-base-controller.js
@@ -0,0 +1,44 @@
+/* global console */
+
+var EditorControllerMixin = Ember.Mixin.create({
+ //## Computed post properties
+ isPublished: Ember.computed.equal('status', 'published'),
+ isDraft: Ember.computed.equal('status', 'draft'),
+ /**
+ * By default, a post will not change its publish state.
+ * Only with a user-set value (via setSaveType action)
+ * can the post's status change.
+ */
+ willPublish: function (key, val) {
+ if (val) {
+ return val;
+ }
+ return this.get('isPublished');
+ }.property('isPublished'),
+
+ actions: {
+ save: function () {
+ var status = this.get('willPublish') ? 'published' : 'draft',
+ self = this;
+
+ this.set('status', status);
+ this.get('model').save().then(function () {
+ console.log('saved');
+ self.notifications.showSuccess('Post status saved as ' +
+ self.get('status') + '.');
+ }, this.notifications.showErrors);
+ },
+
+ setSaveType: function (newType) {
+ if (newType === 'publish') {
+ this.set('willPublish', true);
+ } else if (newType === 'draft') {
+ this.set('willPublish', false);
+ } else {
+ console.warn('Received invalid save type; ignoring.');
+ }
+ }
+ }
+});
+
+export default EditorControllerMixin;
diff --git a/core/client/routes/editor.js b/core/client/routes/editor.js
index 5895492b1f..c4cb60b4c4 100644
--- a/core/client/routes/editor.js
+++ b/core/client/routes/editor.js
@@ -3,7 +3,7 @@ import AuthenticatedRoute from 'ghost/routes/authenticated';
var EditorRoute = AuthenticatedRoute.extend(styleBody, {
classNames: ['editor'],
- controllerName: 'posts.post',
+
model: function (params) {
var post = this.store.getById('post', params.post_id);
@@ -11,7 +11,7 @@ var EditorRoute = AuthenticatedRoute.extend(styleBody, {
return post;
}
- return this.store.filter('post', { status: 'all' }, function (post) {
+ return this.store.filter('post', { status: 'all', staticPages: 'all' }, function (post) {
return post.get('id') === params.post_id;
}).then(function (records) {
return records.get('firstObject');
diff --git a/core/client/routes/new.js b/core/client/routes/new.js
index 319b8a4002..04bba4e6aa 100644
--- a/core/client/routes/new.js
+++ b/core/client/routes/new.js
@@ -2,13 +2,8 @@ import AuthenticatedRoute from 'ghost/routes/authenticated';
import styleBody from 'ghost/mixins/style-body';
var NewRoute = AuthenticatedRoute.extend(styleBody, {
- controllerName: 'posts.post',
classNames: ['editor'],
- renderTemplate: function () {
- this.render('editor');
- },
-
model: function () {
return this.store.createRecord('post', {
title: ''
diff --git a/core/client/templates/-floating-header.hbs b/core/client/templates/-floating-header.hbs
index ae11f98ef8..3198096f58 100644
--- a/core/client/templates/-floating-header.hbs
+++ b/core/client/templates/-floating-header.hbs
@@ -18,7 +18,7 @@
Post Settings
{{/gh-popover-button}}
{{#gh-popover name="post-settings-menu" classNames="post-settings-menu menu-drop-right"}}
- {{view "post-settings-menu-view"}}
+ {{render "post-settings-menu" model}}
{{/gh-popover}}
diff --git a/core/client/templates/-publish-bar.hbs b/core/client/templates/-publish-bar.hbs
index a5fd723ac2..5592f8f7ec 100644
--- a/core/client/templates/-publish-bar.hbs
+++ b/core/client/templates/-publish-bar.hbs
@@ -9,7 +9,7 @@
Post Settings
{{/gh-popover-button}}
{{#gh-popover name="post-settings-menu" classNames="post-settings-menu menu-right"}}
- {{view "post-settings-menu-view"}}
+ {{render "post-settings-menu" model}}
{{/gh-popover}}
diff --git a/core/client/templates/new.hbs b/core/client/templates/new.hbs
deleted file mode 100644
index 30404ce4c5..0000000000
--- a/core/client/templates/new.hbs
+++ /dev/null
@@ -1 +0,0 @@
-TODO
\ No newline at end of file
diff --git a/core/client/views/editor-tags.js b/core/client/views/editor-tags.js
index ee738be55f..fe06183c3b 100644
--- a/core/client/views/editor-tags.js
+++ b/core/client/views/editor-tags.js
@@ -57,7 +57,6 @@ var EditorTags = Ember.View.extend({
this.set('overlay.left', this.$input.position().left);
this.$suggestions.html('');
- window.b = matchingTags;
matchingTags = matchingTags.slice(0, maxSuggestions);
if (matchingTags.length > 0) {
diff --git a/core/client/views/editor.js b/core/client/views/editor.js
index dcab519415..59daf795d4 100644
--- a/core/client/views/editor.js
+++ b/core/client/views/editor.js
@@ -1,5 +1,7 @@
-export default Ember.View.extend({
+var EditorView = Ember.View.extend({
tagName: 'section',
classNames: ['entry-container'],
scrollPosition: 0 // percentage of scroll position
-});
\ No newline at end of file
+});
+
+export default EditorView;
\ No newline at end of file
diff --git a/core/client/views/new.js b/core/client/views/new.js
new file mode 100644
index 0000000000..4d3f48ef06
--- /dev/null
+++ b/core/client/views/new.js
@@ -0,0 +1,8 @@
+var NewView = Ember.View.extend({
+ tagName: 'section',
+ templateName: 'editor',
+ classNames: ['entry-container'],
+ scrollPosition: 0 // percentage of scroll position
+});
+
+export default NewView;