From 8b347bca8b3f58dbfc02b08d4284a32559af3482 Mon Sep 17 00:00:00 2001 From: Blade Barringer Date: Tue, 26 May 2015 17:18:16 -0500 Subject: [PATCH] Remove everyX check from weeklies; Change UI of frequency selection; Prep for monthlies in UI --- common/script/index.coffee | 14 +--- test/common/dailies.coffee | 33 +-------- website/views/shared/tasks/task.jade | 103 ++++++++++++++------------- 3 files changed, 58 insertions(+), 92 deletions(-) diff --git a/common/script/index.coffee b/common/script/index.coffee index fe22dabd7d..87feb96bde 100644 --- a/common/script/index.coffee +++ b/common/script/index.coffee @@ -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 diff --git a/test/common/dailies.coffee b/test/common/dailies.coffee index 5dc9fd4cd7..d26c8d012e 100644 --- a/test/common/dailies.coffee +++ b/test/common/dailies.coffee @@ -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 diff --git a/website/views/shared/tasks/task.jade b/website/views/shared/tasks/task.jade index 7cb4ae73a2..95e5ea2293 100644 --- a/website/views/shared/tasks/task.jade +++ b/website/views/shared/tasks/task.jade @@ -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')