habitica/views/app/index.html

437 lines
19 KiB
HTML
Raw Normal View History

2012-04-27 02:03:01 +00:00
<Title:>
2012-06-20 22:42:48 +00:00
HabitRPG
2012-07-07 21:45:06 +00:00
<Head:>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script type="text/javascript" src="https://js.stripe.com/v1/"></script>
2012-04-27 02:03:01 +00:00
<Header:>
<!-- SEO text, else Google gets strange copy -->
<h2 style="display:none;">A habit tracker app which treats your goals like a Role Playing Game. As you accomplish goals, you level up. If you fail your goals, you lose hit points. Lose all your HP and you die.</h2>
2012-06-21 00:47:08 +00:00
<ui:connectionAlert>
2012-06-26 13:23:16 +00:00
<div id="head">
2013-01-11 03:06:53 +00:00
{#if equal(_user.notifications.kickstarter,'show')}
<div class='alert alert-success'>
<a x-bind="click:closeKickstarterNofitication" class='pull-right'>&times;</a>
Want Habit on iPhone & Android? See the <strong><a href="http://kck.st/XoA3Yg">Kickstarter Campaign</a></strong>! Also funds new features and bug-squashing.
</div>
{/}
<div class='pull-right'>
{#unless _loggedIn}
<a class="btn btn-small btn-info" href="#login-modal" data-toggle="modal">Login / Register</a>
<app:myModal modalId="login-modal" header="Login / Register">
<a href="/auth/facebook"><img src='/img/facebook-login-register.jpeg' alt="Login / Register With Facebook"/></a>
<h3>Or</h3>
<boot:tabs>
<boot:tab title="Login">
<derby-auth:login />
</boot:tab>
<boot:tab title="Register">
<derby-auth:register />
</boot:tab>
</boot:tabs>
</app:myModal>
{else}
<div class="btn-group">
2012-11-15 18:10:59 +00:00
<button class="btn btn-small">{_loginName}</button>
<button class="btn btn-small dropdown-toggle" data-toggle="dropdown">
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="#settings-modal" data-toggle="modal">Settings</a></li>
<li><a href="#reset-modal" data-toggle="modal">Reset</a></li>
<li><a href='/logout'>Logout</a></li>
</ul>
</div>
<app:myModal modalId="settings-modal" header="Settings">
<strong>User ID</strong><br/>
<small>Copy this ID for use in third party applications.</small>
<pre class=prettyprint>{_user.id}</pre><br/>
</app:myModal>
<app:myModal modalId="reset-modal" header="Reset">
<p>This resets your entire account - your tasks will be deleted and your character will start over.</p>
<p>This is highly discouraged because you'll lose historical data, which is useful for graphing your progress over time. However, some people find it useful in the beginning after playing with the app for a while.</p>
<button data-dismiss="modal" x-bind=click:reset class="btn btn-danger btn-large">Reset</button>
</app:myModal>
{/}
</div>
<div class='container-fluid'>
{#if _flash.error}
<ul class="alert alert-error">
{#each _flash.error as :error}<li>{:error}</li>{/}
</ul>
{/}
<div class='row-fluid'>
<div id=character class='span4'>
<table>
<tr>
<td id="avatar">
<div class='avatar-sprites'>
<img class='weapon weapon-{_user.items.weapon}' src="/img/BrowserQuest/habitrpg_mods/weapon{_user.items.weapon}.png" />
<img class='armor armor-{_user.items.armor}' src="/img/BrowserQuest/habitrpg_mods/armor{_user.items.armor}.png" />
</div>
2012-09-04 20:21:55 +00:00
<div id="lvl"><span class="badge badge-info">Lvl {_user.stats.lvl}</span></div>
</td>
<td id="bars">
<div class="progress progress-danger" rel=tooltip data-placement=bottom title="Health">
<div class="bar" style="width: {percent(_user.stats.hp, 50)}%;"></div>
<span class="progress-text"><i class=icon-heart></i> {round(_user.stats.hp)} / 50</span>
</div>
<div class="progress progress-warning" rel=tooltip data-placement=bottom title="Experience">
<div class="bar" style="width: {percent(_user.stats.exp,_user._tnl)}%;"></div>
<span class="progress-text">
{#if _user.history.exp}
<a x-bind=click:toggleChart data-toggle-id="exp-chart" data-history-path="_user.history.exp" rel=tooltip title="Progress"><i class=icon-signal></i></a>&nbsp;
{/}
<i class=icon-star></i> {round(_user.stats.exp)} / {_user._tnl}
</span>
</div>
</td>
</tr>
</table>
2012-09-04 20:36:55 +00:00
<div id="exp-chart" style="display:none;"></div>
</div>
</div>
</div>
2012-06-26 13:23:16 +00:00
</div>
2012-06-01 00:02:17 +00:00
2012-06-26 13:24:12 +00:00
<Body:>
<br/>
<!-- Game Over Modal -->
2012-07-09 03:29:54 +00:00
<div style="{#unless equal(_user.stats.lvl,0)}display:none;{/}">
<app:myModal noDismiss=true modalId='dead-modal'>
<app:userTokens/>
<table>
<tr>
<td><img src="/img/BrowserQuest/habitrpg_mods/dead.png" /></td>
<td>
<h3>Game Over</h3>
{#if lessThan(_user.balance,0.50)}
<a data-toggle="modal" data-target="#stripe-modal" class="btn btn-danger btn-large">Buy More Tokens</a>
<span class='token-cost'>Not enough tokens</span>
{else}
<p>
<a x-bind=click:revive class="btn btn-danger btn-large">Continue</a>
<a class='token-cost'>2 Tokens</a>
</p>
{/}
</td>
</tr>
</table>
</app:myModal>
2012-07-09 03:29:54 +00:00
</div>
<div id=wrap class=container-fluid>
<div id=main class=row-fluid>
2012-06-26 13:24:12 +00:00
<!-- would rather have one component: <app:taskList>, which handles taskList, task, and newTask. However,
can't pass references as paramters. so <app:taskList newModel={_newHabit} list={_habitList}> doesn't work
and have to pass those in via {{{content}}} instead -->
<!--helpTitle & helpContent moved to tour -->
<div class="span3 well habits">
<h2>Habits</h2>
<!--removing for now, help-info in the tour instead-->
<!--<span class="help-icon" rel="popover" data-placement="bottom" data-trigger="hover" data-original-title="{{{helpTitle}}}" data-content="{{{helpContent}}}"><i class="icon-question-sign"></i></span>-->
<ul class='habits'>{#each _habitList as :task}<app:task />{/}</ul>
<app:newTask type=habit><input value={_newHabit} type="text" name=new-task placeholder="New Habit"/></app:newTask>
</div>
<div class="span3 well dailys">
<h2>Daily</h2>
2012-07-07 04:07:30 +00:00
<ul class='dailys'>{#each _dailyList as :task}<app:task />{/}</ul>
<app:newTask type=daily><input value={_newDaily} type="text" name=new-task placeholder="New Daily"/></app:newTask>
</div>
2012-06-26 13:24:12 +00:00
<div class="span3 well todos">
<div class="tabbable"> <!-- Only required for left/right tabs -->
<div class="row-fluid">
<h2 class="span6">Todos</h2>
<ul class="span6 nav nav-pills">
<li class="active"><a href="#tab1" data-toggle="tab">Remaining</a></li>
<li><a href="#tab2" data-toggle="tab">Complete</a></li>
</ul>
</div>
<div class="tab-content">
<div class="tab-pane active" id="tab1">
<ul class='todos'>
{#each _todoList as :task}<app:task />{/}
</ul>
<app:newTask type=todo><input value={_newTodo} type="text" name=new-task placeholder="New Todo"/></app:newTask>
</div>
<div class="tab-pane" id="tab2">
<ul class='completeds'>
{#each _completedList as :task}<app:task />{/}
</ul>
2012-07-28 04:01:58 +00:00
<a x-bind=click:clearCompleted>Clear Completed</a>
</div>
</div>
</div>
2012-06-29 14:16:02 +00:00
{#if _user.history.todos}
<a x-bind=click:toggleChart data-toggle-id="todos-chart" data-history-path="_user.history.todos" rel=tooltip title="Progress"><i class=icon-signal></i></a>
2012-06-29 14:16:02 +00:00
<div id="todos-chart" style="display:none;"></div>
{/}
</div>
2012-06-26 13:24:12 +00:00
<div class="span3 well rewards">
<!--Title -->
<div class="row-fluid">
<div class="span6"><h2>Rewards</h2></div>
<div class="span6" id="money">{gold(_user.stats.money)} <img src='/img/coin_single_gold.png'/> {silver(_user.stats.money)} <img src='/img/coin_single_silver.png'/></div>
</div>
<!-- Content -->
<ul class='rewards'>
{#each _rewardList as :task}<app:task />{/}
</ul>
{#if _user.items.itemsEnabled}
<ul class='items'>
{#with _items.armor as :item}<app:item />{/}
{#with _items.weapon as :item}<app:item />{/}
{#with _items.potion as :item}<app:item />{/}
{#with _items.reroll as :item}<app:item reroll=true/>{/}
</ul>
{/}
<app:newTask type=reward><input value={_newReward} type="text" name=new-task placeholder="New Reward"/></app:newTask>
</div>
<!-- Re-Roll modal -->
<app:myModal modalId='reroll-modal' header="Reset Your Tasks">
<app:userTokens/>
<p>Highly discouraged because red tasks provide good incentive to improve (<a target="_blank" href="https://github.com/lefnire/habitrpg#all-my-tasks-are-red-im-dying-too-fast">read more</a>). However, this becomes necessary after long bouts of bad habits.</p>
{#if lessThan(_user.balance,1)}
<a data-toggle="modal" data-target="#stripe-modal" class="btn btn-danger btn-large">Buy More Tokens</a><span class='token-cost'>Not enough tokens</span>
{else}
<button data-dismiss="modal" x-bind=click:buyReroll class="btn btn-danger btn-large">Re-Roll</button><span class='token-cost'>4 Tokens</span>
{/}
</app:myModal>
2012-06-26 13:24:12 +00:00
</div>
</div>
<!-- Stripe Modal -->
2012-09-19 01:51:29 +00:00
<app:myModal modalId="stripe-modal" header='Buy More Tokens'>
<div class='payment-errors'></div>
<!-- Stripe form from https://stripe.com/docs/tutorials/forms -->
<form action="/" method="POST" id="payment-form" x-bind=submit:submitPayment>
<div class="alert alert-info pull-right"><h2>$5</h2></div>
<div class="form-row">
<label>Card Number</label>
<input type="text" size="20" autocomplete="off" class="card-number"/>
</div>
<div class="form-row">
<label>CVC</label>
<input type="text" size="4" autocomplete="off" class="card-cvc"/>
</div>
<div class="form-row">
<label>Expiration (MM/YYYY)</label>
<input type="text" size="2" class="card-expiry-month"/>
<span> / </span>
<input type="text" size="4" class="card-expiry-year"/>
</div>
<button type="submit" class="submit-button">Submit Payment</button>
</form>
</app:myModal>
<!-- Footer -->
<footer class=footer>
<div class=container>
{#unless _mobileDevice}
2012-09-04 17:46:27 +00:00
<div class='pull-right'>
<table>
<tr>
<td>
<!-- Github -->
<iframe src="/github-btns/github-btn.html?user=lefnire&repo=habitrpg&type=watch&count=true"
allowtransparency="true" frameborder="0" scrolling="0" width="85px" height="20px"></iframe>
<!-- Gittip -->
2012-09-15 19:15:59 +00:00
<iframe style="border: 0; margin: 0; padding: 0;" src="https://www.gittip.com/lefnire/widget.html" width="48pt" height="20pt"></iframe>
<!-- AddThis Button BEGIN -->
</td>
<td>
<div class="addthis_toolbox addthis_default_style "
addthis:url="http://habitrpg.com"
addthis:title="HabitRPG: Role Playing Game for Self Improvement">
<a class="addthis_button_facebook_like" fb:like:layout="button_count"></a>
2012-09-03 04:10:54 +00:00
<a class="addthis_button_tweet" tw:via="lefnire"></a>
</div>
<!-- AddThis Button END -->
<!--<a href="https://twitter.com/share" class="twitter-share-button" data-via="lefnire">Tweet</a>-->
</td>
</tr>
</table>
</div>
{/}
2012-09-04 17:46:27 +00:00
<div>
<ul>
2012-09-15 19:15:59 +00:00
<li>Copyright &copy; 2012 OCDevel LLC</li>
2012-09-04 17:46:27 +00:00
<li><a target="_blank" href="https://github.com/lefnire/habitrpg#habitrpg">About</a></li>
<li><a target="_blank" href="https://github.com/lefnire/habitrpg/wiki/FAQ">FAQ</a></li>
<li><a target="_blank" href="https://github.com/lefnire/habitrpg#contact">Contact</a></li>
2012-09-04 17:46:27 +00:00
<li><a href="/privacy">Privacy</a></li>
<li><a href="/terms">Terms</a></li>
</ul>
</div>
</div>
</footer>
<myModal: nonvoid>
{{#if @noDismiss}}<div data-action="backdrop" class="modal-backdrop"></div>{{/}}
<div class="modal {{#unless @noDismiss}}hide{{/}}" id={{@modalId}} role="dialog">
{{#if @header}}
<div class="modal-header">
{{#unless @noDismiss}}<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>{{/}}
<h3>{{unescaped @header}}</h3>
</div>
{{/}}
<div class="modal-body">{@content}</div>
</div>
<userTokens:>
<div class="pull-right">
<div class="input-append">
<span class="uneditable-input" style="width:auto;">{tokens(_user.balance)}</span>
<span class="add-on">Tokens</span>
</div>
<a class="label" data-toggle="modal" href='#reset-modal'><i class="icon-ban-circle"></i>Reset</a>
</div>
<!--<span class="well pull-right">Tokens: {tokens(_user.balance)}</span>-->
<newTask: nonvoid>
<form class="form-inline" id=new-{{@type}} data-task-type={{@type}} x-bind=submit:addTask>
{{@content}}
2012-06-26 12:56:57 +00:00
<input class="btn" type=submit value=Add>
2012-07-08 02:43:49 +00:00
</form>
<task:>
<li data-id={{:task.id}} class="task {taskClasses(:task.type, :task.completed, :task.value, :task.repeat)}">
<pre>
<div class="task-meta-controls">
<div class="hover-show">
<a x-bind=click:toggleTaskEdit data-hide-id="{{:task.id}}-chart" data-toggle-id="{{:task.id}}-edit" rel=tooltip title="Edit"><i class="icon-pencil"></i></a>
<a x-bind=click:del rel=tooltip title="Delete"><i class="icon-trash"></i></a>
{#if :task.history}
<a x-bind=click:toggleChart data-toggle-id="{{:task.id}}-chart" data-hide-id="{{:task.id}}-edit" data-history-path="_user.tasks.{{:task.id}}.history" rel="tooltip" title="Progress">
<i class="icon-signal"></i>
</a>
{/}
</div>
{#if :task.notes}
{#if equal(:task.type,'reward')}
<span rel="popover" data-trigger="hover" data-placement="left" data-content="{:task.notes}" data-original-title="{:task.text}" class='task-notes'><i class="icon-comment"></i></span>
{else}
<span rel="popover" data-trigger="hover" data-content="{:task.notes}" data-original-title="{:task.text}" class='task-notes'><i class="icon-comment"></i></span>
{/}
{/}
</div>
<div class="task-controls">
2012-06-10 00:57:35 +00:00
<!-- Habits -->
2012-06-25 00:51:42 +00:00
{#if equal(:task.type, 'habit')}
{#if :task.up}<a data-direction=up x-bind=click:score><img src="/img/add.png" /></a>{/}
{#if :task.down}<a data-direction=down x-bind=click:score><img src="/img/remove.png" /></a>{/}
2012-06-10 00:57:35 +00:00
<!-- Rewards -->
2012-06-25 00:51:42 +00:00
{else if equal(:task.type, 'reward')}
<a x-bind=click:score class="buy-link" data-direction=down>{:task.value}<img src="/img/coin_single_gold.png"/></a>
2012-06-10 00:57:35 +00:00
<!-- Daily & Todos -->
{else}
<input type=checkbox checked="{:task.completed}"/>
2012-06-10 00:57:35 +00:00
{/}
</div>
2012-07-09 04:07:39 +00:00
<div class="task-text">{:task.text}</div>
<app:taskMeta />
</pre>
</li>
2012-06-25 00:51:42 +00:00
<taskMeta:>
<div style="display:none;" id={{:task.id}}-edit>
2012-06-26 14:42:07 +00:00
<hr/>
2012-07-18 17:21:00 +00:00
<form x-bind=submit:toggleTaskEdit data-toggle-id="{{:task.id}}-edit">
<div class=control-group>
<label>Text</label><input type=text value={:task.text} />
<label>Notes</label><textarea rows=3>{:task.notes}</textarea>
2012-06-26 14:41:18 +00:00
</div>
{#if equal(:task.type, 'habit')}
<div class="control-group">
<label class="checkbox inline"><input type=checkbox checked={:task.up}>Up</label>
<label class="checkbox inline"><input type=checkbox checked={:task.down}>Down</label>
</div>
{/}
{#if equal(:task.type, 'daily')}
<label>Repeat</label>
<div class="control-group btn-group repeat-days">
<!-- note, does not use data-toggle="buttons-checkbox" - it would interfere with our own click binding -->
<button type="button" class="btn btn-info {#if :task.repeat.su}active{/}" data-day='su' x-bind=click:toggleDay>Su</button>
<button type="button" class="btn btn-info {#if :task.repeat.m}active{/}" data-day='m' x-bind=click:toggleDay>M</button>
<button type="button" class="btn btn-info {#if :task.repeat.t}active{/}" data-day='t' x-bind=click:toggleDay>T</button>
<button type="button" class="btn btn-info {#if :task.repeat.w}active{/}" data-day='w' x-bind=click:toggleDay>W</button>
<button type="button" class="btn btn-info {#if :task.repeat.th}active{/}" data-day='th' x-bind=click:toggleDay>Th</button>
<button type="button" class="btn btn-info {#if :task.repeat.f}active{/}" data-day='f' x-bind=click:toggleDay>F</button>
<button type="button" class="btn btn-info {#if :task.repeat.s}active{/}" data-day='s' x-bind=click:toggleDay>S</button>
</div>
{/}
{#if equal(:task.type, 'reward')}
<div class=control-group>
<label>Price
<div class="input-append">
<input class="span2" size="16" type="text" value={:task.value}><span class="add-on">Gold</span>
</div>
</label>
</div>
{/}
<button type=submit class="btn">Save & Close</button>
</form>
</div>
<div style="display:none;" id={{:task.id}}-chart></div>
<item:>
<li class="task reward item">
2012-07-08 02:43:49 +00:00
<pre>
<div class="task-meta-controls">
<span rel="popover" data-trigger="hover" data-placement="left" data-content="{:item.notes}" data-original-title="{:item.text}" class='task-notes'><i class="icon-comment"></i></span>
2012-07-08 02:43:49 +00:00
</div>
<div class="task-controls">
{#if @reroll}
<a data-toggle="modal" data-target="#reroll-modal" class="item-buy-link" style='cursor:pointer'><i class=icon-retweet></i></a>
{else}
<a x-bind=click:buyItem class="item-buy-link" data-type={:item.type} data-value={:item.value} data-index={:item.index}>{:item.value}<img src="/img/coin_single_gold.png"/></a>
{/}
2012-07-08 02:43:49 +00:00
</div>
<div class="task-text"><img src="/img/BrowserQuest/habitrpg_mods/{:item.icon}.png" /> {:item.text}</div>
2012-07-08 02:43:49 +00:00
</pre>
</li>
<Scripts:>
{#if equal(_nodeEnv,"production")}
<!-- Google Analytics -->
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-33510635-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
{/}