diff --git a/website/client/assets/images/gryphon.png b/website/client/assets/images/gryphon.png
new file mode 100644
index 0000000000..1001e838a2
Binary files /dev/null and b/website/client/assets/images/gryphon.png differ
diff --git a/website/client/assets/images/gryphon@2x.png b/website/client/assets/images/gryphon@2x.png
new file mode 100644
index 0000000000..758e262edb
Binary files /dev/null and b/website/client/assets/images/gryphon@2x.png differ
diff --git a/website/client/assets/images/gryphon@3x.png b/website/client/assets/images/gryphon@3x.png
new file mode 100644
index 0000000000..1b004563c2
Binary files /dev/null and b/website/client/assets/images/gryphon@3x.png differ
diff --git a/website/client/assets/svg/heart.svg b/website/client/assets/svg/heart.svg
new file mode 100644
index 0000000000..b6761a2835
--- /dev/null
+++ b/website/client/assets/svg/heart.svg
@@ -0,0 +1,3 @@
+
diff --git a/website/client/components/appFooter.vue b/website/client/components/appFooter.vue
index 59539140f2..a1e6dfedf8 100644
--- a/website/client/components/appFooter.vue
+++ b/website/client/components/appFooter.vue
@@ -1,5 +1,6 @@
.row
+ buy-gems-modal
modify-inventory
footer.container-fluid
.row
@@ -59,14 +60,14 @@
a(href='http://habitica.wikia.com/wiki/Guidance_for_Blacksmiths', target='_blank') Guidance for Blacksmiths
li
a(href='http://devs.habitica.com/', target='_blank') The Forge - Developer Blog
- .col-6
+ .col-6.social
h3 Social
.social-circle
a(href='https://twitter.com/habitica', target='_blank')
.social-icon.svg-icon(v-html='icons.twitter')
.social-circle
a(href='https://www.instagram.com/habitica/', target='_blank')
- .social-icon.svg-icon(v-html='icons.instagram')
+ .social-icon.svg-icon.instagram(v-html='icons.instagram')
.social-circle
a(href='https://www.facebook.com/Habitica', target='_blank')
.social-icon.facebook.svg-icon(v-html='icons.facebook')
@@ -74,7 +75,9 @@
.col-10
| We’re an open source project that depends on our users for support. The money you donate helps us keep the servers running, maintain a small staff, develop new features, and provide incentives for our volunteers.
.col-2
- button.btn.btn-primary Donate
+ button.btn.btn-donate(@click='donate()')
+ .svg-icon.heart(v-html='icons.heart')
+ .text Donate
.row
hr.col-12
.row
@@ -99,10 +102,12 @@
a.btn.btn-default(@click='makeAdmin()') Make Admin
a.btn.btn-default(@click='openModifyInventoryModal()') Modify Inventory
.col-4.text-center
- .logo.svg-icon(v-html='icons.gryphon')
+ .logo
.col-4.text-right
- span Privacy Policy
- span Terms of Use
+ span
+ router-link(to="/static/privacy") Privacy Policy
+ span.terms-link
+ router-link(to="/static/terms") Terms of Use
+
+
diff --git a/website/client/components/chat/chatMessages.vue b/website/client/components/chat/chatMessages.vue
index cce8f75e2e..fd46dd12c4 100644
--- a/website/client/components/chat/chatMessages.vue
+++ b/website/client/components/chat/chatMessages.vue
@@ -166,7 +166,8 @@ export default {
this.messages.forEach(message => {
let uuid = message.uuid;
- if (!this.cachedProfileData[uuid]) {
+ if (uuid && !this.cachedProfileData[uuid]) {
+ if (uuid === 'system') return;
promises.push(axios.get(`/api/v3/members/${uuid}`));
}
});
diff --git a/website/client/components/hall/heroes.vue b/website/client/components/hall/heroes.vue
index 2413f51e6f..9b8a17b4fa 100644
--- a/website/client/components/hall/heroes.vue
+++ b/website/client/components/hall/heroes.vue
@@ -3,13 +3,13 @@
small.muted(v-html="$t('blurbHallContributors')")
.well(v-if='user.contributor.admin')
h2 {{ $t('rewardUser') }}
- form(v-submit='loadHero(_heroID)')
+ form(submit='loadHero(heroID)') // @TODO: make click
.form-group
- input.form-control(type='text', v-model='_heroID', placeholder {{ $t('UUID') }})
+ input.form-control(type='text', v-model='heroID', placeholder="$t('UUID')")
.form-group
input.btn.btn-default(type='submit')
| {{ $t('loadUser') }}
- form(v-show='hero', v-submit='saveHero(hero)')
+ form(v-if='hero && hero.profile', submit='saveHero(hero)') // @TODO: make click
a(v-click='clickMember(hero._id, true)')
h3 {{hero.profile.name}}
.form-group
@@ -70,19 +70,19 @@
thead
tr
th {{ $t('name') }}
- th(v-if='user.contributor.admin') {{ $t('UUID') }}
+ th(v-if='user.contributor && user.contributor.admin') {{ $t('UUID') }}
th {{ $t('contribLevel') }}
th {{ $t('title') }}
th {{ $t('contributions') }}
tbody
- tr(v-repeat='hero in heroes')
+ tr(v-for='(hero, $index) in heroes')
td
- span(v-if='hero.contributor.admin', :popover="$t('gamemaster')", popover-trigger='mouseenter', popover-placement='right')
+ span(v-if='hero.contributor && hero.contributor.admin', :popover="$t('gamemaster')", popover-trigger='mouseenter', popover-placement='right')
a.label.label-default(v-class='userLevelStyle(hero)', v-click='clickMember(hero._id, true)')
| {{hero.profile.name}}
span(v-class='userAdminGlyphiconStyle(hero)')
- span(v-if='!hero.contributor.admin')
- a.label.label-default(v-class='userLevelStyle(hero)', v-click='clickMember(hero._id, true)') {{hero.profile.name}}
+ span(v-if='!hero.contributor || !hero.contributor.admin')
+ a.label.label-default(v-if='hero.profile', v-class='userLevelStyle(hero)', v-click='clickMember(hero._id, true)') {{hero.profile.name}}
td(v-if='user.contributor.admin', v-click='populateContributorInput(hero._id, $index)').btn-link {{hero._id}}
td {{hero.contributor.level}}
td {{hero.contributor.text}}
@@ -91,7 +91,7 @@
diff --git a/website/client/components/payments/buyGemsModal.vue b/website/client/components/payments/buyGemsModal.vue
new file mode 100644
index 0000000000..58845aa2f6
--- /dev/null
+++ b/website/client/components/payments/buyGemsModal.vue
@@ -0,0 +1,112 @@
+
+b-modal#buy-gems(title="Amazon", :hide-footer="true", size='lg')
+ .modal-body
+ .buy-gems
+ // @TODO: +gemButton(true)
+
+ div(ng-if='user.purchased.plan.customerId && (user.purchased.plan.gemsBought >= User.user.purchased.plan.consecutive.gemCapExtra + Shared.planGemLimits.convCap)')
+ .panel.panel-default
+ .panel-body
+ h3 {{ $t('buyGemsGold') }}
+ p {{ $t('maxBuyGems') }}
+
+ div(ng-if='user.purchased.plan.customerId && (user.purchased.plan.gemsBought < User.user.purchased.plan.consecutive.gemCapExtra + Shared.planGemLimits.convCap)')
+ .panel.panel-default
+ .panel-body
+ h3 {{ $t('buyGemsGold') }}
+ p {{ $t('subGemPop') }}
+ .container-fluid
+ .row
+ .col-md-3
+ button.customize-option(ng-click='User.purchase({params:{type:"gems",key:"gem"}})')
+ span.Pet_Currency_Gem.inline-gems
+ // @TODO: .badge.badge-success.stack-count {{Shared.planGemLimits.convCap + User.user.purchased.plan.consecutive.gemCapExtra - User.user.purchased.plan.gemsBought}}
+ p
+ | 20
+ span.shop_gold
+ .col-md-8
+ .popover.right.gem-count-popover
+ .arrow
+ .popover-content
+ p {{ $t('buyGemsAllow1') }}
+ // @TOOD: | {{Shared.planGemLimits.convCap + User.user.purchased.plan.consecutive.gemCapExtra - User.user.purchased.plan.gemsBought}}
+ | {{ $t('buyGemsAllow2') }}
+ p {{ $t('seeSubscriptionDetails') }}
+ div(ng-if='user.purchased.plan.customerId')
+ .well
+ h3 {{ $t('purchaseGemsSeparately') }}
+ .container-fluid
+ .row
+ .col-md-4.col-md-offset-4.alert.alert-info $5
+ | {{ $t('USD') }}
+ span#TotalGemPrice.dashed-underline(:popover="$t('donateText1')",
+ popover-trigger='mouseenter',popover-placement='bottom')
+ | +20
+ span(class="Pet_Currency_Gem1x inline-gems")
+ .container-fluid
+ .row
+ .col-md-10.col-md-offset-2
+ p
+ small.muted {{ $t('paymentMethods') }}
+ a.purchase.btn.btn-primary(ng-click='Payments.showStripe({})') {{ $t('card') }}
+ a.purchase(href='/paypal/checkout?_id=${user._id}&apiToken=${User.settings.auth.apiToken}')
+ img(src='https://www.paypalobjects.com/webstatic/en_US/i/buttons/pp-acceptance-small.png',alt='Pay now with Paypal')
+ a.purchase(ng-click="Payments.amazonPayments.init({type: 'single'})")
+ img(src='https://payments.amazon.com/gp/cba/button', alt='Pay now with Amazon Payments')
+ div(ng-if='!user.purchased.plan.customerId')
+ .panel.panel-default
+ .panel-body
+ h3 {{ $t('purchaseGems') }}
+ .small
+ span.dashed-underline(popover="$t('donateText3')", popover-trigger='mouseenter', popover-placement='bottom')
+ | {{ $t('donateText2') }}
+ .container-fluid
+ .row
+ .col-md-4.col-md-offset-4.alert.alert-info $5
+ | {{ $t('USD') }}
+ span#TotalGemPrice.dashed-underline(popover="$t('donateText1')",
+ popover-trigger='mouseenter', ement='bottom')
+ | +20
+ span(class="Pet_Currency_Gem1x inline-gems")
+ .container-fluid
+ .row
+ .col-md-10.col-md-offset-2
+ p
+ small.muted {{ $t('paymentMethods') }}
+ a.purchase.btn.btn-primary(ng-click='Payments.showStripe({})') {{ $t('card') }}
+ a.purchase(href='/paypal/checkout?_id=${user._id}&apiToken=${User.settings.auth.apiToken}')
+ img(src='https://www.paypalobjects.com/webstatic/en_US/i/buttons/pp-acceptance-small.png',
+ alt='Pay now with Paypal')
+ a.purchase(ng-click="Payments.amazonPayments.init({type: 'single'})")
+ img(src='https://payments.amazon.com/gp/cba/button', alt='Pay now with Amazon Payments')
+
+ .container-fluid
+ h3 {{ $t('freeGemsTitle') }}
+ p {{ $t('subFreeGemsHow') }}
+
+ .well
+ h3
+ .small {{ $t('buyGemsGoldTitle') }}
+ h3 {{ $t('becomeSubscriber') }}
+
+ div(ng-include="'partials/options.settings.subscription.html'", ng-controller='SettingsCtrl')
+ div(ng-if='user.purchased.plan.customerId').pull-left
+ p {{ $t('seeSubscriptionDetails') }}
+ .text-right
+ button.btn.btn-default(ng-click='$close()') {{ $t('close') }}
+
+
+
diff --git a/website/client/components/settings/deleteModal.vue b/website/client/components/settings/deleteModal.vue
index 5c2bcb3c16..7d14055edc 100644
--- a/website/client/components/settings/deleteModal.vue
+++ b/website/client/components/settings/deleteModal.vue
@@ -1,18 +1,31 @@
b-modal#delete(:title="$t('deleteAccount')", :hide-footer='true' size='md')
- strong {{ $t('deleteLocalAccountText') }}
- br
- .row
- .col-6
- input.form-control(type='password', v-model='password')
- br
- .row
- #feedback.col-12.form-group
- label(for='feedbackTextArea') {{ $t('feedback') }}
- textarea#feedbackTextArea.form-control(v-model='feedback')
- .modal-footer
- button.btn.btn-danger(@click='close()') {{ $t('neverMind') }}
- button.btn.btn-primary(@click='deleteAccount()', :disabled='!password') {{ $t('deleteDo') }}
+ .regular-delete(v-if='user.auth.local.email')
+ strong {{ $t('deleteLocalAccountText') }}
+ br
+ .row
+ .col-6
+ input.form-control(type='password', v-model='password')
+ br
+ .row
+ #feedback.col-12.form-group
+ label(for='feedbackTextArea') {{ $t('feedback') }}
+ textarea#feedbackTextArea.form-control(v-model='feedback')
+ .modal-footer
+ button.btn.btn-danger(@click='close()') {{ $t('neverMind') }}
+ button.btn.btn-primary(@click='deleteAccount()', :disabled='!password') {{ $t('deleteDo') }}
+ .modal-header
+ .social-delete(v-if='!user.auth.local.email')
+ h4 {{ $t('deleteAccount') }}
+ .modal-body
+ p {{ $t('deleteSocialAccountText') }}
+ br
+ .row
+ .col-md-6
+ input.form-control(type='text', v-model='password')
+ .modal-footer
+ button.btn.btn-default(@click='close()') {{ $t('neverMind') }}
+ button.btn.btn-danger(:disabled='!password', @click='deleteAccount()') {{ $t('deleteDo') }}