Files
habitica/website/client-old/js/app.js
Keith Holliday ea24eeb019 Thehollidayinn/group plans part 2 (#8262)
* Added all ui components back

* Added group ui items back and initial group approval directive

* Added approval list view with approving functionality

* Added notification display for group approvals

* Fixed linting issues

* Removed expectation from beforeEach

* Moved string to locale

* Added per use group plan for stripe

* Added tests for stripe group plan upgrade

* Removed paypal option

* Abstract sub blocks. Hit group sub block from user settings page. Added group subscriptin beneifts display

* Fixed lint issue

* Added pricing and adjusted styles

* Moved text to translations

* Added group email types

* Fixed typo

* Fixed group plan abstraction and other style issues

* Fixed email unit test

* Added type to group plan to filter our group plans

* Removed dev protection from routes

* Removed hard coding and fixed upgrade plan

* Added error when group has subscription and tries to remove

* Fixed payment unit tests

* Added custom string and moved subscription check up in the logic

* Added ability for old leader to delete subscription the created

* Allowed old guild leader to edit their group subscription

* Fixed linting and tests

* Added group sub page to user sub settings

* Added approval and group tasks requests back. Hid user group sub on profile

* Added group tasks sync after adding to allow for editing

* Fixed promise chain when resolving group

* Added approvals to group promise chain

* Ensured compelted group todos are not delted at cron

* Updated copy and other minor styles

* Added group field to tags and recolored group tag.

* Added chat message when task is claimed

* Preventing task scoring when approval is needed

* Added approval requested indicator

* Updated column with for tasks on group page

* Added checklist sync on assign

* Added sync for checklist items

* Added checkilist sync when task is updated

* Added checklist sync remove

* Sanatized group tasks when updated

* Fixed lint issues

* Added instant scoring of approved task

* Added task modal

* Fixed editing of challenge and group tasks

* Added cancel button

* Added add new checklist option to update sync

* Added remove for checklist

* Added checklist update

* Added difference check and sync for checklist if there is a diff

* Fixed task syncing

* Fixed linting issues

* Fixed styles and karma tests

* Fixed minor style issues

* Fixed obj transfer on scope

* Fixed broken tests

* Added new benefits page

* Updated group page styles

* Updated benefits page style

* Added translations

* Prevented sync with empty trask list

* Added task title to edit modal

* Added new group plans page and upgrade redirect

* Added group plans redirect to upgrade

* Fixed party home page being hidden and home button click

* Fixed dynamic changing of task status and grey popup

* Fixed tag editing

* Hid benifites information if group has subscription

* Added quotes to task name

* Fixed issue with assigning multiple users

* Added new group plans ctrl

* Hid menu from public guilds

* Fixed task sync issue

* Updated placeholder for assign field

* Added correct cost to subscribe details

* Hid create, edit, delete task options from non group leaders

* Prevented some front end modifications to group tasks

* Hid tags option from group original task

* Added refresh for approvals and group tasks

* Prepend new group tasks

* Fix last checklist item sync

* Fixed casing issue with tags

* Added claimed by message on hover

* Prevent user from deleting assigned task

* Added single route for group plan sign up and payments

* Abstracted stripe payments and added initial tests

* Abstracted amazon and added initial tests

* Fixed create group message

* Update group id check and return group

* Updated to use the new returned group

* Fixed linting and promise issues

* Fixed broken leave test after merge issue

* Fixed undefined approval error and editing/deleting challenge tasks

* Add pricing to group plans, removed confirmation, and fixed redirect after payment

* Updated group plan cost text
2016-12-21 13:45:45 -06:00

390 lines
15 KiB
JavaScript

"use strict";
/* Refresh page if idle > 6h */
var REFRESH_FREQUENCY = 21600000;
var refresh;
window.refresher = function() {
window.location.reload(true);
};
var awaitIdle = function() {
if(refresh) clearTimeout(refresh);
refresh = setTimeout(window.refresher, REFRESH_FREQUENCY);
};
awaitIdle();
$(document).on('mousemove keydown mousedown touchstart', awaitIdle);
/* Refresh page if idle > 6h */
window.habitrpg = angular.module('habitrpg',
['ui.bootstrap', 'ui.keypress', 'ui.router', 'chieffancypants.loadingBar', 'At', 'infinite-scroll', 'ui.select2', 'angular.filter', 'ngResource', 'ngSanitize'])
// @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
.constant("API_URL", "")
.constant("STORAGE_USER_ID", 'habitrpg-user')
.constant("STORAGE_SETTINGS_ID", 'habit-mobile-settings')
.constant("MOBILE_APP", false)
.constant("TAVERN_ID", window.habitrpgShared.TAVERN_ID)
//.constant("STORAGE_GROUPS_ID", "") // if we decide to take groups offline
.config(['$stateProvider', '$urlRouterProvider', '$httpProvider', 'STORAGE_SETTINGS_ID',
function($stateProvider, $urlRouterProvider, $httpProvider, STORAGE_SETTINGS_ID) {
$urlRouterProvider
// Setup default selected tabs
.when('/options', '/options/profile/avatar')
.when('/options/profile', '/options/profile/avatar')
.when('/options/groups', '/options/groups/tavern')
.when('/options/groups/guilds', '/options/groups/guilds/public')
.when('/options/groups/hall', '/options/groups/hall/heroes')
.when('/options/inventory', '/options/inventory/drops')
.when('/options/settings', '/options/settings/settings')
// post cards with promo codes went out with this address
.when('/options/settings/coupon', '/options/settings/promo')
// redirect states that don't match
.otherwise("/tasks");
$stateProvider
// Tasks
.state('tasks', {
url: "/tasks",
templateUrl: "partials/main.html",
title: env.t('titleTasks')
})
// Options
.state('options', {
url: "/options",
templateUrl: "partials/options.html",
controller: function(){}
})
// Options > Profile
.state('options.profile', {
url: "/profile",
templateUrl: "partials/options.profile.html",
controller: 'UserCtrl'
})
.state('options.profile.avatar', {
url: "/avatar",
templateUrl: "partials/options.profile.avatar.html",
title: env.t('titleAvatar')
})
.state('options.profile.backgrounds', {
url: '/backgrounds',
templateUrl: "partials/options.profile.backgrounds.html",
title: env.t('titleBackgrounds')
})
.state('options.profile.stats', {
url: "/stats",
templateUrl: "partials/options.profile.stats.html",
title: env.t('titleStats')
})
.state('options.profile.achievements', {
url: "/achievements",
templateUrl: "partials/options.profile.achievements.html",
title: env.t('titleAchievs')
})
.state('options.profile.profile', {
url: "/profile",
templateUrl: "partials/options.profile.profile.html",
title: env.t('titleProfile')
})
// Options > Groups
.state('options.social', {
url: "/groups",
templateUrl: "partials/options.social.html"
})
.state('options.social.inbox', {
url: '/inbox',
templateUrl: 'partials/options.social.inbox.html',
controller: 'InboxCtrl',
title: env.t('titleInbox')
})
.state('options.social.tavern', {
url: "/tavern",
templateUrl: "partials/options.social.tavern.html",
controller: 'TavernCtrl',
title: env.t('titleTavern')
})
.state('options.social.party', {
url: '/party',
templateUrl: "partials/options.social.party.html",
controller: 'PartyCtrl',
title: env.t('titleParty')
})
.state('options.social.hall', {
url: '/hall',
templateUrl: "partials/options.social.hall.html"
})
.state('options.social.hall.heroes', {
url: '/heroes',
templateUrl: "partials/options.social.hall.heroes.html",
controller: 'HallHeroesCtrl',
title: env.t('titleHeroes')
})
.state('options.social.hall.patrons', {
url: '/patrons',
templateUrl: "partials/options.social.hall.patrons.html",
controller: 'HallPatronsCtrl',
title: env.t('titlePatrons')
})
.state('options.social.groupPlans', {
url: '/group-plans',
templateUrl: "partials/options.social.groupPlans.html",
controller: 'GroupPlansCtrl',
title: env.t('groupPlansTitle')
})
.state('options.social.guilds', {
url: '/guilds',
templateUrl: "partials/options.social.guilds.html",
controller: 'GuildsCtrl',
title: env.t('titleGuilds')
})
.state('options.social.guilds.public', {
url: '/public',
templateUrl: "partials/options.social.guilds.public.html",
title: env.t('titleGuilds')
})
.state('options.social.guilds.create', {
url: '/create',
templateUrl: "partials/options.social.guilds.create.html",
title: env.t('titleGuilds')
})
.state('options.social.guilds.detail', {
url: '/:gid',
templateUrl: 'partials/options.social.guilds.detail.html',
title: env.t('titleGuilds'),
controller: ['$scope', 'Groups', 'Chat', '$stateParams', 'Members', 'Challenges', 'Tasks', 'User', '$location',
function($scope, Groups, Chat, $stateParams, Members, Challenges, Tasks, User, $location) {
$scope.groupPanel = 'chat';
$scope.upgrade = false;
// @TODO: Move this to service or single http request
Groups.Group.get($stateParams.gid)
.then(function (response) {
$scope.obj = $scope.group = response.data.data;
return Chat.markChatSeen($scope.group._id);
})
.then (function () {
return Members.getGroupMembers($scope.group._id);
})
.then(function (response) {
$scope.group.members = response.data.data;
return Members.getGroupInvites($scope.group._id);
})
.then(function (response) {
$scope.group.invites = response.data.data;
return Challenges.getGroupChallenges($scope.group._id);
})
.then(function (response) {
$scope.group.challenges = response.data.data;
return Tasks.getGroupTasks($scope.group._id);
})
.then(function (response) {
var tasks = response.data.data;
tasks.forEach(function (element, index, array) {
if (!$scope.group[element.type + 's']) $scope.group[element.type + 's'] = [];
$scope.group[element.type + 's'].unshift(element);
});
$scope.group.approvals = [];
if (User.user._id === $scope.group.leader._id) {
return Tasks.getGroupApprovals($scope.group._id);
}
})
.then(function (response) {
if (response) $scope.group.approvals = response.data.data;
});
}]
})
// Options > Social > Challenges
.state('options.social.challenges', {
url: "/challenges",
params: { groupIdFilter: null },
controller: 'ChallengesCtrl',
templateUrl: "partials/options.social.challenges.html",
title: env.t('titleChallenges')
})
.state('options.social.challenges.detail', {
url: '/:cid',
templateUrl: 'partials/options.social.challenges.detail.html',
title: env.t('titleChallenges'),
controller: ['$scope', 'Challenges', '$stateParams', 'Tasks', 'Members',
function ($scope, Challenges, $stateParams, Tasks, Members) {
Challenges.getChallenge($stateParams.cid)
.then(function (response) {
$scope.obj = $scope.challenge = response.data.data;
$scope.challenge._locked = true;
return Tasks.getChallengeTasks($scope.challenge._id);
})
.then(function (response) {
var tasks = response.data.data;
tasks.forEach(function (element, index, array) {
if (!$scope.challenge[element.type + 's']) $scope.challenge[element.type + 's'] = [];
$scope.challenge[element.type + 's'].push(element);
})
return Members.getChallengeMembers($scope.challenge._id);
})
.then(function (response) {
$scope.challenge.members = response.data.data;
});
}]
})
.state('options.social.challenges.edit', {
url: '/:cid/edit',
templateUrl: 'partials/options.social.challenges.detail.html',
title: env.t('titleChallenges'),
controller: ['$scope', 'Challenges', '$stateParams', 'Tasks',
function ($scope, Challenges, $stateParams, Tasks) {
Challenges.getChallenge($stateParams.cid)
.then(function (response) {
$scope.obj = $scope.challenge = response.data.data;
$scope.challenge._locked = false;
return Tasks.getChallengeTasks($scope.challenge._id);
})
.then(function (response) {
var tasks = response.data.data;
tasks.forEach(function (element, index, array) {
if (!$scope.challenge[element.type + 's']) $scope.challenge[element.type + 's'] = [];
$scope.challenge[element.type + 's'].push(element);
})
});
}]
})
.state('options.social.challenges.detail.member', {
url: '/:uid',
templateUrl: 'partials/options.social.challenges.detail.member.html',
title: env.t('titleChallenges'),
controller: ['$scope', 'Members', '$stateParams',
function($scope, Members, $stateParams){
Members.getChallengeMemberProgress($stateParams.cid, $stateParams.uid)
.then(function(response) {
$scope.obj = response.data.data;
$scope.obj.habits = [];
$scope.obj.todos = [];
$scope.obj.dailys = [];
$scope.obj.rewards = [];
$scope.obj.tasks.forEach(function (element, index, array) {
$scope.obj[element.type + 's'].push(element)
});
$scope.obj._locked = true;
});
}]
})
// Options > Inventory
.state('options.inventory', {
url: '/inventory',
templateUrl: "partials/options.inventory.html",
controller: 'InventoryCtrl'
})
.state('options.inventory.drops', {
url: '/drops',
templateUrl: "partials/options.inventory.drops.html",
title: env.t('titleDrops')
})
.state('options.inventory.quests', {
url: '/quests',
templateUrl: "partials/options.inventory.quests.html",
title: env.t('titleQuests')
})
.state('options.inventory.pets', {
url: '/pets',
templateUrl: "partials/options.inventory.pets.html",
title: env.t('titlePets')
})
.state('options.inventory.mounts', {
url: '/mounts',
templateUrl: "partials/options.inventory.mounts.html",
title: env.t('titleMounts')
})
.state('options.inventory.equipment', {
url: '/equipment',
templateUrl: "partials/options.inventory.equipment.html",
title: env.t('titleEquipment')
})
.state('options.inventory.timetravelers', {
url: '/timetravelers',
templateUrl: "partials/options.inventory.timetravelers.html",
title: env.t('titleTimeTravelers')
})
.state('options.inventory.seasonalshop', {
url: '/seasonalshop',
templateUrl: "partials/options.inventory.seasonalshop.html",
title: env.t('titleSeasonalShop')
})
// Options > Settings
.state('options.settings', {
url: "/settings",
controller: 'SettingsCtrl',
templateUrl: "partials/options.settings.html",
})
.state('options.settings.settings', {
url: "/settings",
templateUrl: "partials/options.settings.settings.html",
title: env.t('titleSettings')
})
.state('options.settings.api', {
url: "/api",
templateUrl: "partials/options.settings.api.html",
title: env.t('titleSettings')
})
.state('options.settings.export', {
url: "/export",
templateUrl: "partials/options.settings.export.html",
title: env.t('titleSettings')
})
.state('options.settings.promo', {
url: "/promo",
templateUrl: "partials/options.settings.promo.html",
title: env.t('titleSettings')
})
.state('options.settings.subscription', {
url: "/subscription",
templateUrl: "partials/options.settings.subscription.html",
title: env.t('titleSettings')
})
.state('options.settings.notifications', {
url: "/notifications",
templateUrl: "partials/options.settings.notifications.html",
title: env.t('titleSettings')
});
var settings;
try {
settings = JSON.parse(localStorage.getItem(STORAGE_SETTINGS_ID));
} catch (e) {
settings = {};
}
if (settings && settings.auth && settings.auth.apiId && settings.auth.apiToken) {
$httpProvider.defaults.headers.common['x-api-user'] = settings.auth.apiId;
$httpProvider.defaults.headers.common['x-api-key'] = settings.auth.apiToken;
}
$httpProvider.defaults.headers.common['Content-Type'] = 'application/json;charset=utf-8';
$httpProvider.defaults.headers.common['x-client'] = 'habitica-web';
}]);