Fixed follow link in UserDetailView

This commit is contained in:
Fergal Moran
2014-01-09 23:00:37 +00:00
parent a72f6afa57
commit 863fda91fb
8 changed files with 274 additions and 260 deletions

View File

@@ -1,140 +1,137 @@
// Generated by CoffeeScript 1.4.0
(function() {
define(['backbone', 'marionette', 'vent', 'utils', 'app.lib/social', 'app.lib/router', 'app.lib/panningRegion', 'app.lib/realtimeController', 'app.lib/audioController', 'models/user/userItem', 'models/mix/mixCollection', 'views/widgets/headerView', 'views/sidebar/sidebarView'], function(Backbone, Marionette, vent, utils, social, DssRouter, PanningRegion, RealtimeController, AudioController, UserItem, MixCollection, HeaderView, SidebarView) {
var App, sidebarView;
App = new Marionette.Application();
App.audioController = new AudioController();
App.realtimeController = new RealtimeController();
App.realtimeController.startSocketIO();
App.vent.on("routing:started", function() {
var enablePushState, pushState;
console.log("App(vent): routing:started");
enablePushState = true;
pushState = !!(enablePushState && window.history && window.history.pushState);
Backbone.history.start({
pushState: pushState,
hashChange: true
});
return true;
define(['backbone', 'marionette', 'vent', 'utils', 'app.lib/social', 'app.lib/router', 'app.lib/panningRegion', 'app.lib/realtimeController', 'app.lib/audioController', 'models/user/userItem', 'models/mix/mixCollection', 'views/widgets/headerView', 'views/sidebar/sidebarView'], function(Backbone, Marionette, vent, utils, social, DssRouter, PanningRegion, RealtimeController, AudioController, UserItem, MixCollection, HeaderView, SidebarView) {
var App, sidebarView;
App = new Marionette.Application();
App.audioController = new AudioController();
App.realtimeController = new RealtimeController();
App.realtimeController.startSocketIO();
App.vent.on("routing:started", function() {
var enablePushState, pushState;
console.log("App(vent): routing:started");
enablePushState = true;
pushState = !!(enablePushState && window.history && window.history.pushState);
Backbone.history.start({
pushState: pushState,
hashChange: true
});
App.addRegions({
headerRegion: "#header",
contentRegion: {
selector: "#content"
},
footerRegion: "#footer",
sidebarRegion: "#sidebar"
});
App.addInitializer(function() {
console.log("App: routing starting");
App.Router = new DssRouter();
return App.vent.trigger("routing:started");
});
App.addInitializer(function() {
$(document).on("click", "a[href]:not([data-bypass])", function(evt) {
var href, root;
href = {
prop: $(this).prop("href"),
attr: $(this).attr("href")
};
root = location.protocol + "//" + location.host + (App.root || '/');
if (href.prop.slice(0, root.length) === root) {
evt.preventDefault();
App.Router.navigate(href.attr, true);
return true;
}
});
return true;
});
App.addInitializer(function() {
this.listenTo(vent, "app:login", function() {
utils.modal("/dlg/LoginView");
return true;
});
this.listenTo(vent, "app:donate", function() {
console.log("App: donate");
utils.modal("/dlg/Donate");
return true;
});
this.listenTo(vent, "mix:favourite", function(model) {
console.log("App(vent): mix:favourite");
model.save('favourited', !model.get('favourited'), {
patch: true
});
return true;
});
this.listenTo(vent, "mix:like", function(model, id, success, favourite) {
console.log("App(vent): mix:like");
model.save('liked', !model.get('liked'), {
patch: true
});
return true;
});
this.listenTo(vent, "mix:delete", function(model) {
console.log("App(vent): mix:like");
return utils.messageBox("/dlg/DeleteMixConfirm", {
yes: function() {
console.log("Controller: mixDeleteYES!!");
mix.destroy();
return Backbone.history.navigate("/", {
trigger: true
});
},
no: function() {
return console.log("Controller: mixDeleteNO!!");
}
});
});
this.listenTo(vent, "user:follow", function(model) {
var target, user,
_this = this;
console.log("App(vent): user:follow");
user = new UserItem({
id: com.podnoms.settings.currentUser
});
target = com.podnoms.settings.urlRoot + "user/" + model.get("id") + "/";
user.fetch({
success: function() {
var f, newFollowers;
if (!model.get("is_following")) {
newFollowers = user.get("following").concat([target]);
user.save({
"following": newFollowers,
"is_following": true,
patch: true
});
model.set("is_following", true);
} else {
f = user.get("following");
f.splice(f.indexOf(target), 1);
user.save({
"following": f,
"is_following": false,
patch: true
});
model.set("is_following", false);
}
}
});
return true;
});
return this.listenTo(vent, "mix:share", function(mode, model) {
console.log("App(vent): mix:share (" + mode + ")");
if (mode === "facebook") {
social.sharePageToFacebook(model);
} else if (mode === "twitter") {
social.sharePageToTwitter(model);
} else if (mode === "embed") {
social.generateEmbedCode(model);
}
return true;
});
});
App.headerRegion.show(new HeaderView());
sidebarView = new SidebarView();
App.sidebarRegion.show(sidebarView);
return App;
return true;
});
}).call(this);
App.addRegions({
headerRegion: "#header",
contentRegion: {
selector: "#content"
},
footerRegion: "#footer",
sidebarRegion: "#sidebar"
});
App.addInitializer(function() {
console.log("App: routing starting");
App.Router = new DssRouter();
return App.vent.trigger("routing:started");
});
App.addInitializer(function() {
$(document).on("click", "a[href]:not([data-bypass])", function(evt) {
var href, root;
href = {
prop: $(this).prop("href"),
attr: $(this).attr("href")
};
root = location.protocol + "//" + location.host + (App.root || '/');
if (href.prop.slice(0, root.length) === root) {
evt.preventDefault();
App.Router.navigate(href.attr, true);
return true;
}
});
return true;
});
App.addInitializer(function() {
this.listenTo(vent, "app:login", function() {
utils.modal("/dlg/LoginView");
return true;
});
this.listenTo(vent, "app:donate", function() {
console.log("App: donate");
utils.modal("/dlg/Donate");
return true;
});
this.listenTo(vent, "mix:favourite", function(model) {
console.log("App(vent): mix:favourite");
model.save('favourited', !model.get('favourited'), {
patch: true
});
return true;
});
this.listenTo(vent, "mix:like", function(model, id, success, favourite) {
console.log("App(vent): mix:like");
model.save('liked', !model.get('liked'), {
patch: true
});
return true;
});
this.listenTo(vent, "mix:delete", function(model) {
console.log("App(vent): mix:like");
return utils.messageBox("/dlg/DeleteMixConfirm", {
yes: function() {
console.log("Controller: mixDeleteYES!!");
mix.destroy();
return Backbone.history.navigate("/", {
trigger: true
});
},
no: function() {
return console.log("Controller: mixDeleteNO!!");
}
});
});
this.listenTo(vent, "user:follow", function(model) {
var target, user,
_this = this;
console.log("App(vent): user:follow");
user = new UserItem({
id: com.podnoms.settings.currentUser
});
target = com.podnoms.settings.urlRoot + "user/" + model.get("id") + "/";
user.fetch({
success: function() {
var f, newFollowers;
if (!model.get("is_following")) {
newFollowers = user.get("following").concat([target]);
user.save({
"following": newFollowers,
"is_following": true,
patch: true
});
model.set("is_following", true);
} else {
f = user.get("following");
f.splice(f.indexOf(target), 1);
user.save({
"following": f,
"is_following": false,
patch: true
});
model.set("is_following", false);
}
}
});
return true;
});
return this.listenTo(vent, "mix:share", function(mode, model) {
console.log("App(vent): mix:share (" + mode + ")");
if (mode === "facebook") {
social.sharePageToFacebook(model);
} else if (mode === "twitter") {
social.sharePageToTwitter(model);
} else if (mode === "embed") {
social.generateEmbedCode(model);
}
return true;
});
});
App.headerRegion.show(new HeaderView());
sidebarView = new SidebarView();
App.sidebarRegion.show(sidebarView);
return App;
});

View File

@@ -1,41 +1,38 @@
// Generated by CoffeeScript 1.4.0
(function() {
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
define(['app', 'moment', 'app.lib/dssView', 'vent', 'text!/tpl/UserListItemView'], function(App, moment, DssView, vent, Template) {
var UserItemView;
UserItemView = (function(_super) {
define(['app', 'moment', 'app.lib/dssView', 'vent', 'text!/tpl/UserListItemView'], function(App, moment, DssView, vent, Template) {
var UserItemView;
UserItemView = (function(_super) {
__extends(UserItemView, _super);
__extends(UserItemView, _super);
function UserItemView() {
this.initialize = __bind(this.initialize, this);
return UserItemView.__super__.constructor.apply(this, arguments);
function UserItemView() {
this.initialize = __bind(this.initialize, this);
return UserItemView.__super__.constructor.apply(this, arguments);
}
UserItemView.prototype.template = _.template(Template);
UserItemView.prototype.className = "row";
UserItemView.prototype.events = {
"click #follow-button": function() {
return vent.trigger("user:follow", this.model);
},
"click #follow-button-login": function() {
return vent.trigger("app:login", this.model);
}
};
UserItemView.prototype.template = _.template(Template);
UserItemView.prototype.initialize = function() {
return this.listenTo(this.model, 'change:is_following', this.render);
};
UserItemView.prototype.className = "row";
UserItemView.prototype.events = {
"click #follow-button": function() {
return vent.trigger("user:follow", this.model);
},
"click #follow-button-login": function() {
return vent.trigger("app:login", this.model);
}
};
UserItemView.prototype.initialize = function() {
return this.listenTo(this.model, 'change:is_following', this.render);
};
return UserItemView;
})(DssView);
return UserItemView;
});
}).call(this);
})(DssView);
return UserItemView;
});

View File

@@ -19,7 +19,6 @@ define ['jquery', 'marionette', 'models/user/userCollection', 'views/user/userIt
return
_fetchCollection: (options) =>
debugger
@collection.fetch(
data: options
success: =>

View File

@@ -41,7 +41,6 @@ define(['jquery', 'marionette', 'models/user/userCollection', 'views/user/userIt
};
UserListView.prototype._fetchCollection = function(options) {
debugger;
var _this = this;
return this.collection.fetch({
data: options,

View File

@@ -4,6 +4,13 @@ define ['app', 'utils', 'moment', 'marionette', 'vent', 'app.lib/editableView',
class UserProfileView extends EditableView
template: _.template(Template)
events:
"click #follow-button": -> vent.trigger("user:follow", @model)
"click #follow-button-login": -> vent.trigger("app:login", @model)
initialize: =>
@listenTo(@model, 'change:is_following', @render)
templateHelpers:
humanise: (date)->
moment(date).fromNow()

View File

@@ -1,5 +1,6 @@
// Generated by CoffeeScript 1.4.0
var __hasProp = {}.hasOwnProperty,
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
define(['app', 'utils', 'moment', 'marionette', 'vent', 'app.lib/editableView', 'models/user/userItem', 'text!/tpl/UserProfileView', 'ace-editable', 'wysiwyg'], function(App, utils, moment, Marionette, vent, EditableView, UserItem, Template) {
@@ -9,11 +10,25 @@ define(['app', 'utils', 'moment', 'marionette', 'vent', 'app.lib/editableView',
__extends(UserProfileView, _super);
function UserProfileView() {
this.initialize = __bind(this.initialize, this);
return UserProfileView.__super__.constructor.apply(this, arguments);
}
UserProfileView.prototype.template = _.template(Template);
UserProfileView.prototype.events = {
"click #follow-button": function() {
return vent.trigger("user:follow", this.model);
},
"click #follow-button-login": function() {
return vent.trigger("app:login", this.model);
}
};
UserProfileView.prototype.initialize = function() {
return this.listenTo(this.model, 'change:is_following', this.render);
};
UserProfileView.prototype.templateHelpers = {
humanise: function(date) {
return moment(date).fromNow();

View File

@@ -107,4 +107,4 @@
</div>
<div class="col-sm-12">
<div class="hr hr-18 dotted hr-double"></div>
</div>
</div>

View File

@@ -6,9 +6,9 @@
<div>
<span class="profile-picture">
<img id="avatar"
class="editable img-responsive image-user-profile"
alt="Avatar Image"
src="<%= avatar_image %>">
class="editable img-responsive image-user-profile"
alt="Avatar Image"
src="<%= avatar_image %>">
</span>
<div class="space-4"></div>
@@ -51,106 +51,106 @@
<div class="profile-contact-links align-left">
{% if user.is_authenticated %}
<a id="follow-button" class="btn btn-link <% if (is_following) { %> following-disabled <% } %>" data-bypass="true">
<i class="icon-plus-sign bigger-120 green"></i>
Follow<% if (is_following) { %>ing<% } %>
<i class="icon-plus-sign bigger-120 <% if (is_following) { %>red<% } else { %>green <%}%>"></i>
<% if (is_following) { %>Unfollow<% } else { %>Follow<%}%>
</a>
{% else %}
<a id="follow-button-login" class="btn btn-link" data-bypass="true">
<i class="icon-plus-sign bigger-120 green"></i>
Follow<% if (is_following) { %>ing<% } %>
Login to follow
</a>
{% endif %}
<br>
{% comment %}
<a class="btn btn-link" href="#">
<i class="icon-envelope bigger-120 pink"></i>
Send a message
</a>
{% endcomment %}
<a class="btn btn-link" href="<%= url %>">
<i class="icon-globe bigger-125 blue"></i>
Profile Link
</a>
</div>
<div class="space-6"></div>
<br>
{% comment %}
<div class="profile-social-links center">
<a href="#" class="tooltip-info" title="" data-original-title="Visit my Facebook">
<i class="middle icon-facebook-sign icon-2x blue"></i>
</a>
<a href="#" class="tooltip-info" title="" data-original-title="Visit my Twitter">
<i class="middle icon-twitter-sign icon-2x light-blue"></i>
</a>
<a href="#" class="tooltip-error" title="" data-original-title="Visit my Pinterest">
<i class="middle icon-pinterest-sign icon-2x red"></i>
</a>
</div>
<a class="btn btn-link" href="#">
<i class="icon-envelope bigger-120 pink"></i>
Send a message
</a>
{% endcomment %}
<a class="btn btn-link" href="<%= url %>">
<i class="icon-globe bigger-125 blue"></i>
Profile Link
</a>
</div>
</div>
<div class="space-6"></div>
{% comment %}
<div class="profile-social-links center">
<a href="#" class="tooltip-info" title="" data-original-title="Visit my Facebook">
<i class="middle icon-facebook-sign icon-2x blue"></i>
</a>
<div class="col-xs-12 col-sm-9">
<div class="center">
<a href="/user/<%= slug %>/mixes" class="btn btn-app btn-sm btn-pink">
<i class="icon-music bigger-230"></i>
<span class="smaller-90">Mixes</span>
<span class="badge badge-warning"><%= mix_count%></span>
<a href="#" class="tooltip-info" title="" data-original-title="Visit my Twitter">
<i class="middle icon-twitter-sign icon-2x light-blue"></i>
</a>
<a href="/user/<%= slug %>/favourites" class="btn btn-app btn-sm btn-danger">
<i class="icon-star bigger-230"></i>
<span class="smaller-90">Favourites</span>
<span class="badge badge-warning"><%= favourite_count %></span>
</a>
<a href="/user/<%= slug %>/likes" class="btn btn-app btn-sm btn-purple">
<i class="icon-heart /bigger-230"></i>
<span class="smaller-90">Likes</span>
<span class="badge badge-warning"><%= like_count %></span>
</a>
<a href="/user/<%= slug %>/followers" class="btn btn-app btn-sm btn-default">
<i class="icon-check bigger-230"></i>
<span class="smaller-90">Followers</span>
<span class="badge badge-warning"><%= followers.length %></span>
</a>
<a href="/user/<%= slug %>/following" class="btn btn-app btn-sm btn-warning">
<i class="icon-share bigger-230"></i>
<span class="smaller-90">Following</span>
<span class="badge badge-warning"><%= following.length %></span>
<a href="#" class="tooltip-error" title="" data-original-title="Visit my Pinterest">
<i class="middle icon-pinterest-sign icon-2x red"></i>
</a>
</div>
<div class="space-12"></div>
<div class="profile-user-info profile-user-info-striped">
<div class="profile-info-row">
<div class="profile-info-name"> Location</div>
<div class="profile-info-value">
<i class="icon-map-marker light-orange bigger-110"></i>
<span class="usereditable" id="city" style="display: inline;"><%= city %></span>
<span class="usereditable" id="country" style="display: inline;"><%= country %></span>
</div>
</div>
<div class="profile-info-row">
<div class="profile-info-name"> Joined</div>
<div class="profile-info-value">
<span id="signup" style="display: inline;"><%= humanise(date_joined) %></span>
</div>
</div>
<div class="profile-info-row">
<div class="profile-info-name"> Last Online</div>
<div class="profile-info-value">
<span id="login" style="display: inline; background-color: rgba(0, 0, 0, 0);"><%= humanise(last_login) %></span>
</div>
</div>
<div class="profile-info-row">
<div class="profile-info-name"> About Me</div>
<div class="profile-info-value">
<div class="usereditable" id="about" style="display: inline; white-space:pre-wrap;"><%= description %></div>
</div>
</div>
</div>
<div class="space-20"></div>
{% endcomment %}
</div>
</div>
<div class="col-xs-12 col-sm-9">
<div class="center">
<a href="/user/<%= slug %>/mixes" class="btn btn-app btn-sm btn-pink">
<i class="icon-music bigger-230"></i>
<span class="smaller-90">Mixes</span>
<span class="badge badge-warning"><%= mix_count%></span>
</a>
<a href="/user/<%= slug %>/favourites" class="btn btn-app btn-sm btn-danger">
<i class="icon-star bigger-230"></i>
<span class="smaller-90">Favourites</span>
<span class="badge badge-warning"><%= favourite_count %></span>
</a>
<a href="/user/<%= slug %>/likes" class="btn btn-app btn-sm btn-purple">
<i class="icon-heart /bigger-230"></i>
<span class="smaller-90">Likes</span>
<span class="badge badge-warning"><%= like_count %></span>
</a>
<a href="/user/<%= slug %>/followers" class="btn btn-app btn-sm btn-default">
<i class="icon-check bigger-230"></i>
<span class="smaller-90">Followers</span>
<span class="badge badge-warning"><%= followers.length %></span>
</a>
<a href="/user/<%= slug %>/following" class="btn btn-app btn-sm btn-warning">
<i class="icon-share bigger-230"></i>
<span class="smaller-90">Following</span>
<span class="badge badge-warning"><%= following.length %></span>
</a>
</div>
<div class="space-12"></div>
<div class="profile-user-info profile-user-info-striped">
<div class="profile-info-row">
<div class="profile-info-name"> Location</div>
<div class="profile-info-value">
<i class="icon-map-marker light-orange bigger-110"></i>
<span class="usereditable" id="city" style="display: inline;"><%= city %></span>
<span class="usereditable" id="country" style="display: inline;"><%= country %></span>
</div>
</div>
<div class="profile-info-row">
<div class="profile-info-name"> Joined</div>
<div class="profile-info-value">
<span id="signup" style="display: inline;"><%= humanise(date_joined) %></span>
</div>
</div>
<div class="profile-info-row">
<div class="profile-info-name"> Last Online</div>
<div class="profile-info-value">
<span id="login" style="display: inline; background-color: rgba(0, 0, 0, 0);"><%= humanise(last_login) %></span>
</div>
</div>
<div class="profile-info-row">
<div class="profile-info-name"> About Me</div>
<div class="profile-info-value">
<div class="usereditable" id="about" style="display: inline; white-space:pre-wrap;"><%= description %></div>
</div>
</div>
</div>
<div class="space-20"></div>
</div>
</div>
</div>
</div>