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.
- checksums.yaml +7 -0
- data/LICENSE-AGPLv3.txt +661 -0
- data/README.md +174 -0
- data/Rakefile +40 -0
- data/app/assets/config/admin/decidim_time_tracker_manifest.css +2 -0
- data/app/assets/config/admin/decidim_time_tracker_manifest.js +1 -0
- data/app/assets/config/decidim_time_tracker_manifest.css +3 -0
- data/app/assets/config/decidim_time_tracker_manifest.js +1 -0
- data/app/assets/images/decidim/time_tracker/icon.svg +1 -0
- data/app/assets/javascripts/decidim/time_tracker/activity_ui.js.es6 +112 -0
- data/app/assets/javascripts/decidim/time_tracker/admin/assignations.js.es6 +35 -0
- data/app/assets/javascripts/decidim/time_tracker/reports/reports.js.es6 +19 -0
- data/app/assets/javascripts/decidim/time_tracker/time_tracker.js.es6 +82 -0
- data/app/assets/javascripts/decidim/time_tracker/timer_api.js.es6 +55 -0
- data/app/assets/stylesheets/decidim/time_tracker/_variables.scss +1 -0
- data/app/assets/stylesheets/decidim/time_tracker/admin/time_tracker.scss +59 -0
- data/app/assets/stylesheets/decidim/time_tracker/time_tracker.scss +118 -0
- data/app/cells/decidim/time_tracker/milestone/show.erb +42 -0
- data/app/cells/decidim/time_tracker/milestone_cell.rb +54 -0
- data/app/commands/decidim/time_tracker/admin/create_activity.rb +39 -0
- data/app/commands/decidim/time_tracker/admin/create_assignation.rb +75 -0
- data/app/commands/decidim/time_tracker/admin/create_task.rb +33 -0
- data/app/commands/decidim/time_tracker/admin/create_time_tracker.rb +76 -0
- data/app/commands/decidim/time_tracker/admin/destroy_activity.rb +43 -0
- data/app/commands/decidim/time_tracker/admin/destroy_assignation.rb +43 -0
- data/app/commands/decidim/time_tracker/admin/destroy_task.rb +43 -0
- data/app/commands/decidim/time_tracker/admin/export_time_tracker.rb +150 -0
- data/app/commands/decidim/time_tracker/admin/update_activity.rb +49 -0
- data/app/commands/decidim/time_tracker/admin/update_assignation.rb +42 -0
- data/app/commands/decidim/time_tracker/admin/update_task.rb +44 -0
- data/app/commands/decidim/time_tracker/create_milestone.rb +57 -0
- data/app/commands/decidim/time_tracker/create_request_assignation.rb +39 -0
- data/app/commands/decidim/time_tracker/start_time_event.rb +104 -0
- data/app/commands/decidim/time_tracker/stop_last_time_event.rb +45 -0
- data/app/controllers/concerns/decidim/time_tracker/admin/filterable_assignations.rb +50 -0
- data/app/controllers/decidim/time_tracker/activity_questionnaire_controller.rb +76 -0
- data/app/controllers/decidim/time_tracker/admin/activities_controller.rb +82 -0
- data/app/controllers/decidim/time_tracker/admin/activity_questionnaire_controller.rb +52 -0
- data/app/controllers/decidim/time_tracker/admin/application_controller.rb +22 -0
- data/app/controllers/decidim/time_tracker/admin/assignations_controller.rb +84 -0
- data/app/controllers/decidim/time_tracker/admin/assignee_questionnaire_controller.rb +58 -0
- data/app/controllers/decidim/time_tracker/admin/stats_controller.rb +24 -0
- data/app/controllers/decidim/time_tracker/admin/tasks_controller.rb +112 -0
- data/app/controllers/decidim/time_tracker/admin/time_tracker_exports_controller.rb +25 -0
- data/app/controllers/decidim/time_tracker/application_controller.rb +24 -0
- data/app/controllers/decidim/time_tracker/assignations_controller.rb +38 -0
- data/app/controllers/decidim/time_tracker/assignee_questionnaire_controller.rb +80 -0
- data/app/controllers/decidim/time_tracker/milestones_controller.rb +62 -0
- data/app/controllers/decidim/time_tracker/reports/user_controller.rb +38 -0
- data/app/controllers/decidim/time_tracker/time_events_controller.rb +68 -0
- data/app/controllers/decidim/time_tracker/time_tracker_controller.rb +43 -0
- data/app/forms/decidim/time_tracker/admin/activity_form.rb +27 -0
- data/app/forms/decidim/time_tracker/admin/assignation_form.rb +29 -0
- data/app/forms/decidim/time_tracker/admin/task_form.rb +22 -0
- data/app/forms/decidim/time_tracker/milestone_form.rb +32 -0
- data/app/forms/decidim/time_tracker/time_event_form.rb +47 -0
- data/app/helpers/decidim/time_tracker/admin/application_helper.rb +33 -0
- data/app/helpers/decidim/time_tracker/application_helper.rb +95 -0
- data/app/jobs/decidim/time_tracker/stop_counter_job.rb +29 -0
- data/app/models/decidim/time_tracker/activity.rb +135 -0
- data/app/models/decidim/time_tracker/application_record.rb +10 -0
- data/app/models/decidim/time_tracker/assignation.rb +68 -0
- data/app/models/decidim/time_tracker/assignee.rb +29 -0
- data/app/models/decidim/time_tracker/assignee_data.rb +19 -0
- data/app/models/decidim/time_tracker/milestone.rb +27 -0
- data/app/models/decidim/time_tracker/task.rb +44 -0
- data/app/models/decidim/time_tracker/time_event.rb +62 -0
- data/app/models/decidim/time_tracker/time_tracker.rb +46 -0
- data/app/models/decidim/time_tracker/tos_acceptance.rb +16 -0
- data/app/permissions/decidim/time_tracker/admin/permissions.rb +69 -0
- data/app/permissions/decidim/time_tracker/permissions.rb +69 -0
- data/app/presenters/decidim/time_tracker/admin_log/activity_presenter.rb +44 -0
- data/app/presenters/decidim/time_tracker/admin_log/assignation_presenter.rb +48 -0
- data/app/presenters/decidim/time_tracker/admin_log/task_presenter.rb +46 -0
- data/app/presenters/decidim/time_tracker/admin_log/value_types/activity_presenter.rb +28 -0
- data/app/presenters/decidim/time_tracker/admin_log/value_types/time_tracker_presenter.rb +28 -0
- data/app/views/decidim/time_tracker/admin/_breadcrumbs.html.erb +56 -0
- data/app/views/decidim/time_tracker/admin/activities/_form.html.erb +41 -0
- data/app/views/decidim/time_tracker/admin/activities/_index.html.erb +73 -0
- data/app/views/decidim/time_tracker/admin/activities/edit.html.erb +5 -0
- data/app/views/decidim/time_tracker/admin/activities/new.html.erb +5 -0
- data/app/views/decidim/time_tracker/admin/assignations/_form.html.erb +30 -0
- data/app/views/decidim/time_tracker/admin/assignations/index.html.erb +67 -0
- data/app/views/decidim/time_tracker/admin/assignations/new.html.erb +9 -0
- data/app/views/decidim/time_tracker/admin/questionnaires/_index.html.erb +27 -0
- data/app/views/decidim/time_tracker/admin/questionnaires/_questionnaire.html.erb +21 -0
- data/app/views/decidim/time_tracker/admin/stats/index.html.erb +50 -0
- data/app/views/decidim/time_tracker/admin/tasks/_assignations.html.erb +60 -0
- data/app/views/decidim/time_tracker/admin/tasks/_form.html.erb +7 -0
- data/app/views/decidim/time_tracker/admin/tasks/_index.html.erb +61 -0
- data/app/views/decidim/time_tracker/admin/tasks/edit.html.erb +16 -0
- data/app/views/decidim/time_tracker/admin/tasks/index.html.erb +5 -0
- data/app/views/decidim/time_tracker/admin/tasks/new.html.erb +12 -0
- data/app/views/decidim/time_tracker/milestones/index.html.erb +60 -0
- data/app/views/decidim/time_tracker/reports/user/index.html.erb +41 -0
- data/app/views/decidim/time_tracker/time_tracker/_activity.html.erb +43 -0
- data/app/views/decidim/time_tracker/time_tracker/_answer_questionnaire.html.erb +7 -0
- data/app/views/decidim/time_tracker/time_tracker/_assignee_data.html.erb +9 -0
- data/app/views/decidim/time_tracker/time_tracker/_callout_status.html.erb +3 -0
- data/app/views/decidim/time_tracker/time_tracker/_idle_activity.html.erb +27 -0
- data/app/views/decidim/time_tracker/time_tracker/_milestone_form.html.erb +35 -0
- data/app/views/decidim/time_tracker/time_tracker/_request_activity.html.erb +22 -0
- data/app/views/decidim/time_tracker/time_tracker/_sign_in.html.erb +5 -0
- data/app/views/decidim/time_tracker/time_tracker/index.html.erb +59 -0
- data/config/activity_questionnaire.yml +26 -0
- data/config/assignee_questionnaire.yml +37 -0
- data/config/i18n-tasks.yml +10 -0
- data/config/locales/ca.yml +394 -0
- data/config/locales/cs.yml +394 -0
- data/config/locales/en.yml +419 -0
- data/config/locales/es.yml +394 -0
- data/db/migrate/20200302115642_create_decidim_time_tracker_time_trackers.rb +10 -0
- data/db/migrate/20200302115654_create_decidim_time_tracker_tasks.rb +11 -0
- data/db/migrate/20200302115658_create_decidim_time_tracker_assignees.rb +12 -0
- data/db/migrate/20200302115700_create_decidim_time_tracker_activities.rb +19 -0
- data/db/migrate/20200302115708_create_decidim_time_tracker_milestones.rb +13 -0
- data/db/migrate/20200302115831_create_decidim_time_tracker_assignations.rb +16 -0
- data/db/migrate/20200302115840_create_decidim_time_tracker_time_events.rb +15 -0
- data/db/migrate/20201118153327_create_decidim_time_tracker_assignee_data.rb +10 -0
- data/db/migrate/20201223115130_create_decidim_time_tracker_tos_acceptances.rb +18 -0
- data/lib/decidim/time_tracker.rb +45 -0
- data/lib/decidim/time_tracker/admin.rb +10 -0
- data/lib/decidim/time_tracker/admin_engine.rb +51 -0
- data/lib/decidim/time_tracker/component.rb +248 -0
- data/lib/decidim/time_tracker/engine.rb +59 -0
- data/lib/decidim/time_tracker/reports.rb +10 -0
- data/lib/decidim/time_tracker/reports_engine.rb +34 -0
- data/lib/decidim/time_tracker/test/admin_log_presenter_examples.rb +34 -0
- data/lib/decidim/time_tracker/test/factories.rb +110 -0
- data/lib/decidim/time_tracker/test/time_tracker_context.rb +18 -0
- data/lib/decidim/time_tracker/time_tracker_activity_questionnaire_answers_serializer.rb +74 -0
- data/lib/decidim/time_tracker/version.rb +9 -0
- data/vendor/assets/javascripts/jsrender.min.js +4 -0
- 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
|