Files
habitica/website/client-old/js/services/taskServices.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

408 lines
11 KiB
JavaScript

'use strict';
var TASK_KEYS_TO_REMOVE = ['_id', 'completed', 'date', 'dateCompleted', 'history', 'id', 'streak', 'createdAt', 'challenge'];
angular.module('habitrpg')
.factory('Tasks', ['$rootScope', 'Shared', '$http',
function tasksFactory($rootScope, Shared, $http) {
function addTasks(listDef, addTaskFn) {
var tasks = listDef.newTask;
if (listDef.bulk) {
tasks = tasks.split(/[\n\r]+/);
// Reverse the order of tasks so the tasks
// will appear in the order the user entered them
tasks.reverse();
listDef.bulk = false;
} else {
tasks = [tasks];
}
addTaskFn(listDef, tasks);
delete listDef.newTask;
delete listDef.focus;
}
function toggleBulk (list) {
list.bulk = !list.bulk;
list.focus = true;
};
function removeTask (task) {
if (!confirm(window.env.t('sureDelete', {taskType: window.env.t(task.type), taskText: task.text}))) {
return false;
};
task._edit = undefined;
return true;
}
function saveTask (task, stayOpen, isSaveAndClose) {
if (task._edit) {
angular.copy(task._edit, task);
}
task._edit = undefined;
if (task.checklist) {
task.checklist = _.filter(task.checklist, function (i) {
return !!i.text
});
}
if (!stayOpen) task._editing = false;
if (isSaveAndClose) {
$("#task-" + task._id).parent().children('.popover').removeClass('in');
}
}
function getUserTasks (getCompletedTodos) {
var url = '/api/v3/tasks/user';
if (getCompletedTodos) url += '?type=completedTodos';
return $http({
method: 'GET',
url: url,
ignoreLoadingBar: $rootScope.appLoaded !== true,
});
};
function createUserTasks (taskDetails) {
return $http({
method: 'POST',
url: '/api/v3/tasks/user',
data: taskDetails,
});
};
function getChallengeTasks (challengeId) {
return $http({
method: 'GET',
url: '/api/v3/tasks/challenge/' + challengeId,
});
};
function createChallengeTasks (challengeId, tasks) {
return $http({
method: 'POST',
url: '/api/v3/tasks/challenge/' + challengeId,
data: tasks,
});
};
function getGroupTasks (groupId) {
return $http({
method: 'GET',
url: '/api/v3/tasks/group/' + groupId,
});
};
function createGroupTasks (groupId, taskDetails) {
return $http({
method: 'POST',
url: '/api/v3/tasks/group/' + groupId,
data: taskDetails,
});
};
function getGroupApprovals (groupId) {
return $http({
method: 'GET',
url: '/api/v3/approvals/group/' + groupId,
});
};
function approve (taskId, userId) {
return $http({
method: 'POST',
url: '/api/v3/tasks/' + taskId + '/approve/' + userId,
});
};
function getTask (taskId) {
return $http({
method: 'GET',
url: '/api/v3/tasks/' + taskId,
});
};
function updateTask (taskId, taskDetails) {
var taskDetailsToSend = _.omit(taskDetails, ['challenge', 'group', 'history', 'reminders', 'tags'])
return $http({
method: 'PUT',
url: '/api/v3/tasks/' + taskId,
data: taskDetailsToSend,
});
};
function deleteTask (taskId) {
return $http({
method: 'DELETE',
url: '/api/v3/tasks/' + taskId,
});
};
function scoreTask (taskId, direction) {
return $http({
method: 'POST',
url: '/api/v3/tasks/' + taskId + '/score/' + direction,
});
};
function moveTask (taskId, position) {
return $http({
method: 'POST',
url: '/api/v3/tasks/' + taskId + '/move/to/' + position,
});
};
function addChecklistItem (taskId, checkListItem) {
return $http({
method: 'POST',
url: '/api/v3/tasks/' + taskId + '/checklist',
data: checkListItem,
});
};
function scoreCheckListItem (taskId, itemId) {
return $http({
method: 'POST',
url: '/api/v3/tasks/' + taskId + '/checklist/' + itemId + '/score',
});
};
function updateChecklistItem (taskId, itemId, itemDetails) {
return $http({
method: 'PUT',
url: '/api/v3/tasks/' + taskId + '/checklist/' + itemId,
data: itemDetails,
});
};
function removeChecklistItem (taskId, itemId) {
return $http({
method: 'DELETE',
url: '/api/v3/tasks/' + taskId + '/checklist/' + itemId,
});
};
function addTagToTask (taskId, tagId) {
return $http({
method: 'POST',
url: '/api/v3/tasks/' + taskId + '/tags/' + tagId,
});
};
function removeTagFromTask (taskId, tagId) {
return $http({
method: 'DELETE',
url: '/api/v3/tasks/' + taskId + '/tags/' + tagId,
});
};
function unlinkOneTask (taskId, keep) { // single task
if (!keep) {
keep = "keep";
}
return $http({
method: 'POST',
url: '/api/v3/tasks/unlink-one/' + taskId + '?keep=' + keep,
});
};
function unlinkAllTasks (challengeId, keep) { // all tasks
if (!keep) {
keep = "keep-all";
}
return $http({
method: 'POST',
url: '/api/v3/tasks/unlink-all/' + challengeId + '?keep=' + keep,
});
};
function clearCompletedTodos () {
return $http({
method: 'POST',
url: '/api/v3/tasks/clearCompletedTodos',
});
};
function assignTask (taskId, userId) {
return $http({
method: 'POST',
url: '/api/v3/tasks/' + taskId + '/assign/' + userId,
});
};
function unAssignTask (taskId, userId) {
return $http({
method: 'POST',
url: '/api/v3/tasks/' + taskId + '/unassign/' + userId,
});
};
function editTask(task, user, taskStatus, scopeInc) {
var modalScope = $rootScope.$new();
modalScope.task = task;
modalScope.task._editing = true;
modalScope.task._tags = !user.preferences.tagsCollapsed;
modalScope.task._advanced = !user.preferences.advancedCollapsed;
modalScope.task._edit = angular.copy(task);
if($rootScope.charts[task._id]) $rootScope.charts[task.id] = false;
modalScope.taskStatus = taskStatus;
if (scopeInc) {
modalScope.saveTask = scopeInc.saveTask;
modalScope.addChecklist = scopeInc.addChecklist;
modalScope.addChecklistItem = scopeInc.addChecklistItem;
modalScope.removeChecklistItem = scopeInc.removeChecklistItem;
modalScope.swapChecklistItems = scopeInc.swapChecklistItems;
modalScope.navigateChecklist = scopeInc.navigateChecklist;
modalScope.checklistCompletion = scopeInc.checklistCompletion;
modalScope.canEdit = scopeInc.canEdit;
modalScope.updateTaskTags = scopeInc.updateTaskTags;
modalScope.obj = scopeInc.obj;
}
modalScope.cancelTaskEdit = cancelTaskEdit;
$rootScope.openModal('task-edit', {scope: modalScope, backdrop: 'static'});
}
function cancelTaskEdit(task) {
task._edit = undefined;
task._editing = false;
};
function cloneTask(task) {
var clonedTask = _.cloneDeep(task);
clonedTask = _cleanUpTask(clonedTask);
return Shared.taskDefaults(clonedTask);
}
function _cleanUpTask(task) {
var cleansedTask = _.omit(task, TASK_KEYS_TO_REMOVE);
// Copy checklists but reset to uncomplete and assign new id
_(cleansedTask.checklist).forEach(function(item) {
item.completed = false;
item.id = Shared.uuid();
}).value();
if (cleansedTask.type !== 'reward') {
delete cleansedTask.value;
}
return cleansedTask;
}
/*
------------------------
Checklists
------------------------
*/
function focusChecklist(task, index) {
window.setTimeout(function(){
$('#task-' + task._id + ' .checklist-form input[type="text"]')[index].focus();
});
}
function addChecklist(task) {
task._edit.checklist = [{completed:false, text:""}];
focusChecklist(task._edit,0);
}
function addChecklistItemToUI(task, $event, $index) {
if (task._edit.checklist[$index].text) {
if ($index === task._edit.checklist.length - 1) {
task._edit.checklist.push({ completed: false, text: '' });
}
focusChecklist(task._edit, $index + 1);
} else {
// TODO Provide UI feedback that this item is still blank
}
}
function removeChecklistItemFromUI(task, $event, $index, force) {
// Remove item if clicked on trash icon
if (force) {
task._edit.checklist.splice($index, 1);
} else if (!task._edit.checklist[$index].text) {
// User deleted all the text and is now wishing to delete the item
// saveTask will prune the empty item
// Move focus if the list is still non-empty
if ($index > 0)
focusChecklist(task._edit, $index-1);
// Don't allow the backspace key to navigate back now that the field is gone
$event.preventDefault();
}
}
function swapChecklistItems(task, oldIndex, newIndex) {
var toSwap = task._edit.checklist.splice(oldIndex, 1)[0];
task._edit.checklist.splice(newIndex, 0, toSwap);
}
function navigateChecklist(task,$index,$event) {
focusChecklist(task, $event.keyCode == '40' ? $index+1 : $index-1);
}
function checklistCompletion(checklist) {
return _.reduce(checklist,function(m,i){return m+(i.completed ? 1 : 0);},0)
}
function collapseChecklist(task) {
task.collapseChecklist = !task.collapseChecklist;
saveTask(task, true);
}
return {
addTasks: addTasks,
toggleBulk: toggleBulk,
getUserTasks: getUserTasks,
removeTask: removeTask,
saveTask: saveTask,
loadedCompletedTodos: false,
createUserTasks: createUserTasks,
getChallengeTasks: getChallengeTasks,
createChallengeTasks: createChallengeTasks,
getGroupTasks: getGroupTasks,
createGroupTasks: createGroupTasks,
getTask: getTask,
updateTask: updateTask,
deleteTask: deleteTask,
scoreTask: scoreTask,
moveTask: moveTask,
addChecklistItem: addChecklistItem,
scoreCheckListItem: scoreCheckListItem,
updateChecklistItem: updateChecklistItem,
removeChecklistItem: removeChecklistItem,
addTagToTask: addTagToTask,
removeTagFromTask: removeTagFromTask,
unlinkOneTask: unlinkOneTask,
unlinkAllTasks: unlinkAllTasks,
clearCompletedTodos: clearCompletedTodos,
editTask: editTask,
cancelTaskEdit: cancelTaskEdit,
cloneTask: cloneTask,
assignTask: assignTask,
unAssignTask: unAssignTask,
addChecklist: addChecklist,
addChecklistItemToUI: addChecklistItemToUI,
removeChecklistItemFromUI: removeChecklistItemFromUI,
swapChecklistItems: swapChecklistItems,
navigateChecklist: navigateChecklist,
checklistCompletion: checklistCompletion,
collapseChecklist: collapseChecklist,
getGroupApprovals: getGroupApprovals,
approve: approve,
};
}]);