Implement new single post view.

This commit is contained in:
Roger Braun 2013-08-17 14:41:09 +02:00
parent 46d2240ed4
commit 958793e338
9 changed files with 212 additions and 0 deletions

View file

@ -0,0 +1,40 @@
app.pages.SinglePostViewer = app.views.Base.extend({
templateName: "single-post-viewer",
subviews : {
"#single-post-content" : "singlePostContentView",
'#single-post-interactions' : 'singlePostInteractionsView'
},
initialize : function(options) {
this.model = new app.models.Post({ id : options.id });
this.model.preloadOrFetch().done(_.bind(this.initViews, this));
this.model.interactions.fetch() //async, yo, might want to throttle this later.
this.setupLightbox()
},
setupLightbox : function(){
this.lightbox = Diaspora.BaseWidget.instantiate("Lightbox");
this.lightbox.set({
imageParent: '.photo_attachments',
imageSelector: 'img.stream-photo'
});
this.$el.delegate("a.stream-photo-link", "click", this.lightbox.lightboxImageClicked);
},
initViews : function() {
this.singlePostContentView = new app.views.SinglePostContent({model: this.model});
this.singlePostInteractionsView = new app.views.SinglePostInteractions({model: this.model});
this.render();
},
postRenderTemplate : function() {
if(this.model.get("title")){
// formats title to html...
var html_title = app.helpers.textFormatter(this.model.get("title"), this.model);
//... and converts html to plain text
document.title = $('<div>').html(html_title).text();
}
},
});

View file

@ -0,0 +1,3 @@
app.views.SinglePostActions = app.views.Feedback.extend({
templateName: "single-post-viewer/single-post-actions",
});

View file

@ -0,0 +1,15 @@
app.views.SinglePostCommentStream = app.views.CommentStream.extend({
postRenderTemplate: function() {
app.views.CommentStream.prototype.postRenderTemplate.apply(this)
this.$(".new_comment_form_wrapper").removeClass('hidden')
},
presenter: function(){
return _.extend(this.defaultPresenter(), {
moreCommentsCount : 0,
showExpandCommentsLink : false,
commentsCount : this.model.interactions.commentsCount()
})
},
})

View file

@ -0,0 +1,33 @@
app.views.SinglePostContent = app.views.Base.extend({
templateName: 'single-post-viewer/single-post-content',
subviews : {
"#single-post-actions" : "singlePostActionsView",
'#real-post-content' : 'postContentView',
".oembed" : "oEmbedView",
".opengraph" : "openGraphView"
},
initialize : function() {
this.singlePostActionsView = new app.views.SinglePostActions({model: this.model});
this.oEmbedView = new app.views.OEmbed({model : this.model});
this.openGraphView = new app.views.OpenGraph({model : this.model});
this.postContentView = new app.views.StatusMessage({model: this.model});
},
presenter : function() {
return _.extend(this.defaultPresenter(), {
authorIsCurrentUser : this.authorIsCurrentUser(),
showPost : this.showPost(),
text : app.helpers.textFormatter(this.model.get("text"), this.model)
})
},
authorIsCurrentUser : function() {
return app.currentUser.authenticated() && this.model.get("author").id == app.user().id
},
showPost : function() {
return (app.currentUser.get("showNsfw")) || !this.model.get("nsfw")
}
});

View file

@ -0,0 +1,24 @@
app.views.SinglePostInteractions = app.views.Base.extend({
templateName: "single-post-viewer/single-post-interactions",
subviews: {
'#comments': 'commentStreamView'
},
initialize : function() {
this.model.interactions.on('change', this.render, this);
this.commentStreamView = new app.views.SinglePostCommentStream({model: this.model})
},
presenter : function(){
var interactions = this.model.interactions
return {
likes : interactions.likes.toJSON(),
comments : interactions.comments.toJSON(),
reshares : interactions.reshares.toJSON(),
commentsCount : interactions.commentsCount(),
likesCount : interactions.likesCount(),
resharesCount : interactions.resharesCount(),
}
},
});

View file

@ -0,0 +1,24 @@
<div class='pull-right'>
<div class="post-time">
<time datetime="{{created_at}}" />
</div>
<div class='pull-right'>
<a href="#" rel="auth-required" class="label like" title="{{#if userLike}} {{t "viewer.unlike"}} {{else}} {{t "viewer.like"}} {{/if}}">
{{#if userLike}}
<i class="icon-heart icon-red"></i>
{{else}}
<i class="icon-heart icon-white"></i>
{{/if}}
</a>
{{#if userCanReshare}}
<a href="#" rel="auth-required" class="label reshare" title="{{#if userReshare}} {{t "viewer.reshared"}} {{else}} {{t "viewer.reshare"}} {{/if}}">
{{#if userReshare}}
<i class="icon-retweet icon-blue"></i>
{{else}}
<i class="icon-retweet icon-white"></i>
{{/if}}
</a>
{{/if}}
</div>
</div>

View file

@ -0,0 +1,36 @@
<div id='head' class='row-fluid'>
<div id='author' class='span6'>
<div class="img pull-left">
{{#linkToPerson author}}
<div class="profile-image-container small" style="background-image : url('{{avatar.small}}');" data-placement="right"></div>
{{/linkToPerson}}
</div>
<div class="bd">
{{#linkToPerson author}}
{{name}}
{{/linkToPerson}}
{{#if root}}
<div>
<i class="icon-retweet"></i>
{{#linkToPerson root.author}}
{{name}}
{{/linkToPerson}}
</div>
{{/if}}
<div class='public-info'>
{{#unless public}}
<i class="icon-lock"> </i>
{{/unless}}
</div>
</div>
</div>
<div id='single-post-actions' class='span6'>
</div>
</div>
<div id='body' class='row-fluid'>
<div id='real-post-content' class='span12'>
</div>
</div>

View file

@ -0,0 +1,29 @@
<div id='reshares'>
<span class='label reshare'>
<i class='icon-retweet icon-white'></i>
{{resharesCount}}
</span>
{{#each reshares}}
{{{personImage author 'small' "micro"}}}
{{/each}}
</div>
<div id='likes'>
<span class='label like'>
<i class='icon-heart icon-white'></i>
{{likesCount}}
</span>
{{#each likes}}
{{{personImage author 'small' "micro"}}}
{{/each}}
</div>
<div id='comments-meta'>
<span class='label comments'>
<i class='icon-comment icon-white'></i>
{{commentsCount}}
</span>
{{#each comments}}
{{{personImage author 'small' "micro"}}}
{{/each}}
</div>
<div id='comments'>
</div>

View file

@ -0,0 +1,8 @@
<div id='single-post-container' class='container-fluid'>
<div class='row-fluid'>
<div id='single-post-content' class='span6'>
</div>
<div id='single-post-interactions' class='span6'>
</div>
</div>
</div>