decidim-time_tracker 0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (134) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE-AGPLv3.txt +661 -0
  3. data/README.md +174 -0
  4. data/Rakefile +40 -0
  5. data/app/assets/config/admin/decidim_time_tracker_manifest.css +2 -0
  6. data/app/assets/config/admin/decidim_time_tracker_manifest.js +1 -0
  7. data/app/assets/config/decidim_time_tracker_manifest.css +3 -0
  8. data/app/assets/config/decidim_time_tracker_manifest.js +1 -0
  9. data/app/assets/images/decidim/time_tracker/icon.svg +1 -0
  10. data/app/assets/javascripts/decidim/time_tracker/activity_ui.js.es6 +112 -0
  11. data/app/assets/javascripts/decidim/time_tracker/admin/assignations.js.es6 +35 -0
  12. data/app/assets/javascripts/decidim/time_tracker/reports/reports.js.es6 +19 -0
  13. data/app/assets/javascripts/decidim/time_tracker/time_tracker.js.es6 +82 -0
  14. data/app/assets/javascripts/decidim/time_tracker/timer_api.js.es6 +55 -0
  15. data/app/assets/stylesheets/decidim/time_tracker/_variables.scss +1 -0
  16. data/app/assets/stylesheets/decidim/time_tracker/admin/time_tracker.scss +59 -0
  17. data/app/assets/stylesheets/decidim/time_tracker/time_tracker.scss +118 -0
  18. data/app/cells/decidim/time_tracker/milestone/show.erb +42 -0
  19. data/app/cells/decidim/time_tracker/milestone_cell.rb +54 -0
  20. data/app/commands/decidim/time_tracker/admin/create_activity.rb +39 -0
  21. data/app/commands/decidim/time_tracker/admin/create_assignation.rb +75 -0
  22. data/app/commands/decidim/time_tracker/admin/create_task.rb +33 -0
  23. data/app/commands/decidim/time_tracker/admin/create_time_tracker.rb +76 -0
  24. data/app/commands/decidim/time_tracker/admin/destroy_activity.rb +43 -0
  25. data/app/commands/decidim/time_tracker/admin/destroy_assignation.rb +43 -0
  26. data/app/commands/decidim/time_tracker/admin/destroy_task.rb +43 -0
  27. data/app/commands/decidim/time_tracker/admin/export_time_tracker.rb +150 -0
  28. data/app/commands/decidim/time_tracker/admin/update_activity.rb +49 -0
  29. data/app/commands/decidim/time_tracker/admin/update_assignation.rb +42 -0
  30. data/app/commands/decidim/time_tracker/admin/update_task.rb +44 -0
  31. data/app/commands/decidim/time_tracker/create_milestone.rb +57 -0
  32. data/app/commands/decidim/time_tracker/create_request_assignation.rb +39 -0
  33. data/app/commands/decidim/time_tracker/start_time_event.rb +104 -0
  34. data/app/commands/decidim/time_tracker/stop_last_time_event.rb +45 -0
  35. data/app/controllers/concerns/decidim/time_tracker/admin/filterable_assignations.rb +50 -0
  36. data/app/controllers/decidim/time_tracker/activity_questionnaire_controller.rb +76 -0
  37. data/app/controllers/decidim/time_tracker/admin/activities_controller.rb +82 -0
  38. data/app/controllers/decidim/time_tracker/admin/activity_questionnaire_controller.rb +52 -0
  39. data/app/controllers/decidim/time_tracker/admin/application_controller.rb +22 -0
  40. data/app/controllers/decidim/time_tracker/admin/assignations_controller.rb +84 -0
  41. data/app/controllers/decidim/time_tracker/admin/assignee_questionnaire_controller.rb +58 -0
  42. data/app/controllers/decidim/time_tracker/admin/stats_controller.rb +24 -0
  43. data/app/controllers/decidim/time_tracker/admin/tasks_controller.rb +112 -0
  44. data/app/controllers/decidim/time_tracker/admin/time_tracker_exports_controller.rb +25 -0
  45. data/app/controllers/decidim/time_tracker/application_controller.rb +24 -0
  46. data/app/controllers/decidim/time_tracker/assignations_controller.rb +38 -0
  47. data/app/controllers/decidim/time_tracker/assignee_questionnaire_controller.rb +80 -0
  48. data/app/controllers/decidim/time_tracker/milestones_controller.rb +62 -0
  49. data/app/controllers/decidim/time_tracker/reports/user_controller.rb +38 -0
  50. data/app/controllers/decidim/time_tracker/time_events_controller.rb +68 -0
  51. data/app/controllers/decidim/time_tracker/time_tracker_controller.rb +43 -0
  52. data/app/forms/decidim/time_tracker/admin/activity_form.rb +27 -0
  53. data/app/forms/decidim/time_tracker/admin/assignation_form.rb +29 -0
  54. data/app/forms/decidim/time_tracker/admin/task_form.rb +22 -0
  55. data/app/forms/decidim/time_tracker/milestone_form.rb +32 -0
  56. data/app/forms/decidim/time_tracker/time_event_form.rb +47 -0
  57. data/app/helpers/decidim/time_tracker/admin/application_helper.rb +33 -0
  58. data/app/helpers/decidim/time_tracker/application_helper.rb +95 -0
  59. data/app/jobs/decidim/time_tracker/stop_counter_job.rb +29 -0
  60. data/app/models/decidim/time_tracker/activity.rb +135 -0
  61. data/app/models/decidim/time_tracker/application_record.rb +10 -0
  62. data/app/models/decidim/time_tracker/assignation.rb +68 -0
  63. data/app/models/decidim/time_tracker/assignee.rb +29 -0
  64. data/app/models/decidim/time_tracker/assignee_data.rb +19 -0
  65. data/app/models/decidim/time_tracker/milestone.rb +27 -0
  66. data/app/models/decidim/time_tracker/task.rb +44 -0
  67. data/app/models/decidim/time_tracker/time_event.rb +62 -0
  68. data/app/models/decidim/time_tracker/time_tracker.rb +46 -0
  69. data/app/models/decidim/time_tracker/tos_acceptance.rb +16 -0
  70. data/app/permissions/decidim/time_tracker/admin/permissions.rb +69 -0
  71. data/app/permissions/decidim/time_tracker/permissions.rb +69 -0
  72. data/app/presenters/decidim/time_tracker/admin_log/activity_presenter.rb +44 -0
  73. data/app/presenters/decidim/time_tracker/admin_log/assignation_presenter.rb +48 -0
  74. data/app/presenters/decidim/time_tracker/admin_log/task_presenter.rb +46 -0
  75. data/app/presenters/decidim/time_tracker/admin_log/value_types/activity_presenter.rb +28 -0
  76. data/app/presenters/decidim/time_tracker/admin_log/value_types/time_tracker_presenter.rb +28 -0
  77. data/app/views/decidim/time_tracker/admin/_breadcrumbs.html.erb +56 -0
  78. data/app/views/decidim/time_tracker/admin/activities/_form.html.erb +41 -0
  79. data/app/views/decidim/time_tracker/admin/activities/_index.html.erb +73 -0
  80. data/app/views/decidim/time_tracker/admin/activities/edit.html.erb +5 -0
  81. data/app/views/decidim/time_tracker/admin/activities/new.html.erb +5 -0
  82. data/app/views/decidim/time_tracker/admin/assignations/_form.html.erb +30 -0
  83. data/app/views/decidim/time_tracker/admin/assignations/index.html.erb +67 -0
  84. data/app/views/decidim/time_tracker/admin/assignations/new.html.erb +9 -0
  85. data/app/views/decidim/time_tracker/admin/questionnaires/_index.html.erb +27 -0
  86. data/app/views/decidim/time_tracker/admin/questionnaires/_questionnaire.html.erb +21 -0
  87. data/app/views/decidim/time_tracker/admin/stats/index.html.erb +50 -0
  88. data/app/views/decidim/time_tracker/admin/tasks/_assignations.html.erb +60 -0
  89. data/app/views/decidim/time_tracker/admin/tasks/_form.html.erb +7 -0
  90. data/app/views/decidim/time_tracker/admin/tasks/_index.html.erb +61 -0
  91. data/app/views/decidim/time_tracker/admin/tasks/edit.html.erb +16 -0
  92. data/app/views/decidim/time_tracker/admin/tasks/index.html.erb +5 -0
  93. data/app/views/decidim/time_tracker/admin/tasks/new.html.erb +12 -0
  94. data/app/views/decidim/time_tracker/milestones/index.html.erb +60 -0
  95. data/app/views/decidim/time_tracker/reports/user/index.html.erb +41 -0
  96. data/app/views/decidim/time_tracker/time_tracker/_activity.html.erb +43 -0
  97. data/app/views/decidim/time_tracker/time_tracker/_answer_questionnaire.html.erb +7 -0
  98. data/app/views/decidim/time_tracker/time_tracker/_assignee_data.html.erb +9 -0
  99. data/app/views/decidim/time_tracker/time_tracker/_callout_status.html.erb +3 -0
  100. data/app/views/decidim/time_tracker/time_tracker/_idle_activity.html.erb +27 -0
  101. data/app/views/decidim/time_tracker/time_tracker/_milestone_form.html.erb +35 -0
  102. data/app/views/decidim/time_tracker/time_tracker/_request_activity.html.erb +22 -0
  103. data/app/views/decidim/time_tracker/time_tracker/_sign_in.html.erb +5 -0
  104. data/app/views/decidim/time_tracker/time_tracker/index.html.erb +59 -0
  105. data/config/activity_questionnaire.yml +26 -0
  106. data/config/assignee_questionnaire.yml +37 -0
  107. data/config/i18n-tasks.yml +10 -0
  108. data/config/locales/ca.yml +394 -0
  109. data/config/locales/cs.yml +394 -0
  110. data/config/locales/en.yml +419 -0
  111. data/config/locales/es.yml +394 -0
  112. data/db/migrate/20200302115642_create_decidim_time_tracker_time_trackers.rb +10 -0
  113. data/db/migrate/20200302115654_create_decidim_time_tracker_tasks.rb +11 -0
  114. data/db/migrate/20200302115658_create_decidim_time_tracker_assignees.rb +12 -0
  115. data/db/migrate/20200302115700_create_decidim_time_tracker_activities.rb +19 -0
  116. data/db/migrate/20200302115708_create_decidim_time_tracker_milestones.rb +13 -0
  117. data/db/migrate/20200302115831_create_decidim_time_tracker_assignations.rb +16 -0
  118. data/db/migrate/20200302115840_create_decidim_time_tracker_time_events.rb +15 -0
  119. data/db/migrate/20201118153327_create_decidim_time_tracker_assignee_data.rb +10 -0
  120. data/db/migrate/20201223115130_create_decidim_time_tracker_tos_acceptances.rb +18 -0
  121. data/lib/decidim/time_tracker.rb +45 -0
  122. data/lib/decidim/time_tracker/admin.rb +10 -0
  123. data/lib/decidim/time_tracker/admin_engine.rb +51 -0
  124. data/lib/decidim/time_tracker/component.rb +248 -0
  125. data/lib/decidim/time_tracker/engine.rb +59 -0
  126. data/lib/decidim/time_tracker/reports.rb +10 -0
  127. data/lib/decidim/time_tracker/reports_engine.rb +34 -0
  128. data/lib/decidim/time_tracker/test/admin_log_presenter_examples.rb +34 -0
  129. data/lib/decidim/time_tracker/test/factories.rb +110 -0
  130. data/lib/decidim/time_tracker/test/time_tracker_context.rb +18 -0
  131. data/lib/decidim/time_tracker/time_tracker_activity_questionnaire_answers_serializer.rb +74 -0
  132. data/lib/decidim/time_tracker/version.rb +9 -0
  133. data/vendor/assets/javascripts/jsrender.min.js +4 -0
  134. metadata +276 -0
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ module Admin
6
+ class ActivityQuestionnaireController < Admin::ApplicationController
7
+ include Decidim::Forms::Admin::Concerns::HasQuestionnaire
8
+ include Decidim::Forms::Admin::Concerns::HasQuestionnaireAnswers
9
+
10
+ def questionnaire_for
11
+ time_tracker
12
+ end
13
+
14
+ def questionnaire_participants_url
15
+ index_activity_questionnaire_url
16
+ end
17
+
18
+ def questionnaire_url
19
+ activity_questionnaire_url
20
+ end
21
+
22
+ def questionnaire_participant_answers_url(session_token)
23
+ show_activity_questionnaire_url(session_token: session_token)
24
+ end
25
+
26
+ def questionnaire_export_response_url(session_token)
27
+ export_response_activity_questionnaire_url(session_token: session_token, format: "pdf")
28
+ end
29
+
30
+ def update_url
31
+ EngineRouter.admin_proxy(current_component).activity_questionnaire_path
32
+ end
33
+
34
+ # URL is a custom preview path so we can take control of the answer action
35
+ def public_url
36
+ activity = time_tracker.activities.first
37
+ return unless activity
38
+
39
+ EngineRouter.main_proxy(current_component).preview_task_activity_form_path(task_id: activity.task, activity_id: activity, id: activity.questionnaire)
40
+ end
41
+
42
+ def after_update_url
43
+ EngineRouter.admin_proxy(current_component).root_path
44
+ end
45
+
46
+ def answer_options_url(params)
47
+ EngineRouter.admin_proxy(current_component).answer_options_activity_questionnaire_path(format: :json, **params)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ module Admin
6
+ # This controller is the abstract class from which all other controllers of
7
+ # this engine inherit.
8
+ #
9
+ # Note that it inherits from `Decidim::Admin::Components::BaseController`, which
10
+ # override its layout and provide all kinds of useful methods.
11
+ class ApplicationController < Decidim::Admin::Components::BaseController
12
+ helper_method :time_tracker
13
+
14
+ private
15
+
16
+ def time_tracker
17
+ @time_tracker ||= Decidim::TimeTracker::TimeTracker.find_by(component: current_component)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ module Admin
6
+ class AssignationsController < Admin::ApplicationController
7
+ helper Decidim::TimeTracker::ApplicationHelper
8
+ helper Decidim::TimeTracker::Admin::ApplicationHelper
9
+ helper_method :assignations, :current_task, :current_activity, :current_assignation
10
+
11
+ def index
12
+ @assignations = assignations
13
+ end
14
+
15
+ def new
16
+ enforce_permission_to :create, :assignations
17
+
18
+ @form = form(AssignationForm).instance
19
+ end
20
+
21
+ def create
22
+ enforce_permission_to :create, :assignations
23
+
24
+ @form = form(AssignationForm).from_params(params)
25
+
26
+ CreateAssignation.call(@form, current_activity) do
27
+ on(:ok) do
28
+ flash[:notice] = I18n.t("assignations.create.success", scope: "decidim.time_tracker.admin")
29
+ redirect_to EngineRouter.admin_proxy(current_component).task_activity_assignations_path(current_task, current_activity)
30
+ end
31
+
32
+ on(:invalid) do
33
+ flash.now[:alert] = I18n.t("assignations.create.error", scope: "decidim.time_tracker.admin")
34
+ render :new
35
+ end
36
+ end
37
+ end
38
+
39
+ def destroy
40
+ enforce_permission_to :destroy, :assignation, assignation: current_assignation
41
+
42
+ DestroyAssignation.call(current_assignation, current_user) do
43
+ on(:ok) do
44
+ flash[:notice] = I18n.t("assignations.destroy.success", scope: "decidim.time_tracker.admin")
45
+ redirect_to EngineRouter.admin_proxy(current_component).task_activity_assignations_path(current_task, current_activity)
46
+ end
47
+ end
48
+ end
49
+
50
+ def update
51
+ enforce_permission_to :update, :assignation, assignation: current_assignation
52
+
53
+ UpdateAssignation.call(current_assignation, current_user, params[:assignation_status].to_sym) do
54
+ on(:ok) do
55
+ flash[:notice] = I18n.t("assignations.update.success", scope: "decidim.time_tracker.admin")
56
+ if params[:success_path].present?
57
+ redirect_to params[:success_path]
58
+ else
59
+ redirect_to EngineRouter.admin_proxy(current_component).task_activity_assignations_path(current_task, current_activity)
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ # obtaining the users separately to have them ordered in a nice way
66
+ def assignations
67
+ @assignations = Assignation.where(activity: current_activity.id).sorted_by_status(:pending, :accepted, :rejected)
68
+ end
69
+
70
+ def current_task
71
+ @current_task ||= Task.find(params[:task_id])
72
+ end
73
+
74
+ def current_activity
75
+ @current_activity ||= Activity.find(params[:activity_id])
76
+ end
77
+
78
+ def current_assignation
79
+ @current_assignation ||= Assignation.find(params[:id])
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ module Admin
6
+ class AssigneeQuestionnaireController < Admin::ApplicationController
7
+ include Decidim::Forms::Admin::Concerns::HasQuestionnaire
8
+ include Decidim::Forms::Admin::Concerns::HasQuestionnaireAnswers
9
+
10
+ # only allows answers if not in preview mode
11
+ def allow_answers?
12
+ return false unless current_user
13
+
14
+ return true if params[:action] == "preview" && current_user.admin?
15
+
16
+ activity.allow_answers_for? current_user
17
+ end
18
+
19
+ def questionnaire_for
20
+ time_tracker.assignee_data
21
+ end
22
+
23
+ def questionnaire_participants_url
24
+ index_assignee_questionnaire_url
25
+ end
26
+
27
+ def questionnaire_url
28
+ assignee_questionnaire_url
29
+ end
30
+
31
+ def questionnaire_participant_answers_url(session_token)
32
+ show_assignee_questionnaire_url(session_token: session_token)
33
+ end
34
+
35
+ def questionnaire_export_response_url(session_token)
36
+ export_response_assignee_questionnaire_url(session_token: session_token, format: "pdf")
37
+ end
38
+
39
+ def update_url
40
+ EngineRouter.admin_proxy(current_component).assignee_questionnaire_path
41
+ end
42
+
43
+ # URL is a custom preview path so we can take control of the answer action
44
+ def public_url
45
+ EngineRouter.main_proxy(current_component).preview_assignee_questionnaire_path
46
+ end
47
+
48
+ def after_update_url
49
+ EngineRouter.admin_proxy(current_component).root_path
50
+ end
51
+
52
+ def answer_options_url(params)
53
+ EngineRouter.admin_proxy(current_component).answer_options_assignee_questionnaire_path(format: :json, **params)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ module Admin
6
+ class StatsController < Admin::ApplicationController
7
+ include Paginable
8
+ include Decidim::TimeTracker::Admin::FilterableAssignations
9
+
10
+ helper Decidim::TimeTracker::ApplicationHelper
11
+
12
+ helper_method :assignations
13
+
14
+ def index; end
15
+
16
+ def assignations_collection
17
+ @assignations_collection ||= Decidim::TimeTracker::Assignation.joins(:task).where(decidim_time_tracker_tasks: { time_tracker_id: time_tracker.id })
18
+ end
19
+
20
+ alias assignations filtered_collection
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ module Admin
6
+ class TasksController < Admin::ApplicationController
7
+ include Decidim::TimeTracker::ApplicationHelper
8
+ helper_method :tasks, :current_task, :assignations, :tasks_label, :activities_label, :assignations_label
9
+
10
+ delegate :tasks, to: :time_tracker
11
+
12
+ def index
13
+ @tasks = tasks
14
+ end
15
+
16
+ def new
17
+ enforce_permission_to :create, :task
18
+
19
+ @form = form(TaskForm).instance
20
+ end
21
+
22
+ def edit
23
+ enforce_permission_to :update, :task, task: current_task
24
+ @form = form(TaskForm).from_model(current_task, endpoint: current_task)
25
+ end
26
+
27
+ def create
28
+ enforce_permission_to :create, :task
29
+
30
+ @form = form(TaskForm).from_params(params)
31
+
32
+ CreateTask.call(@form) do
33
+ on(:ok) do
34
+ flash[:notice] = I18n.t("tasks.create.success", scope: "decidim.time_tracker.admin")
35
+ redirect_to EngineRouter.admin_proxy(current_component).tasks_path
36
+ end
37
+
38
+ on(:invalid) do
39
+ flash.now[:alert] = I18n.t("tasks.create.error", scope: "decidim.time_tracker.admin")
40
+ render :new
41
+ end
42
+ end
43
+ end
44
+
45
+ def update
46
+ enforce_permission_to :update, :task, task: current_task
47
+
48
+ form = form(TaskForm).from_params(params, task: current_task)
49
+
50
+ UpdateTask.call(current_task, form, current_user) do
51
+ on(:ok) do
52
+ flash[:notice] = I18n.t("tasks.update.success", scope: "decidim.time_tracker.admin")
53
+ redirect_to EngineRouter.admin_proxy(current_component).edit_task_path(current_task)
54
+ end
55
+
56
+ on(:invalid) do
57
+ flash.now[:alert] = I18n.t("tasks.update.error", scope: "decidim.time_tracker.admin")
58
+ render :edit
59
+ end
60
+ end
61
+ end
62
+
63
+ def destroy
64
+ enforce_permission_to :destroy, :task, task: current_task
65
+
66
+ DestroyTask.call(current_task, current_user) do
67
+ on(:ok) do
68
+ flash[:notice] = I18n.t("tasks.destroy.success", scope: "decidim.time_tracker.admin")
69
+ redirect_to EngineRouter.admin_proxy(current_component).tasks_path
70
+ end
71
+ end
72
+ end
73
+
74
+ def accept_all_pending_assignations
75
+ return redirect_to(tasks_path) if assignations.blank?
76
+
77
+ ok_count = invalid_count = 0
78
+ assignations.each do |assignation|
79
+ UpdateAssignation.call(assignation, current_user, :accepted) do
80
+ on(:ok) do
81
+ ok_count += 1
82
+ end
83
+
84
+ on(:invalid) do
85
+ invalid_count += 1
86
+ end
87
+ end
88
+ end
89
+
90
+ flash[:notice] = I18n.t("tasks.assignations.bulk_ok", scope: "decidim.time_tracker.admin", count: ok_count) if ok_count.positive?
91
+ flash[:alert] = I18n.t("tasks.assignations.bulk_invalid", scope: "decidim.time_tracker.admin", count: invalid_count) if invalid_count.positive?
92
+
93
+ redirect_to(tasks_path)
94
+ end
95
+
96
+ private
97
+
98
+ def tasks
99
+ time_tracker.tasks
100
+ end
101
+
102
+ def assignations
103
+ time_tracker.assignations.pending
104
+ end
105
+
106
+ def current_task
107
+ @current_task ||= Task.find(params[:id])
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ module Admin
6
+ class TimeTrackerExportsController < Admin::ApplicationController
7
+ def export
8
+ # enforce_permission_to :import, :time_tracker
9
+
10
+ ExportTimeTracker.call(current_component, current_user) do
11
+ on(:ok) do |accountability_component|
12
+ flash[:notice] = I18n.t("time_tracker_exports.create.success", scope: "decidim.time_tracker.admin")
13
+ redirect_to EngineRouter.admin_proxy(accountability_component).root_path
14
+ end
15
+
16
+ on(:invalid) do
17
+ flash.now[:alert] = I18n.t("time_tracker_exports.create.error", scope: "decidim.time_tracker.admin")
18
+ redirect_to EngineRouter.admin_proxy(current_component).root_path
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ # This controller is the abstract class from which all other controllers of
6
+ # this engine inherit.
7
+ #
8
+ # Note that it inherits from `Decidim::Components::BaseController`, which
9
+ # override its layout and provide all kinds of useful methods.
10
+ class ApplicationController < Decidim::Components::BaseController
11
+ helper_method :time_tracker, :current_assignee
12
+
13
+ private
14
+
15
+ def time_tracker
16
+ @time_tracker ||= Decidim::TimeTracker::TimeTracker.find_by(component: current_component)
17
+ end
18
+
19
+ def current_assignee
20
+ @current_assignee ||= Decidim::TimeTracker::Assignee.for(current_user)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ class AssignationsController < Decidim::TimeTracker::ApplicationController
6
+ helper_method :assignation
7
+
8
+ def create
9
+ enforce_permission_to :create, :assignation, activity: activity
10
+
11
+ CreateRequestAssignation.call(activity, current_user) do
12
+ on(:ok) do |activity|
13
+ render json: {
14
+ message: I18n.t("assignations.request.success", scope: "decidim.time_tracker"),
15
+ activityId: activity.id
16
+ }
17
+ end
18
+
19
+ on(:invalid) do
20
+ render json: {
21
+ message: I18n.t("assignations.request.error", scope: "decidim.time_tracker")
22
+ }, status: :unprocessable_entity
23
+ end
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def activity
30
+ @activity ||= Activity.active.find_by(id: params[:activity_id])
31
+ end
32
+
33
+ def assignation
34
+ @assignation ||= Assignation.accepted.find_by(id: params[:id])
35
+ end
36
+ end
37
+ end
38
+ end