mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-19 15:48:04 +01:00
between client & server. If the op is called on the client, it updates the user & then POSTs to the server with op of the same name. If called on server, it updates the user and user.save()s
175 lines
9.9 KiB
Plaintext
175 lines
9.9 KiB
Plaintext
li(bindonce='list', ng-repeat='task in obj[list.type+"s"]', class='task {{Shared.taskClasses(task, user.filters, user.preferences.dayStart, user.lastCron, list.showCompleted, main)}}', ng-click='spell && castEnd(task, "task", $event)', ng-class='{"cast-target":spell}')
|
|
// right-hand side control buttons
|
|
.task-meta-controls
|
|
|
|
// Due Date
|
|
span.task-date(ng-if='task.type=="todo" && task.date')
|
|
| {{task.date}}
|
|
// Streak
|
|
span(ng-show='task.streak') {{task.streak}}
|
|
span(tooltip='Streak Counter')
|
|
i.icon-forward
|
|
|
|
// Icons only available if you own the tasks (aka, hidden from challenge stats)
|
|
span(ng-if='!obj._locked')
|
|
i.icon-tags(tooltip='{{appliedTags(user.tags, task.tags)}}', ng-hide='noTags(task.tags)')
|
|
// edit
|
|
a(ng-hide='task._editing', ng-click='editTask(task)', tooltip='Edit')
|
|
i.icon-pencil(ng-hide='task._editing')
|
|
// cancel
|
|
a(ng-hide='!task._editing', ng-click='editTask(task)', tooltip='Cancel')
|
|
i.icon-remove(ng-hide='!task._editing')
|
|
// save
|
|
a(ng-hide='!task._editing', ng-click='editTask(task);saveTask(task)', tooltip='Save')
|
|
i.icon-ok(ng-hide='!task._editing')
|
|
//challenges
|
|
span(ng-if='task.challenge.id')
|
|
span(ng-if='task.challenge.broken')
|
|
i.icon-bullhorn(style='background-color:red;', ng-click='task._editing = true', tooltip="Broken Challenge Link", tooltip-placement='right')
|
|
span(ng-if='!task.challenge.broken')
|
|
i.icon-bullhorn(tooltip="Challenge")
|
|
// delete
|
|
a(ng-if='!task.challenge.id', ng-click='removeTask(obj[list.type+"s"], $index)', tooltip='Delete')
|
|
i.icon-trash
|
|
|
|
// chart
|
|
a(ng-show='task.history', ng-click='toggleChart(obj._id+task.id, task)', tooltip='Progress')
|
|
i.icon-signal
|
|
// notes
|
|
span.task-notes(ng-show='task.notes && !task._editing', popover-trigger='mouseenter', popover-placement='left', popover='{{task.notes}}', popover-title='{{task.text}}')
|
|
i.icon-comment
|
|
|
|
// left-hand side checkbox
|
|
.task-controls.task-primary
|
|
|
|
// Habits
|
|
span(bo-if='task.type=="habit"')
|
|
// score() is overridden in challengesCtrl to do nothing
|
|
a.task-action-btn(ng-if='task.up', ng-click='score(task,"up")') +
|
|
a.task-action-btn(ng-if='task.down', ng-click='score(task,"down")') -
|
|
|
|
// Rewards
|
|
span(ng-show='task.type=="reward"')
|
|
a.money.btn-buy(ng-click='score(task, "down")')
|
|
span.reward-cost {{task.value}}
|
|
span.shop_gold
|
|
|
|
// Daily & Todos
|
|
span.task-checker.action-yesno(bo-if='task.type=="daily" || task.type=="todo"')
|
|
input.visuallyhidden.focusable(ng-if='$state.includes("tasks")', id='box-{{obj._id}}_{{task.id}}', type='checkbox', ng-model='task.completed', ng-change='changeCheck(task)')
|
|
input.visuallyhidden.focusable(ng-if='!$state.includes("tasks")', id='box-{{obj._id}}_{{task.id}}', type='checkbox')
|
|
label(for='box-{{obj._id}}_{{task.id}}')
|
|
// main content
|
|
p.task-text
|
|
| {{task.text}}
|
|
|
|
// edit/options dialog
|
|
.task-options(ng-show='task._editing')
|
|
|
|
// Broken Challenge
|
|
.well(ng-if='task.challenge.broken')
|
|
div(ng-if='task.challenge.broken=="TASK_DELETED"')
|
|
p Broken Challenge Link: this task was part of a challenge, but has been removed from it. What would you like to do?
|
|
p
|
|
a(ng-click='unlink(task, "keep")') Keep It
|
|
| |
|
|
a(ng-click="removeTask(obj[list.type+'s'], $index)") Remove It
|
|
div(ng-if='task.challenge.broken=="CHALLENGE_DELETED"')
|
|
p Broken Challenge Link: this task was part of a challenge, but the challenge (or group) has been deleted. What to do with the orphan tasks?
|
|
p
|
|
a(ng-click='unlink(task, "keep-all")') Keep Them
|
|
| |
|
|
a(ng-click='unlink(task, "remove-all")') Remove Them
|
|
div(ng-if='task.challenge.broken=="CHALLENGE_CLOSED"')
|
|
p.
|
|
This challenge has been completed, and the winner was <span class='badge'>{{task.challenge.winner}}</span>! What to do with the orphan tasks?
|
|
p
|
|
a(ng-click='unlink(task, "keep-all")') Keep Them
|
|
| |
|
|
a(ng-click='unlink(task, "remove-all")') Remove Them
|
|
//div(ng-if='task.challenge.broken=="UNSUBSCRIBED"')
|
|
p Broken Challenge Link: this task was part of a challenge, but you have unsubscribed from the challenge. What to do with the orphan tasks?
|
|
p
|
|
a(ng-click="unlink(task, 'keep-all')") Keep Them
|
|
| |
|
|
a(ng-click="unlink(task, 'remove-all')") Remove Them
|
|
|
|
form(ng-submit='saveTask(task)')
|
|
// text & notes
|
|
fieldset.option-group
|
|
label.option-title Text
|
|
input.option-content(type='text', ng-model='task.text', required, ng-disabled='task.challenge.id')
|
|
|
|
label.option-title Extra Notes
|
|
textarea.option-content(rows='3', ng-model='task.notes', ng-disabled='task.challenge.id')
|
|
|
|
// if Habit, plus/minus command options
|
|
fieldset.option-group(ng-if='task.type=="habit" && !task.challenge.id')
|
|
legend.option-title Direction/Actions
|
|
span.task-checker.action-plusminus.select-toggle
|
|
input.visuallyhidden.focusable(id='{{obj._id}}_{{task.id}}-option-plus', type='checkbox', ng-model='task.up')
|
|
label(for='{{obj._id}}_{{task.id}}-option-plus')
|
|
span.task-checker.action-plusminus.select-toggle
|
|
input.visuallyhidden.focusable(id='{{obj._id}}_{{task.id}}-option-minus', type='checkbox', ng-model='task.down')
|
|
label(for='{{obj._id}}_{{task.id}}-option-minus')
|
|
|
|
// if Daily, calendar
|
|
fieldset(bo-if='task.type=="daily"', class="option-group")
|
|
legend.option-title Repeat
|
|
.task-controls.tile-group.repeat-days(bindonce)
|
|
// note, does not use data-toggle="buttons-checkbox" - it would interfere with our own click binding
|
|
button.task-action-btn.tile(ng-class='{active: task.repeat.su}', type='button', ng-click='task.challenge.id || (task.repeat.su = !task.repeat.su)', bo-text='moment.weekdaysMin(0)')
|
|
button.task-action-btn.tile(ng-class='{active: task.repeat.m}', type='button', ng-click='task.challenge.id || (task.repeat.m = !task.repeat.m)', bo-text='moment.weekdaysMin(1)')
|
|
button.task-action-btn.tile(ng-class='{active: task.repeat.t}', type='button', ng-click='task.challenge.id || (task.repeat.t = !task.repeat.t)', bo-text='moment.weekdaysMin(2)')
|
|
button.task-action-btn.tile(ng-class='{active: task.repeat.w}', type='button', ng-click='task.challenge.id || (task.repeat.w = !task.repeat.w)', bo-text='moment.weekdaysMin(3)')
|
|
button.task-action-btn.tile(ng-class='{active: task.repeat.th}', type='button', ng-click='task.challenge.id || (task.repeat.th = !task.repeat.th)', bo-text='moment.weekdaysMin(4)')
|
|
button.task-action-btn.tile(ng-class='{active: task.repeat.f}', type='button', ng-click='task.challenge.id || (task.repeat.f= !task.repeat.f)', bo-text='moment.weekdaysMin(5)')
|
|
button.task-action-btn.tile(ng-class='{active: task.repeat.s}', type='button', ng-click='task.challenge.id || (task.repeat.s = !task.repeat.s)', bo-text='moment.weekdaysMin(6)')
|
|
|
|
// if Reward, pricing
|
|
fieldset.option-group.option-short(ng-if='task.type=="reward" && !task.challenge.id')
|
|
legend.option-title Price
|
|
input.option-content(type='number', size='16', min='0', step="any", ng-model='task.value')
|
|
.money.input-suffix
|
|
span.shop_gold
|
|
|
|
// if Todos, the due date
|
|
fieldset.option-group(ng-if='task.type=="todo" && !task.challenge.id')
|
|
legend.option-title Due Date
|
|
input.option-content.datepicker(type='text', data-date-format='mm/dd/yyyy', ng-model='task.date')
|
|
|
|
fieldset.option-group(ng-if='!$state.includes("options.social.challenges")')
|
|
legend.option-title Tags
|
|
label.checkbox(ng-repeat='tag in user.tags')
|
|
input(type='checkbox', ng-model='task.tags[tag.id]')
|
|
| {{tag.name}}
|
|
|
|
// Advanced Options
|
|
span(bo-if='task.type!="reward"')
|
|
p.option-title.mega(ng-click='task._advanced = !task._advanced') Advanced Options
|
|
fieldset.option-group.advanced-option(ng-class="{visuallyhidden: !task._advanced}")
|
|
legend.option-title
|
|
a.priority-multiplier-help(href='https://trello.com/card/priority-multiplier/50e5d3684fe3a7266b0036d6/17', target='_blank', popover-title='How difficult is this task?', popover-trigger='mouseenter', popover="This multiplies its point value. Use sparingly, rely instead on our organic value-adjustment algorithms. But some tasks are grossly more valuable (Write Thesis vs Floss Teeth). Click for more info.")
|
|
i.icon-question-sign
|
|
| Difficulty
|
|
.task-controls.tile-group.priority-multiplier
|
|
button.task-action-btn.tile(type='button', ng-class='{active: task.priority=="!" || !task.priority}', ng-click='task.challenge.id || (task.priority="!")') Easy
|
|
button.task-action-btn.tile(type='button', ng-class='{active: task.priority=="!!"}', ng-click='task.challenge.id || (task.priority="!!")') Medium
|
|
button.task-action-btn.tile(type='button', ng-class='{active: task.priority=="!!!"}', ng-click='task.challenge.id || (task.priority="!!!")') Hard
|
|
//span(ng-if='task.type=="daily" && !task.challenge.id')
|
|
br
|
|
span(ng-if='task.type=="daily"')
|
|
legend.option-title Restore Streak
|
|
input.option-content(type='number', ng-model='task.streak')
|
|
|
|
legend.option-title Attributes
|
|
.task-controls.tile-group
|
|
button.task-action-btn.tile(type='button') Physical
|
|
button.task-action-btn.tile(type='button') Mental
|
|
button.task-action-btn.tile(type='button') Social
|
|
button.task-action-btn.tile(type='button') Other
|
|
|
|
button.task-action-btn.tile.spacious(type='submit') Save & Close
|
|
|
|
div(class='{{obj._id}}{{task.id}}-chart', ng-show='charts[obj._id+task.id]')
|