Merge branch 'develop' into release

This commit is contained in:
Sabe Jones
2018-06-14 17:04:50 +00:00
8 changed files with 200 additions and 16 deletions
@@ -0,0 +1,100 @@
import max from 'lodash/max';
import mean from 'lodash/mean';
import monk from 'monk';
import round from 'lodash/round';
import sum from 'lodash/sum';
/*
* Output data on subscribers' task histories, formatted for CSV.
* User ID,Count of Dailies,Count of Habits,Total History Size,Max History Size,Mean History Size,Median History Size
*/
const connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE
let dbUsers = monk(connectionString).get('users', { castIds: false });
let dbTasks = monk(connectionString).get('tasks', { castIds: false });
function usersReport () {
let allHistoryLengths = [];
console.info('User ID,Count of Dailies,Count of Habits,Total History Size,Max History Size,Mean History Size,Median History Size');
dbUsers.find(
{
$and:
[
{'purchased.plan.planId': {$ne:null}},
{'purchased.plan.planId': {$ne:''}},
],
$or:
[
{'purchased.plan.dateTerminated': null},
{'purchased.plan.dateTerminated': ''},
{'purchased.plan.dateTerminated': {$gt:new Date()}},
],
},
{
fields: {_id: 1},
}
).each((user, {close, pause, resume}) => {
let historyLengths = [];
let habitCount = 0;
let dailyCount = 0;
pause();
return dbTasks.find(
{
userId: user._id,
$or:
[
{type: 'habit'},
{type: 'daily'},
],
},
{
fields: {
type: 1,
history: 1,
},
}
).each((task) => {
if (task.type === 'habit') {
habitCount++;
}
if (task.type === 'daily') {
dailyCount++;
}
if (task.history.length > 0) {
allHistoryLengths.push(task.history.length);
historyLengths.push(task.history.length);
}
}).then(() => {
const totalHistory = sum(historyLengths);
const maxHistory = historyLengths.length > 0 ? max(historyLengths) : 0;
const meanHistory = historyLengths.length > 0 ? round(mean(historyLengths)) : 0;
const medianHistory = historyLengths.length > 0 ? median(historyLengths) : 0;
console.info(`${user._id},${dailyCount},${habitCount},${totalHistory},${maxHistory},${meanHistory},${medianHistory}`);
resume();
});
}).then(() => {
console.info(`Total Subscriber History Entries: ${sum(allHistoryLengths)}`);
console.info(`Largest History Size: ${max(allHistoryLengths)}`);
console.info(`Mean History Size: ${round(mean(allHistoryLengths))}`);
console.info(`Median History Size: ${median(allHistoryLengths)}`);
return process.exit(0);
});
}
function median(values) { // https://gist.github.com/caseyjustus/1166258
values.sort( function(a,b) {return a - b;} );
var half = Math.floor(values.length/2);
if (values.length % 2) {
return values[half];
}
else {
return (values[half-1] + values[half]) / 2.0;
}
}
module.exports = usersReport;
+1 -1
View File
@@ -106,7 +106,7 @@ div
/* @TODO: The modal-open class is not being removed. Let's try this for now */
.modal, .modal-open {
overflow-y: scroll !important;
overflow-y: scroll;
}
.modal-backdrop.show {
+82 -1
View File
@@ -35,5 +35,86 @@
overflow-y: hidden;
text-overflow: ellipsis;
}
}
#start-quest-modal, #buy-quest-modal {
@media only screen and (max-width: 1200px) {
.modal-dialog {
max-width: 33%;
.left-panel {
left: initial;
width: 100%;
right: 100%;
.col-4 {
width: 100px;
}
}
.side-panel, .right-sidebar {
left: calc(100% - 10px);
max-width: 100%;
right: initial;
.questRewards {
width: 90%;
.reward-item {
width: 100%;
}
}
}
}
}
@media only screen and (max-width: 1000px) {
.modal-dialog {
max-width: 80%;
width: 80% !important;
.modal-body {
flex-direction: column;
display: flex;
div:nth-child(1) { order: 3; }
div:nth-child(2) { order: 1; }
div:nth-child(3) { order: 4; }
div:nth-child(4) { order: 5; }
div:nth-child(5) { order: 2; }
.left-panel {
border-radius: 8px;
position: static;
right: initial;
margin: 20px 0;
height: auto;
width: 100%;
z-index: 0;
order: 3;
.col-4 {
max-width: 100px;
}
}
.side-panel, .right-sidebar {
margin: 20px 0 0 0;
position: static;
box-shadow: none;
height: auto;
width: 100%;
z-index: 0;
order: 2;
left: 0;
.questRewards {
padding: 0 2em 2em 2em;
width: 100%;
z-index: 0;
}
}
}
}
}
}
+2 -2
View File
@@ -67,8 +67,8 @@
a.social-circle(href='https://www.facebook.com/Habitica', target='_blank')
.social-icon.facebook.svg-icon(v-html='icons.facebook')
.row
.col-12.col-md-10 {{ $t('donateText3') }}
.col-12.col-md-2
.col-12.col-md-8 {{ $t('donateText3') }}
.col-12.col-md-4
button.btn.btn-contribute(@click="donate()", v-if="user")
.svg-icon.heart(v-html="icons.heart")
.text {{ $t('companyDonate') }}
@@ -365,9 +365,9 @@ export default {
this.$root.$emit('bv::show::modal', 'close-challenge-modal');
},
edit () {
// @TODO: set working challenge
this.$store.state.challengeOptions.workingChallenge = Object.assign({}, this.$store.state.challengeOptions.workingChallenge, this.challenge);
this.$root.$emit('bv::show::modal', 'challenge-modal');
this.$root.$emit('habitica:update-challenge', {
challenge: this.challenge,
});
},
// @TODO: view members
updatedChallenge (eventData) {
@@ -241,6 +241,12 @@ export default {
this.$store.state.challengeOptions.workingChallenge = Object.assign({}, this.$store.state.challengeOptions.workingChallenge, data.challenge);
this.$root.$emit('bv::show::modal', 'challenge-modal');
});
this.$root.$on('habitica:update-challenge', (data) => {
if (!data.challenge) return;
this.cloning = false;
this.$store.state.challengeOptions.workingChallenge = Object.assign({}, this.$store.state.challengeOptions.workingChallenge, data.challenge);
this.$root.$emit('bv::show::modal', 'challenge-modal');
});
},
beforeDestroy () {
this.$root.$off('habitica:clone-challenge');
+5 -1
View File
@@ -39,7 +39,7 @@
| {{$t('groupNoNotifications')}}
.col-12.col-sm-4.sidebar
.row(:class='{"guild-background": !isParty}')
.col-12
.col-12.buttons-wrapper
.button-container
button.btn.btn-success(class='btn-success', v-if='isLeader && !group.purchased.active', @click='upgradeGroup()')
| {{ $t('upgrade') }}
@@ -127,6 +127,10 @@
.sidebar {
background-color: $gray-600;
padding-bottom: 2em;
}
.buttons-wrapper {
padding-top: 2.8em;
}
@@ -62,7 +62,6 @@
.content {
text-align: center;
overflow-y: scroll;
}
.item-wrapper {
@@ -71,14 +70,12 @@
.inner-content {
margin: 33px auto auto;
width: 400px;
}
.questInfo {
width: 70%;
margin: 0 auto;
margin-bottom: 10px;
margin: 0 auto 10px auto;
}
.right-sidebar {
@@ -99,9 +96,7 @@
span.svg-icon.inline.icon-32 {
height: 32px;
width: 32px;
margin-right: 8px;
vertical-align: middle;
}
@@ -112,7 +107,6 @@
font-size: 24px;
font-weight: bold;
line-height: 1.33;
vertical-align: middle;
&.gems {
@@ -161,7 +155,6 @@
}
}
.notEnough {
pointer-events: none;
opacity: 0.55;