Ghost-Admin/app/routes/settings/tags.js

110 lines
2.9 KiB
JavaScript

/* global key */
import $ from 'jquery';
import AuthenticatedRoute from 'ghost-admin/routes/authenticated';
import CurrentUserSettings from 'ghost-admin/mixins/current-user-settings';
import ShortcutsRoute from 'ghost-admin/mixins/shortcuts-route';
export default AuthenticatedRoute.extend(CurrentUserSettings, ShortcutsRoute, {
titleToken: 'Settings - Tags',
shortcuts: null,
init() {
this._super(...arguments);
this.shortcuts = {
'up, k': 'moveUp',
'down, j': 'moveDown',
left: 'focusList',
right: 'focusContent',
c: 'newTag'
};
},
// authors aren't allowed to manage tags
beforeModel() {
this._super(...arguments);
return this.get('session.user')
.then(this.transitionAuthor());
},
// set model to a live array so all tags are shown and created/deleted tags
// are automatically added/removed. Also load all tags in the background,
// pausing to show the loading spinner if no tags have been loaded yet
model() {
let promise = this.store.query('tag', {limit: 'all', include: 'count.posts'});
let tags = this.store.peekAll('tag');
if (this.store.peekAll('tag').get('length') === 0) {
return promise.then(() => tags);
} else {
return tags;
}
},
deactivate() {
this._super(...arguments);
this.send('resetShortcutsScope');
},
actions: {
moveUp() {
if (this.controller.get('tagContentFocused')) {
this.scrollContent(-1);
} else {
this.stepThroughTags(-1);
}
},
moveDown() {
if (this.controller.get('tagContentFocused')) {
this.scrollContent(1);
} else {
this.stepThroughTags(1);
}
},
focusList() {
this.set('controller.keyboardFocus', 'tagList');
},
focusContent() {
this.set('controller.keyboardFocus', 'tagContent');
},
newTag() {
this.transitionTo('settings.tags.new');
},
resetShortcutsScope() {
key.setScope('default');
}
},
stepThroughTags(step) {
let currentTag = this.modelFor('settings.tags.tag');
let tags = this.get('controller.sortedTags');
let length = tags.get('length');
if (currentTag && length) {
let newPosition = tags.indexOf(currentTag) + step;
if (newPosition >= length) {
return;
} else if (newPosition < 0) {
return;
}
this.transitionTo('settings.tags.tag', tags.objectAt(newPosition));
}
},
scrollContent(amount) {
let content = $('.tag-settings-pane');
let scrolled = content.scrollTop();
content.scrollTop(scrolled + 50 * amount);
}
});