Class: QTimetrap::ViewModels::MainViewModel
- Inherits:
-
Object
- Object
- QTimetrap::ViewModels::MainViewModel
- Includes:
- MainViewModelArchiveModeHelpers, MainViewModelEntryNoteHelpers, MainViewModelEntryTaskHelpers, MainViewModelEntryTimeHelpers, MainViewModelSheetHelpers, MainViewModelTaskFilterHelpers, MainViewModelTimeRangeFilterHelpers
- Defined in:
- app/view_models/main_view_model.rb
Overview
Coordinates tracker data and exposes presentation-ready state for UI.
Constant Summary collapse
- EPOCH_TIME =
Time.at(0)
Constants included from MainViewModelArchiveModeHelpers
QTimetrap::ViewModels::MainViewModelArchiveModeHelpers::EMPTY_ARRAY
Instance Attribute Summary collapse
-
#current_sheet ⇒ Object
readonly
Returns the value of attribute current_sheet.
-
#current_started_at ⇒ Object
readonly
Returns the value of attribute current_started_at.
-
#entries ⇒ Object
readonly
Returns the value of attribute entries.
-
#selected_project ⇒ Object
readonly
Returns the value of attribute selected_project.
-
#selected_projects ⇒ Object
readonly
Returns the value of attribute selected_projects.
-
#selected_tasks ⇒ Object
readonly
Returns the value of attribute selected_tasks.
-
#time_filter_from_at ⇒ Object
readonly
Returns the value of attribute time_filter_from_at.
-
#time_filter_to_at ⇒ Object
readonly
Returns the value of attribute time_filter_to_at.
Instance Method Summary collapse
- #entry_nodes ⇒ Object
-
#initialize(gateway: Services::TimetrapGateway.new, archived_entries_store: Services::ArchivedEntriesStore.new) ⇒ MainViewModel
constructor
A new instance of MainViewModel.
- #refresh! ⇒ Object
- #running_current_sheet? ⇒ Boolean
- #running_timer_line(now: Time.now) ⇒ Object
- #select_project(project, sync_current_fields: true) ⇒ Object
- #select_projects(projects, primary_project:, sync_current_fields: true) ⇒ Object
- #start_tracking(sheet) ⇒ Object
- #stop_tracking ⇒ Object
- #summary_line ⇒ Object
- #total_seconds ⇒ Object
- #week_total_seconds ⇒ Object
Methods included from MainViewModelArchiveModeHelpers
#archive_entry, #archive_mode=, #archive_mode?, #project_names, #task_names_for_project, #task_names_for_selected_project, #unarchive_entry
Methods included from MainViewModelTimeRangeFilterHelpers
Methods included from MainViewModelTaskFilterHelpers
#filtered_entries, #select_tasks
Methods included from MainViewModelSheetHelpers
#current_project_name, #current_project_name=, #current_sheet_input, #current_sheet_label, #current_task_input, #current_task_input=, #sheet_for_task_input
Methods included from MainViewModelEntryTimeHelpers
Methods included from MainViewModelEntryNoteHelpers
Methods included from MainViewModelEntryTaskHelpers
Constructor Details
#initialize(gateway: Services::TimetrapGateway.new, archived_entries_store: Services::ArchivedEntriesStore.new) ⇒ MainViewModel
Returns a new instance of MainViewModel.
22 23 24 25 26 |
# File 'app/view_models/main_view_model.rb', line 22 def initialize(gateway: Services::TimetrapGateway.new, archived_entries_store: Services::ArchivedEntriesStore.new) @gateway = gateway @archived_entries_store = archived_entries_store initialize_state end |
Instance Attribute Details
#current_sheet ⇒ Object (readonly)
Returns the value of attribute current_sheet.
19 20 21 |
# File 'app/view_models/main_view_model.rb', line 19 def current_sheet @current_sheet end |
#current_started_at ⇒ Object (readonly)
Returns the value of attribute current_started_at.
19 20 21 |
# File 'app/view_models/main_view_model.rb', line 19 def current_started_at @current_started_at end |
#entries ⇒ Object (readonly)
Returns the value of attribute entries.
19 20 21 |
# File 'app/view_models/main_view_model.rb', line 19 def entries @entries end |
#selected_project ⇒ Object (readonly)
Returns the value of attribute selected_project.
19 20 21 |
# File 'app/view_models/main_view_model.rb', line 19 def selected_project @selected_project end |
#selected_projects ⇒ Object (readonly)
Returns the value of attribute selected_projects.
19 20 21 |
# File 'app/view_models/main_view_model.rb', line 19 def selected_projects @selected_projects end |
#selected_tasks ⇒ Object (readonly)
Returns the value of attribute selected_tasks.
19 20 21 |
# File 'app/view_models/main_view_model.rb', line 19 def selected_tasks @selected_tasks end |
#time_filter_from_at ⇒ Object (readonly)
Returns the value of attribute time_filter_from_at.
19 20 21 |
# File 'app/view_models/main_view_model.rb', line 19 def time_filter_from_at @time_filter_from_at end |
#time_filter_to_at ⇒ Object (readonly)
Returns the value of attribute time_filter_to_at.
19 20 21 |
# File 'app/view_models/main_view_model.rb', line 19 def time_filter_to_at @time_filter_to_at end |
Instance Method Details
#entry_nodes ⇒ Object
92 93 94 |
# File 'app/view_models/main_view_model.rb', line 92 def entry_nodes EntryNodesBuilder.new(entries: filtered_entries, selected_project: selected_project).build end |
#refresh! ⇒ Object
28 29 30 31 32 33 34 35 36 37 |
# File 'app/view_models/main_view_model.rb', line 28 def refresh! @current_started_at = gateway.active_started_at @entries = gateway.entries @current_sheet = detect_current_sheet reset_archive_mode_caches! normalize_selected_projects! seed_current_fields_from_sheet! normalize_selected_tasks! self end |
#running_current_sheet? ⇒ Boolean
90 |
# File 'app/view_models/main_view_model.rb', line 90 def running_current_sheet? = !current_started_at.nil? |
#running_timer_line(now: Time.now) ⇒ Object
84 85 86 87 88 |
# File 'app/view_models/main_view_model.rb', line 84 def running_timer_line(now: Time.now) return '00:00:00' unless current_started_at Services::Formatters.seconds_to_hms(now.to_i - current_started_at.to_i) end |
#select_project(project, sync_current_fields: true) ⇒ Object
39 40 41 |
# File 'app/view_models/main_view_model.rb', line 39 def select_project(project, sync_current_fields: true) select_projects([project], primary_project: project, sync_current_fields: sync_current_fields) end |
#select_projects(projects, primary_project:, sync_current_fields: true) ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 |
# File 'app/view_models/main_view_model.rb', line 43 def select_projects(projects, primary_project:, sync_current_fields: true) normalized = Array(projects).map(&:to_s).reject(&:empty?).uniq normalized = ['* ALL'] if normalized.empty? || normalized.include?('* ALL') @selected_projects = normalized @selected_project = normalized.include?(primary_project) ? primary_project : normalized.first @selected_tasks = [] return unless sync_current_fields apply_selected_project_to_current_field! self.current_task_input = latest_task_for_project(@selected_project) end |
#start_tracking(sheet) ⇒ Object
55 56 57 58 59 60 61 |
# File 'app/view_models/main_view_model.rb', line 55 def start_tracking(sheet) value = normalize_text(sheet).strip raise ArgumentError, 'Task is required' if value.empty? gateway.start(value) @current_started_at = Time.now unless current_started_at end |
#stop_tracking ⇒ Object
63 64 65 66 |
# File 'app/view_models/main_view_model.rb', line 63 def stop_tracking gateway.stop @current_started_at = nil end |
#summary_line ⇒ Object
79 80 81 82 |
# File 'app/view_models/main_view_model.rb', line 79 def summary_line "Week total: #{Services::Formatters.seconds_to_hms(week_total_seconds)} | " \ "Total: #{Services::Formatters.seconds_to_hms(total_seconds)}" end |
#total_seconds ⇒ Object
75 76 77 |
# File 'app/view_models/main_view_model.rb', line 75 def total_seconds filtered_entries.sum(&:duration_seconds) end |
#week_total_seconds ⇒ Object
68 69 70 71 72 73 |
# File 'app/view_models/main_view_model.rb', line 68 def week_total_seconds start_of_week = Date.today - ((Date.today.wday + 6) % 7) filtered_entries.sum do |entry| entry.day >= start_of_week ? entry.duration_seconds : 0 end end |