mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-10 23:36:14 -05:00
Merge pull request #4308 from jaswilli/slugs-save
Ensure slug generation has completed prior to save
This commit is contained in:
commit
5db1ede28c
2 changed files with 45 additions and 12 deletions
|
@ -7,6 +7,8 @@ var PostSettingsMenuController = Ember.ObjectController.extend({
|
||||||
//State for if the user is viewing a tab's pane.
|
//State for if the user is viewing a tab's pane.
|
||||||
needs: 'application',
|
needs: 'application',
|
||||||
|
|
||||||
|
lastPromise: null,
|
||||||
|
|
||||||
isViewingSubview: Ember.computed('controllers.application.showRightOutlet', function (key, value) {
|
isViewingSubview: Ember.computed('controllers.application.showRightOutlet', function (key, value) {
|
||||||
// Not viewing a subview if we can't even see the PSM
|
// Not viewing a subview if we can't even see the PSM
|
||||||
if (!this.get('controllers.application.showRightOutlet')) {
|
if (!this.get('controllers.application.showRightOutlet')) {
|
||||||
|
@ -89,11 +91,22 @@ var PostSettingsMenuController = Ember.ObjectController.extend({
|
||||||
//Requests slug from title
|
//Requests slug from title
|
||||||
generateAndSetSlug: function (destination) {
|
generateAndSetSlug: function (destination) {
|
||||||
var self = this,
|
var self = this,
|
||||||
title = this.get('titleScratch');
|
title = this.get('titleScratch'),
|
||||||
|
afterSave = this.get('lastPromise'),
|
||||||
|
promise;
|
||||||
|
|
||||||
this.get('slugGenerator').generateSlug(title).then(function (slug) {
|
// Only set an "untitled" slug once per post
|
||||||
self.set(destination, slug);
|
if (title === '(Untitled)' && this.get('slug')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
promise = Ember.RSVP.resolve(afterSave).then(function () {
|
||||||
|
return self.get('slugGenerator').generateSlug(title).then(function (slug) {
|
||||||
|
self.set(destination, slug);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.set('lastPromise', promise);
|
||||||
},
|
},
|
||||||
|
|
||||||
metaTitleScratch: boundOneWay('meta_title'),
|
metaTitleScratch: boundOneWay('meta_title'),
|
||||||
|
@ -168,11 +181,15 @@ var PostSettingsMenuController = Ember.ObjectController.extend({
|
||||||
}
|
}
|
||||||
}.observes('model'),
|
}.observes('model'),
|
||||||
titleObserver: function () {
|
titleObserver: function () {
|
||||||
|
var debounceId;
|
||||||
|
|
||||||
if (this.get('isNew') && !this.get('title')) {
|
if (this.get('isNew') && !this.get('title')) {
|
||||||
Ember.run.debounce(this, 'generateAndSetSlug', ['slugPlaceholder'], 700);
|
debounceId = Ember.run.debounce(this, 'generateAndSetSlug', ['slugPlaceholder'], 700);
|
||||||
} else if (this.get('title') === '(Untitled)') {
|
} else if (this.get('title') === '(Untitled)') {
|
||||||
Ember.run.debounce(this, 'generateAndSetSlug', ['slug'], 700);
|
debounceId = Ember.run.debounce(this, 'generateAndSetSlug', ['slug'], 700);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.set('debounceId', debounceId);
|
||||||
},
|
},
|
||||||
slugPlaceholder: Ember.computed(function (key, value) {
|
slugPlaceholder: Ember.computed(function (key, value) {
|
||||||
var slug = this.get('slug');
|
var slug = this.get('slug');
|
||||||
|
|
|
@ -12,7 +12,7 @@ PostModel.eachAttribute(function (name) {
|
||||||
});
|
});
|
||||||
|
|
||||||
var EditorControllerMixin = Ember.Mixin.create(MarkerManager, {
|
var EditorControllerMixin = Ember.Mixin.create(MarkerManager, {
|
||||||
needs: ['post-tags-input'],
|
needs: ['post-tags-input', 'post-settings-menu'],
|
||||||
|
|
||||||
init: function () {
|
init: function () {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
@ -195,7 +195,9 @@ var EditorControllerMixin = Ember.Mixin.create(MarkerManager, {
|
||||||
prevStatus = this.get('status'),
|
prevStatus = this.get('status'),
|
||||||
isNew = this.get('isNew'),
|
isNew = this.get('isNew'),
|
||||||
autoSaveId = this.get('autoSaveId'),
|
autoSaveId = this.get('autoSaveId'),
|
||||||
self = this;
|
self = this,
|
||||||
|
psmController = this.get('controllers.post-settings-menu'),
|
||||||
|
promise;
|
||||||
|
|
||||||
options = options || {};
|
options = options || {};
|
||||||
|
|
||||||
|
@ -221,11 +223,21 @@ var EditorControllerMixin = Ember.Mixin.create(MarkerManager, {
|
||||||
|
|
||||||
this.set('title', this.get('titleScratch'));
|
this.set('title', this.get('titleScratch'));
|
||||||
|
|
||||||
return this.get('model').save(options).then(function (model) {
|
if (!this.get('slug')) {
|
||||||
if (!options.silent) {
|
// Cancel any pending slug generation that may still be queued in the
|
||||||
self.showSaveNotification(prevStatus, model.get('status'), isNew ? true : false);
|
// run loop because we need to run it before the post is saved.
|
||||||
}
|
Ember.run.cancel(psmController.get('debounceId'));
|
||||||
return model;
|
|
||||||
|
psmController.generateAndSetSlug('slug');
|
||||||
|
}
|
||||||
|
|
||||||
|
promise = Ember.RSVP.resolve(psmController.get('lastPromise')).then(function () {
|
||||||
|
return self.get('model').save(options).then(function (model) {
|
||||||
|
if (!options.silent) {
|
||||||
|
self.showSaveNotification(prevStatus, model.get('status'), isNew ? true : false);
|
||||||
|
}
|
||||||
|
return model;
|
||||||
|
});
|
||||||
}).catch(function (errors) {
|
}).catch(function (errors) {
|
||||||
if (!options.silent) {
|
if (!options.silent) {
|
||||||
self.showErrorNotification(prevStatus, self.get('status'), errors);
|
self.showErrorNotification(prevStatus, self.get('status'), errors);
|
||||||
|
@ -234,6 +246,10 @@ var EditorControllerMixin = Ember.Mixin.create(MarkerManager, {
|
||||||
|
|
||||||
return Ember.RSVP.reject(errors);
|
return Ember.RSVP.reject(errors);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
psmController.set('lastPromise', promise);
|
||||||
|
|
||||||
|
return promise;
|
||||||
},
|
},
|
||||||
|
|
||||||
setSaveType: function (newType) {
|
setSaveType: function (newType) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue