mirror of
https://github.com/sudoxnym/habitica.git
synced 2026-08-03 08:21:07 +00:00
Merge branch 'develop' of https://github.com/HabitRPG/habitrpg into develop
Conflicts: views/shared/tasks/task.jade
This commit is contained in:
commit
f93e0ba6b9
36 changed files with 683 additions and 758 deletions
10
bower.json
10
bower.json
|
|
@ -16,10 +16,10 @@
|
|||
"dependencies": {
|
||||
"jquery": "~2.1.0",
|
||||
"jquery.cookie": "~1.4.0",
|
||||
"angular": "1.3.3",
|
||||
"angular": "1.3.9",
|
||||
"angular-ui": "~0.4.0",
|
||||
"angular-sanitize": "1.3.3",
|
||||
"angular-resource": "1.3.3",
|
||||
"angular-sanitize": "1.3.9",
|
||||
"angular-resource": "1.3.9",
|
||||
"angular-ui-utils": "~0.1.0",
|
||||
"angular-ui-select2": "git://github.com/angular-ui/ui-select2.git",
|
||||
"angular-bootstrap": "~0.12.0",
|
||||
|
|
@ -45,10 +45,10 @@
|
|||
"angular-ui-router": "~0.2.13"
|
||||
},
|
||||
"devDependencies": {
|
||||
"angular-mocks": "1.3.3"
|
||||
"angular-mocks": "1.3.9"
|
||||
},
|
||||
"resolutions": {
|
||||
"angular": "1.3.3",
|
||||
"angular": "1.3.9",
|
||||
"jquery": ">=1.9.0"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
db.users.update(
|
||||
{'purchased.plan.customerId':{$ne:null}, 'purchased.plan.dateUpdated':null},
|
||||
{$set: {'purchased.plan.datedUpdated': new Date('12/01/2014')}},
|
||||
{
|
||||
$set: {'purchased.plan.dateUpdated': new Date('12/01/2014')},
|
||||
$unset: {'purchased.plan.datedUpdated':''}
|
||||
},
|
||||
{multi:true}
|
||||
);
|
||||
|
|
@ -1,9 +1,7 @@
|
|||
"use strict";
|
||||
|
||||
window.habitrpg = angular.module('habitrpg',
|
||||
['ngResource', 'ngSanitize', 'userServices', 'groupServices', 'memberServices', 'challengeServices',
|
||||
'authServices', 'notificationServices', 'guideServices', 'authCtrl', 'paymentServices',
|
||||
'ui.bootstrap', 'ui.keypress', 'ui.router', 'chieffancypants.loadingBar', 'At', 'infinite-scroll', 'ui.select2', 'angular.filter'])
|
||||
['ui.bootstrap', 'ui.keypress', 'ui.router', 'chieffancypants.loadingBar', 'At', 'infinite-scroll', 'ui.select2', 'angular.filter', 'ngResource'])
|
||||
|
||||
// @see https://github.com/angular-ui/ui-router/issues/110 and https://github.com/HabitRPG/habitrpg/issues/1705
|
||||
// temporary hack until they have a better solution
|
||||
|
|
@ -14,8 +12,8 @@ window.habitrpg = angular.module('habitrpg',
|
|||
.constant("MOBILE_APP", false)
|
||||
//.constant("STORAGE_GROUPS_ID", "") // if we decide to take groups offline
|
||||
|
||||
.config(['$stateProvider', '$urlRouterProvider', '$httpProvider', '$provide', 'STORAGE_SETTINGS_ID',
|
||||
function($stateProvider, $urlRouterProvider, $httpProvider, $provide, STORAGE_SETTINGS_ID) {
|
||||
.config(['$stateProvider', '$urlRouterProvider', '$httpProvider', 'STORAGE_SETTINGS_ID',
|
||||
function($stateProvider, $urlRouterProvider, $httpProvider, STORAGE_SETTINGS_ID) {
|
||||
|
||||
$urlRouterProvider
|
||||
// Setup default selected tabs
|
||||
|
|
@ -222,52 +220,4 @@ window.habitrpg = angular.module('habitrpg',
|
|||
$httpProvider.defaults.headers.common['x-api-user'] = settings.auth.apiId;
|
||||
$httpProvider.defaults.headers.common['x-api-key'] = settings.auth.apiToken;
|
||||
}
|
||||
|
||||
// Handle errors
|
||||
$provide.factory('myHttpInterceptor', ['$rootScope','$q',function($rootScope,$q) {
|
||||
return {
|
||||
response: function(response) {
|
||||
return response;
|
||||
},
|
||||
responseError: function(response) {
|
||||
// Offline
|
||||
if (response.status == 0 ||
|
||||
// don't know why we're getting 404 here, should be 0
|
||||
(response.status == 404 && _.isEmpty(response.data))) {
|
||||
$rootScope.$broadcast('responseText', window.env.t('serverUnreach'));
|
||||
|
||||
// Needs refresh
|
||||
} else if (response.needRefresh) {
|
||||
$rootScope.$broadcast('responseError', "The site has been updated and the page needs to refresh. The last action has not been recorded, please refresh and try again.");
|
||||
|
||||
} else if (response.data.code && response.data.code === 'ACCOUNT_SUSPENDED') {
|
||||
confirm(response.data.err);
|
||||
localStorage.clear();
|
||||
window.location.href = '/logout';
|
||||
|
||||
// 400 range?
|
||||
} else if (response.status < 500) {
|
||||
$rootScope.$broadcast('responseText', response.data.err || response.data);
|
||||
// Need to reject the prompse so the error is handled correctly
|
||||
if (response.status === 401) {
|
||||
return $q.reject(response);
|
||||
}
|
||||
|
||||
// Error
|
||||
} else {
|
||||
var error = '<strong>Please reload</strong>, ' +
|
||||
'"'+window.env.t('error')+' '+(response.data.err || response.data || 'something went wrong')+'" ' +
|
||||
window.env.t('seeConsole');
|
||||
$rootScope.$broadcast('responseError', error);
|
||||
console.error(response);
|
||||
}
|
||||
|
||||
return response;
|
||||
// this completely halts the chain, meaning we can't queue offline actions
|
||||
//if (canRecover(response)) return responseOrNewPromise
|
||||
//return $q.reject(response);
|
||||
}
|
||||
};
|
||||
}]);
|
||||
$httpProvider.interceptors.push('myHttpInterceptor');
|
||||
}])
|
||||
|
|
|
|||
|
|
@ -4,9 +4,9 @@
|
|||
The authentication controller (login & facebook)
|
||||
*/
|
||||
|
||||
angular.module('authCtrl', [])
|
||||
.controller("AuthCtrl", ['$scope', '$rootScope', 'User', '$http', '$location', '$window','ApiUrlService', '$modal',
|
||||
function($scope, $rootScope, User, $http, $location, $window, ApiUrlService, $modal) {
|
||||
angular.module('habitrpg')
|
||||
.controller("AuthCtrl", ['$scope', '$rootScope', 'User', '$http', '$location', '$window','ApiUrl', '$modal',
|
||||
function($scope, $rootScope, User, $http, $location, $window, ApiUrl, $modal) {
|
||||
|
||||
$scope.logout = function() {
|
||||
localStorage.clear();
|
||||
|
|
@ -36,7 +36,7 @@ angular.module('authCtrl', [])
|
|||
if ($scope.registrationForm.$invalid) {
|
||||
return;
|
||||
}
|
||||
var url = ApiUrlService.get() + "/api/v2/register";
|
||||
var url = ApiUrl.get() + "/api/v2/register";
|
||||
if($rootScope.selectedLanguage) url = url + '?lang=' + $rootScope.selectedLanguage.code;
|
||||
$http.post(url, $scope.registerVals).success(function(data, status, headers, config) {
|
||||
runAuth(data.id, data.apiToken);
|
||||
|
|
@ -48,7 +48,7 @@ angular.module('authCtrl', [])
|
|||
username: $scope.loginUsername || $('#login-tab input[name="username"]').val(),
|
||||
password: $scope.loginPassword || $('#login-tab input[name="password"]').val()
|
||||
};
|
||||
$http.post(ApiUrlService.get() + "/api/v2/user/auth/local", data)
|
||||
$http.post(ApiUrl.get() + "/api/v2/user/auth/local", data)
|
||||
.success(function(data, status, headers, config) {
|
||||
runAuth(data.id, data.token);
|
||||
}).error(errorAlert);
|
||||
|
|
@ -70,7 +70,7 @@ angular.module('authCtrl', [])
|
|||
if(email == null || email.length == 0) {
|
||||
alert(window.env.t('invalidEmail'));
|
||||
} else {
|
||||
$http.post(ApiUrlService.get() + '/api/v2/user/reset-password', {email:email})
|
||||
$http.post(ApiUrl.get() + '/api/v2/user/reset-password', {email:email})
|
||||
.success(function(){
|
||||
alert(window.env.t('newPassSent'));
|
||||
})
|
||||
|
|
@ -120,7 +120,7 @@ angular.module('authCtrl', [])
|
|||
|
||||
$scope.socialLogin = function(network){
|
||||
hello(network).login({scope:'email'}).then(function(auth){
|
||||
$http.post(ApiUrlService.get() + "/api/v2/user/auth/social", auth)
|
||||
$http.post(ApiUrl.get() + "/api/v2/user/auth/social", auth)
|
||||
.success(function(data, status, headers, config) {
|
||||
runAuth(data.id, data.token);
|
||||
}).error(errorAlert);
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
"use strict";
|
||||
|
||||
(typeof habitrpg !== 'undefined' ? habitrpg : habitrpgStatic)
|
||||
.controller("FooterCtrl", ['$scope', '$rootScope', 'User', '$http', 'Notification', 'ApiUrlService',
|
||||
function($scope, $rootScope, User, $http, Notification, ApiUrlService) {
|
||||
angular.module('habitrpg').controller("FooterCtrl",
|
||||
['$scope', '$rootScope', 'User', '$http', 'Notification', 'ApiUrl',
|
||||
function($scope, $rootScope, User, $http, Notification, ApiUrl) {
|
||||
|
||||
if(typeof habitrpg === "undefined"){
|
||||
$scope.languages = env.avalaibleLanguages;
|
||||
|
|
@ -78,7 +78,7 @@
|
|||
Notification.text('-1 day, remember to refresh');
|
||||
}
|
||||
$scope.addTenGems = function(){
|
||||
$http.post(ApiUrlService.get() + '/api/v2/user/addTenGems').success(function(){
|
||||
$http.post(ApiUrl.get() + '/api/v2/user/addTenGems').success(function(){
|
||||
User.log({});
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -211,7 +211,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
|
|||
});
|
||||
}])
|
||||
|
||||
.controller('ChatCtrl', ['$scope', 'Groups', 'User', '$http', 'ApiUrlService', 'Notification', 'Members', '$rootScope', function($scope, Groups, User, $http, ApiUrlService, Notification, Members, $rootScope){
|
||||
.controller('ChatCtrl', ['$scope', 'Groups', 'User', '$http', 'ApiUrl', 'Notification', 'Members', '$rootScope', function($scope, Groups, User, $http, ApiUrl, Notification, Members, $rootScope){
|
||||
$scope.message = {content:''};
|
||||
$scope._sending = false;
|
||||
|
||||
|
|
@ -275,7 +275,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
|
|||
}
|
||||
//Chat.Chat.like({gid:group._id,mid:message.id});
|
||||
|
||||
$http.post(ApiUrlService.get() + '/api/v2/groups/' + group._id + '/chat/' + message.id + '/like');
|
||||
$http.post(ApiUrl.get() + '/api/v2/groups/' + group._id + '/chat/' + message.id + '/like');
|
||||
}
|
||||
|
||||
$scope.flagChatMessage = function(groupId,message) {
|
||||
|
|
@ -303,11 +303,18 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
|
|||
'level': window.env.t('sortLevel'),
|
||||
'random': window.env.t('sortRandom'),
|
||||
'pets': window.env.t('sortPets'),
|
||||
'habitrpg_date_joined' : window.env.t('sortHabitrpgJoined'),
|
||||
'party_date_joined': window.env.t('sortJoined'),
|
||||
'habitrpg_last_logged_in': window.env.t('sortHabitrpgLastLoggedIn'),
|
||||
'name': window.env.t('sortName'),
|
||||
'backgrounds': window.env.t('sortBackgrounds'),
|
||||
};
|
||||
|
||||
$scope.partyOrderAscendingChoices = {
|
||||
'ascending': window.env.t('ascendingSort'),
|
||||
'descending': window.env.t('descendingSort')
|
||||
}
|
||||
|
||||
}])
|
||||
|
||||
.controller("GuildsCtrl", ['$scope', 'Groups', 'User', 'Challenges', '$rootScope', '$state', '$location', '$compile',
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
"use strict";
|
||||
|
||||
habitrpg.controller("HallHeroesCtrl", ['$scope', '$rootScope', 'User', 'Notification', 'ApiUrlService', '$resource',
|
||||
function($scope, $rootScope, User, Notification, ApiUrlService, $resource) {
|
||||
var Hero = $resource(ApiUrlService.get() + '/api/v2/hall/heroes/:uid', {uid:'@_id'});
|
||||
habitrpg.controller("HallHeroesCtrl", ['$scope', '$rootScope', 'User', 'Notification', 'ApiUrl', '$resource',
|
||||
function($scope, $rootScope, User, Notification, ApiUrl, $resource) {
|
||||
var Hero = $resource(ApiUrl.get() + '/api/v2/hall/heroes/:uid', {uid:'@_id'});
|
||||
$scope.hero = undefined;
|
||||
$scope.loadHero = function(uuid){
|
||||
$scope.hero = Hero.get({uid:uuid});
|
||||
|
|
@ -19,9 +19,9 @@ habitrpg.controller("HallHeroesCtrl", ['$scope', '$rootScope', 'User', 'Notifica
|
|||
$scope.heroes = Hero.query();
|
||||
}]);
|
||||
|
||||
habitrpg.controller("HallPatronsCtrl", ['$scope', '$rootScope', 'User', 'Notification', 'ApiUrlService', '$resource',
|
||||
function($scope, $rootScope, User, Notification, ApiUrlService, $resource) {
|
||||
var Patron = $resource(ApiUrlService.get() + '/api/v2/hall/patrons/:uid', {uid:'@_id'});
|
||||
habitrpg.controller("HallPatronsCtrl", ['$scope', '$rootScope', 'User', 'Notification', 'ApiUrl', '$resource',
|
||||
function($scope, $rootScope, User, Notification, ApiUrl, $resource) {
|
||||
var Patron = $resource(ApiUrl.get() + '/api/v2/hall/patrons/:uid', {uid:'@_id'});
|
||||
|
||||
var page = 0;
|
||||
$scope.patrons = [];
|
||||
|
|
|
|||
|
|
@ -28,12 +28,21 @@ habitrpg.controller("HeaderCtrl", ['$scope', 'Groups', 'User',
|
|||
case 'backgrounds':
|
||||
return member.preferences.background;
|
||||
break;
|
||||
case 'habitrpg_date_joined':
|
||||
return member.auth.timestamps.created;
|
||||
break
|
||||
case 'habitrpg_last_logged_in':
|
||||
return member.auth.timestamps.loggedin;
|
||||
break
|
||||
default:
|
||||
// party date joined
|
||||
return true;
|
||||
}
|
||||
}
|
||||
).reverse()
|
||||
)
|
||||
if (User.user.party.orderAscending == "descending") {
|
||||
$scope.partyMinusSelf = $scope.partyMinusSelf.reverse()
|
||||
}
|
||||
});
|
||||
}
|
||||
]);
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@
|
|||
/* Make user and settings available for everyone through root scope.
|
||||
*/
|
||||
|
||||
habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$http', '$state', '$stateParams', 'Notification', 'Groups', 'Shared', 'Content', '$modal', '$timeout', 'ApiUrlService', 'Payments',
|
||||
function($scope, $rootScope, $location, User, $http, $state, $stateParams, Notification, Groups, Shared, Content, $modal, $timeout, ApiUrlService, Payments) {
|
||||
habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$http', '$state', '$stateParams', 'Notification', 'Groups', 'Shared', 'Content', '$modal', '$timeout', 'ApiUrl', 'Payments',
|
||||
function($scope, $rootScope, $location, User, $http, $state, $stateParams, Notification, Groups, Shared, Content, $modal, $timeout, ApiUrl, Payments) {
|
||||
var user = User.user;
|
||||
|
||||
var initSticky = _.once(function(){
|
||||
|
|
@ -221,7 +221,7 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$
|
|||
$scope.spell = null;
|
||||
$rootScope.applyingAction = false;
|
||||
|
||||
$http.post(ApiUrlService.get() + '/api/v2/user/class/cast/'+spell.key+'?targetType='+type+'&targetId='+targetId)
|
||||
$http.post(ApiUrl.get() + '/api/v2/user/class/cast/'+spell.key+'?targetType='+type+'&targetId='+targetId)
|
||||
.success(function(){
|
||||
var msg = window.env.t('youCast', {spell: spell.text()});
|
||||
switch (type) {
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
|
||||
// Make user and settings available for everyone through root scope.
|
||||
habitrpg.controller('SettingsCtrl',
|
||||
['$scope', 'User', '$rootScope', '$http', 'ApiUrlService', 'Guide', '$location', '$timeout', 'Notification', 'Shared',
|
||||
function($scope, User, $rootScope, $http, ApiUrlService, Guide, $location, $timeout, Notification, Shared) {
|
||||
['$scope', 'User', '$rootScope', '$http', 'ApiUrl', 'Guide', '$location', '$timeout', 'Notification', 'Shared',
|
||||
function($scope, User, $rootScope, $http, ApiUrl, Guide, $location, $timeout, Notification, Shared) {
|
||||
|
||||
// FIXME we have this re-declared everywhere, figure which is the canonical version and delete the rest
|
||||
// $scope.auth = function (id, token) {
|
||||
|
|
@ -81,10 +81,11 @@ habitrpg.controller('SettingsCtrl',
|
|||
if (!changeUser.newUsername || !changeUser.password) {
|
||||
return alert(window.env.t('fillAll'));
|
||||
}
|
||||
$http.post(ApiUrlService.get() + '/api/v2/user/change-username', changeUser)
|
||||
$http.post(ApiUrl.get() + '/api/v2/user/change-username', changeUser)
|
||||
.success(function(){
|
||||
alert(window.env.t('usernameSuccess'));
|
||||
$scope.changeUser = {};
|
||||
User.sync();
|
||||
})
|
||||
.error(function(data){
|
||||
alert(data.err);
|
||||
|
|
@ -95,7 +96,7 @@ habitrpg.controller('SettingsCtrl',
|
|||
if (!changePass.oldPassword || !changePass.newPassword || !changePass.confirmNewPassword) {
|
||||
return alert(window.env.t('fillAll'));
|
||||
}
|
||||
$http.post(ApiUrlService.get() + '/api/v2/user/change-password', changePass)
|
||||
$http.post(ApiUrl.get() + '/api/v2/user/change-password', changePass)
|
||||
.success(function(data, status, headers, config){
|
||||
if (data.err) return alert(data.err);
|
||||
alert(window.env.t('passSuccess'));
|
||||
|
|
@ -132,7 +133,7 @@ habitrpg.controller('SettingsCtrl',
|
|||
}
|
||||
|
||||
$scope['delete'] = function(){
|
||||
$http['delete'](ApiUrlService.get() + '/api/v2/user')
|
||||
$http['delete'](ApiUrl.get() + '/api/v2/user')
|
||||
.success(function(res, code){
|
||||
if (res.err) return alert(res.err);
|
||||
localStorage.clear();
|
||||
|
|
@ -141,14 +142,14 @@ habitrpg.controller('SettingsCtrl',
|
|||
}
|
||||
|
||||
$scope.enterCoupon = function(code) {
|
||||
$http.post(ApiUrlService.get() + '/api/v2/user/coupon/' + code).success(function(res,code){
|
||||
$http.post(ApiUrl.get() + '/api/v2/user/coupon/' + code).success(function(res,code){
|
||||
if (code!==200) return;
|
||||
User.sync();
|
||||
Notification.text('Coupon applied! Check your inventory');
|
||||
});
|
||||
}
|
||||
$scope.generateCodes = function(codes){
|
||||
$http.post(ApiUrlService.get() + '/api/v2/coupons/generate/'+codes.event+'?count='+(codes.count || 1))
|
||||
$http.post(ApiUrl.get() + '/api/v2/coupons/generate/'+codes.event+'?count='+(codes.count || 1))
|
||||
.success(function(res,code){
|
||||
$scope._codes = {};
|
||||
if (code!==200) return;
|
||||
|
|
@ -183,7 +184,7 @@ habitrpg.controller('SettingsCtrl',
|
|||
}
|
||||
|
||||
$scope.applyCoupon = function(coupon){
|
||||
$http.get(ApiUrlService.get() + '/api/v2/coupons/valid-discount/'+coupon)
|
||||
$http.get(ApiUrl.get() + '/api/v2/coupons/valid-discount/'+coupon)
|
||||
.success(function(){
|
||||
Notification.text("Coupon applied!");
|
||||
var subs = $scope.Content.subscriptionBlocks;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
"use strict";
|
||||
|
||||
habitrpg.controller("TasksCtrl", ['$scope', '$rootScope', '$location', 'User','Notification', '$http', 'ApiUrlService', '$timeout', 'Shared',
|
||||
function($scope, $rootScope, $location, User, Notification, $http, ApiUrlService, $timeout, Shared) {
|
||||
habitrpg.controller("TasksCtrl", ['$scope', '$rootScope', '$location', 'User','Notification', '$http', 'ApiUrl', '$timeout', 'Shared',
|
||||
function($scope, $rootScope, $location, User, Notification, $http, ApiUrl, $timeout, Shared) {
|
||||
$scope.obj = User.user; // used for task-lists
|
||||
$scope.user = User.user;
|
||||
|
||||
|
|
@ -88,7 +88,7 @@ habitrpg.controller("TasksCtrl", ['$scope', '$rootScope', '$location', 'User','N
|
|||
|
||||
$scope.unlink = function(task, keep) {
|
||||
// TODO move this to userServices, turn userSerivces.user into ng-resource
|
||||
$http.post(ApiUrlService.get() + '/api/v2/user/tasks/' + task.id + '/unlink?keep=' + keep)
|
||||
$http.post(ApiUrl.get() + '/api/v2/user/tasks/' + task.id + '/unlink?keep=' + keep)
|
||||
.success(function(){
|
||||
User.log({});
|
||||
});
|
||||
|
|
@ -202,8 +202,6 @@ habitrpg.controller("TasksCtrl", ['$scope', '$rootScope', '$location', 'User','N
|
|||
$scope.shouldShow = function(task, list, prefs){
|
||||
if (task._editing) // never hide a task while being edited
|
||||
return true;
|
||||
if (task.type == 'todo') // TODO: convert To-Dos to use this new system and probably add a "Dated" column (i.e., "Incomplete" (includes dated), "Dated" (has due date and is not complete), "Complete")
|
||||
return true;
|
||||
var shouldDo = task.type == 'daily' ? habitrpgShared.shouldDo(new Date, task.repeat, prefs) : true;
|
||||
switch (list.view) {
|
||||
case "yellowred": // Habits
|
||||
|
|
@ -214,6 +212,8 @@ habitrpg.controller("TasksCtrl", ['$scope', '$rootScope', '$location', 'User','N
|
|||
return !task.completed && shouldDo;
|
||||
case "complete": // Dailies and To-Dos
|
||||
return task.completed || !shouldDo;
|
||||
case "dated": // To-Dos
|
||||
return !task.completed && task.date;
|
||||
case "ingamerewards": // All skills/rewards except the user's own
|
||||
return false; // Because "rewards" list includes only the user's own
|
||||
case "all":
|
||||
|
|
|
|||
|
|
@ -81,8 +81,8 @@ habitrpg
|
|||
}, {
|
||||
header: window.env.t('todos'),
|
||||
type: 'todo',
|
||||
placeHolder: window.env.t('newTodo')
|
||||
// view: "remaining"
|
||||
placeHolder: window.env.t('newTodo'),
|
||||
view: "remaining"
|
||||
}, {
|
||||
header: window.env.t('rewards'),
|
||||
type: 'reward',
|
||||
|
|
|
|||
|
|
@ -1,104 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
/**
|
||||
* Services that persists and retrieves user from localStorage.
|
||||
* FIXME is this file ever used?
|
||||
*/
|
||||
|
||||
var facebook = {}
|
||||
|
||||
angular.module('authServices', ['userServices']).
|
||||
factory('Facebook',
|
||||
['$http', '$location', 'User', 'ApiUrlService',
|
||||
function($http, $location, User, ApiUrlService) {
|
||||
//TODO FB.init({appId: '${section.parameters['facebook.app.id']}', status: true, cookie: true, xfbml: true});
|
||||
var auth, user = User.user;
|
||||
|
||||
facebook.handleStatusChange = function(session) {
|
||||
if (session.authResponse) {
|
||||
|
||||
FB.api('/me', {
|
||||
fields: 'name, picture, email'
|
||||
}, function(response) {
|
||||
console.log(response.error)
|
||||
if (!response.error) {
|
||||
|
||||
var data = {
|
||||
name: response.name,
|
||||
facebook_id: response.id,
|
||||
email: response.email
|
||||
}
|
||||
|
||||
$http.post(ApiUrlService.get() + '/api/v2/user/auth/facebook', data).success(function(data, status, headers, config) {
|
||||
User.authenticate(data.id, data.token, function(err) {
|
||||
if (!err) {
|
||||
alert(window.env.t('loginSuccess'));
|
||||
$location.path("/habit");
|
||||
}
|
||||
});
|
||||
}).error(function(response) {
|
||||
console.log('error')
|
||||
})
|
||||
|
||||
} else {
|
||||
alert('napaka')
|
||||
}
|
||||
//clearAction();
|
||||
});
|
||||
} else {
|
||||
document.body.className = 'not_connected';
|
||||
//clearAction();
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
|
||||
authUser: function() {
|
||||
FB.Event.subscribe('auth.statusChange', facebook.handleStatusChange);
|
||||
},
|
||||
|
||||
getAuth: function() {
|
||||
return auth;
|
||||
},
|
||||
|
||||
login: function() {
|
||||
|
||||
FB.login(null, {
|
||||
scope: 'email'
|
||||
});
|
||||
},
|
||||
|
||||
logout: function() {
|
||||
FB.logout(function(response) {
|
||||
window.location.reload();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
])
|
||||
|
||||
.factory('LocalAuth',
|
||||
['$http', 'User',
|
||||
function($http, User) {
|
||||
var auth,
|
||||
user = User.user;
|
||||
|
||||
return {
|
||||
getAuth: function() {
|
||||
return auth;
|
||||
},
|
||||
|
||||
login: function() {
|
||||
user.id = '';
|
||||
user.apiToken = '';
|
||||
User.authenticate();
|
||||
return;
|
||||
|
||||
},
|
||||
|
||||
logout: function() {}
|
||||
}
|
||||
|
||||
}
|
||||
]);
|
||||
|
|
@ -4,17 +4,17 @@
|
|||
* Services that persists and retrieves user from localStorage.
|
||||
*/
|
||||
|
||||
angular.module('challengeServices', ['ngResource']).
|
||||
factory('Challenges', ['ApiUrlService', '$resource', 'User', '$q', 'Members',
|
||||
function(ApiUrlService, $resource, User, $q, Members) {
|
||||
var Challenge = $resource(ApiUrlService.get() + '/api/v2/challenges/:cid',
|
||||
angular.module('habitrpg').factory('Challenges',
|
||||
['ApiUrl', '$resource',
|
||||
function(ApiUrl, $resource) {
|
||||
var Challenge = $resource(ApiUrl.get() + '/api/v2/challenges/:cid',
|
||||
{cid:'@_id'},
|
||||
{
|
||||
//'query': {method: "GET", isArray:false}
|
||||
join: {method: "POST", url: ApiUrlService.get() + '/api/v2/challenges/:cid/join'},
|
||||
leave: {method: "POST", url: ApiUrlService.get() + '/api/v2/challenges/:cid/leave'},
|
||||
close: {method: "POST", params: {uid:''}, url: ApiUrlService.get() + '/api/v2/challenges/:cid/close'},
|
||||
getMember: {method: "GET", url: ApiUrlService.get() + '/api/v2/challenges/:cid/member/:uid'}
|
||||
join: {method: "POST", url: ApiUrl.get() + '/api/v2/challenges/:cid/join'},
|
||||
leave: {method: "POST", url: ApiUrl.get() + '/api/v2/challenges/:cid/leave'},
|
||||
close: {method: "POST", params: {uid:''}, url: ApiUrl.get() + '/api/v2/challenges/:cid/close'},
|
||||
getMember: {method: "GET", url: ApiUrl.get() + '/api/v2/challenges/:cid/member/:uid'}
|
||||
});
|
||||
|
||||
//var challenges = [];
|
||||
|
|
@ -23,5 +23,4 @@ angular.module('challengeServices', ['ngResource']).
|
|||
Challenge: Challenge
|
||||
//challenges: challenges
|
||||
}
|
||||
}
|
||||
]);
|
||||
}]);
|
||||
|
|
|
|||
|
|
@ -4,25 +4,37 @@
|
|||
* Services that persists and retrieves user from localStorage.
|
||||
*/
|
||||
|
||||
angular.module('groupServices', ['ngResource']).
|
||||
factory('Groups', ['ApiUrlService', '$resource', '$q', '$http', 'User',
|
||||
function(ApiUrlService, $resource, $q, $http, User) {
|
||||
var Group = $resource(ApiUrlService.get() + '/api/v2/groups/:gid',
|
||||
angular.module('habitrpg').factory('Groups',
|
||||
['ApiUrl', '$resource', '$q', '$http', 'User', 'Challenges',
|
||||
function(ApiUrl, $resource, $q, $http, User, Challenges) {
|
||||
var Group = $resource(ApiUrl.get() + '/api/v2/groups/:gid',
|
||||
{gid:'@_id', messageId: '@_messageId'},
|
||||
{
|
||||
//query: {method: "GET", isArray:false},
|
||||
postChat: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/chat'},
|
||||
deleteChatMessage: {method: "DELETE", url: ApiUrlService.get() + '/api/v2/groups/:gid/chat/:messageId'},
|
||||
flagChatMessage: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/chat/:messageId/flag'},
|
||||
clearFlagCount: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/chat/:messageId/clearflags'},
|
||||
join: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/join'},
|
||||
leave: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/leave'},
|
||||
invite: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/invite'},
|
||||
removeMember: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/removeMember'},
|
||||
questAccept: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/questAccept'},
|
||||
questReject: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/questReject'},
|
||||
questCancel: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/questCancel'},
|
||||
questAbort: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/questAbort'}
|
||||
get: {
|
||||
method: "GET",
|
||||
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;
|
||||
}
|
||||
},
|
||||
|
||||
postChat: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/chat'},
|
||||
deleteChatMessage: {method: "DELETE", url: ApiUrl.get() + '/api/v2/groups/:gid/chat/:messageId'},
|
||||
flagChatMessage: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/chat/:messageId/flag'},
|
||||
clearFlagCount: {method: "POST", url: ApiUrl.get() + '/api/v2/groups/:gid/chat/:messageId/clearflags'},
|
||||
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
|
||||
|
|
@ -49,7 +61,7 @@ angular.module('groupServices', ['ngResource']).
|
|||
|
||||
// On enter, set chat message to "seen"
|
||||
seenMessage: function(gid){
|
||||
$http.post(ApiUrlService.get() + '/api/v2/groups/'+gid+'/chat/seen');
|
||||
$http.post(ApiUrl.get() + '/api/v2/groups/'+gid+'/chat/seen');
|
||||
if (User.user.newMessages) delete User.user.newMessages[gid];
|
||||
},
|
||||
|
||||
|
|
@ -59,8 +71,7 @@ angular.module('groupServices', ['ngResource']).
|
|||
|
||||
Group: Group
|
||||
}
|
||||
}
|
||||
])
|
||||
}])
|
||||
/**
|
||||
* TODO Get this working. Make ChatService it's own ngResource, so we can update chat without having to sync the whole
|
||||
* group object (expensive). Also so we can add chat-specific routes
|
||||
|
|
|
|||
|
|
@ -4,9 +4,9 @@
|
|||
* Services for each tour step when you unlock features
|
||||
*/
|
||||
|
||||
angular.module('guideServices', []).
|
||||
factory('Guide', ['$rootScope', 'User', '$timeout', function($rootScope, User, $timeout) {
|
||||
|
||||
angular.module('habitrpg').factory('Guide',
|
||||
['$rootScope', 'User', '$timeout',
|
||||
function($rootScope, User, $timeout) {
|
||||
/**
|
||||
* Init and show the welcome tour. Note we do it listening to a $rootScope broadcasted 'userLoaded' message,
|
||||
* this because we need to determine whether to show the tour *after* the user has been pulled from the server,
|
||||
|
|
@ -217,6 +217,4 @@ angular.module('guideServices', []).
|
|||
initTour: initTour,
|
||||
classesTour: classesTour
|
||||
};
|
||||
|
||||
}
|
||||
]);
|
||||
}]);
|
||||
|
|
|
|||
|
|
@ -4,11 +4,11 @@
|
|||
* Services that persists and retrieves user from localStorage.
|
||||
*/
|
||||
|
||||
angular.module('memberServices', ['ngResource', 'sharedServices']).
|
||||
factory('Members', ['$rootScope', 'Shared', 'ApiUrlService', '$resource',
|
||||
function($rootScope, Shared, ApiUrlService, $resource) {
|
||||
angular.module('habitrpg').factory('Members',
|
||||
['$rootScope', 'Shared', 'ApiUrl', '$resource',
|
||||
function($rootScope, Shared, ApiUrl, $resource) {
|
||||
var members = {};
|
||||
var Member = $resource(ApiUrlService.get() + '/api/v2/members/:uid', {uid:'@_id'});
|
||||
var Member = $resource(ApiUrl.get() + '/api/v2/members/:uid', {uid:'@_id'});
|
||||
var memberServices = {
|
||||
|
||||
Member: Member,
|
||||
|
|
@ -84,5 +84,4 @@ angular.module('memberServices', ['ngResource', 'sharedServices']).
|
|||
})
|
||||
|
||||
return memberServices;
|
||||
}
|
||||
]);
|
||||
}]);
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/**
|
||||
Set up "+1 Exp", "Level Up", etc notifications
|
||||
*/
|
||||
angular.module("notificationServices", [])
|
||||
.factory("Notification", [function() {
|
||||
angular.module("habitrpg").factory("Notification",
|
||||
[function() {
|
||||
var stack_topright = {"dir1": "down", "dir2": "left", "spacing1": 15, "spacing2": 15, "firstpos1": 60};
|
||||
function notify(html, type, icon) {
|
||||
var notice = $.pnotify({
|
||||
|
|
@ -81,5 +81,4 @@ angular.module("notificationServices", [])
|
|||
notify(val, 'drop', 'glyphicon glyphicon-gift');
|
||||
}
|
||||
};
|
||||
}
|
||||
]);
|
||||
}]);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('paymentServices',[]).factory('Payments',
|
||||
angular.module('habitrpg').factory('Payments',
|
||||
['$rootScope', 'User', '$http', 'Content',
|
||||
function($rootScope, User, $http, Content) {
|
||||
var Payments = {};
|
||||
|
|
|
|||
|
|
@ -4,12 +4,10 @@
|
|||
* Services that expose habitrpg-shared
|
||||
*/
|
||||
|
||||
angular.module('sharedServices', []).
|
||||
factory('Shared', [function () {
|
||||
angular.module('habitrpg')
|
||||
.factory('Shared', [function () {
|
||||
return window.habitrpgShared;
|
||||
}
|
||||
]).
|
||||
factory('Content', ['Shared', function (Shared) {
|
||||
}])
|
||||
.factory('Content', ['Shared', function (Shared) {
|
||||
return Shared.content;
|
||||
}
|
||||
]);
|
||||
}]);
|
||||
|
|
|
|||
|
|
@ -1,13 +1,12 @@
|
|||
"use strict";
|
||||
|
||||
window.habitrpgStatic = angular.module('habitrpgStatic', ['notificationServices', 'userServices', 'chieffancypants.loadingBar', 'authCtrl', 'ui.bootstrap'])
|
||||
window.habitrpg = angular.module('habitrpg', ['chieffancypants.loadingBar', 'ui.bootstrap'])
|
||||
.constant("API_URL", "")
|
||||
.constant("STORAGE_USER_ID", 'habitrpg-user')
|
||||
.constant("STORAGE_SETTINGS_ID", 'habit-mobile-settings')
|
||||
.constant("MOBILE_APP", false)
|
||||
|
||||
.controller("RootCtrl", ['$scope', '$location', '$modal', '$http', function($scope, $location, $modal, $http){
|
||||
// must be #?memberId=xx, see https://github.com/angular/angular.js/issues/7239
|
||||
var memberId = $location.search()['memberId'];
|
||||
if (memberId) {
|
||||
$http.get('/api/v2/members/'+memberId).success(function(data, status, headers, config){
|
||||
|
|
|
|||
|
|
@ -37,8 +37,8 @@
|
|||
"js/env.js",
|
||||
|
||||
"js/app.js",
|
||||
"bower_components/habitrpg-shared/script/config.js",
|
||||
"js/services/sharedServices.js",
|
||||
"js/services/authServices.js",
|
||||
"js/services/notificationServices.js",
|
||||
"bower_components/habitrpg-shared/script/userServices.js",
|
||||
"bower_components/habitrpg-shared/script/directives.js",
|
||||
|
|
|
|||
|
|
@ -660,10 +660,12 @@ questStart = function(req, res, next) {
|
|||
})
|
||||
|
||||
group.quest.active = true;
|
||||
if (quest.boss)
|
||||
if (quest.boss) {
|
||||
group.quest.progress.hp = quest.boss.hp;
|
||||
else
|
||||
if (quest.boss.rage) group.quest.progress.rage = 0;
|
||||
} else {
|
||||
group.quest.progress.collect = collected;
|
||||
}
|
||||
group.quest.members = questMembers;
|
||||
group.markModified('quest'); // members & progress.collect are both Mixed types
|
||||
parallel.push(function(cb2){group.save(cb2)});
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ module.exports.errorHandler = function(err, req, res, next) {
|
|||
error: "Uncaught error",
|
||||
stack: (err.stack || err.message || err),
|
||||
body: req.body, headers: req.header,
|
||||
auth: (req.headers['x-api-user'] + ' | ' + req.headers['x-api-key']),
|
||||
auth: req.headers['x-api-user'],
|
||||
originalUrl: req.originalUrl
|
||||
});
|
||||
var message = err.message ? err.message : err;
|
||||
|
|
|
|||
|
|
@ -301,8 +301,17 @@ GroupSchema.statics.bossQuest = function(user, progress, cb) {
|
|||
var down = progress.down * quest.boss.str; // multiply by boss strength
|
||||
|
||||
group.quest.progress.hp -= progress.up;
|
||||
group.sendChat("`" + user.profile.name + " attacks " + quest.boss.name('en') + " for " + (progress.up.toFixed(1)) + " damage, " + quest.boss.name('en') + " attacks party for " + Math.abs(down).toFixed(1) + " damage.`");
|
||||
group.sendChat("`" + user.profile.name + " attacks " + quest.boss.name('en') + " for " + (progress.up.toFixed(1)) + " damage, " + quest.boss.name('en') + " attacks party for " + Math.abs(down).toFixed(1) + " damage.`"); //TODO Create a party preferred language option so emits like this can be localized
|
||||
|
||||
// If boss has Rage, increment Rage as well
|
||||
if (quest.boss.rage) {
|
||||
group.quest.progress.rage += Math.abs(down);
|
||||
if (group.quest.progress.rage >= quest.boss.rage.value) {
|
||||
group.sendChat(quest.boss.rage.effect('en'));
|
||||
group.quest.progress.rage = 0;
|
||||
if (quest.boss.rage.healing) group.quest.progress.hp += (group.quest.progress.hp * quest.boss.rage.healing); //TODO To make Rage effects more expandable, let's turn these into functions in quest.boss.rage
|
||||
}
|
||||
}
|
||||
// Everyone takes damage
|
||||
var series = [
|
||||
function(cb2){
|
||||
|
|
|
|||
|
|
@ -250,6 +250,7 @@ var UserSchema = new Schema({
|
|||
party: {
|
||||
// id // FIXME can we use a populated doc instead of fetching party separate from user?
|
||||
order: {type:String, 'default':'level'},
|
||||
orderAscending: {type:String, 'default':'ascending'},
|
||||
quest: {
|
||||
key: String,
|
||||
progress: {
|
||||
|
|
|
|||
|
|
@ -607,7 +607,7 @@ module.exports = (swagger, v2) ->
|
|||
path: '/members/{uuid}'
|
||||
description: "Get a member."
|
||||
parameters: [path('uuid','Member ID','string')]
|
||||
middleware: [auth.auth, i18n.getUserLanguage]
|
||||
middleware: [i18n.getUserLanguage] # removed auth.auth, so anon users can view shared avatars
|
||||
action: members.getMember
|
||||
"/members/{uuid}/message":
|
||||
spec:
|
||||
|
|
|
|||
|
|
@ -183,6 +183,11 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html')
|
|||
p
|
||||
| {{::Content.eggs.#{egg}.value}}
|
||||
span.Pet_Currency_Gem1x.inline-gems
|
||||
div(ng-show='(user.achievements.quests.trex + user.achievements.quests.trex_undead) > 1')
|
||||
button.customize-option(popover='{{::Content.eggs.TRex.notes()}}', popover-title!=env.t("egg", {eggType: "{{Content.eggs.TRex.text()}}"}), popover-trigger='mouseenter', popover-placement='top', ng-click='purchase("eggs", Content.eggs.TRex)', class='Pet_Egg_TRex')
|
||||
p
|
||||
| {{::Content.eggs.TRex.value}}
|
||||
span.Pet_Currency_Gem1x.inline-gems
|
||||
|
||||
li.customize-menu
|
||||
menu.pets-menu(label=env.t('hatchingPotions'))
|
||||
|
|
|
|||
|
|
@ -213,6 +213,12 @@ script(id='partials/options.profile.profile.html', type='text/ng-template')
|
|||
button.btn.btn-default(ng-click='_editing.profile = true', ng-show='!_editing.profile')= env.t('edit')
|
||||
h4=env.t('displayName')
|
||||
span(ng-show='profile.profile.name') {{profile.profile.name}}
|
||||
p
|
||||
small.muted=env.t('displayNameDescription1')
|
||||
|
|
||||
a(href='/#/options/settings/settings')=env.t('displayNameDescription2')
|
||||
|
|
||||
=env.t('displayNameDescription3')
|
||||
span.muted(ng-hide='profile.profile.name') -
|
||||
=env.t('none')
|
||||
| -
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ script(type='text/ng-template', id='partials/options.settings.settings.html')
|
|||
h5.hint(popover=env.t('clockInfo'), popover-trigger='mouseenter')=env.t('customDayStart')
|
||||
.form-group
|
||||
.input-group
|
||||
input.form-control(type='number', min='0', max='23', ng-model='user.preferences.dayStart', ng-change='saveDayStart()')
|
||||
input.form-control(type='number', min='0', max='23', ng-model='user.preferences.dayStart', ng-blur='saveDayStart()')
|
||||
span.input-group-addon= ':00 (' + env.t('24HrClock') + ')'
|
||||
small
|
||||
=env.t('subWarning1')
|
||||
|
|
@ -88,10 +88,26 @@ script(type='text/ng-template', id='partials/options.settings.settings.html')
|
|||
.panel-heading
|
||||
span Registration
|
||||
.panel-body
|
||||
p(ng-if='user.auth.facebook.id') Registered with Facebook
|
||||
p(ng-if='user.auth.facebook.id')=env.t('registeredWithFb')
|
||||
div(ng-if='user.auth.local.username')
|
||||
p Username: {{user.auth.local.username}}
|
||||
p Email: {{user.auth.local.email}}
|
||||
p=env.t('username')
|
||||
|: {{user.auth.local.username}}
|
||||
p
|
||||
small.muted
|
||||
=env.t('loginNameDescription1')
|
||||
|
|
||||
a(href='/#/options/profile/profile')=env.t('loginNameDescription2')
|
||||
|
|
||||
=env.t('loginNameDescription3')
|
||||
p=env.t('email')
|
||||
|: {{::user.auth.local.email}}
|
||||
p
|
||||
small.muted
|
||||
=env.t('emailChange1')
|
||||
|
|
||||
a(href='mailto:admin@habitrpg.com')=env.t('emailChange2')
|
||||
|
|
||||
=env.t('emailChange3')
|
||||
hr
|
||||
h5=env.t('changeUsername')
|
||||
form(ng-submit='changeUsername(changeUser)', ng-show='user.auth.local')
|
||||
|
|
|
|||
|
|
@ -58,13 +58,20 @@ a.pull-right.gem-wallet(ng-if='group.type!="party"', popover-trigger='mouseenter
|
|||
button.pull-right.btn.btn-primary(ng-click="openModal('invite-friends', {controller:'GroupsCtrl'})", ng-if='::group.type=="party"') Invite Friends
|
||||
.panel-body.modal-fixed-height
|
||||
div.form-group(ng-if='::group.type=="party"')
|
||||
=env.t('partyList')
|
||||
p=env.t('partyList')
|
||||
select.form-control#partyOrder(
|
||||
ng-model='user.party.order',
|
||||
ng-controller='ChatCtrl',
|
||||
ng-options='k as v for (k , v) in partyOrderChoices',
|
||||
ng-change='set({"party.order": user.party.order})'
|
||||
)
|
||||
|
|
||||
select.form-control#partyOrderAscending(
|
||||
ng-model='user.party.orderAscending',
|
||||
ng-controller='ChatCtrl',
|
||||
ng-options='k as v for (k , v) in partyOrderAscendingChoices',
|
||||
ng-change='set({"party.orderAscending": user.party.orderAscending})'
|
||||
)
|
||||
table.table.table-striped(bindonce='group')
|
||||
tr(ng-repeat='member in group.members track by member._id')
|
||||
td.media
|
||||
|
|
|
|||
|
|
@ -1,4 +1,14 @@
|
|||
h5 STRESS HAS STRUCK!
|
||||
h5 TYRANNOSAUR PET QUEST, SPREAD THE WORD CHALLENGE, AND FIRST STRESS STRIKE!
|
||||
tr
|
||||
td
|
||||
h5 Tyrannosaur Pet Quest
|
||||
p In the <a href='https://habitrpg.com/#/options/inventory/drops' target='_blank'>Market</a> there are now two new pet quests: King of the Dinosaurs and The Dinosaur Unearthed! They both give out the same rewards, including pet Tyrannosaur eggs. The difference is that "King of the Dinosaurs" is a normal pet quest, like all the others, whereas "The Dinosaur Unearthed" has less HP - but also a Rage bar (a la World Bosses) that allows it to heal if you skip too many of your Dailies. Both bosses still attack your party based on how many Dailies are incomplete. Users will be able to buy Tyrannosaur eggs after defeating either boss twice or both bosses once.
|
||||
p Have fun!
|
||||
p.small.muted by Baconsaur, Urse, Lemoness, and SabreCat
|
||||
tr
|
||||
td
|
||||
h5 Spread the Word Challenge Reminder
|
||||
p In case you missed it, we're running our second Spread the Word Challenge! The rules are simple: make a post some time between December 31st 2014 and January 31st 2015 on some form of blog or social media that tells people about HabitRPG. The top post will be awarded 100 GEMS, and the next nineteen top posts will be awarded 80 GEMS each. Learn more and join in <a href='https://habitrpg.com/#/options/groups/challenges/e1ad6d92-587d-4137-848e-4a1f643603ba' target='_blank'>here</a>!
|
||||
tr
|
||||
td
|
||||
h5 World Boss: First Stress Strike!
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template")
|
|||
.todos-chart(ng-if='::list.type == "todo"', ng-show='charts.todos')
|
||||
|
||||
// Add New
|
||||
form.task-add(name='new{{list.type}}form', ng-hide='obj._locked || (list.showCompleted && list.type=="todo")', ng-submit='addTask(obj[list.type+"s"],list)')
|
||||
form.task-add(name='new{{list.type}}form', ng-hide='obj._locked', ng-submit='addTask(obj[list.type+"s"],list)')
|
||||
input(type='text', ng-model='list.newTask', placeholder='{{list.placeHolder}}', required)
|
||||
button(type='submit', ng-disabled='new{{list.type}}form.$invalid')
|
||||
span.glyphicon.glyphicon-plus
|
||||
|
|
@ -50,20 +50,20 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template")
|
|||
a(ng-click='list.view = "complete"')=env.t('grey')
|
||||
// Todo Tabs
|
||||
div(ng-if='::main && list.type=="todo"', ng-class='::{"tabbable tabs-below": list.type=="todo"}')
|
||||
// div(ng-show='list.view == "complete" || list.view == "all"')
|
||||
// li.task.reward-item(ng-if='#{canceler ? "user.stats.buffs."+canceler : "user.items.special."+k+">0"}',popover-trigger='mouseenter', popover-placement='top', popover='{{Content.spells.special.#{k}.notes()}}')
|
||||
if position=="bottom"
|
||||
div(ng-show='list.showCompleted')
|
||||
div(ng-show='list.view == "complete"')
|
||||
.alert
|
||||
=env.t('lotOfToDos')
|
||||
button.task-action-btn.tile.spacious.bright(ng-click='user.ops.clearCompleted({})',popover=env.t('deleteToDosExplanation'),popover-trigger='mouseenter')=env.t('clearCompleted')
|
||||
p!=env.t('beeminderDeleteWarning')
|
||||
// remaining/completed tabs
|
||||
ul.task-filter
|
||||
li(ng-class='{active: !list.showCompleted}')
|
||||
a(ng-click='list.showCompleted = false')=env.t('remaining')
|
||||
li(ng-class='{active: list.showCompleted}')
|
||||
a(ng-click='list.showCompleted= true')=env.t('complete')
|
||||
li(ng-class='{active: list.view == "remaining"}')
|
||||
a(ng-click='list.view = "remaining"')=env.t('remaining')
|
||||
li(ng-class='{active: list.view == "dated"}', tooltip=env.t('datedNotSorted'))
|
||||
a(ng-click='list.view = "dated"')=env.t('dated')
|
||||
li(ng-class='{active: list.view == "complete"}')
|
||||
a(ng-click='list.view = "complete"')=env.t('complete')
|
||||
// Rewards Tabs
|
||||
div(ng-if='::main && list.type=="reward"', class='tabbable tabs-below')
|
||||
ul.task-filter
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
li(bindonce='list', id='task-{{::task.id}}', ng-repeat='task in obj[list.type+"s"]', class='task {{Shared.taskClasses(task, user.filters, user.preferences.dayStart, user.lastCron, list.showCompleted, main)}}', ng-click='spell && (list.type != "reward") && castEnd(task, "task", $event)', ng-class='{"cast-target":spell && (list.type != "reward")}', popover-trigger='mouseenter', data-popover-html="{{task.notes | markdown}}", data-popover-placement="top", ng-show='shouldShow(task, list, user.preferences)')
|
||||
li(bindonce='list', bo-id='"task-"+task.id', ng-repeat='task in obj[list.type+"s"]', class='task {{Shared.taskClasses(task, user.filters, user.preferences.dayStart, user.lastCron, list.showCompleted, main)}}', ng-click='spell && (list.type != "reward") && castEnd(task, "task", $event)', ng-class='{"cast-target":spell && (list.type != "reward")}', popover-trigger='mouseenter', data-popover-html="{{task.notes | markdown}}", data-popover-placement="top", ng-show='shouldShow(task, list, user.preferences)')
|
||||
// right-hand side control buttons
|
||||
.task-meta-controls
|
||||
|
||||
|
|
@ -63,9 +63,9 @@ li(bindonce='list', id='task-{{::task.id}}', ng-repeat='task in obj[list.type+"s
|
|||
// Habits
|
||||
.task-actions(ng-if='::task.type=="habit"')
|
||||
// score() is overridden in challengesCtrl to do nothing
|
||||
a(ng-if='task.up', ng-click='score(task,"up")')
|
||||
a(ng-if='task.up', ng-click='applyingAction || score(task,"up")')
|
||||
span.glyphicon.glyphicon-plus
|
||||
a(ng-if='task.down', ng-click='score(task,"down")')
|
||||
a(ng-if='task.down', ng-click='applyingAction || score(task,"down")')
|
||||
span.glyphicon.glyphicon-minus
|
||||
|
||||
// Rewards
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
//-Trick needed to pass 'env' to ./layout
|
||||
block vars
|
||||
doctype html
|
||||
html(ng-app='habitrpgStatic')
|
||||
html(ng-app='habitrpg')
|
||||
|
||||
head
|
||||
block extraHead
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
block vars
|
||||
doctype html
|
||||
html(ng-app='habitrpgStatic')
|
||||
html(ng-app='habitrpg')
|
||||
|
||||
head
|
||||
block title
|
||||
|
|
|
|||
Loading…
Reference in a new issue