decidim-time_tracker 0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|