Use routers, remove some hacks

This commit is contained in:
Dan Hansen 2011-12-05 23:58:43 -06:00 committed by Dennis Collinson
parent d4219799e4
commit ba9ece0014
9 changed files with 97 additions and 60 deletions

View file

@ -41,16 +41,16 @@
- unless @landing_page - unless @landing_page
= include_javascripts :main = include_javascripts :main
:javascript :javascript
App.user({
current_user: #{current_user.person.as_api_response(:backbone).to_json}
});
Diaspora.I18n.loadLocale(#{get_javascript_strings_for(I18n.locale).to_json}, "#{I18n.locale}"); Diaspora.I18n.loadLocale(#{get_javascript_strings_for(I18n.locale).to_json}, "#{I18n.locale}");
Diaspora.Page = "#{params[:controller].camelcase}#{params[:action].camelcase}"; Diaspora.Page = "#{params[:controller].camelcase}#{params[:action].camelcase}";
- if @backbone
:javascript
window.useBackbone = true;
= yield(:head) = yield(:head)
-unless Rails.env == "production" -unless Rails.env == "production"
:css :css
.translation_missing { .translation_missing {
color: purple; color: purple;
@ -60,8 +60,7 @@
- if @person - if @person
%link{:rel => "alternate", :href => "#{@person.public_url}.atom", :type => "application/atom+xml", :title => "#{t('.public_feed', :name => @person.name)}"} %link{:rel => "alternate", :href => "#{@person.public_url}.atom", :type => "application/atom+xml", :title => "#{t('.public_feed', :name => @person.name)}"}
- metadata = user_signed_in? ? CGI::escape({:current_user => current_user.person.as_api_response(:backbone)}.to_json) : "" %body{:class => "#{yield(:body_class)}"}
%body{:class => "#{yield(:body_class)}", 'data-current-user-metadata' => metadata }
- unless @page == :logged_out - unless @page == :logged_out
- flash.each do |name, msg| - flash.each do |name, msg|

View file

@ -20,6 +20,9 @@ javascripts:
- public/javascripts/collections/* - public/javascripts/collections/*
- public/javascripts/views/* - public/javascripts/views/*
- public/javascripts/routers/stream.js
- public/javascripts/routers/*
- public/javascripts/rails.validations.js - public/javascripts/rails.validations.js
- public/javascripts/rails.js - public/javascripts/rails.js
- public/javascripts/vendor/jquery.hotkeys.js - public/javascripts/vendor/jquery.hotkeys.js

View file

@ -1,9 +1,25 @@
var App = { var App = {
Collections: {}, Collections: {},
Models: {}, Models: {},
routers: {},
Routers: {},
Views: {}, Views: {},
currentUser: function() { user: function(user) {
return $.parseJSON(unescape($("body").data("current-user-metadata"))); if(user) { return this._user = user; }
return this._user;
},
initialize: function() {
_.each(App.Routers, function(Router, name) {
App.routers[name] = new Router;
});
Backbone.history.start({pushState: true});
} }
}; };
$(function() { App.initialize(); });

View file

@ -1,13 +1,10 @@
App.Collections.Stream = Backbone.Collection.extend({ App.Collections.Stream = Backbone.Collection.extend({
url: function() { url: function() {
var path = document.location.pathname; var path = document.location.pathname + ".json";
if(this.models.length) { if(this.models.length) { path += "?max_time=" + _.last(this.models).intTime(); }
return path + ".json?max_time=" + _.last(this.models).intTime();
} return path;
else {
return path + ".json";
}
}, },
model: App.Models.Post, model: App.Models.Post,

View file

@ -0,0 +1,5 @@
App.Routers.CommentStream = App.Routers.Stream.extend({
routes: {
"comment_stream": "stream"
}
});

View file

@ -0,0 +1,5 @@
App.Routers.Mentions = App.Routers.Stream.extend({
routes: {
"mentions": "stream"
}
});

View file

@ -0,0 +1,9 @@
App.Routers.Stream = Backbone.Router.extend({
routes: {
"stream": "stream"
},
stream: function() {
App.stream = new App.Views.Stream;
}
});

View file

@ -1,55 +1,47 @@
$(function() { App.Views.Stream = Backbone.View.extend({
App.Views.Stream = Backbone.View.extend({ events: {
"click #paginate": "loadMore"
},
el: $("#main_stream"), initialize: function(){
this.el = $("#main_stream");
this.template = _.template($("#stream-element-template").html());
template: _.template($('#stream-element-template').html()), _.bindAll(this, "appendPost", "collectionFetched");
events: { this.collection = new App.Collections.Stream;
"click #paginate": "loadMore" this.collection.bind("add", this.appendPost);
}, this.loadMore();
},
initialize: function(){ appendPost: function(model) {
_.bindAll(this, "appendPost", "collectionFetched"); var post = $(this.template($.extend(
model.toJSON(),
App.user()
)));
$(this.el).append(post);
Diaspora.BaseWidget.instantiate("StreamElement", post);
},
this.collection = new App.Collections.Stream; collectionFetched: function() {
this.collection.bind("add", this.appendPost); this.$(".details time").timeago();
this.loadMore(); this.$("label").inFieldLabels();
},
appendPost: function(model) { this.$("#paginate").remove();
var post = $(this.template($.extend( $(this.el).append($("<a>", {
model.toJSON(), href: this.collection.url(),
App.currentUser() id: "paginate"
))); }).text('more'));
$(this.el).append(post); },
Diaspora.BaseWidget.instantiate("StreamElement", post);
},
collectionFetched: function() { loadMore: function(evt) {
this.$("time").timeago(); if(evt) {
this.$("label").inFieldLabels(); evt.preventDefault();
this.$("#paginate").remove();
$(this.el).append($("<a>", {
href: this.collection.url(),
id: "paginate"
}).text('more'));
},
loadMore: function(evt) {
if(evt) {
evt.preventDefault();
}
this.collection.fetch({
add: true,
success: this.collectionFetched
});
} }
});
if(window.useBackbone) { this.collection.fetch({
window.stream = new App.Views.Stream; add: true,
success: this.collectionFetched
});
} }
}); });

View file

@ -0,0 +1,11 @@
describe("App", function() {
describe("user", function() {
it("sets the user if given one and returns the current user", function() {
expect(App.user()).toBeUndefined();
App.user({name: "alice"});
expect(App.user()).toEqual({name: "alice"});
});
});
});