Remove everyX check from weeklies; Change UI of frequency selection; Prep for monthlies in UI

This commit is contained in:
Blade Barringer 2015-05-26 17:18:16 -05:00
parent 0f096bd405
commit 8b347bca8b
3 changed files with 58 additions and 92 deletions

View file

@ -93,9 +93,7 @@ api.shouldDo = (day, dailyTask, options = {}) ->
return everyXCheck && hasStartedCheck
else if dailyTask.frequency == 'weekly'
dayOfWeekCheck = dailyTask.repeat[api.dayMapping[dayOfWeekNum]]
weeksSinceTaskStartWeek = api.numWeeksApart(day, dailyTask.startDate, o)
everyXCheck = (weeksSinceTaskStartWeek % dailyTask.everyX == 0)
return dayOfWeekCheck && everyXCheck && hasStartedCheck
return dayOfWeekCheck && hasStartedCheck
else
# unexpected frequency string
return false
@ -106,16 +104,6 @@ api.numDaysApart = (day1, day2, o) ->
numDays = Math.abs(startOfDay1.diff(startOfDay2, 'days'))
return numDays
# weeks between the two days, counting Monday as the start of each week
api.numWeeksApart = (day1, day2, o) ->
startOfDay1 = api.startOfDay(_.defaults {now:day1}, o)
startOfDay2 = api.startOfDay(_.defaults {now:day2}, o)
startWeekOfDay1 = startOfDay1.startOf('week')
startWeekOfDay2 = startOfDay2.startOf('week')
numWeeks = Math.abs(startWeekOfDay1.diff(startWeekOfDay2, 'weeks'))
return numWeeks
###
------------------------------------------------------
Level cap

View file

@ -319,41 +319,12 @@ describe 'daily that repeats every x days', ->
user.dailys = [ shared.taskDefaults({type:'daily', startDate: moment(), frequency: 'daily'}) ]
daily = user.dailys[0]
_.times 10, (n) ->
due = n + 1
_.times 11, (due) ->
it 'where x equals ' + due, ->
daily.everyX = due
_.times 100, (day) ->
_.times 30, (day) ->
isDue = shared.shouldDo moment().add(day, 'days'), daily
expect(isDue).to.be true if day % due == 0
expect(isDue).to.be false if day % due != 0
describe 'weekly that repeats on M,W,F every x days', ->
user = null
weekly = null
start_date = moment()
beforeEach ->
user = newUser()
user.dailys = [ shared.taskDefaults({type:'daily', startDate: start_date, frequency: 'weekly', repeat: {su:false,m:1,t:false,w:1,th:false,f:1,s:false}}) ]
weekly = user.dailys[0]
_.times 10, (n) ->
due = n + 1
it 'where x equals ' + due, ->
weekly.everyX = due
_.times 100, (day) ->
valid_days = { Mon: true, Wed: true, Fri: true }
day_to_test = start_date.add(day, 'days')
day_of_week = shared.startOfDay({now:day_to_test}).format('ddd')
isDue = shared.shouldDo day_to_test, weekly
is_correct_week = shared.numWeeksApart(day_to_test, start_date) % due == 0
if valid_days[day_of_week] && is_correct_week
expect(isDue).to.be true
else
expect(isDue).to.be false

View file

@ -1,3 +1,31 @@
mixin repeatOptions
// If frequency is daily
.form-group(ng-if='task.frequency=="daily"')
.input-group
span.input-group-addon Once every  
input.form-control(type='number', ng-model='task.everyX', min='1')
span.input-group-addon day{{task.everyX == 1 ? '' : 's'}}
// If frequency is weekly
.form-group(ng-show='task.frequency=="weekly"')
ul.repeat-days(bindonce)
// note, does not use data-toggle="buttons-checkbox" - it would interfere with our own click binding
li
button(ng-class='{active: task.repeat.su}', type='button', ng-click='task.challenge.id || (task.repeat.su = !task.repeat.su)') {{::moment.weekdaysMin(0)}}
li
button(ng-class='{active: task.repeat.m}', type='button', ng-click='task.challenge.id || (task.repeat.m = !task.repeat.m)') {{::moment.weekdaysMin(1)}}
li
button(ng-class='{active: task.repeat.t}', type='button', ng-click='task.challenge.id || (task.repeat.t = !task.repeat.t)') {{::moment.weekdaysMin(2)}}
li
button(ng-class='{active: task.repeat.w}', type='button', ng-click='task.challenge.id || (task.repeat.w = !task.repeat.w)') {{::moment.weekdaysMin(3)}}
li
button(ng-class='{active: task.repeat.th}', type='button', ng-click='task.challenge.id || (task.repeat.th = !task.repeat.th)') {{::moment.weekdaysMin(4)}}
li
button(ng-class='{active: task.repeat.f}', type='button', ng-click='task.challenge.id || (task.repeat.f= !task.repeat.f)') {{::moment.weekdaysMin(5)}}
li
button(ng-class='{active: task.repeat.s}', type='button', ng-click='task.challenge.id || (task.repeat.s = !task.repeat.s)') {{::moment.weekdaysMin(6)}}
li(bindonce='list', id='task-{{::task.id}}', ng-repeat='task in obj[list.type+"s"] | conditionalOrderBy: list.view=="dated":"date"', class='task {{Shared.taskClasses(task, user.filters, user.preferences.dayStart, user.lastCron, list.showCompleted, main)}}', ng-click='spell && (list.type != "reward") && castEnd(task, "task", $event)', ng-class='{"cast-target":spell && (list.type != "reward"), "locked-task":obj._locked === true}', popover-trigger='mouseenter', data-popover-html="{{task.popoverOpen ? '' : task.notes | markdown}}", popover-placement="top", popover-append-to-body='{{::modal ? "false":"true"}}', ng-show='shouldShow(task, list, user.preferences)')
// right-hand side control buttons
.task-meta-controls
@ -168,52 +196,7 @@ li(bindonce='list', id='task-{{::task.id}}', ng-repeat='task in obj[list.type+"s
.dailies
legend.option-title=env.t('repeat')
// Choose the frequency
ul.repeat-frequency
li
button(ng-class='{active: task.frequency=="daily"}', type='button', ng-click='task.frequency="daily"')='Daily'
li
button(ng-class='{active: task.frequency=="weekly"}', type='button', ng-click='task.frequency="weekly"')='Weekly'
// If frequency is daily
div.repeat-frequency(ng-show='task.frequency=="daily"')
div.repeat-daily
| Once every  
select(ng-model='task.everyX')
option(ng-repeat='x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]') {{x}}
| days
// If frequency is weekly
div.repeat-frequency(ng-show='task.frequency=="weekly"')
div.repeat-weekly
| Once every 
select(ng-model='task.everyX')
option(ng-repeat='x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]') {{x}}
| weeks on these days:
ul.repeat-days(bindonce)
// note, does not use data-toggle="buttons-checkbox" - it would interfere with our own click binding
li
button(ng-class='{active: task.repeat.su}', type='button', ng-click='task.challenge.id || (task.repeat.su = !task.repeat.su)') {{::moment.weekdaysMin(0)}}
li
button(ng-class='{active: task.repeat.m}', type='button', ng-click='task.challenge.id || (task.repeat.m = !task.repeat.m)') {{::moment.weekdaysMin(1)}}
li
button(ng-class='{active: task.repeat.t}', type='button', ng-click='task.challenge.id || (task.repeat.t = !task.repeat.t)') {{::moment.weekdaysMin(2)}}
li
button(ng-class='{active: task.repeat.w}', type='button', ng-click='task.challenge.id || (task.repeat.w = !task.repeat.w)') {{::moment.weekdaysMin(3)}}
li
button(ng-class='{active: task.repeat.th}', type='button', ng-click='task.challenge.id || (task.repeat.th = !task.repeat.th)') {{::moment.weekdaysMin(4)}}
li
button(ng-class='{active: task.repeat.f}', type='button', ng-click='task.challenge.id || (task.repeat.f= !task.repeat.f)') {{::moment.weekdaysMin(5)}}
li
button(ng-class='{active: task.repeat.s}', type='button', ng-click='task.challenge.id || (task.repeat.s = !task.repeat.s)') {{::moment.weekdaysMin(6)}}
label.option-title=env.t('startDate')
p.input-group
input(type='text' class='form-control' datepicker-popup ng-model='task._tempDateForPicker' ng-change='updateTaskStartDate(task)' is-open='task._isDatePickerOpen')
span.input-group-btn
button.btn.btn-default(type='button' ng-click='openDatePicker($event, task)')
.glyphicon.glyphicon-calendar
+repeatOptions
// if Reward, pricing
@ -238,7 +221,32 @@ li(bindonce='list', id='task-{{::task.id}}', ng-repeat='task in obj[list.type+"s
// Advanced Options
span(ng-if='::task.type!="reward"')
p.option-title.mega(ng-click='task._advanced = !task._advanced', tooltip=env.t('expandCollapse'))=env.t('advancedOptions')
fieldset.option-group.advanced-option(ng-class="{visuallyhidden: task._advanced}")
div(ng-show='task._advanced')
div(ng-if='task.type == "daily"')
.form-group
legend.option-title=env.t('startDate')
.input-group
input(type='text' class='form-control' datepicker-popup ng-model='task._tempDateForPicker' ng-change='updateTaskStartDate(task)' is-open='task._isDatePickerOpen')
span.input-group-btn
button.btn.btn-default(type='button' ng-click='openDatePicker($event, task)')
.glyphicon.glyphicon-calendar
hr
.form-group
legend.option-title Repeat Frequency
select.form-control(ng-model='task.frequency')
option(value='weekly') Repeat on certain days of the week
option(value='daily') Repeat every X days
option(value='monthly') Repeat on certain days of the month
+repeatOptions
hr
fieldset.option-group.advanced-option(ng-show="task._advanced")
legend.option-title
a.hint.priority-multiplier-help(href='http://habitrpg.wikia.com/wiki/Difficulty', target='_blank', popover-title=env.t('difficultyHelpTitle'), popover-trigger='mouseenter', popover=env.t('difficultyHelpContent'))=env.t('difficulty')
ul.priority-multiplier
@ -249,7 +257,6 @@ li(bindonce='list', id='task-{{::task.id}}', ng-repeat='task in obj[list.type+"s
li
button(type='button', ng-class='{active: task.priority==2}', ng-click='task.challenge.id || (task.priority=2)')=env.t('hard')
//span(ng-if='task.type=="daily" && !task.challenge.id')
span(ng-if='task.type=="daily"')
legend.option-title.pull-left=env.t('restoreStreak')
input.option-content(type='number', ng-model='task.streak')