diff --git a/app/controllers/recurring_todos/form_helper.rb b/app/controllers/recurring_todos/form_helper.rb new file mode 100644 index 00000000..0a81f08d --- /dev/null +++ b/app/controllers/recurring_todos/form_helper.rb @@ -0,0 +1,50 @@ +module RecurringTodos + + class FormHelper + + def initialize(recurring_todo) + @recurring_todo = recurring_todo + end + + def create_pattern(pattern_class) + pattern = pattern_class.new(@recurring_todo.user) + pattern.build_from_recurring_todo(@recurring_todo) + pattern + end + + def daily_pattern + @daily_pattern ||= create_pattern(DailyRepeatPattern) + end + + def weekly_pattern + @weekly_pattern ||= create_pattern(WeeklyRepeatPattern) + end + + def monthly_pattern + @monthly_pattern ||= create_pattern(MonthlyRepeatPattern) + end + + def yearly_pattern + @yearly_pattern ||= create_pattern(YearlyRepeatPattern) + end + + def method_missing(method, *args) + if method.to_s =~ /^daily_(.+)$/ + daily_pattern.send($1, *args) + elsif method.to_s =~ /^weekly_(.+)$/ + weekly_pattern.send($1, *args) + elsif method.to_s =~ /^monthly_(.+)$/ + monthly_pattern.send($1, *args) + elsif method.to_s =~ /^yearly_(.+)$/ + yearly_pattern.send($1, *args) + elsif method.to_s =~ /^on_(.+)$/ # on_monday, on_tuesday, etc. + weekly_pattern.send(method, *args) + else + # no match, let @recurring_todo handle it, or fail + @recurring_todo.send(method, *args) + end + end + + end + +end \ No newline at end of file diff --git a/app/controllers/recurring_todos_controller.rb b/app/controllers/recurring_todos_controller.rb index 20461e05..a15f6922 100644 --- a/app/controllers/recurring_todos_controller.rb +++ b/app/controllers/recurring_todos_controller.rb @@ -37,13 +37,15 @@ class RecurringTodosController < ApplicationController end def edit + @form_helper = RecurringTodos::FormHelper.new(@recurring_todo) + respond_to do |format| format.js end end def update - updater = RecurringTodos::RecurringTodosBuilder.new(current_user, edit_recurring_todo_params) + updater = RecurringTodos::RecurringTodosBuilder.new(current_user, update_recurring_todo_params) @saved = updater.update(@recurring_todo) @recurring_todo.reload @@ -162,23 +164,29 @@ class RecurringTodosController < ApplicationController def all_recurring_todo_params # move context_name, project_name and tag_list into :recurring_todo hash for easier processing - { context_name: :context_name, project_name: :project_name, tag_list: :tag_list}.each do |target,source| + { + context_name: :context_name, + project_name: :project_name, + tag_list: :tag_list + }.each do |target,source| move_into_recurring_todo_param(params, target, source) end recurring_todo_params end - def edit_recurring_todo_params + def update_recurring_todo_params # we needed to rename the recurring_period selector in the edit form because # the form for a new recurring todo and the edit form are on the same page. # Same goes for start_from and end_date params['recurring_todo']['recurring_period'] = params['recurring_edit_todo']['recurring_period'] - { context_name: :context_name, + { + context_name: :context_name, project_name: :project_name, tag_list: :edit_recurring_todo_tag_list, end_date: :recurring_todo_edit_end_date, - start_from: :recurring_todo_edit_start_from}.each do |target,source| + start_from: :recurring_todo_edit_start_from + }.each do |target,source| move_into_recurring_todo_param(params, target, source) end @@ -187,7 +195,8 @@ class RecurringTodosController < ApplicationController %w{monday tuesday wednesday thursday friday saturday sunday}.each do |day| params["recurring_todo"]["weekly_return_#{day}"]=' ' if params["recurring_todo"]["weekly_return_#{day}"].nil? end - params['recurring_todo'] + + recurring_todo_params end def move_into_recurring_todo_param(params, target, source) diff --git a/app/models/recurring_todo.rb b/app/models/recurring_todo.rb index 9fa34198..b731e697 100644 --- a/app/models/recurring_todo.rb +++ b/app/models/recurring_todo.rb @@ -101,14 +101,6 @@ class RecurringTodo < ActiveRecord::Base end end - def recurring_show_days_before=(days) - self.show_from_delta=days - end - - def recurring_show_always=(value) - self.show_always=value - end - def daily_recurrence_pattern if only_work_days I18n.t("todos.recurrence.pattern.on_work_days") diff --git a/app/models/recurring_todos/abstract_recurring_todos_builder.rb b/app/models/recurring_todos/abstract_recurring_todos_builder.rb index e2d610e7..fd61bcc4 100644 --- a/app/models/recurring_todos/abstract_recurring_todos_builder.rb +++ b/app/models/recurring_todos/abstract_recurring_todos_builder.rb @@ -22,15 +22,10 @@ module RecurringTodos def build @recurring_todo = @pattern.build_recurring_todo(@mapped_attributes) - @recurring_todo.context = @filterred_attributes.get(:context) - @recurring_todo.project = @filterred_attributes.get(:project) end def update(recurring_todo) @recurring_todo = @pattern.update_recurring_todo(recurring_todo, @mapped_attributes) - @recurring_todo.context = @filterred_attributes.get(:context) - @recurring_todo.project = @filterred_attributes.get(:project) - @saved = @recurring_todo.save @recurring_todo.tag_with(@filterred_attributes.get(:tag_list)) if @saved && @filterred_attributes.get(:tag_list).present? @recurring_todo.reload @@ -45,6 +40,22 @@ module RecurringTodos return @saved end + def save_collection(collection, collection_id) + # save object (project or context) and add its id to @mapped_attributes and remove the object from the attributes + object = @mapped_attributes.get(collection) + object.save + @mapped_attributes.set(collection_id, object.id) + @mapped_attributes.except(collection) + end + + def save_project + save_collection(:project, :project_id) + end + + def save_context + save_collection(:context, :context_id) + end + def saved_recurring_todo raise(Exception.new, @recurring_todo.valid? ? "Recurring todo was not saved yet" : "Recurring todos was not saved because of validation errors") unless @saved diff --git a/app/models/recurring_todos/abstract_repeat_pattern.rb b/app/models/recurring_todos/abstract_repeat_pattern.rb index cf2f6a76..93bc3fef 100644 --- a/app/models/recurring_todos/abstract_repeat_pattern.rb +++ b/app/models/recurring_todos/abstract_repeat_pattern.rb @@ -33,11 +33,11 @@ module RecurringTodos end def build_recurring_todo(attribute_handler) - @recurring_todo = @user.recurring_todos.build(attribute_handler.attributes) + @recurring_todo = @user.recurring_todos.build(attribute_handler.safe_attributes) end def update_recurring_todo(recurring_todo, attribute_handler) - recurring_todo.assign_attributes(attribute_handler.attributes) + recurring_todo.assign_attributes(attribute_handler.safe_attributes) recurring_todo end diff --git a/app/models/recurring_todos/monthly_repeat_pattern.rb b/app/models/recurring_todos/monthly_repeat_pattern.rb index 3561ba60..aa901b4a 100644 --- a/app/models/recurring_todos/monthly_repeat_pattern.rb +++ b/app/models/recurring_todos/monthly_repeat_pattern.rb @@ -14,10 +14,18 @@ module RecurringTodos get(:recurrence_selector) == 0 end + def every_x_day + get(:every_other1) + end + def every_xth_day? get(:recurrence_selector) == 1 end + def every_xth_day + get :every_other2 + end + def every_x_month # in case monthly pattern is every day x, return every_other2 otherwise # return a default value diff --git a/app/models/recurring_todos/recurring_todos_builder.rb b/app/models/recurring_todos/recurring_todos_builder.rb index 569baa3d..dd26e637 100644 --- a/app/models/recurring_todos/recurring_todos_builder.rb +++ b/app/models/recurring_todos/recurring_todos_builder.rb @@ -32,8 +32,8 @@ module RecurringTodos end def save - @project.save if @new_project_created - @context.save if @new_context_created + @builder.save_project if @new_project_created + @builder.save_context if @new_context_created return @builder.save end diff --git a/app/views/recurring_todos/_edit_form.html.erb b/app/views/recurring_todos/_edit_form.html.erb index dfb94095..21c4ab24 100644 --- a/app/views/recurring_todos/_edit_form.html.erb +++ b/app/views/recurring_todos/_edit_form.html.erb @@ -5,91 +5,91 @@