diff --git a/app/controllers/work_item_controller.rb b/app/controllers/work_item_controller.rb
new file mode 100644
index 0000000..50b5930
--- /dev/null
+++ b/app/controllers/work_item_controller.rb
@@ -0,0 +1,15 @@
+class WorkItemController < ApplicationController
+ def start_time_entry
+ work_item = WorkItem.find(params[:id])
+
+ Toggl::start_time_entry(
+ description: work_item.title,
+ project_id: work_item.course.toggl_project,
+ )
+ end
+
+ def complete
+ work_item = WorkItem.find(params[:id])
+ work_item.complete!
+ end
+end
diff --git a/app/helpers/work_item_helper.rb b/app/helpers/work_item_helper.rb
new file mode 100644
index 0000000..bb332cb
--- /dev/null
+++ b/app/helpers/work_item_helper.rb
@@ -0,0 +1,2 @@
+module WorkItemHelper
+end
diff --git a/app/controllers/concerns/Trackable.rb b/app/models/concerns/Trackable.rb
similarity index 100%
rename from app/controllers/concerns/Trackable.rb
rename to app/models/concerns/Trackable.rb
diff --git a/app/models/concerns/course_item.rb b/app/models/concerns/course_item.rb
new file mode 100644
index 0000000..faf9cd2
--- /dev/null
+++ b/app/models/concerns/course_item.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+module CourseItem
+ def week_number
+ ((start_time.beginning_of_week - course.semester_start_date.to_time) / 1.week).floor + 1
+ end
+end
diff --git a/app/models/lecture.rb b/app/models/lecture.rb
index e25b895..9333015 100644
--- a/app/models/lecture.rb
+++ b/app/models/lecture.rb
@@ -9,7 +9,7 @@ class Lecture < ApplicationRecord
:problems_class,
], default: :lecture
- include Trackable
+ include Trackable, CourseItem
def prepared?
tracked_time_entries.where(kind: [:preparation]).any?
@@ -35,10 +35,6 @@ class Lecture < ApplicationRecord
tracked_time_entries.review.sum(&:duration).seconds
end
- def week_number
- ((start_time.beginning_of_week - course.semester_start_date.to_time) / 1.week).floor + 1
- end
-
def live_video_url
nil
end
diff --git a/app/models/work_item.rb b/app/models/work_item.rb
index f63a20d..1e1f894 100644
--- a/app/models/work_item.rb
+++ b/app/models/work_item.rb
@@ -2,17 +2,38 @@ class WorkItem < ApplicationRecord
belongs_to :course
has_many :tracked_time_entries, dependent: :destroy, as: :subject
- validate :due_date_after_start_date
+ validate :date_orderings
+ include Trackable, CourseItem
- include Trackable
+ def start_time
+ available_from
+ end
- def due_date_after_start_date
- if due_date.present? && start_time.present? && due_date < start_time
- errors.add(:due_date, "can't be before start date")
+ def completed?
+ completed_at.present?
+ end
+
+ def complete!
+ update(completed_at: Time.now)
+ end
+
+ def workable?
+ available_from.past? && !completed?
+ end
+
+ def started?
+ !tracked_time_entries.empty?
+ end
+
+ private
+
+ def date_orderings
+ if due_at.present? && available_from.present? && due_at < available_from
+ errors.add(:due_at, "can't be before date work item is available")
+ end
+
+ if completed_at.present? && available_from.present? && completed_at < available_from
+ errors.add(:completed_at, "can't be before date work item is available")
end
end
-
- def week_number
- ((start_time.beginning_of_week - course.semester_start_date.to_time) / 1.week).floor + 1
- end
end
diff --git a/app/views/work_item/complete.html.erb b/app/views/work_item/complete.html.erb
new file mode 100644
index 0000000..5fa51ca
--- /dev/null
+++ b/app/views/work_item/complete.html.erb
@@ -0,0 +1,4 @@
+
+
WorkItem#complete
+
Find me in app/views/work_item/complete.html.erb
+
diff --git a/app/views/work_item/start_time_entry.html.erb b/app/views/work_item/start_time_entry.html.erb
new file mode 100644
index 0000000..0db09d3
--- /dev/null
+++ b/app/views/work_item/start_time_entry.html.erb
@@ -0,0 +1,4 @@
+
+
WorkItem#start_time_entry
+
Find me in app/views/work_item/start_time_entry.html.erb
+
diff --git a/app/views/work_items/_work_item.html.erb b/app/views/work_items/_work_item.html.erb
index 7f3f98f..d65c76b 100644
--- a/app/views/work_items/_work_item.html.erb
+++ b/app/views/work_items/_work_item.html.erb
@@ -1,4 +1,8 @@
-
+
|
<%= work_item.title %>
|
@@ -7,12 +11,19 @@
-
-
+
+ <% if work_item.completed? %>
+
+ <% elsif work_item.started? %>
+
+ <% else %>
+ <%# Symbol to show work has not started yet %>
+
+ <% end %>
- <% unless work_item.tracked_time_entries.empty? %>
+ <% if work_item.started? %>
Time spent: <%= humanise_duration(work_item.total_overall_time) %>
@@ -23,26 +34,25 @@
|
- <% if work_item.start_time.future? %>
- <%= button_to "Prepare",
- "X",
+ <% if work_item.workable? %>
+ <% start_label = if work_item.started? then
+ "Continue"
+ else
+ "Start"
+ end %>
+ <%= button_to start_label,
+ work_item_start_time_entry_path(work_item),
class: 'action-button'
%>
- <% elsif work_item.start_time.past? && work_item.due_date.future? %>
- <%= button_to "Start",
- "X",
- class: 'action-button'
- %>
- <% else %>
-
- <%= button_to "Review",
- "X",
- class: 'action-button'
- %>
-
<% end %>
|
+ <% if work_item.started? && !work_item.completed? %>
+ <%= button_to "Complete",
+ work_item_complete_path(work_item),
+ class: 'action-button'
+ %>
+ <% end %>
|
diff --git a/config/routes.rb b/config/routes.rb
index 8df9001..15695b9 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -15,5 +15,8 @@ Rails.application.routes.draw do
post '/lectures/:id/start_preparation', to: 'lecture#start_preparation', as: :lecture_start_preparation
post '/lectures/:id/start_review', to: 'lecture#start_review', as: :lecture_start_review
+ get '/work_items/:id/start_time_entry', to: 'work_item#start_time_entry', as: :work_item_start_time_entry
+ get '/work_items/:id/complete', to: 'work_item#complete', as: :work_item_complete
+
post '/lectures/:id/checkin', to: 'lecture#checkin', as: :lecture_checkin
end
diff --git a/db/migrate/20231008144635_rename_work_item_columns.rb b/db/migrate/20231008144635_rename_work_item_columns.rb
new file mode 100644
index 0000000..e7bb9f3
--- /dev/null
+++ b/db/migrate/20231008144635_rename_work_item_columns.rb
@@ -0,0 +1,6 @@
+class RenameWorkItemColumns < ActiveRecord::Migration[7.1]
+ def change
+ rename_column :work_items, :start_time, :available_from
+ rename_column :work_items, :due_date, :due_at
+ end
+end
diff --git a/db/migrate/20231008145328_add_completion_time_to_work_item.rb b/db/migrate/20231008145328_add_completion_time_to_work_item.rb
new file mode 100644
index 0000000..eb85ddc
--- /dev/null
+++ b/db/migrate/20231008145328_add_completion_time_to_work_item.rb
@@ -0,0 +1,5 @@
+class AddCompletionTimeToWorkItem < ActiveRecord::Migration[7.1]
+ def change
+ add_column :work_items, :completed_at, :datetime
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index ff9eceb..c21ee59 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[7.1].define(version: 2023_10_08_143146) do
+ActiveRecord::Schema[7.1].define(version: 2023_10_08_145328) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -64,10 +64,11 @@ ActiveRecord::Schema[7.1].define(version: 2023_10_08_143146) do
create_table "work_items", force: :cascade do |t|
t.string "title", null: false
t.bigint "course_id", null: false
- t.datetime "due_date", null: false
+ t.datetime "due_at", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
- t.datetime "start_time"
+ t.datetime "available_from"
+ t.datetime "completed_at"
t.index ["course_id"], name: "index_work_items_on_course_id"
end
diff --git a/test/controllers/work_item_controller_test.rb b/test/controllers/work_item_controller_test.rb
new file mode 100644
index 0000000..3dbec92
--- /dev/null
+++ b/test/controllers/work_item_controller_test.rb
@@ -0,0 +1,13 @@
+require "test_helper"
+
+class WorkItemControllerTest < ActionDispatch::IntegrationTest
+ test "should get start_time_entry" do
+ get work_item_start_time_entry_url
+ assert_response :success
+ end
+
+ test "should get complete" do
+ get work_item_complete_url
+ assert_response :success
+ end
+end