mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 22:57:21 +01:00
minor text fixes: accurate flavour text for Golden Knight testimonies collection quest, etc (#8826)
* make comment more accurate: members are removed, not banned They can rejoin with an invitation in a private group or at any time in a public group. * change windows line breaks to unix line breaks * change flavour text of Golden Knight collection quest to reduce number of testimonies * fix grammatical error noticed by mandyzhou * improve message about not being able to send PMs because we often see people report it as a bug * update instructions for cancelling Google subscriptions (thanks to Scea for noticing) * change Delete Completed on-hover message - fixes #8598 * correct the Orb of Rebirth's text about pets and mounts (they are not locked)
This commit is contained in:
@@ -1,47 +1,47 @@
|
|||||||
import Bluebird from 'Bluebird';
|
import Bluebird from 'Bluebird';
|
||||||
|
|
||||||
import { model as Challenges } from '../../website/server/models/challenge';
|
import { model as Challenges } from '../../website/server/models/challenge';
|
||||||
import { model as User } from '../../website/server/models/user';
|
import { model as User } from '../../website/server/models/user';
|
||||||
|
|
||||||
async function syncChallengeToMembers (challenges) {
|
async function syncChallengeToMembers (challenges) {
|
||||||
let challengSyncPromises = challenges.map(async function (challenge) {
|
let challengSyncPromises = challenges.map(async function (challenge) {
|
||||||
let users = await User.find({
|
let users = await User.find({
|
||||||
// _id: '',
|
// _id: '',
|
||||||
challenges: challenge._id,
|
challenges: challenge._id,
|
||||||
}).exec();
|
}).exec();
|
||||||
|
|
||||||
let promises = [];
|
let promises = [];
|
||||||
users.forEach(function (user) {
|
users.forEach(function (user) {
|
||||||
promises.push(challenge.syncToUser(user));
|
promises.push(challenge.syncToUser(user));
|
||||||
promises.push(challenge.save());
|
promises.push(challenge.save());
|
||||||
promises.push(user.save());
|
promises.push(user.save());
|
||||||
});
|
});
|
||||||
|
|
||||||
return Bluebird.all(promises);
|
return Bluebird.all(promises);
|
||||||
});
|
});
|
||||||
|
|
||||||
return await Bluebird.all(challengSyncPromises);
|
return await Bluebird.all(challengSyncPromises);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function syncChallenges (lastChallengeDate) {
|
async function syncChallenges (lastChallengeDate) {
|
||||||
let query = {
|
let query = {
|
||||||
// _id: '',
|
// _id: '',
|
||||||
};
|
};
|
||||||
|
|
||||||
if (lastChallengeDate) {
|
if (lastChallengeDate) {
|
||||||
query.createdOn = { $lte: lastChallengeDate };
|
query.createdOn = { $lte: lastChallengeDate };
|
||||||
}
|
}
|
||||||
|
|
||||||
let challengesFound = await Challenges.find(query)
|
let challengesFound = await Challenges.find(query)
|
||||||
.limit(10)
|
.limit(10)
|
||||||
.sort('-createdAt')
|
.sort('-createdAt')
|
||||||
.exec();
|
.exec();
|
||||||
|
|
||||||
let syncedChallenges = await syncChallengeToMembers(challengesFound)
|
let syncedChallenges = await syncChallengeToMembers(challengesFound)
|
||||||
.catch(reason => console.error(reason));
|
.catch(reason => console.error(reason));
|
||||||
let lastChallenge = challengesFound[challengesFound.length - 1];
|
let lastChallenge = challengesFound[challengesFound.length - 1];
|
||||||
if (lastChallenge) syncChallenges(lastChallenge.createdAt);
|
if (lastChallenge) syncChallenges(lastChallenge.createdAt);
|
||||||
return syncedChallenges;
|
return syncedChallenges;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = syncChallenges;
|
module.exports = syncChallenges;
|
||||||
|
|||||||
@@ -1,63 +1,63 @@
|
|||||||
describe('Group Tasks Meta Actions Controller', () => {
|
describe('Group Tasks Meta Actions Controller', () => {
|
||||||
let rootScope, scope, user, userSerivce;
|
let rootScope, scope, user, userSerivce;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
module(function($provide) {
|
module(function($provide) {
|
||||||
$provide.value('User', {});
|
$provide.value('User', {});
|
||||||
});
|
});
|
||||||
|
|
||||||
inject(($rootScope, $controller) => {
|
inject(($rootScope, $controller) => {
|
||||||
rootScope = $rootScope;
|
rootScope = $rootScope;
|
||||||
|
|
||||||
user = specHelper.newUser();
|
user = specHelper.newUser();
|
||||||
user._id = "unique-user-id";
|
user._id = "unique-user-id";
|
||||||
userSerivce = {user: user};
|
userSerivce = {user: user};
|
||||||
|
|
||||||
scope = $rootScope.$new();
|
scope = $rootScope.$new();
|
||||||
|
|
||||||
scope.task = {
|
scope.task = {
|
||||||
group: {
|
group: {
|
||||||
assignedUsers: [],
|
assignedUsers: [],
|
||||||
approval: {
|
approval: {
|
||||||
required: false,
|
required: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
scope.task._edit = angular.copy(scope.task);
|
scope.task._edit = angular.copy(scope.task);
|
||||||
|
|
||||||
$controller('GroupTaskActionsCtrl', {$scope: scope, User: userSerivce});
|
$controller('GroupTaskActionsCtrl', {$scope: scope, User: userSerivce});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('toggleTaskRequiresApproval', function () {
|
describe('toggleTaskRequiresApproval', function () {
|
||||||
it('toggles task approval required field from false to true', function () {
|
it('toggles task approval required field from false to true', function () {
|
||||||
scope.toggleTaskRequiresApproval();
|
scope.toggleTaskRequiresApproval();
|
||||||
expect(scope.task._edit.group.approval.required).to.be.true;
|
expect(scope.task._edit.group.approval.required).to.be.true;
|
||||||
});
|
});
|
||||||
|
|
||||||
it('toggles task approval required field from true to false', function () {
|
it('toggles task approval required field from true to false', function () {
|
||||||
scope.task._edit.group.approval.required = true;
|
scope.task._edit.group.approval.required = true;
|
||||||
scope.toggleTaskRequiresApproval();
|
scope.toggleTaskRequiresApproval();
|
||||||
expect(scope.task._edit.group.approval.required).to.be.false;
|
expect(scope.task._edit.group.approval.required).to.be.false;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
describe('assign events', function () {
|
describe('assign events', function () {
|
||||||
it('adds a group member to assigned users on "addedGroupMember" event ', () => {
|
it('adds a group member to assigned users on "addedGroupMember" event ', () => {
|
||||||
var testId = 'test-id';
|
var testId = 'test-id';
|
||||||
rootScope.$broadcast('addedGroupMember', testId);
|
rootScope.$broadcast('addedGroupMember', testId);
|
||||||
expect(scope.task.group.assignedUsers).to.contain(testId);
|
expect(scope.task.group.assignedUsers).to.contain(testId);
|
||||||
expect(scope.task._edit.group.assignedUsers).to.contain(testId);
|
expect(scope.task._edit.group.assignedUsers).to.contain(testId);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('removes a group member to assigned users on "addedGroupMember" event ', () => {
|
it('removes a group member to assigned users on "addedGroupMember" event ', () => {
|
||||||
var testId = 'test-id';
|
var testId = 'test-id';
|
||||||
scope.task.group.assignedUsers.push(testId);
|
scope.task.group.assignedUsers.push(testId);
|
||||||
scope.task._edit.group.assignedUsers.push(testId);
|
scope.task._edit.group.assignedUsers.push(testId);
|
||||||
rootScope.$broadcast('removedGroupMember', testId);
|
rootScope.$broadcast('removedGroupMember', testId);
|
||||||
expect(scope.task.group.assignedUsers).to.not.contain(testId);
|
expect(scope.task.group.assignedUsers).to.not.contain(testId);
|
||||||
expect(scope.task._edit.group.assignedUsers).to.not.contain(testId);
|
expect(scope.task._edit.group.assignedUsers).to.not.contain(testId);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -91,8 +91,8 @@
|
|||||||
height: 10.5em
|
height: 10.5em
|
||||||
width: 100%
|
width: 100%
|
||||||
|
|
||||||
// Covers avatars, health bar at 1005-768. Fix:
|
// Covers avatars, health bar at 1005-768. Fix:
|
||||||
@media (max-width: 1005px) and (min-width: 768px)
|
@media (max-width: 1005px) and (min-width: 768px)
|
||||||
margin-top: 2.8em;
|
margin-top: 2.8em;
|
||||||
|
|
||||||
// this is a wrapper for avatars in the header
|
// this is a wrapper for avatars in the header
|
||||||
|
|||||||
@@ -1,43 +1,43 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
A controller to manage the Group Plans page
|
A controller to manage the Group Plans page
|
||||||
*/
|
*/
|
||||||
|
|
||||||
angular.module('habitrpg')
|
angular.module('habitrpg')
|
||||||
.controller("GroupPlansCtrl", ['$scope', '$window', 'Groups', 'Payments',
|
.controller("GroupPlansCtrl", ['$scope', '$window', 'Groups', 'Payments',
|
||||||
function($scope, $window, Groups, Payments) {
|
function($scope, $window, Groups, Payments) {
|
||||||
$scope.PAGES = {
|
$scope.PAGES = {
|
||||||
BENEFITS: 'benefits',
|
BENEFITS: 'benefits',
|
||||||
CREATE_GROUP: 'create-group',
|
CREATE_GROUP: 'create-group',
|
||||||
UPGRADE_GROUP: 'upgrade-group',
|
UPGRADE_GROUP: 'upgrade-group',
|
||||||
};
|
};
|
||||||
$scope.activePage = $scope.PAGES.BENEFITS;
|
$scope.activePage = $scope.PAGES.BENEFITS;
|
||||||
$scope.newGroup = {
|
$scope.newGroup = {
|
||||||
type: 'guild',
|
type: 'guild',
|
||||||
privacy: 'private',
|
privacy: 'private',
|
||||||
};
|
};
|
||||||
$scope.PAYMENTS = {
|
$scope.PAYMENTS = {
|
||||||
AMAZON: 'amazon',
|
AMAZON: 'amazon',
|
||||||
STRIPE: 'stripe',
|
STRIPE: 'stripe',
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.changePage = function (page) {
|
$scope.changePage = function (page) {
|
||||||
$scope.activePage = page;
|
$scope.activePage = page;
|
||||||
$window.scrollTo(0, 0);
|
$window.scrollTo(0, 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.newGroupIsReady = function () {
|
$scope.newGroupIsReady = function () {
|
||||||
return !!$scope.newGroup.name;
|
return !!$scope.newGroup.name;
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.createGroup = function () {
|
$scope.createGroup = function () {
|
||||||
$scope.changePage($scope.PAGES.UPGRADE_GROUP);
|
$scope.changePage($scope.PAGES.UPGRADE_GROUP);
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.upgradeGroup = function (paymentType) {
|
$scope.upgradeGroup = function (paymentType) {
|
||||||
var subscriptionKey = 'group_monthly'; // @TODO: Get from content API?
|
var subscriptionKey = 'group_monthly'; // @TODO: Get from content API?
|
||||||
if (paymentType === $scope.PAYMENTS.STRIPE) Payments.showStripe({subscription: subscriptionKey, coupon: null, groupToCreate: $scope.newGroup});
|
if (paymentType === $scope.PAYMENTS.STRIPE) Payments.showStripe({subscription: subscriptionKey, coupon: null, groupToCreate: $scope.newGroup});
|
||||||
if (paymentType === $scope.PAYMENTS.AMAZON) Payments.amazonPayments.init({type: 'subscription', subscription: subscriptionKey, coupon: null, groupToCreate: $scope.newGroup});
|
if (paymentType === $scope.PAYMENTS.AMAZON) Payments.amazonPayments.init({type: 'subscription', subscription: subscriptionKey, coupon: null, groupToCreate: $scope.newGroup});
|
||||||
};
|
};
|
||||||
}]);
|
}]);
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
#Running
|
#Running
|
||||||
- Open a terminal and type `npm run client:dev`
|
- Open a terminal and type `npm run client:dev`
|
||||||
- Open a second terminal and type `npm start`
|
- Open a second terminal and type `npm start`
|
||||||
|
|
||||||
#Preparation Reading
|
#Preparation Reading
|
||||||
- Vue 2 (https://vuejs.org)
|
- Vue 2 (https://vuejs.org)
|
||||||
|
|
||||||
- Webpack (https://webpack.github.io/) is the build system and it includes plugins for code transformation, right now we have: BabelJS for ES6 transpilation, eslint for code style, less and postcss for css compilation. The code comes from https://github.com/vuejs-templates/webpack which is a Webpack template for Vue, with some small modifications to adapt it to our use case. Docs http://vuejs-templates.github.io/webpack/
|
- Webpack (https://webpack.github.io/) is the build system and it includes plugins for code transformation, right now we have: BabelJS for ES6 transpilation, eslint for code style, less and postcss for css compilation. The code comes from https://github.com/vuejs-templates/webpack which is a Webpack template for Vue, with some small modifications to adapt it to our use case. Docs http://vuejs-templates.github.io/webpack/
|
||||||
|
|
||||||
- We’re using `.vue` files that make it possible to have HTML, JS and CSS for each component together in a single location. They’re implemented as a webpack plugin and the docs can be found here http://vue-loader.vuejs.org/en/
|
- We’re using `.vue` files that make it possible to have HTML, JS and CSS for each component together in a single location. They’re implemented as a webpack plugin and the docs can be found here http://vue-loader.vuejs.org/en/
|
||||||
|
|
||||||
- SemanticUI is the UI framework http://semantic-ui.com/. So far I’ve only used the CSS part, it also has JS plugins but I’ve yet to use them. It supports theming so if it’s not too difficult we’ll want to customize the base theme with our own styles instead of writing CSS rules to override the original styling.
|
- SemanticUI is the UI framework http://semantic-ui.com/. So far I’ve only used the CSS part, it also has JS plugins but I’ve yet to use them. It supports theming so if it’s not too difficult we’ll want to customize the base theme with our own styles instead of writing CSS rules to override the original styling.
|
||||||
|
|
||||||
The code is in `/website/client`. We’re using something very similar to Vuex (equivalent of React’s Redux) for state management http://vuex.vuejs.org/en/index.html
|
The code is in `/website/client`. We’re using something very similar to Vuex (equivalent of React’s Redux) for state management http://vuex.vuejs.org/en/index.html
|
||||||
|
|
||||||
The API is almost the same except that we don’t use mutations but only actions because it would make it difficult to work with common code
|
The API is almost the same except that we don’t use mutations but only actions because it would make it difficult to work with common code
|
||||||
|
|
||||||
The project is developed directly in the `develop` branch as long as we’ll be able to avoid splitting it into a different branch.
|
The project is developed directly in the `develop` branch as long as we’ll be able to avoid splitting it into a different branch.
|
||||||
|
|
||||||
So far most of the work has been on the template, so there’s no complex logic to understand. The only thing I would suggest you to read about is Vuex for data management: it’s basically a Flux implementation: there’s a central store that hold the data for the entire app, and every change to the data must happen through an action, the data cannot be mutated directly.
|
So far most of the work has been on the template, so there’s no complex logic to understand. The only thing I would suggest you to read about is Vuex for data management: it’s basically a Flux implementation: there’s a central store that hold the data for the entire app, and every change to the data must happen through an action, the data cannot be mutated directly.
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
#Running
|
#Running
|
||||||
- Open a terminal and type `npm run client:dev`
|
- Open a terminal and type `npm run client:dev`
|
||||||
- Open a second terminal and type `npm start`
|
- Open a second terminal and type `npm start`
|
||||||
|
|
||||||
#Preparation Reading
|
#Preparation Reading
|
||||||
- Vue 2 (https://vuejs.org)
|
- Vue 2 (https://vuejs.org)
|
||||||
|
|
||||||
- Webpack (https://webpack.github.io/) is the build system and it includes plugins for code transformation, right now we have: BabelJS for ES6 transpilation, eslint for code style, less and postcss for css compilation. The code comes from https://github.com/vuejs-templates/webpack which is a Webpack template for Vue, with some small modifications to adapt it to our use case. Docs http://vuejs-templates.github.io/webpack/
|
- Webpack (https://webpack.github.io/) is the build system and it includes plugins for code transformation, right now we have: BabelJS for ES6 transpilation, eslint for code style, less and postcss for css compilation. The code comes from https://github.com/vuejs-templates/webpack which is a Webpack template for Vue, with some small modifications to adapt it to our use case. Docs http://vuejs-templates.github.io/webpack/
|
||||||
|
|
||||||
- We’re using `.vue` files that make it possible to have HTML, JS and CSS for each component together in a single location. They’re implemented as a webpack plugin and the docs can be found here http://vue-loader.vuejs.org/en/
|
- We’re using `.vue` files that make it possible to have HTML, JS and CSS for each component together in a single location. They’re implemented as a webpack plugin and the docs can be found here http://vue-loader.vuejs.org/en/
|
||||||
|
|
||||||
- SemanticUI is the UI framework http://semantic-ui.com/. So far I’ve only used the CSS part, it also has JS plugins but I’ve yet to use them. It supports theming so if it’s not too difficult we’ll want to customize the base theme with our own styles instead of writing CSS rules to override the original styling.
|
- SemanticUI is the UI framework http://semantic-ui.com/. So far I’ve only used the CSS part, it also has JS plugins but I’ve yet to use them. It supports theming so if it’s not too difficult we’ll want to customize the base theme with our own styles instead of writing CSS rules to override the original styling.
|
||||||
|
|
||||||
The code is in `/website/client`. We’re using something very similar to Vuex (equivalent of React’s Redux) for state management http://vuex.vuejs.org/en/index.html
|
The code is in `/website/client`. We’re using something very similar to Vuex (equivalent of React’s Redux) for state management http://vuex.vuejs.org/en/index.html
|
||||||
|
|
||||||
The API is almost the same except that we don’t use mutations but only actions because it would make it difficult to work with common code
|
The API is almost the same except that we don’t use mutations but only actions because it would make it difficult to work with common code
|
||||||
|
|
||||||
The project is developed directly in the `develop` branch as long as we’ll be able to avoid splitting it into a different branch.
|
The project is developed directly in the `develop` branch as long as we’ll be able to avoid splitting it into a different branch.
|
||||||
|
|
||||||
So far most of the work has been on the template, so there’s no complex logic to understand. The only thing I would suggest you to read about is Vuex for data management: it’s basically a Flux implementation: there’s a central store that hold the data for the entire app, and every change to the data must happen through an action, the data cannot be mutated directly.
|
So far most of the work has been on the template, so there’s no complex logic to understand. The only thing I would suggest you to read about is Vuex for data management: it’s basically a Flux implementation: there’s a central store that hold the data for the entire app, and every change to the data must happen through an action, the data cannot be mutated directly.
|
||||||
|
|||||||
@@ -114,7 +114,7 @@
|
|||||||
"messageRequired": "A message is required.",
|
"messageRequired": "A message is required.",
|
||||||
"toUserIDRequired": "A User ID is required",
|
"toUserIDRequired": "A User ID is required",
|
||||||
"gemAmountRequired": "A number of gems is required",
|
"gemAmountRequired": "A number of gems is required",
|
||||||
"notAuthorizedToSendMessageToThisUser": "Can't send message to this user.",
|
"notAuthorizedToSendMessageToThisUser": "You can't send a message to this player because they have chosen to block messages.",
|
||||||
"privateMessageGiftGemsMessage": "Hello <%= receiverName %>, <%= senderName %> has sent you <%= gemAmount %> gems!",
|
"privateMessageGiftGemsMessage": "Hello <%= receiverName %>, <%= senderName %> has sent you <%= gemAmount %> gems!",
|
||||||
"privateMessageGiftSubscriptionMessage": "<%= numberOfMonths %> months of subscription! ",
|
"privateMessageGiftSubscriptionMessage": "<%= numberOfMonths %> months of subscription! ",
|
||||||
"cannotSendGemsToYourself": "Cannot send gems to yourself. Try a subscription instead.",
|
"cannotSendGemsToYourself": "Cannot send gems to yourself. Try a subscription instead.",
|
||||||
|
|||||||
@@ -109,7 +109,7 @@
|
|||||||
"questGoldenknight1DropGoldenknight2Quest": "The Golden Knight Part 2: Gold Knight (Scroll)",
|
"questGoldenknight1DropGoldenknight2Quest": "The Golden Knight Part 2: Gold Knight (Scroll)",
|
||||||
|
|
||||||
"questGoldenknight2Text": "The Golden Knight, Part 2: Gold Knight",
|
"questGoldenknight2Text": "The Golden Knight, Part 2: Gold Knight",
|
||||||
"questGoldenknight2Notes": "Armed with hundreds of Habitican's testimonies, you finally confront the Golden Knight. You begin to recite the Habitcan's complaints to her, one by one. \"And @Pfeffernusse says that your constant bragging-\" The knight raises her hand to silence you and scoffs, \"Please, these people are merely jealous of my success. Instead of complaining, they should simply work as hard as I! Perhaps I shall show you the power you can attain through diligence such as mine!\" She raises her morningstar and prepares to attack you!",
|
"questGoldenknight2Notes": "Armed with dozens of Habiticans' testimonies, you finally confront the Golden Knight. You begin to recite the Habitcans' complaints to her, one by one. \"And @Pfeffernusse says that your constant bragging-\" The knight raises her hand to silence you and scoffs, \"Please, these people are merely jealous of my success. Instead of complaining, they should simply work as hard as I! Perhaps I shall show you the power you can attain through diligence such as mine!\" She raises her morningstar and prepares to attack you!",
|
||||||
"questGoldenknight2Boss": "Gold Knight",
|
"questGoldenknight2Boss": "Gold Knight",
|
||||||
"questGoldenknight2DropGoldenknight3Quest": "The Golden Knight Part 3: The Iron Knight (Scroll)",
|
"questGoldenknight2DropGoldenknight3Quest": "The Golden Knight Part 3: The Iron Knight (Scroll)",
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
"rebirthInList1": "Tasks, history, equipment, and settings remain.",
|
"rebirthInList1": "Tasks, history, equipment, and settings remain.",
|
||||||
"rebirthInList2": "Challenge, Guild, and Party memberships remain.",
|
"rebirthInList2": "Challenge, Guild, and Party memberships remain.",
|
||||||
"rebirthInList3": "Gems, backer tiers, and contributor levels remain.",
|
"rebirthInList3": "Gems, backer tiers, and contributor levels remain.",
|
||||||
"rebirthInList4": "Items obtained from Gems or drops (such as pets and mounts) remain, though you cannot access them until you unlock them again.",
|
"rebirthInList4": "Items obtained from Gems or drops (such as pets and mounts) remain.",
|
||||||
"rebirthEarnAchievement": "You also earn an Achievement for beginning a new adventure!",
|
"rebirthEarnAchievement": "You also earn an Achievement for beginning a new adventure!",
|
||||||
"beReborn": "Be Reborn",
|
"beReborn": "Be Reborn",
|
||||||
"rebirthAchievement": "You've begun a new adventure! This is Rebirth <%= number %> for you, and the highest Level you've attained is <%= level %>. To stack this Achievement, begin your next new adventure when you've reached an even higher Level!",
|
"rebirthAchievement": "You've begun a new adventure! This is Rebirth <%= number %> for you, and the highest Level you've attained is <%= level %>. To stack this Achievement, begin your next new adventure when you've reached an even higher Level!",
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
"subscribed": "Subscribed",
|
"subscribed": "Subscribed",
|
||||||
"manageSub": "Click to manage subscription",
|
"manageSub": "Click to manage subscription",
|
||||||
"cancelSub": "Cancel Subscription",
|
"cancelSub": "Cancel Subscription",
|
||||||
"cancelSubInfoGoogle": "Please go to the \"My apps & games\" > \"Subscriptions\" section of the Google Play Store app to cancel your subscription or to see your subscription's termination date if you have already cancelled it. This screen is not able to show you whether your subscription has been cancelled.",
|
"cancelSubInfoGoogle": "Please go to the \"Account\" > \"Subscriptions\" section of the Google Play Store app to cancel your subscription or to see your subscription's termination date if you have already cancelled it. This screen is not able to show you whether your subscription has been cancelled.",
|
||||||
"cancelSubInfoApple": "Please follow <a href=\"https://support.apple.com/en-us/HT202039\">Apple’s official instructions</a> to cancel your subscription or to see your subscription's termination date if you have already cancelled it. This screen is not able to show you whether your subscription has been cancelled.",
|
"cancelSubInfoApple": "Please follow <a href=\"https://support.apple.com/en-us/HT202039\">Apple’s official instructions</a> to cancel your subscription or to see your subscription's termination date if you have already cancelled it. This screen is not able to show you whether your subscription has been cancelled.",
|
||||||
"canceledSubscription": "Canceled Subscription",
|
"canceledSubscription": "Canceled Subscription",
|
||||||
"cancelingSubscription": "Canceling the subscription",
|
"cancelingSubscription": "Canceling the subscription",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"clearCompleted": "Delete Completed",
|
"clearCompleted": "Delete Completed",
|
||||||
"lotOfToDos": "Your most recent 30 completed To-Dos are shown here. You can see older completed To-Dos from Data > Data Display Tool or Data > Export Data > User Data.",
|
"lotOfToDos": "Your most recent 30 completed To-Dos are shown here. You can see older completed To-Dos from Data > Data Display Tool or Data > Export Data > User Data.",
|
||||||
"deleteToDosExplanation": "If you click the button below, all of your completed To-Dos and archived To-Dos will be permanently deleted. Export them first if you want to keep a record of them.",
|
"deleteToDosExplanation": "If you click the button below, all of your completed To-Dos and archived To-Dos will be permanently deleted, except for To-Dos from active challenges and Group Plans. Export them first if you want to keep a record of them.",
|
||||||
"addmultiple": "Add Multiple",
|
"addmultiple": "Add Multiple",
|
||||||
"addsingle": "Add Single",
|
"addsingle": "Add Single",
|
||||||
"habit": "Habit",
|
"habit": "Habit",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
script(id='partials/options.profile.achievements.html', type='text/ng-template')
|
script(id='partials/options.profile.achievements.html', type='text/ng-template')
|
||||||
.container-fluid
|
.container-fluid
|
||||||
div(class='row')
|
div(class='row')
|
||||||
div(ng-class='user.flags.classSelected && !user.preferences.disableClasses ? "col-md-4" : "col-md-6"')
|
div(ng-class='user.flags.classSelected && !user.preferences.disableClasses ? "col-md-4" : "col-md-6"')
|
||||||
include ../../shared/profiles/achievements
|
include ../../shared/profiles/achievements
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
script(id='partials/options.profile.avatar.html', type='text/ng-template')
|
script(id='partials/options.profile.avatar.html', type='text/ng-template')
|
||||||
+customizeProfile()
|
+customizeProfile()
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
script(id='partials/options.settings.export.html', type="text/ng-template")
|
script(id='partials/options.settings.export.html', type="text/ng-template")
|
||||||
.container-fluid
|
.container-fluid
|
||||||
.row
|
.row
|
||||||
.col-md-6
|
.col-md-6
|
||||||
h2=env.t('dataExport')
|
h2=env.t('dataExport')
|
||||||
small=env.t('saveData')
|
small=env.t('saveData')
|
||||||
h4=env.t('habitHistory')
|
h4=env.t('habitHistory')
|
||||||
=env.t('exportHistory')
|
=env.t('exportHistory')
|
||||||
a(href="/export/history.csv")= ' ' + env.t('csv')
|
a(href="/export/history.csv")= ' ' + env.t('csv')
|
||||||
h4=env.t('userData')
|
h4=env.t('userData')
|
||||||
=env.t('exportUserData')
|
=env.t('exportUserData')
|
||||||
a(href="/export/userdata.xml")= ' ' + env.t('xml') + ' '
|
a(href="/export/userdata.xml")= ' ' + env.t('xml') + ' '
|
||||||
a(href="/export/userdata.json")= env.t('json')
|
a(href="/export/userdata.json")= env.t('json')
|
||||||
|
|||||||
@@ -1,49 +1,49 @@
|
|||||||
script(id='partials/options.settings.notifications.html', type="text/ng-template")
|
script(id='partials/options.settings.notifications.html', type="text/ng-template")
|
||||||
.container-fluid
|
.container-fluid
|
||||||
.row
|
.row
|
||||||
.personal-options.col-md-6
|
.personal-options.col-md-6
|
||||||
.panel.panel-default
|
.panel.panel-default
|
||||||
.panel-heading
|
.panel-heading
|
||||||
=env.t('notifications')
|
=env.t('notifications')
|
||||||
.panel-body
|
.panel-body
|
||||||
table.table
|
table.table
|
||||||
tr
|
tr
|
||||||
td
|
td
|
||||||
th
|
th
|
||||||
span=env.t("email")
|
span=env.t("email")
|
||||||
th
|
th
|
||||||
span=env.t("push")
|
span=env.t("push")
|
||||||
-var unsubscribeFromAllEmails = 'user.preferences.emailNotifications.unsubscribeFromAll'
|
-var unsubscribeFromAllEmails = 'user.preferences.emailNotifications.unsubscribeFromAll'
|
||||||
-var unsubscribeFromAllPush = 'user.preferences.pushNotifications.unsubscribeFromAll'
|
-var unsubscribeFromAllPush = 'user.preferences.pushNotifications.unsubscribeFromAll'
|
||||||
each notification in ['newPM', 'wonChallenge', 'giftedGems', 'giftedSubscription', 'invitedParty', 'invitedGuild', 'kickedGroup', 'questStarted', 'invitedQuest', 'importantAnnouncements', 'weeklyRecaps', 'onboarding']
|
each notification in ['newPM', 'wonChallenge', 'giftedGems', 'giftedSubscription', 'invitedParty', 'invitedGuild', 'kickedGroup', 'questStarted', 'invitedQuest', 'importantAnnouncements', 'weeklyRecaps', 'onboarding']
|
||||||
tr
|
tr
|
||||||
td
|
td
|
||||||
span=env.t(notification)
|
span=env.t(notification)
|
||||||
td
|
td
|
||||||
-var preference = 'user.preferences.emailNotifications.' + notification
|
-var preference = 'user.preferences.emailNotifications.' + notification
|
||||||
input(type='checkbox', ng-model='#{preference}',
|
input(type='checkbox', ng-model='#{preference}',
|
||||||
ng-disabled='#{unsubscribeFromAllEmails} === true || #{preference} === undefined',
|
ng-disabled='#{unsubscribeFromAllEmails} === true || #{preference} === undefined',
|
||||||
ng-checked='#{unsubscribeFromAllEmails} === false && #{preference} === true',
|
ng-checked='#{unsubscribeFromAllEmails} === false && #{preference} === true',
|
||||||
ng-change='set({"preferences.emailNotifications.#{notification}": #{preference} ? true: false})')
|
ng-change='set({"preferences.emailNotifications.#{notification}": #{preference} ? true: false})')
|
||||||
td
|
td
|
||||||
-var preference = 'user.preferences.pushNotifications.' + notification
|
-var preference = 'user.preferences.pushNotifications.' + notification
|
||||||
input(type='checkbox', ng-model='#{preference}',
|
input(type='checkbox', ng-model='#{preference}',
|
||||||
ng-disabled='#{unsubscribeFromAllPush} === true || #{preference} === undefined',
|
ng-disabled='#{unsubscribeFromAllPush} === true || #{preference} === undefined',
|
||||||
ng-checked='#{unsubscribeFromAllPush} === false && #{preference} === true',
|
ng-checked='#{unsubscribeFromAllPush} === false && #{preference} === true',
|
||||||
ng-change='set({"preferences.pushNotifications.#{notification}": #{preference} ? true: false})')
|
ng-change='set({"preferences.pushNotifications.#{notification}": #{preference} ? true: false})')
|
||||||
|
|
||||||
hr
|
hr
|
||||||
|
|
||||||
.checkbox
|
.checkbox
|
||||||
label
|
label
|
||||||
input(type='checkbox', ng-model='user.preferences.pushNotifications.unsubscribeFromAll',
|
input(type='checkbox', ng-model='user.preferences.pushNotifications.unsubscribeFromAll',
|
||||||
ng-change='set({"preferences.pushNotifications.unsubscribeFromAll": user.preferences.pushNotifications.unsubscribeFromAll ? true: false})')
|
ng-change='set({"preferences.pushNotifications.unsubscribeFromAll": user.preferences.pushNotifications.unsubscribeFromAll ? true: false})')
|
||||||
span=env.t('unsubscribeAllPush')
|
span=env.t('unsubscribeAllPush')
|
||||||
|
|
||||||
.checkbox
|
.checkbox
|
||||||
label
|
label
|
||||||
input(type='checkbox', ng-model='user.preferences.emailNotifications.unsubscribeFromAll',
|
input(type='checkbox', ng-model='user.preferences.emailNotifications.unsubscribeFromAll',
|
||||||
ng-change='set({"preferences.emailNotifications.unsubscribeFromAll": user.preferences.emailNotifications.unsubscribeFromAll ? true: false})')
|
ng-change='set({"preferences.emailNotifications.unsubscribeFromAll": user.preferences.emailNotifications.unsubscribeFromAll ? true: false})')
|
||||||
span=env.t('unsubscribeAllEmails')
|
span=env.t('unsubscribeAllEmails')
|
||||||
|
|
||||||
small=env.t('unsubscribeAllEmailsText')
|
small=env.t('unsubscribeAllEmailsText')
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
script(type='text/ng-template', id='partials/options.settings.promo.html')
|
script(type='text/ng-template', id='partials/options.settings.promo.html')
|
||||||
.container-fluid
|
.container-fluid
|
||||||
.row
|
.row
|
||||||
.col-md-6
|
.col-md-6
|
||||||
h2=env.t('promoCode')
|
h2=env.t('promoCode')
|
||||||
form.form-inline(role='form',ng-submit='enterCoupon(_couponCode)')
|
form.form-inline(role='form',ng-submit='enterCoupon(_couponCode)')
|
||||||
input.form-control(type='text', ng-model='_couponCode', placeholder=env.t('promoPlaceholder'))
|
input.form-control(type='text', ng-model='_couponCode', placeholder=env.t('promoPlaceholder'))
|
||||||
button.btn.btn-primary(type='submit')= env.t('submit')
|
button.btn.btn-primary(type='submit')= env.t('submit')
|
||||||
div
|
div
|
||||||
small= env.t('couponText')
|
small= env.t('couponText')
|
||||||
div(ng-if='user.contributor.sudo')
|
div(ng-if='user.contributor.sudo')
|
||||||
hr
|
hr
|
||||||
h4=env.t('generateCodes')
|
h4=env.t('generateCodes')
|
||||||
form.form(role='form',ng-submit='generateCodes(_codes)',ng-init='_codes={}')
|
form.form(role='form',ng-submit='generateCodes(_codes)',ng-init='_codes={}')
|
||||||
.form-group
|
.form-group
|
||||||
input.form-control(type='text',ng-model='_codes.event',placeholder="Event code (eg, 'wondercon')")
|
input.form-control(type='text',ng-model='_codes.event',placeholder="Event code (eg, 'wondercon')")
|
||||||
.form-group
|
.form-group
|
||||||
input.form-control(type='number',ng-model='_codes.count',placeholder="Number of codes to generate (eg, 250)")
|
input.form-control(type='number',ng-model='_codes.count',placeholder="Number of codes to generate (eg, 250)")
|
||||||
.form-group
|
.form-group
|
||||||
button.btn.btn-primary(type='submit')=env.t('generate')
|
button.btn.btn-primary(type='submit')=env.t('generate')
|
||||||
a.btn.btn-default(href='/api/v3/coupons?_id={{user._id}}&apiToken={{User.settings.auth.apiToken}}')=env.t('getCodes')
|
a.btn.btn-default(href='/api/v3/coupons?_id={{user._id}}&apiToken={{User.settings.auth.apiToken}}')=env.t('getCodes')
|
||||||
|
|||||||
@@ -1,186 +1,186 @@
|
|||||||
script(type='text/ng-template', id='partials/options.settings.settings.html')
|
script(type='text/ng-template', id='partials/options.settings.settings.html')
|
||||||
.container-fluid
|
.container-fluid
|
||||||
.row
|
.row
|
||||||
.personal-options.col-md-6
|
.personal-options.col-md-6
|
||||||
.panel.panel-default
|
.panel.panel-default
|
||||||
.panel-heading
|
.panel-heading
|
||||||
=env.t('settings')
|
=env.t('settings')
|
||||||
.panel-body
|
.panel-body
|
||||||
|
|
||||||
.form-horizontal
|
.form-horizontal
|
||||||
h5=env.t('language')
|
h5=env.t('language')
|
||||||
select.form-control(ng-model='language.code', ng-options='lang.code as lang.name for lang in availableLanguages', ng-change='changeLanguage()')
|
select.form-control(ng-model='language.code', ng-options='lang.code as lang.name for lang in availableLanguages', ng-change='changeLanguage()')
|
||||||
small
|
small
|
||||||
!=env.t('americanEnglishGovern')
|
!=env.t('americanEnglishGovern')
|
||||||
br
|
br
|
||||||
strong
|
strong
|
||||||
!=env.t('helpWithTranslation')
|
!=env.t('helpWithTranslation')
|
||||||
|
|
||||||
hr
|
hr
|
||||||
|
|
||||||
.form-horizontal
|
.form-horizontal
|
||||||
h5=env.t('dateFormat')
|
h5=env.t('dateFormat')
|
||||||
select.form-control(ng-model='user.preferences.dateFormat', ng-options='DF for DF in availableFormats', ng-change='set({"preferences.dateFormat": user.preferences.dateFormat})')
|
select.form-control(ng-model='user.preferences.dateFormat', ng-options='DF for DF in availableFormats', ng-change='set({"preferences.dateFormat": user.preferences.dateFormat})')
|
||||||
|
|
||||||
hr
|
hr
|
||||||
|
|
||||||
.checkbox
|
.checkbox
|
||||||
label
|
label
|
||||||
input(type='checkbox', ng-click='hideHeader() ', ng-checked='user.preferences.hideHeader!==true')
|
input(type='checkbox', ng-click='hideHeader() ', ng-checked='user.preferences.hideHeader!==true')
|
||||||
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('showHeaderPop'))=env.t('showHeader')
|
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('showHeaderPop'))=env.t('showHeader')
|
||||||
.checkbox
|
.checkbox
|
||||||
label
|
label
|
||||||
input(type='checkbox', ng-click='toggleStickyHeader()', ng-checked='user.preferences.stickyHeader!==false', ng-disabled="user.preferences.hideHeader!==false")
|
input(type='checkbox', ng-click='toggleStickyHeader()', ng-checked='user.preferences.stickyHeader!==false', ng-disabled="user.preferences.hideHeader!==false")
|
||||||
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('stickyHeaderPop'))=env.t('stickyHeader')
|
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('stickyHeaderPop'))=env.t('stickyHeader')
|
||||||
.checkbox
|
.checkbox
|
||||||
label
|
label
|
||||||
input(type='checkbox', ng-model='user.preferences.newTaskEdit', ng-change='set({"preferences.newTaskEdit": user.preferences.newTaskEdit?true: false})')
|
input(type='checkbox', ng-model='user.preferences.newTaskEdit', ng-change='set({"preferences.newTaskEdit": user.preferences.newTaskEdit?true: false})')
|
||||||
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('newTaskEditPop'))=env.t('newTaskEdit')
|
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('newTaskEditPop'))=env.t('newTaskEdit')
|
||||||
.checkbox
|
.checkbox
|
||||||
label
|
label
|
||||||
input(type='checkbox', ng-model='user.preferences.tagsCollapsed', ng-change='set({"preferences.tagsCollapsed": user.preferences.tagsCollapsed?true: false})')
|
input(type='checkbox', ng-model='user.preferences.tagsCollapsed', ng-change='set({"preferences.tagsCollapsed": user.preferences.tagsCollapsed?true: false})')
|
||||||
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('startCollapsedPop'))=env.t('startCollapsed')
|
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('startCollapsedPop'))=env.t('startCollapsed')
|
||||||
.checkbox
|
.checkbox
|
||||||
label
|
label
|
||||||
input(type='checkbox', ng-model='user.preferences.advancedCollapsed', ng-change='set({"preferences.advancedCollapsed": user.preferences.advancedCollapsed?true: false})')
|
input(type='checkbox', ng-model='user.preferences.advancedCollapsed', ng-change='set({"preferences.advancedCollapsed": user.preferences.advancedCollapsed?true: false})')
|
||||||
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('startAdvCollapsedPop'))=env.t('startAdvCollapsed')
|
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('startAdvCollapsedPop'))=env.t('startAdvCollapsed')
|
||||||
.checkbox
|
.checkbox
|
||||||
label
|
label
|
||||||
input(type='checkbox', ng-model='user.preferences.dailyDueDefaultView', ng-change='set({"preferences.dailyDueDefaultView": user.preferences.dailyDueDefaultView?true: false})')
|
input(type='checkbox', ng-model='user.preferences.dailyDueDefaultView', ng-change='set({"preferences.dailyDueDefaultView": user.preferences.dailyDueDefaultView?true: false})')
|
||||||
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('dailyDueDefaultViewPop'))=env.t('dailyDueDefaultView')
|
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('dailyDueDefaultViewPop'))=env.t('dailyDueDefaultView')
|
||||||
.checkbox(ng-if='party.memberCount === 1')
|
.checkbox(ng-if='party.memberCount === 1')
|
||||||
label
|
label
|
||||||
input(type='checkbox', ng-model='user.preferences.displayInviteToPartyWhenPartyIs1', ng-change='set({"preferences.displayInviteToPartyWhenPartyIs1": user.preferences.displayInviteToPartyWhenPartyIs1 ? true : false})')
|
input(type='checkbox', ng-model='user.preferences.displayInviteToPartyWhenPartyIs1', ng-change='set({"preferences.displayInviteToPartyWhenPartyIs1": user.preferences.displayInviteToPartyWhenPartyIs1 ? true : false})')
|
||||||
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('displayInviteToPartyWhenPartyIs1'))=env.t('displayInviteToPartyWhenPartyIs1')
|
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('displayInviteToPartyWhenPartyIs1'))=env.t('displayInviteToPartyWhenPartyIs1')
|
||||||
.checkbox
|
.checkbox
|
||||||
label=env.t('suppressLevelUpModal')
|
label=env.t('suppressLevelUpModal')
|
||||||
input(type='checkbox', ng-model='user.preferences.suppressModals.levelUp', ng-change='set({"preferences.suppressModals.levelUp": user.preferences.suppressModals.levelUp?true: false})')
|
input(type='checkbox', ng-model='user.preferences.suppressModals.levelUp', ng-change='set({"preferences.suppressModals.levelUp": user.preferences.suppressModals.levelUp?true: false})')
|
||||||
.checkbox
|
.checkbox
|
||||||
label=env.t('suppressHatchPetModal')
|
label=env.t('suppressHatchPetModal')
|
||||||
input(type='checkbox', ng-model='user.preferences.suppressModals.hatchPet', ng-change='set({"preferences.suppressModals.hatchPet": user.preferences.suppressModals.hatchPet?true: false})')
|
input(type='checkbox', ng-model='user.preferences.suppressModals.hatchPet', ng-change='set({"preferences.suppressModals.hatchPet": user.preferences.suppressModals.hatchPet?true: false})')
|
||||||
.checkbox
|
.checkbox
|
||||||
label=env.t('suppressRaisePetModal')
|
label=env.t('suppressRaisePetModal')
|
||||||
input(type='checkbox', ng-model='user.preferences.suppressModals.raisePet', ng-change='set({"preferences.suppressModals.raisePet": user.preferences.suppressModals.raisePet?true: false})')
|
input(type='checkbox', ng-model='user.preferences.suppressModals.raisePet', ng-change='set({"preferences.suppressModals.raisePet": user.preferences.suppressModals.raisePet?true: false})')
|
||||||
.checkbox
|
.checkbox
|
||||||
label=env.t('suppressStreakModal')
|
label=env.t('suppressStreakModal')
|
||||||
input(type='checkbox', ng-model='user.preferences.suppressModals.streak', ng-change='set({"preferences.suppressModals.streak": user.preferences.suppressModals.streak?true: false})')
|
input(type='checkbox', ng-model='user.preferences.suppressModals.streak', ng-change='set({"preferences.suppressModals.streak": user.preferences.suppressModals.streak?true: false})')
|
||||||
//- .checkbox
|
//- .checkbox
|
||||||
//- label=env.t('confirmScoreNotes')
|
//- label=env.t('confirmScoreNotes')
|
||||||
//- input(type='checkbox', ng-model='user.preferences.tasks.confirmScoreNotes', ng-change='set({"preferences.tasks.confirmScoreNotes": user.preferences.tasks.confirmScoreNotes ? true: false})')
|
//- input(type='checkbox', ng-model='user.preferences.tasks.confirmScoreNotes', ng-change='set({"preferences.tasks.confirmScoreNotes": user.preferences.tasks.confirmScoreNotes ? true: false})')
|
||||||
|
|
||||||
//- .checkbox
|
//- .checkbox
|
||||||
//- label=env.t('groupTasksByChallenge')
|
//- label=env.t('groupTasksByChallenge')
|
||||||
//- input(type='checkbox', ng-model='user.preferences.tasks.groupByChallenge', ng-change='set({"preferences.tasks.groupByChallenge": user.preferences.tasks.groupByChallenge ? true: false})')
|
//- input(type='checkbox', ng-model='user.preferences.tasks.groupByChallenge', ng-change='set({"preferences.tasks.groupByChallenge": user.preferences.tasks.groupByChallenge ? true: false})')
|
||||||
|
|
||||||
hr
|
hr
|
||||||
|
|
||||||
button.btn.btn-default(ng-click='showBailey()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('showBaileyPop'))= env.t('showBailey')
|
button.btn.btn-default(ng-click='showBailey()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('showBaileyPop'))= env.t('showBailey')
|
||||||
button.btn.btn-default(ng-click='openRestoreModal()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('fixValPop'))= env.t('fixVal')
|
button.btn.btn-default(ng-click='openRestoreModal()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('fixValPop'))= env.t('fixVal')
|
||||||
button.btn.btn-default(ng-if='user.preferences.disableClasses==true', ng-click='User.changeClass({})', popover-trigger='mouseenter', popover-placement='right', popover=env.t('enableClassPop'))= env.t('enableClass')
|
button.btn.btn-default(ng-if='user.preferences.disableClasses==true', ng-click='User.changeClass({})', popover-trigger='mouseenter', popover-placement='right', popover=env.t('enableClassPop'))= env.t('enableClass')
|
||||||
|
|
||||||
hr
|
hr
|
||||||
|
|
||||||
h5=env.t('customDayStart')
|
h5=env.t('customDayStart')
|
||||||
alert.alert-warning=env.t('customDayStartInfo1')
|
alert.alert-warning=env.t('customDayStartInfo1')
|
||||||
|
|
||||||
.form-horizontal
|
.form-horizontal
|
||||||
.form-group
|
.form-group
|
||||||
.col-sm-7
|
.col-sm-7
|
||||||
select.form-control(ng-model='dayStart')
|
select.form-control(ng-model='dayStart')
|
||||||
- var number = 0
|
- var number = 0
|
||||||
while number < 24
|
while number < 24
|
||||||
- var value = number
|
- var value = number
|
||||||
- var meridian = number < 12 ? 'AM' : 'PM'
|
- var meridian = number < 12 ? 'AM' : 'PM'
|
||||||
- var hour = number++ % 12
|
- var hour = number++ % 12
|
||||||
option(value=value) #{hour ? hour : 12}:00 #{meridian}
|
option(value=value) #{hour ? hour : 12}:00 #{meridian}
|
||||||
|
|
||||||
.col-sm-5
|
.col-sm-5
|
||||||
br.visible-xs
|
br.visible-xs
|
||||||
button.btn.btn-block.btn-primary(ng-click='openDayStartModal(dayStart)',
|
button.btn.btn-block.btn-primary(ng-click='openDayStartModal(dayStart)',
|
||||||
ng-disabled='dayStart == user.preferences.dayStart')
|
ng-disabled='dayStart == user.preferences.dayStart')
|
||||||
=env.t('saveCustomDayStart')
|
=env.t('saveCustomDayStart')
|
||||||
|
|
||||||
hr
|
hr
|
||||||
|
|
||||||
h5=env.t('timezone')
|
h5=env.t('timezone')
|
||||||
.form-horizontal
|
.form-horizontal
|
||||||
.form-group
|
.form-group
|
||||||
.col-sm-12
|
.col-sm-12
|
||||||
p!=env.t('timezoneUTC', {utc: "{{ user.preferences.timezoneOffset | timezoneOffsetToUtc }}"})
|
p!=env.t('timezoneUTC', {utc: "{{ user.preferences.timezoneOffset | timezoneOffsetToUtc }}"})
|
||||||
br
|
br
|
||||||
p!=env.t('timezoneInfo')
|
p!=env.t('timezoneInfo')
|
||||||
|
|
||||||
.personal-options.col-md-6
|
.personal-options.col-md-6
|
||||||
.panel.panel-default
|
.panel.panel-default
|
||||||
.panel-heading
|
.panel-heading
|
||||||
span=env.t('registration')
|
span=env.t('registration')
|
||||||
.panel-body
|
.panel-body
|
||||||
div
|
div
|
||||||
ul.list-inline
|
ul.list-inline
|
||||||
li(ng-repeat='network in SOCIAL_AUTH_NETWORKS')
|
li(ng-repeat='network in SOCIAL_AUTH_NETWORKS')
|
||||||
button.btn.btn-primary(ng-if='!user.auth[network.key].id', ng-click='socialLogin(network.key, user)')=env.t('registerWithSocial', {network: '{{network.name}}'})
|
button.btn.btn-primary(ng-if='!user.auth[network.key].id', ng-click='socialLogin(network.key, user)')=env.t('registerWithSocial', {network: '{{network.name}}'})
|
||||||
button.btn.btn-primary(disabled='disabled', ng-if='!hasBackupAuthOption(user, network.key) && user.auth[network.key].id')=env.t('registeredWithSocial', {network: '{{network.name}}'})
|
button.btn.btn-primary(disabled='disabled', ng-if='!hasBackupAuthOption(user, network.key) && user.auth[network.key].id')=env.t('registeredWithSocial', {network: '{{network.name}}'})
|
||||||
button.btn.btn-danger(ng-click='deleteSocialAuth(network.key)', ng-if='hasBackupAuthOption(user, network.key) && user.auth[network.key].id')=env.t('detachSocial', {network: '{{network.name}}'})
|
button.btn.btn-danger(ng-click='deleteSocialAuth(network.key)', ng-if='hasBackupAuthOption(user, network.key) && user.auth[network.key].id')=env.t('detachSocial', {network: '{{network.name}}'})
|
||||||
hr
|
hr
|
||||||
div(ng-if='!user.auth.local.username')
|
div(ng-if='!user.auth.local.username')
|
||||||
p=env.t('addLocalAuth')
|
p=env.t('addLocalAuth')
|
||||||
form(ng-submit='http("post", "/api/v3/user/auth/local/register", localAuth, "addedLocalAuth")', ng-init='localAuth={}', name='localAuth', novalidate)
|
form(ng-submit='http("post", "/api/v3/user/auth/local/register", localAuth, "addedLocalAuth")', ng-init='localAuth={}', name='localAuth', novalidate)
|
||||||
//-.alert.alert-danger(ng-messages='changeUsername.$error && changeUsername.submitted')=env.t('fillAll')
|
//-.alert.alert-danger(ng-messages='changeUsername.$error && changeUsername.submitted')=env.t('fillAll')
|
||||||
.form-group
|
.form-group
|
||||||
input.form-control(type='text', placeholder=env.t('username'), ng-model='localAuth.username', required)
|
input.form-control(type='text', placeholder=env.t('username'), ng-model='localAuth.username', required)
|
||||||
.form-group
|
.form-group
|
||||||
input.form-control(type='text', placeholder=env.t('email'), ng-model='localAuth.email', required)
|
input.form-control(type='text', placeholder=env.t('email'), ng-model='localAuth.email', required)
|
||||||
.form-group
|
.form-group
|
||||||
input.form-control(type='password', placeholder=env.t('password'), ng-model='localAuth.password', required)
|
input.form-control(type='password', placeholder=env.t('password'), ng-model='localAuth.password', required)
|
||||||
.form-group
|
.form-group
|
||||||
input.form-control(type='password', placeholder=env.t('confirmPass'), ng-model='localAuth.confirmPassword', required)
|
input.form-control(type='password', placeholder=env.t('confirmPass'), ng-model='localAuth.confirmPassword', required)
|
||||||
input.btn.btn-default(type='submit', ng-disabled='localAuth.$invalid', value=env.t('submit'))
|
input.btn.btn-default(type='submit', ng-disabled='localAuth.$invalid', value=env.t('submit'))
|
||||||
|
|
||||||
div(ng-if='user.auth.local.username')
|
div(ng-if='user.auth.local.username')
|
||||||
p=env.t('username')
|
p=env.t('username')
|
||||||
|: {{user.auth.local.username}}
|
|: {{user.auth.local.username}}
|
||||||
p
|
p
|
||||||
small.muted
|
small.muted
|
||||||
=env.t('loginNameDescription1')
|
=env.t('loginNameDescription1')
|
||||||
|
|
|
|
||||||
a(href='/#/options/profile/profile')=env.t('loginNameDescription2')
|
a(href='/#/options/profile/profile')=env.t('loginNameDescription2')
|
||||||
|
|
|
|
||||||
=env.t('loginNameDescription3')
|
=env.t('loginNameDescription3')
|
||||||
p=env.t('email')
|
p=env.t('email')
|
||||||
|: {{user.auth.local.email}}
|
|: {{user.auth.local.email}}
|
||||||
hr
|
hr
|
||||||
|
|
||||||
h5=env.t('changeUsername')
|
h5=env.t('changeUsername')
|
||||||
form(ng-submit='changeUser("username", usernameUpdates)', ng-init='usernameUpdates={}', ng-show='user.auth.local', name='changeUsername', novalidate)
|
form(ng-submit='changeUser("username", usernameUpdates)', ng-init='usernameUpdates={}', ng-show='user.auth.local', name='changeUsername', novalidate)
|
||||||
//-.alert.alert-danger(ng-messages='changeUsername.$error && changeUsername.submitted')=env.t('fillAll')
|
//-.alert.alert-danger(ng-messages='changeUsername.$error && changeUsername.submitted')=env.t('fillAll')
|
||||||
.form-group
|
.form-group
|
||||||
input.form-control(type='text', placeholder=env.t('newUsername'), ng-model='usernameUpdates.username', required)
|
input.form-control(type='text', placeholder=env.t('newUsername'), ng-model='usernameUpdates.username', required)
|
||||||
.form-group
|
.form-group
|
||||||
input.form-control(type='password', placeholder=env.t('password'), ng-model='usernameUpdates.password', required)
|
input.form-control(type='password', placeholder=env.t('password'), ng-model='usernameUpdates.password', required)
|
||||||
input.btn.btn-default(type='submit', ng-disabled='changeUsername.$invalid', value=env.t('submit'))
|
input.btn.btn-default(type='submit', ng-disabled='changeUsername.$invalid', value=env.t('submit'))
|
||||||
|
|
||||||
h5=env.t('changeEmail')
|
h5=env.t('changeEmail')
|
||||||
form(ng-submit='changeUser("email", emailUpdates)', ng-show='user.auth.local', name='changeEmail', novalidate)
|
form(ng-submit='changeUser("email", emailUpdates)', ng-show='user.auth.local', name='changeEmail', novalidate)
|
||||||
.form-group
|
.form-group
|
||||||
input.form-control(type='text', placeholder=env.t('newEmail'), ng-model='emailUpdates.newEmail', required)
|
input.form-control(type='text', placeholder=env.t('newEmail'), ng-model='emailUpdates.newEmail', required)
|
||||||
.form-group
|
.form-group
|
||||||
input.form-control(type='password', placeholder=env.t('password'), ng-model='emailUpdates.password', required)
|
input.form-control(type='password', placeholder=env.t('password'), ng-model='emailUpdates.password', required)
|
||||||
input.btn.btn-default(type='submit', ng-disabled='changeEmail.$invalid', value=env.t('submit'))
|
input.btn.btn-default(type='submit', ng-disabled='changeEmail.$invalid', value=env.t('submit'))
|
||||||
|
|
||||||
h5=env.t('changePass')
|
h5=env.t('changePass')
|
||||||
form(ng-submit='changeUser("password", passwordUpdates)', ng-show='user.auth.local', name='changePassword', novalidate)
|
form(ng-submit='changeUser("password", passwordUpdates)', ng-show='user.auth.local', name='changePassword', novalidate)
|
||||||
.form-group
|
.form-group
|
||||||
input.form-control(type='password', placeholder=env.t('oldPass'), ng-model='passwordUpdates.password', required)
|
input.form-control(type='password', placeholder=env.t('oldPass'), ng-model='passwordUpdates.password', required)
|
||||||
.form-group
|
.form-group
|
||||||
input.form-control(type='password', placeholder=env.t('newPass'), ng-model='passwordUpdates.newPassword', required)
|
input.form-control(type='password', placeholder=env.t('newPass'), ng-model='passwordUpdates.newPassword', required)
|
||||||
.form-group
|
.form-group
|
||||||
input.form-control(type='password', placeholder=env.t('confirmPass'), ng-model='passwordUpdates.confirmPassword', required)
|
input.form-control(type='password', placeholder=env.t('confirmPass'), ng-model='passwordUpdates.confirmPassword', required)
|
||||||
input.btn.btn-default(type='submit', ng-disabled='changePassword.$invalid', value=env.t('submit'))
|
input.btn.btn-default(type='submit', ng-disabled='changePassword.$invalid', value=env.t('submit'))
|
||||||
|
|
||||||
|
|
||||||
.panel.panel-default
|
.panel.panel-default
|
||||||
.panel-heading
|
.panel-heading
|
||||||
span=env.t('dangerZone')
|
span=env.t('dangerZone')
|
||||||
.panel-body
|
.panel-body
|
||||||
a.btn.btn-danger(ng-click='openModal("reset", {controller:"SettingsCtrl"})', popover-trigger='mouseenter', popover-placement='right', popover=env.t('resetAccPop'))= env.t('resetAccount')
|
a.btn.btn-danger(ng-click='openModal("reset", {controller:"SettingsCtrl"})', popover-trigger='mouseenter', popover-placement='right', popover=env.t('resetAccPop'))= env.t('resetAccount')
|
||||||
a.btn.btn-danger(ng-click='openModal("delete", {controller:"SettingsCtrl"})', popover-trigger='mouseenter', popover=env.t('deleteAccPop'))= env.t('deleteAccount')
|
a.btn.btn-danger(ng-click='openModal("delete", {controller:"SettingsCtrl"})', popover-trigger='mouseenter', popover=env.t('deleteAccPop'))= env.t('deleteAccount')
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ a.pull-right.gem-wallet(ng-if='group.type!="party"', popover-trigger='mouseenter
|
|||||||
table.table.table-striped(ng-show='::group.memberCount > 1 || group.type !== "party"' bindonce='group')
|
table.table.table-striped(ng-show='::group.memberCount > 1 || group.type !== "party"' bindonce='group')
|
||||||
tr(ng-repeat='member in group.members track by member._id')
|
tr(ng-repeat='member in group.members track by member._id')
|
||||||
td.media
|
td.media
|
||||||
// allow leaders and administrators to ban members
|
// allow leaders and administrators to remove members
|
||||||
.pull-left(ng-show='(isAbleToEditGroup(group) && member._id != user._id)')
|
.pull-left(ng-show='(isAbleToEditGroup(group) && member._id != user._id)')
|
||||||
a.media-object(ng-click='removeMember(group, member, true)')
|
a.media-object(ng-click='removeMember(group, member, true)')
|
||||||
span.glyphicon.glyphicon-ban-circle(tooltip=env.t('banTip'))
|
span.glyphicon.glyphicon-ban-circle(tooltip=env.t('banTip'))
|
||||||
@@ -130,7 +130,7 @@ a.pull-right.gem-wallet(ng-if='group.type!="party"', popover-trigger='mouseenter
|
|||||||
table.table.table-striped
|
table.table.table-striped
|
||||||
tr(ng-repeat='invite in group.invites')
|
tr(ng-repeat='invite in group.invites')
|
||||||
td.media
|
td.media
|
||||||
// allow leaders and administrators to ban members
|
// allow leaders and administrators to remove members
|
||||||
.pull-left(ng-show='isAbleToEditGroup(group)')
|
.pull-left(ng-show='isAbleToEditGroup(group)')
|
||||||
a.media-object(ng-click='removeMember(group, invite, false)')
|
a.media-object(ng-click='removeMember(group, invite, false)')
|
||||||
span.glyphicon.glyphicon-ban-circle(tooltip=env.t('banTip'))
|
span.glyphicon.glyphicon-ban-circle(tooltip=env.t('banTip'))
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
script(type='text/ng-template', id='modals/task-notes.html')
|
script(type='text/ng-template', id='modals/task-notes.html')
|
||||||
.modal-header
|
.modal-header
|
||||||
h4 Task Notes
|
h4 Task Notes
|
||||||
|
|
||||||
.modal-body
|
.modal-body
|
||||||
textarea.form-control(ng-model="task.scoreNotes", row="10")
|
textarea.form-control(ng-model="task.scoreNotes", row="10")
|
||||||
|
|
||||||
.modal-footer
|
.modal-footer
|
||||||
.btn.btn-default(ng-click='$close()')=env.t('cancel')
|
.btn.btn-default(ng-click='$close()')=env.t('cancel')
|
||||||
.btn.btn-primary(ng-click="$close(task)")=env.t('save')
|
.btn.btn-primary(ng-click="$close(task)")=env.t('save')
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
script(type='text/ng-template', id='modals/task-edit.html')
|
script(type='text/ng-template', id='modals/task-edit.html')
|
||||||
.modal-content.task-modal(style='min-width:22em', class='{{taskStatus}}', id="task-{{task._id}}")
|
.modal-content.task-modal(style='min-width:22em', class='{{taskStatus}}', id="task-{{task._id}}")
|
||||||
.modal-body.text-center(style='padding-bottom:0')
|
.modal-body.text-center(style='padding-bottom:0')
|
||||||
include ../tasks/edit/index
|
include ../tasks/edit/index
|
||||||
.modal-footer(style='margin-top:0')
|
.modal-footer(style='margin-top:0')
|
||||||
.container-fluid
|
.container-fluid
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
script(id='templates/task-list.html', type="text/ng-template")
|
script(id='templates/task-list.html', type="text/ng-template")
|
||||||
ul(ng-init='setObj(obj)', class='{{::list.type}}s main-list',
|
ul(ng-init='setObj(obj)', class='{{::list.type}}s main-list',
|
||||||
ng-show='obj[list.type+"s"].length > 0',
|
ng-show='obj[list.type+"s"].length > 0',
|
||||||
ng-if='showNormalList(obj)')
|
ng-if='showNormalList(obj)')
|
||||||
task(hrpg-sort-tasks)
|
task(hrpg-sort-tasks)
|
||||||
|
|
||||||
div(ng-init='setObj(obj);')
|
div(ng-init='setObj(obj);')
|
||||||
div(
|
div(
|
||||||
ng-repeat="(key, taskList) in groupedList[list.type]",
|
ng-repeat="(key, taskList) in groupedList[list.type]",
|
||||||
ng-if='showGroupedList(obj)')
|
ng-if='showGroupedList(obj)')
|
||||||
h3 {{key}}
|
h3 {{key}}
|
||||||
ul(class='{{::list.type}}s main-list',
|
ul(class='{{::list.type}}s main-list',
|
||||||
ng-show='taskList.length > 0')
|
ng-show='taskList.length > 0')
|
||||||
task(hrpg-sort-tasks)
|
task(hrpg-sort-tasks)
|
||||||
|
|
||||||
//Loads the non-sortable lists for challenges
|
//Loads the non-sortable lists for challenges
|
||||||
ul(ng-init='setObj(obj)', class='{{::list.type}}s main-list',
|
ul(ng-init='setObj(obj)', class='{{::list.type}}s main-list',
|
||||||
ng-show='obj[list.type + "s"].length > 0',
|
ng-show='obj[list.type + "s"].length > 0',
|
||||||
ng-if='showChallengeList()')
|
ng-if='showChallengeList()')
|
||||||
task
|
task
|
||||||
|
|||||||
Reference in New Issue
Block a user