mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-11-29 07:09:48 +03:00
48e3bf003d
no issue - https://github.com/ember-cli/eslint-plugin-ember/blob/master/docs/rules/order-in-components.md - https://github.com/ember-cli/eslint-plugin-ember/blob/master/docs/rules/order-in-controllers.md - https://github.com/ember-cli/eslint-plugin-ember/blob/master/docs/rules/order-in-routes.md
95 lines
2.8 KiB
JavaScript
95 lines
2.8 KiB
JavaScript
import $ from 'jquery';
|
|
import Component from '@ember/component';
|
|
import Ember from 'ember';
|
|
import {alias, equal} from '@ember/object/computed';
|
|
import {computed} from '@ember/object';
|
|
import {htmlSafe} from '@ember/string';
|
|
import {isBlank} from '@ember/utils';
|
|
import {inject as service} from '@ember/service';
|
|
|
|
const {Handlebars} = Ember;
|
|
|
|
export default Component.extend({
|
|
ghostPaths: service(),
|
|
|
|
tagName: 'li',
|
|
classNames: ['gh-posts-list-item'],
|
|
classNameBindings: ['active'],
|
|
|
|
post: null,
|
|
active: false,
|
|
|
|
// closure actions
|
|
onClick() {},
|
|
onDoubleClick() {},
|
|
|
|
isFeatured: alias('post.featured'),
|
|
isPage: alias('post.page'),
|
|
isDraft: equal('post.status', 'draft'),
|
|
isPublished: equal('post.status', 'published'),
|
|
isScheduled: equal('post.status', 'scheduled'),
|
|
|
|
authorName: computed('post.author.{name,email}', function () {
|
|
return this.get('post.author.name') || this.get('post.author.email');
|
|
}),
|
|
|
|
authorAvatar: computed('post.author.profileImage', function () {
|
|
return this.get('post.author.profileImage') || `${this.get('ghostPaths.assetRoot')}/img/user-image.png`;
|
|
}),
|
|
|
|
authorAvatarBackground: computed('authorAvatar', function () {
|
|
let authorAvatar = this.get('authorAvatar');
|
|
let safeUrl = Handlebars.Utils.escapeExpression(authorAvatar);
|
|
return htmlSafe(`background-image: url(${safeUrl})`);
|
|
}),
|
|
|
|
// HACK: this is intentionally awful due to time constraints
|
|
// TODO: find a better way to get an excerpt! :)
|
|
subText: computed('post.{plaintext,metaDescription}', function () {
|
|
let text = this.get('post.plaintext');
|
|
let metaDescription = this.get('post.metaDescription');
|
|
|
|
if (!isBlank(metaDescription)) {
|
|
text = metaDescription;
|
|
}
|
|
return `${text.slice(0, 80)}...`;
|
|
}),
|
|
|
|
didReceiveAttrs() {
|
|
if (this.get('active')) {
|
|
this.scrollIntoView();
|
|
}
|
|
},
|
|
|
|
click() {
|
|
this.onClick(this.get('post'));
|
|
},
|
|
|
|
doubleClick() {
|
|
this.onDoubleClick(this.get('post'));
|
|
},
|
|
|
|
scrollIntoView() {
|
|
let element = this.$();
|
|
let offset = element.offset().top;
|
|
let elementHeight = element.height();
|
|
let container = $('.content-list');
|
|
let containerHeight = container.height();
|
|
let currentScroll = container.scrollTop();
|
|
let isBelowTop, isAboveBottom, isOnScreen;
|
|
|
|
isAboveBottom = offset < containerHeight;
|
|
isBelowTop = offset > elementHeight;
|
|
|
|
isOnScreen = isBelowTop && isAboveBottom;
|
|
|
|
if (!isOnScreen) {
|
|
// Scroll so that element is centered in container
|
|
// 40 is the amount of padding on the container
|
|
container.clearQueue().animate({
|
|
scrollTop: currentScroll + offset - 40 - containerHeight / 2
|
|
});
|
|
}
|
|
}
|
|
});
|