decidim-time_tracker 0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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