users can now favorite posts

This commit is contained in:
danielgrippi 2012-04-22 00:42:16 -07:00
parent 494ba1f9b8
commit 75d25e9475
13 changed files with 120 additions and 33 deletions

View file

@ -10,6 +10,12 @@ app.pages.Profile = app.views.Base.extend({
"#canvas" : "canvasView" "#canvas" : "canvasView"
}, },
events : {
"click #edit-mode-toggle" : "toggleEdit"
},
editMode : false,
initialize : function(options) { initialize : function(options) {
this.model = new app.models.Profile.findByGuid(options.personId) this.model = new app.models.Profile.findByGuid(options.personId)
this.stream = options && options.stream || new app.models.Stream() this.stream = options && options.stream || new app.models.Stream()
@ -17,5 +23,12 @@ app.pages.Profile = app.views.Base.extend({
this.model.bind("change", this.render, this) //this should go on profile info view when it gets Extracted this.model.bind("change", this.render, this) //this should go on profile info view when it gets Extracted
this.canvasView = new app.views.Canvas({model : this.stream}) this.canvasView = new app.views.Canvas({model : this.stream})
},
toggleEdit : function(evt) {
if(evt) { evt.preventDefault() }
this.editMode = !this.editMode
this.$el.toggleClass("edit-mode")
} }
}); });

View file

@ -5,6 +5,7 @@ app.views.SmallFrame = app.views.Base.extend({
templateName : "small-frame", templateName : "small-frame",
events : { events : {
"click .fav" : "favoritePost",
"click .content" : "goToPost" "click .content" : "goToPost"
}, },
@ -19,6 +20,9 @@ app.views.SmallFrame = app.views.Base.extend({
}, },
dimensionsClass : function() { dimensionsClass : function() {
/* by default, make it big if it's a fav */
if(this.model.get("favorite")) { return "x2 width height" }
var firstPhoto = this.model.get("photos")[0] var firstPhoto = this.model.get("photos")[0]
, className = "photo "; , className = "photo ";
@ -48,35 +52,16 @@ app.views.SmallFrame = app.views.Base.extend({
} }
}, },
// textClass : function(){ favoritePost : function(evt) {
// var textLength = this.model.get("text").length if(evt) { evt.stopImmediatePropagation(); evt.preventDefault() }
// , baseClass = "text ";
// if(this.model.get("favorite")) {
// if(textLength <= 20){ this.model.save({favorite : false})
// return baseClass + "extra-small" } else {
// } else if(textLength <= 140) { this.model.save({favorite : true})
// return baseClass + "small" this.$el.addClass("x2 width height")
// } else if(textLength <= 500) { }
// return baseClass + "medium" },
// } else {
// return baseClass + "large"
// }
// },
//
// photoClass : function(){
// var photoCount = this.model.get('photos').length
// , baseClass = "photo ";
//
// if(photoCount == 0 ) {
// return ""
// } else if(photoCount == 1){
// return baseClass + 'one'
// } else if(photoCount == 2 ) {
// return baseClass + 'two'
// } else {
// return baseClass + 'many'
// }
// },
goToPost : function() { goToPost : function() {
app.router.navigate(this.model.url(), true) app.router.navigate(this.model.url(), true)

View file

@ -8,4 +8,5 @@
/* profile */ /* profile */
@import 'new_styles/canvas'; @import 'new_styles/canvas';
@import 'new_styles/spinner'; @import 'new_styles/spinner';
@import 'new_styles/profile';

View file

@ -96,6 +96,13 @@ body {
} }
} }
.fav {
position : absolute;
z-index : 100;
top : 10px;
right : 10px;
}
/* larger declarations */ /* larger declarations */
&.x2.width .content { @include wide(); } &.x2.width .content { @include wide(); }
&.x2.height .content { @include tall(); } &.x2.height .content { @include tall(); }

View file

@ -0,0 +1,36 @@
#edit-controls {
@include transition(opacity);
@include opacity(0);
position : fixed;
width : 100%;
top : 0;
left : 0;
text-align : center;
z-index : 999;
background-color : rgba(0,0,0,0.6);
color : #eee;
padding : 10px 0;
}
.canvas-frame .fav {
@include transition(opacity);
@include opacity(0)
}
/* functionality under edit mode */
.edit-mode {
#edit-controls {
@include opacity(1);
//display : block;
}
.canvas-frame .fav {
@include opacity(1)
}
}

View file

@ -1,3 +1,7 @@
<div id="edit-controls">
editing...
</div>
<section id="profile_info"> <section id="profile_info">
<h1>{{full_name}}</h1> <h1>{{full_name}}</h1>
<dl> <dl>
@ -8,7 +12,8 @@
</dl> </dl>
</section> </section>
<a href="/posts/new">COMPOSE</a> <a href="/posts/new">COMPOSE</a> |
<a href="#" id="edit-mode-toggle">EDIT</a>
<section id="canvas"> <section id="canvas">

View file

@ -1,5 +1,13 @@
<div class="content"> <div class="content">
<a href="#" class="fav">
{{#if favorite}}
NOT WORTHY
{{else}}
FAVE IT
{{/ if}}
</a>
{{#if photos}} {{#if photos}}
<div class="image-container"> <div class="image-container">
{{#each photos}} {{#each photos}}

View file

@ -79,6 +79,15 @@ class PostsController < ApplicationController
end end
end end
def update
@post = current_user.posts.find(params[:id])
if @post
@post.favorite = !@post.favorite
@post.save
render :nothing => true, :status => 202
end
end
private private
def find_by_guid_or_id_with_current_user(id) def find_by_guid_or_id_with_current_user(id)

View file

@ -44,6 +44,7 @@ class Post < ActiveRecord::Base
t.add :mentioned_people t.add :mentioned_people
t.add :photos t.add :photos
t.add :nsfw t.add :nsfw
t.add :favorite
end end
xml_attr :provider_display_name xml_attr :provider_display_name

View file

@ -11,7 +11,7 @@ Diaspora::Application.routes.draw do
resources :status_messages, :only => [:new, :create] resources :status_messages, :only => [:new, :create]
resources :posts, :only => [:show, :new, :destroy] do resources :posts do
resources :likes, :only => [:create, :destroy, :index] resources :likes, :only => [:create, :destroy, :index]
resources :participations, :only => [:create, :destroy, :index] resources :participations, :only => [:create, :destroy, :index]
resources :comments, :only => [:new, :create, :destroy, :index] resources :comments, :only => [:new, :create, :destroy, :index]

View file

@ -0,0 +1,5 @@
class AddFavoriteToPost < ActiveRecord::Migration
def change
add_column :posts, :favorite, :boolean, :default => 0
end
end

View file

@ -11,7 +11,7 @@
# #
# It's strongly recommended to check this file into your version control system. # It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20120420185823) do ActiveRecord::Schema.define(:version => 20120422072257) do
create_table "account_deletions", :force => true do |t| create_table "account_deletions", :force => true do |t|
t.string "diaspora_handle" t.string "diaspora_handle"
@ -340,6 +340,7 @@ ActiveRecord::Schema.define(:version => 20120420185823) do
t.integer "reshares_count", :default => 0 t.integer "reshares_count", :default => 0
t.datetime "interacted_at" t.datetime "interacted_at"
t.string "frame_name" t.string "frame_name"
t.boolean "favorite", :default => false
end end
add_index "posts", ["author_id", "root_guid"], :name => "index_posts_on_author_id_and_root_guid", :unique => true add_index "posts", ["author_id", "root_guid"], :name => "index_posts_on_author_id_and_root_guid", :unique => true

View file

@ -29,4 +29,20 @@ describe("app.pages.Profile", function(){
this.page.render(); this.page.render();
}); });
}); });
describe("edit mode", function(){
describe("toggle edit", function(){
it("changes the page's global edit state", function(){
expect(this.page.editMode).toBeFalsy()
this.page.toggleEdit()
expect(this.page.editMode).toBeTruthy()
})
it("changes the page's class to 'edit-mode'", function(){
expect(this.page.$el).not.toHaveClass('edit-mode')
this.page.toggleEdit()
expect(this.page.$el).toHaveClass('edit-mode')
})
})
})
}); });