Skip to content

Commit

Permalink
Use Ember.inject instead of needs and initializers
Browse files Browse the repository at this point in the history
No Issue
- Switches to the newer style of dependency injection.
- Instead of injection Controllers via "needs," use
  Ember.inject.controller().
- Get rid of initializers that were only injecting objects
  into various factories. Converts these objects into Ember.Service
  objects and declaratively inject them where needed via
  Ember.inject.service().  The added benefit to this is that it's no
  longer a mystery where these properties/methods come from and it's
  straightforward to inject them where needed.
  • Loading branch information
jaswilli committed May 27, 2015
1 parent 3ece83f commit c3ad1ae
Show file tree
Hide file tree
Showing 61 changed files with 377 additions and 483 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ CHANGELOG.md

config.js
/core/client/config.js
!/core/client/app/services/config.js

# Built asset files
/core/built
Expand Down
9 changes: 4 additions & 5 deletions core/client/app/components/gh-alert.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import Ember from 'ember';

var AlertComponent = Ember.Component.extend({
export default Ember.Component.extend({
tagName: 'article',
classNames: ['gh-alert', 'gh-alert-blue'],
classNameBindings: ['typeClass'],

notifications: Ember.inject.service(),

typeClass: Ember.computed(function () {
var classes = '',
message = this.get('message'),
Expand All @@ -31,10 +33,7 @@ var AlertComponent = Ember.Component.extend({

actions: {
closeNotification: function () {
var self = this;
self.notifications.closeNotification(self.get('message'));
this.get('notifications').closeNotification(this.get('message'));
}
}
});

export default AlertComponent;
3 changes: 2 additions & 1 deletion core/client/app/components/gh-blog-url.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import Ember from 'ember';

var blogUrl = Ember.Component.extend({
tagName: ''
tagName: '',
config: Ember.inject.service()
});

export default blogUrl;
6 changes: 3 additions & 3 deletions core/client/app/components/gh-dropdown-button.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import Ember from 'ember';
import DropdownMixin from 'ghost/mixins/dropdown-mixin';

var DropdownButton = Ember.Component.extend(DropdownMixin, {
export default Ember.Component.extend(DropdownMixin, {
tagName: 'button',
attributeBindings: 'role',
role: 'button',

// matches with the dropdown this button toggles
dropdownName: null,

dropdown: Ember.inject.service(),

// Notify dropdown service this dropdown should be toggled
click: function (event) {
this._super(event);
this.get('dropdown').toggleDropdown(this.get('dropdownName'), this);
}
});

export default DropdownButton;
8 changes: 4 additions & 4 deletions core/client/app/components/gh-dropdown.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import Ember from 'ember';
import DropdownMixin from 'ghost/mixins/dropdown-mixin';

var GhostDropdown = Ember.Component.extend(DropdownMixin, {
export default Ember.Component.extend(DropdownMixin, {
classNames: 'ghost-dropdown',
classNameBindings: ['fadeIn:fade-in-scale:fade-out', 'isOpen:open:closed'],

name: null,
closeOnClick: false,

Expand All @@ -17,7 +19,7 @@ var GhostDropdown = Ember.Component.extend(DropdownMixin, {
return this.get('isOpen') && !this.get('closing');
}),

classNameBindings: ['fadeIn:fade-in-scale:fade-out', 'isOpen:open:closed'],
dropdown: Ember.inject.service(),

open: function () {
this.set('isOpen', true);
Expand Down Expand Up @@ -88,5 +90,3 @@ var GhostDropdown = Ember.Component.extend(DropdownMixin, {
dropdownService.off('toggle', this, this.toggle);
}
});

export default GhostDropdown;
2 changes: 2 additions & 0 deletions core/client/app/components/gh-ed-preview.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import Ember from 'ember';
import uploader from 'ghost/assets/lib/uploader';

var Preview = Ember.Component.extend({
config: Ember.inject.service(),

didInsertElement: function () {
this.set('scrollWrapper', this.$().closest('.entry-preview-content'));
Ember.run.scheduleOnce('afterRender', this, this.dropzoneHandler);
Expand Down
2 changes: 2 additions & 0 deletions core/client/app/components/gh-nav-menu.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ export default Ember.Component.extend({
classNames: ['gh-nav'],
classNameBindings: ['open'],

config: Ember.inject.service(),

open: false,

autoNav: null,
Expand Down
13 changes: 7 additions & 6 deletions core/client/app/components/gh-notification.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import Ember from 'ember';

var NotificationComponent = Ember.Component.extend({
export default Ember.Component.extend({
tagName: 'article',
classNames: ['gh-notification', 'gh-notification-green'],
classNameBindings: ['typeClass'],

message: null,

notifications: Ember.inject.service(),

typeClass: Ember.computed(function () {
var classes = '',
message = this.get('message'),
Expand Down Expand Up @@ -34,17 +38,14 @@ var NotificationComponent = Ember.Component.extend({

self.$().on('animationend webkitAnimationEnd oanimationend MSAnimationEnd', function (event) {
if (event.originalEvent.animationName === 'fade-out') {
self.notifications.removeObject(self.get('message'));
self.get('notifications').removeObject(self.get('message'));
}
});
},

actions: {
closeNotification: function () {
var self = this;
self.notifications.closeNotification(self.get('message'));
this.get('notifications').closeNotification(this.get('message'));
}
}
});

export default NotificationComponent;
9 changes: 5 additions & 4 deletions core/client/app/components/gh-notifications.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import Ember from 'ember';
var NotificationsComponent = Ember.Component.extend({

export default Ember.Component.extend({
tagName: 'aside',
classNames: 'gh-notifications',

messages: Ember.computed.filter('notifications', function (notification) {
notifications: Ember.inject.service(),

messages: Ember.computed.filter('notifications.content', function (notification) {
var displayStatus = (typeof notification.toJSON === 'function') ?
notification.get('status') : notification.status;

return displayStatus === 'passive';
})
});

export default NotificationsComponent;
8 changes: 4 additions & 4 deletions core/client/app/components/gh-popover-button.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import Ember from 'ember';
import DropdownButton from 'ghost/components/gh-dropdown-button';

var PopoverButton = DropdownButton.extend({
click: Ember.K, // We don't want clicks on popovers, but dropdowns have them. So `K`ill them here.
export default DropdownButton.extend({
dropdown: Ember.inject.service(),

click: Ember.K,

mouseEnter: function (event) {
this._super(event);
Expand All @@ -14,5 +16,3 @@ var PopoverButton = DropdownButton.extend({
this.get('dropdown').toggleDropdown(this.get('popoverName'), this);
}
});

export default PopoverButton;
8 changes: 4 additions & 4 deletions core/client/app/components/gh-popover.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Ember from 'ember';
import GhostDropdown from 'ghost/components/gh-dropdown';

var GhostPopover = GhostDropdown.extend({
classNames: 'ghost-popover'
export default GhostDropdown.extend({
classNames: 'ghost-popover',
dropdown: Ember.inject.service()
});

export default GhostPopover;
2 changes: 2 additions & 0 deletions core/client/app/components/gh-upload-modal.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import cajaSanitizers from 'ghost/utils/caja-sanitizers';
var UploadModal = ModalDialog.extend({
layoutName: 'components/gh-modal-dialog',

config: Ember.inject.service(),

didInsertElement: function () {
this._super();
upload.call(this.$('.js-drop-zone'), {fileStorage: this.get('config.fileStorage')});
Expand Down
2 changes: 2 additions & 0 deletions core/client/app/components/gh-uploader.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import uploader from 'ghost/assets/lib/uploader';
var PostImageUploader = Ember.Component.extend({
classNames: ['image-uploader', 'js-post-image-upload'],

config: Ember.inject.service(),

imageSource: Ember.computed('image', function () {
return this.get('image') || '';
}),
Expand Down
4 changes: 3 additions & 1 deletion core/client/app/components/gh-url-preview.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ var urlPreview = Ember.Component.extend({
prefix: null,
slug: null,

config: Ember.inject.service(),

url: Ember.computed('slug', function () {
// Get the blog URL and strip the scheme
var blogUrl = this.get('config').blogUrl,
var blogUrl = this.get('config.blogUrl'),
noSchemeBlogUrl = blogUrl.substr(blogUrl.indexOf('://') + 3), // Remove `http[s]://`

// Get the prefix and slug values
Expand Down
2 changes: 2 additions & 0 deletions core/client/app/controllers/application.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import Ember from 'ember';

export default Ember.Controller.extend({
dropdown: Ember.inject.service(),

// jscs: disable
signedOut: Ember.computed.match('currentPath', /(signin|signup|setup|reset)/),
// jscs: enable
Expand Down
5 changes: 1 addition & 4 deletions core/client/app/controllers/modals/copy-html.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import Ember from 'ember';
var CopyHTMLController = Ember.Controller.extend({

export default Ember.Controller.extend({
generatedHTML: Ember.computed.alias('model.generatedHTML')

});

export default CopyHTMLController;
7 changes: 5 additions & 2 deletions core/client/app/controllers/modals/delete-all.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,21 @@ import Ember from 'ember';
import {request as ajax} from 'ic-ajax';

export default Ember.Controller.extend({
ghostPaths: Ember.inject.service('ghost-paths'),
notifications: Ember.inject.service(),

actions: {
confirmAccept: function () {
var self = this;

ajax(this.get('ghostPaths.url').api('db'), {
type: 'DELETE'
}).then(function () {
self.notifications.showSuccess('All content deleted from database.');
self.get('notifications').showSuccess('All content deleted from database.');
self.store.unloadAll('post');
self.store.unloadAll('tag');
}).catch(function (response) {
self.notifications.showErrors(response);
self.get('notifications').showErrors(response);
});
},

Expand Down
12 changes: 7 additions & 5 deletions core/client/app/controllers/modals/delete-post.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import Ember from 'ember';
var DeletePostController = Ember.Controller.extend({

export default Ember.Controller.extend({
dropdown: Ember.inject.service(),
notifications: Ember.inject.service(),

actions: {
confirmAccept: function () {
var self = this,
Expand All @@ -11,9 +15,9 @@ var DeletePostController = Ember.Controller.extend({
model.destroyRecord().then(function () {
self.get('dropdown').closeDropdowns();
self.transitionToRoute('posts.index');
self.notifications.showSuccess('Your post has been deleted.', {delayed: true});
self.get('notifications').showSuccess('Your post has been deleted.', {delayed: true});
}, function () {
self.notifications.showError('Your post could not be deleted. Please try again.');
self.get('notifications').showError('Your post could not be deleted. Please try again.');
});
},

Expand All @@ -33,5 +37,3 @@ var DeletePostController = Ember.Controller.extend({
}
}
});

export default DeletePostController;
11 changes: 6 additions & 5 deletions core/client/app/controllers/modals/delete-tag.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import Ember from 'ember';
var DeleteTagController = Ember.Controller.extend({

export default Ember.Controller.extend({
notifications: Ember.inject.service(),

postInflection: Ember.computed('model.post_count', function () {
return this.get('model.post_count') > 1 ? 'posts' : 'post';
}),
Expand All @@ -13,9 +16,9 @@ var DeleteTagController = Ember.Controller.extend({
this.send('closeSettingsMenu');

tag.destroyRecord().then(function () {
self.notifications.showSuccess('Deleted ' + name);
self.get('notifications').showSuccess('Deleted ' + name);
}).catch(function (error) {
self.notifications.showAPIError(error);
self.get('notifications').showAPIError(error);
});
},

Expand All @@ -35,5 +38,3 @@ var DeleteTagController = Ember.Controller.extend({
}
}
});

export default DeleteTagController;
11 changes: 6 additions & 5 deletions core/client/app/controllers/modals/delete-user.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import Ember from 'ember';
var DeleteUserController = Ember.Controller.extend({

export default Ember.Controller.extend({
notifications: Ember.inject.service(),

userPostCount: Ember.computed('model.id', function () {
var promise,
query = {
Expand Down Expand Up @@ -28,9 +31,9 @@ var DeleteUserController = Ember.Controller.extend({
user.destroyRecord().then(function () {
self.store.unloadAll('post');
self.transitionToRoute('settings.users');
self.notifications.showSuccess('The user has been deleted.', {delayed: true});
self.get('notifications').showSuccess('The user has been deleted.', {delayed: true});
}, function () {
self.notifications.showError('The user could not be deleted. Please try again.');
self.get('notifications').showError('The user could not be deleted. Please try again.');
});
},

Expand All @@ -50,5 +53,3 @@ var DeleteUserController = Ember.Controller.extend({
}
}
});

export default DeleteUserController;
Loading

0 comments on commit c3ad1ae

Please sign in to comment.