WIP(party-page): Refactor groups service
2
common/dist/sprites/habitrpg-shared.css
vendored
1672
common/dist/sprites/spritesmith1.css
vendored
BIN
common/dist/sprites/spritesmith1.png
vendored
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
1318
common/dist/sprites/spritesmith2.css
vendored
BIN
common/dist/sprites/spritesmith2.png
vendored
|
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 109 KiB |
792
common/dist/sprites/spritesmith4.css
vendored
BIN
common/dist/sprites/spritesmith4.png
vendored
|
Before Width: | Height: | Size: 550 KiB After Width: | Height: | Size: 554 KiB |
836
common/dist/sprites/spritesmith5.css
vendored
BIN
common/dist/sprites/spritesmith5.png
vendored
|
Before Width: | Height: | Size: 235 KiB After Width: | Height: | Size: 235 KiB |
816
common/dist/sprites/spritesmith6.css
vendored
BIN
common/dist/sprites/spritesmith6.png
vendored
|
Before Width: | Height: | Size: 202 KiB After Width: | Height: | Size: 202 KiB |
@@ -7,13 +7,13 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
|
|||||||
if (!group.quest || !group.quest.members) return false;
|
if (!group.quest || !group.quest.members) return false;
|
||||||
if (group.quest.active) return false; // quest is started, not pending
|
if (group.quest.active) return false; // quest is started, not pending
|
||||||
return userid in group.quest.members && group.quest.members[userid] != false;
|
return userid in group.quest.members && group.quest.members[userid] != false;
|
||||||
}
|
};
|
||||||
|
|
||||||
$scope.isMemberOfRunningQuest = function(userid, group) {
|
$scope.isMemberOfRunningQuest = function(userid, group) {
|
||||||
if (!group.quest || !group.quest.members) return false;
|
if (!group.quest || !group.quest.members) return false;
|
||||||
if (!group.quest.active) return false; // quest is pending, not started
|
if (!group.quest.active) return false; // quest is pending, not started
|
||||||
return group.quest.members[userid];
|
return group.quest.members[userid];
|
||||||
}
|
};
|
||||||
|
|
||||||
$scope.isMemberOfGroup = function(userid, group){
|
$scope.isMemberOfGroup = function(userid, group){
|
||||||
|
|
||||||
@@ -32,11 +32,11 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
|
|||||||
if (!group.members) return false;
|
if (!group.members) return false;
|
||||||
var memberIds = _.map(group.members, function(x){return x._id});
|
var memberIds = _.map(group.members, function(x){return x._id});
|
||||||
return ~(memberIds.indexOf(userid));
|
return ~(memberIds.indexOf(userid));
|
||||||
}
|
};
|
||||||
|
|
||||||
$scope.isMember = function(user, group){
|
$scope.isMember = function(user, group){
|
||||||
return ~(group.members.indexOf(user._id));
|
return ~(group.members.indexOf(user._id));
|
||||||
}
|
};
|
||||||
|
|
||||||
$scope.Members = Members;
|
$scope.Members = Members;
|
||||||
$scope._editing = {group:false};
|
$scope._editing = {group:false};
|
||||||
@@ -45,13 +45,13 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
|
|||||||
if(group._newLeader && group._newLeader._id) group.leader = group._newLeader._id;
|
if(group._newLeader && group._newLeader._id) group.leader = group._newLeader._id;
|
||||||
group.$save();
|
group.$save();
|
||||||
group._editing = false;
|
group._editing = false;
|
||||||
}
|
};
|
||||||
|
|
||||||
$scope.deleteAllMessages = function() {
|
$scope.deleteAllMessages = function() {
|
||||||
if (confirm(window.env.t('confirmDeleteAllMessages'))) {
|
if (confirm(window.env.t('confirmDeleteAllMessages'))) {
|
||||||
User.user.ops.clearPMs({});
|
User.user.ops.clearPMs({});
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
// ------ Modals ------
|
// ------ Modals ------
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
|
|||||||
$rootScope.openModal('member', {controller:'MemberModalCtrl', windowClass:'profile-modal', size:'lg'});
|
$rootScope.openModal('member', {controller:'MemberModalCtrl', windowClass:'profile-modal', size:'lg'});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
|
|
||||||
$scope.removeMember = function(group, member, isMember){
|
$scope.removeMember = function(group, member, isMember){
|
||||||
@@ -80,7 +80,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
|
|||||||
isMember: isMember
|
isMember: isMember
|
||||||
};
|
};
|
||||||
$rootScope.openModal('remove-member', {scope: $scope});
|
$rootScope.openModal('remove-member', {scope: $scope});
|
||||||
}
|
};
|
||||||
|
|
||||||
$scope.confirmRemoveMember = function(confirm){
|
$scope.confirmRemoveMember = function(confirm){
|
||||||
if(confirm){
|
if(confirm){
|
||||||
@@ -100,7 +100,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
|
|||||||
}else{
|
}else{
|
||||||
$scope.removeMemberData = undefined;
|
$scope.removeMemberData = undefined;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
$scope.openInviteModal = function(group){
|
$scope.openInviteModal = function(group){
|
||||||
$rootScope.openModal('invite-friends', {controller:'InviteToGroupCtrl', resolve:
|
$rootScope.openModal('invite-friends', {controller:'InviteToGroupCtrl', resolve:
|
||||||
@@ -109,23 +109,6 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
|
|||||||
}}});
|
}}});
|
||||||
};
|
};
|
||||||
|
|
||||||
//var serializeQs = function(obj, prefix){
|
|
||||||
// var str = [];
|
|
||||||
// for(var p in obj) {
|
|
||||||
// if (obj.hasOwnProperty(p)) {
|
|
||||||
// var k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
|
|
||||||
// str.push(typeof v == "object" ?
|
|
||||||
// serializeQs(v, k) :
|
|
||||||
// encodeURIComponent(k) + "=" + encodeURIComponent(v));
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return str.join("&");
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//$scope.inviteLink = function(obj){
|
|
||||||
// return window.env.BASE_URL + '?' + serializeQs({partyInvite: obj});
|
|
||||||
//}
|
|
||||||
|
|
||||||
$scope.quickReply = function(uid) {
|
$scope.quickReply = function(uid) {
|
||||||
Members.selectMember(uid, function(){
|
Members.selectMember(uid, function(){
|
||||||
$rootScope.openModal('private-message',{controller:'MemberModalCtrl'});
|
$rootScope.openModal('private-message',{controller:'MemberModalCtrl'});
|
||||||
@@ -141,45 +124,39 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
|
|||||||
$scope.emails = [{name:"",email:""},{name:"",email:""}];
|
$scope.emails = [{name:"",email:""},{name:"",email:""}];
|
||||||
$scope.invitees = {uuid:""};
|
$scope.invitees = {uuid:""};
|
||||||
|
|
||||||
$scope.inviteNewUsers = function(inviteMethod){
|
$scope.inviteNewUsers = function(inviteMethod) {
|
||||||
if (!$scope.group) {
|
if (!$scope.group._id) {
|
||||||
Groups.group.create($scope.newGroup, function() {
|
group.create($scope.newGroup, function() {
|
||||||
inviteByMethod(inviteMethod);
|
_inviteByMethod(inviteMethod);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
inviteByMethod(inviteMethod);
|
_inviteByMethod(inviteMethod);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var inviteByMethod = function(inviteMethod) {
|
function _inviteByMethod(inviteMethod) {
|
||||||
if (inviteMethod === 'email') {
|
if (inviteMethod === 'email') {
|
||||||
inviteEmails();
|
Groups.Group.invite({gid: $scope.group._id}, {inviter: $scope.inviter, emails: $scope.emails}, function(){
|
||||||
|
Notification.text(window.env.t('invitationsSent'));
|
||||||
|
$scope.emails = [{name:'',email:''},{name:'',email:''}];
|
||||||
|
}, function(){
|
||||||
|
$scope.emails = [{name:'',email:''},{name:'',email:''}];
|
||||||
|
});
|
||||||
}
|
}
|
||||||
else if (inviteMethod === 'uuid') {
|
else if (inviteMethod === 'uuid') {
|
||||||
invite();
|
Groups.Group.invite({gid: $scope.group._id}, {uuids: [$scope.invitees.uuid]}, function(){
|
||||||
|
Notification.text(window.env.t('invitationsSent'));
|
||||||
|
$scope.invitees = {uuid:""};
|
||||||
|
}, function(){
|
||||||
|
$scope.invitees = {uuid:""};
|
||||||
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return console.log('Invalid invite method.')
|
return console.log('Invalid invite method.')
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
$scope.inviteEmails = function(){
|
|
||||||
Groups.Group.invite({gid: $scope.group._id}, {inviter: $scope.inviter, emails: $scope.emails}, function(){
|
|
||||||
Notification.text(window.env.t('invitationsSent'));
|
|
||||||
$scope.emails = [{name:'',email:''},{name:'',email:''}];
|
|
||||||
}, function(){
|
|
||||||
$scope.emails = [{name:'',email:''},{name:'',email:''}];
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
$scope.invite = function(){
|
|
||||||
Groups.Group.invite({gid: $scope.group._id}, {uuids: [$scope.invitees.uuid]}, function(){
|
|
||||||
Notification.text(window.env.t('invitationsSent'));
|
|
||||||
$scope.invitees = {uuid:""};
|
|
||||||
}, function(){
|
|
||||||
$scope.invitees = {uuid:""};
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}])
|
}])
|
||||||
|
|
||||||
.controller('AutocompleteCtrl', ['$scope', '$timeout', 'Groups', 'User', 'InputCaret', function ($scope,$timeout,Groups,User,InputCaret) {
|
.controller('AutocompleteCtrl', ['$scope', '$timeout', 'Groups', 'User', 'InputCaret', function ($scope,$timeout,Groups,User,InputCaret) {
|
||||||
|
|||||||
@@ -1,93 +1,104 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
/**
|
(function() {
|
||||||
* Services that persists and retrieves user from localStorage.
|
angular
|
||||||
*/
|
.module('habitrpg')
|
||||||
|
.factory('Groups', groupsFactory);
|
||||||
|
|
||||||
angular.module('habitrpg').factory('Groups',
|
groupsFactory.$inject = [
|
||||||
['$rootScope','ApiUrl', '$resource', '$q', '$http', 'User', 'Challenges', 'Analytics', '$location',
|
'$location',
|
||||||
function($rootScope, ApiUrl, $resource, $q, $http, User, Challenges, Analytics, $location) {
|
'$resource',
|
||||||
var Group = $resource(ApiUrl.get() + '/api/v2/groups/:gid',
|
'$rootScope',
|
||||||
{gid:'@_id', messageId: '@_messageId'},
|
'Analytics',
|
||||||
{
|
'ApiUrl',
|
||||||
get: {
|
'Challenges',
|
||||||
method: "GET",
|
'User'
|
||||||
isArray:false,
|
];
|
||||||
// Wrap challenges as ngResource so they have functions like $leave or $join
|
|
||||||
transformResponse: function(data, headers) {
|
|
||||||
data = angular.fromJson(data);
|
|
||||||
_.each(data && data.challenges, function(c) {
|
|
||||||
angular.extend(c, Challenges.Challenge.prototype);
|
|
||||||
});
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
syncParty: {method: "GET", url: '/api/v2/groups/party'},
|
function groupsFactory($location, $resource, $rootScope, Analytics, ApiUrl, Challenges, User) {
|
||||||
join: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/join'},
|
|
||||||
leave: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/leave'},
|
|
||||||
invite: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/invite'},
|
|
||||||
removeMember: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/removeMember'},
|
|
||||||
questAccept: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/questAccept'},
|
|
||||||
questReject: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/questReject'},
|
|
||||||
questCancel: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/questCancel'},
|
|
||||||
questAbort: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/questAbort'}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Defer loading everything until they're requested
|
var data = {party: undefined, myGuilds: undefined, publicGuilds: undefined, tavern: undefined};
|
||||||
var data = {party: undefined, myGuilds: undefined, publicGuilds: undefined, tavern: undefined};
|
var Group = $resource(ApiUrl.get() + '/api/v2/groups/:gid',
|
||||||
|
{gid:'@_id', messageId: '@_messageId'},
|
||||||
|
{
|
||||||
|
get: {
|
||||||
|
method: "GET",
|
||||||
|
isArray:false,
|
||||||
|
// Wrap challenges as ngResource so they have functions like $leave or $join
|
||||||
|
transformResponse: function(data) {
|
||||||
|
data = angular.fromJson(data);
|
||||||
|
_.each(data && data.challenges, function(c) {
|
||||||
|
angular.extend(c, Challenges.Challenge.prototype);
|
||||||
|
});
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
var syncUser = function(res) {
|
syncParty: {method: "GET", url: '/api/v2/groups/party'},
|
||||||
User.sync();
|
join: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/join'},
|
||||||
}
|
leave: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/leave'},
|
||||||
var logError = function(err) {
|
invite: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/invite'},
|
||||||
console.log(err);
|
removeMember: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/removeMember'},
|
||||||
}
|
questAccept: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/questAccept'},
|
||||||
|
questReject: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/questReject'},
|
||||||
|
questCancel: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/questCancel'},
|
||||||
|
questAbort: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/questAbort'}
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
function syncUser() {
|
||||||
party: function(cb){
|
User.sync();
|
||||||
|
}
|
||||||
|
|
||||||
|
function logError(err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
function party(cb) {
|
||||||
if (!data.party) return (data.party = Group.get({gid: 'party'}, cb));
|
if (!data.party) return (data.party = Group.get({gid: 'party'}, cb));
|
||||||
return (cb) ? cb(party) : data.party;
|
return (cb) ? cb(party) : data.party;
|
||||||
},
|
}
|
||||||
publicGuilds: function(){
|
|
||||||
|
function publicGuilds() {
|
||||||
//TODO combine these as {type:'guilds,public'} and create a $filter() to separate them
|
//TODO combine these as {type:'guilds,public'} and create a $filter() to separate them
|
||||||
if (!data.publicGuilds) data.publicGuilds = Group.query({type:'public'});
|
if (!data.publicGuilds) data.publicGuilds = Group.query({type:'public'});
|
||||||
return data.publicGuilds;
|
return data.publicGuilds;
|
||||||
},
|
}
|
||||||
myGuilds: function(){
|
|
||||||
|
function myGuilds() {
|
||||||
if (!data.myGuilds) data.myGuilds = Group.query({type:'guilds'});
|
if (!data.myGuilds) data.myGuilds = Group.query({type:'guilds'});
|
||||||
return data.myGuilds;
|
return data.myGuilds;
|
||||||
},
|
}
|
||||||
tavern: function(){
|
|
||||||
|
function tavern() {
|
||||||
if (!data.tavern) data.tavern = Group.get({gid:'habitrpg'});
|
if (!data.tavern) data.tavern = Group.get({gid:'habitrpg'});
|
||||||
return data.tavern;
|
return data.tavern;
|
||||||
},
|
}
|
||||||
|
|
||||||
questAccept: function(party){
|
function questAccept(party) {
|
||||||
Analytics.updateUser({'partyID':party.id,'partySize':party.memberCount});
|
Analytics.updateUser({'partyID':party.id,'partySize':party.memberCount});
|
||||||
party.$questAccept()
|
party.$questAccept()
|
||||||
.then(syncUser, logError);
|
.then(syncUser, logError);
|
||||||
},
|
}
|
||||||
|
|
||||||
questReject: function(party){
|
function questReject(party) {
|
||||||
Analytics.updateUser({'partyID':party.id,'partySize':party.memberCount});
|
Analytics.updateUser({'partyID':party.id,'partySize':party.memberCount});
|
||||||
party.$questReject()
|
party.$questReject()
|
||||||
.then(syncUser, logError);
|
.then(syncUser, logError);
|
||||||
},
|
}
|
||||||
|
|
||||||
questCancel: function(party){
|
function questCancel(party) {
|
||||||
Analytics.updateUser({'partyID':party.id,'partySize':party.memberCount});
|
Analytics.updateUser({'partyID':party.id,'partySize':party.memberCount});
|
||||||
party.$questCancel()
|
party.$questCancel()
|
||||||
.then(syncUser, logError);
|
.then(syncUser, logError);
|
||||||
},
|
}
|
||||||
|
|
||||||
questAbort: function(party){
|
function questAbort(party) {
|
||||||
Analytics.updateUser({'partyID':party.id,'partySize':party.memberCount});
|
Analytics.updateUser({'partyID':party.id,'partySize':party.memberCount});
|
||||||
party.$questAbort()
|
party.$questAbort()
|
||||||
.then(syncUser, logError);
|
.then(syncUser, logError);
|
||||||
},
|
}
|
||||||
|
|
||||||
inviteOrStartParty: function(group) {
|
function inviteOrStartParty(group) {
|
||||||
if (group.type === "party" || $location.$$path === "/options/groups/party") {
|
if (group.type === "party" || $location.$$path === "/options/groups/party") {
|
||||||
$rootScope.openModal('invite-friends', {
|
$rootScope.openModal('invite-friends', {
|
||||||
controller:'InviteToGroupCtrl',
|
controller:'InviteToGroupCtrl',
|
||||||
@@ -99,12 +110,22 @@ function($rootScope, ApiUrl, $resource, $q, $http, User, Challenges, Analytics,
|
|||||||
Analytics.track({'hitType':'event','eventCategory':'button','eventAction':'click','eventLabel':'Invite Friends'});
|
Analytics.track({'hitType':'event','eventCategory':'button','eventAction':'click','eventLabel':'Invite Friends'});
|
||||||
$location.path("/options/groups/party");
|
$location.path("/options/groups/party");
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
|
||||||
// Pass reference to party, myGuilds, publicGuilds, tavern; inside data in order to
|
return {
|
||||||
// be able to modify them directly (otherwise will be stick with cached version)
|
syncUser: syncUser,
|
||||||
data: data,
|
logError: logError,
|
||||||
|
party: party,
|
||||||
|
publicGuilds: publicGuilds,
|
||||||
|
myGuilds: myGuilds,
|
||||||
|
tavern: tavern,
|
||||||
|
questAccept: questAccept,
|
||||||
|
questReject: questReject,
|
||||||
|
questCancel: questCancel,
|
||||||
|
inviteOrStartParty: inviteOrStartParty,
|
||||||
|
|
||||||
Group: Group
|
data: data,
|
||||||
|
Group: Group
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}])
|
})();
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ script(type='text/ng-template', id='modals/invite-friends.html')
|
|||||||
.quest_basilist.pull-left
|
.quest_basilist.pull-left
|
||||||
p(style='margin:2em')=env.t('exclusiveQuestScroll')
|
p(style='margin:2em')=env.t('exclusiveQuestScroll')
|
||||||
button.btn.btn-default.pull-right(style='margin:auto 1em', ng-click='$close()')=env.t('close')
|
button.btn.btn-default.pull-right(style='margin:auto 1em', ng-click='$close()')=env.t('close')
|
||||||
.modal-footer(style='padding-bottom:0',ng-if='!group || group.memberCount === 1')
|
.modal-footer(style='padding-bottom:0',ng-if='!group._id || group.memberCount < 2')
|
||||||
p!=env.t('wantExistingParty', {linkStart: "<a href='/#/options/groups/guilds/f2db2a7f-13c5-454d-b3ee-ea1f5089e601'>", linkEnd: "</a>"})
|
p!=env.t('wantExistingParty', {linkStart: "<a href='/#/options/groups/guilds/f2db2a7f-13c5-454d-b3ee-ea1f5089e601'>", linkEnd: "</a>"})
|
||||||
pre(style='margin:1em 0 0 0').
|
pre(style='margin:1em 0 0 0').
|
||||||
{{user.id}}
|
{{user.id}}
|
||||||
|
|||||||