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,60 @@
|
|
1
|
+
<div class="card">
|
2
|
+
<div class="card-divider">
|
3
|
+
<h2 class="card-title">
|
4
|
+
<%= t(".pending") %>
|
5
|
+
|
6
|
+
<div class="button--title">
|
7
|
+
<%= link_to t("assignations.actions.accept_all", scope: "decidim.time_tracker.admin", name: assignations_label), accept_all_pending_assignations_tasks_path, method: :post, class: "button tiny button--simple" %>
|
8
|
+
</div>
|
9
|
+
</h2>
|
10
|
+
</div>
|
11
|
+
|
12
|
+
<div class="card-section">
|
13
|
+
<div class="table-scroll">
|
14
|
+
<table class="table-list">
|
15
|
+
<thead>
|
16
|
+
<tr>
|
17
|
+
<th><%= t("models.assignation.fields.name", scope: "decidim.time_tracker") %></th>
|
18
|
+
<th><%= t("models.assignation.fields.task", scope: "decidim.time_tracker") %></th>
|
19
|
+
<th><%= t("models.assignation.fields.invited_by", scope: "decidim.time_tracker") %></th>
|
20
|
+
<th><%= t("models.assignation.fields.invited_at", scope: "decidim.time_tracker") %></th>
|
21
|
+
<th><%= t("models.assignation.fields.tos_accepted_at", scope: "decidim.time_tracker") %></th>
|
22
|
+
<th class="actions"><%= t("actions.title", scope: "decidim.time_tracker.admin") %></th>
|
23
|
+
</tr>
|
24
|
+
</thead>
|
25
|
+
<tbody>
|
26
|
+
<% assignations.each do |assignation| %>
|
27
|
+
<tr data-id="<%= assignation.id %>" class="assignation--pending">
|
28
|
+
<td>
|
29
|
+
<%= link_to assignation.user.name, decidim.profile_path(assignation.user.nickname) %>
|
30
|
+
(<%= assignation.user.email %>)
|
31
|
+
</td>
|
32
|
+
<td>
|
33
|
+
<%= link_to translated_attribute(assignation.task.name), edit_task_path(assignation.task) %> /
|
34
|
+
<%= link_to translated_attribute(assignation.activity.description), task_activity_assignations_path(assignation.task, assignation.activity) %>
|
35
|
+
</td>
|
36
|
+
<td>
|
37
|
+
<%= assignation.invited_by_user&.name %>
|
38
|
+
</td>
|
39
|
+
<td>
|
40
|
+
<%= l(assignation.invited_at, format: :decidim_short) if assignation.invited_at.present? %>
|
41
|
+
</td>
|
42
|
+
<td>
|
43
|
+
<%= l(assignation.assignee.tos_accepted_at(time_tracker), format: :decidim_short) if assignation.assignee.tos_accepted?(time_tracker) %>
|
44
|
+
</td>
|
45
|
+
<td class="table-list__actions">
|
46
|
+
<% if allowed_to? :update, :assignation, assignation: assignation %>
|
47
|
+
<%= change_assignation_status_button assignation, success_path: tasks_path %>
|
48
|
+
<% end %>
|
49
|
+
|
50
|
+
<% if allowed_to? :destroy, :assignation, assignation: assignation %>
|
51
|
+
<%= icon_link_to "circle-x", task_activity_assignation_path(assignation.task, assignation.activity, assignation), t("assignations.actions.destroy", scope: "decidim.time_tracker.admin"), method: :delete, class: "action-icon--remove", data: { confirm: t("assignations.actions.confirm_destroy", scope: "decidim.time_tracker.admin") } %>
|
52
|
+
<% end %>
|
53
|
+
</td>
|
54
|
+
</tr>
|
55
|
+
<% end %>
|
56
|
+
</tbody>
|
57
|
+
</table>
|
58
|
+
</div>
|
59
|
+
</div>
|
60
|
+
</div>
|
@@ -0,0 +1,61 @@
|
|
1
|
+
<div class="card">
|
2
|
+
<div class="card-divider">
|
3
|
+
<h2 class="card-title">
|
4
|
+
<%= t(".title") %>
|
5
|
+
<div class="button--title">
|
6
|
+
<%= link_to t("tasks.actions.new", scope: "decidim.time_tracker.admin", name: tasks_label), new_task_path, class: "button tiny button--simple" %>
|
7
|
+
</div>
|
8
|
+
</h2>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="card-section">
|
12
|
+
<div class="table-scroll">
|
13
|
+
<table class="table-list">
|
14
|
+
<thead>
|
15
|
+
<tr>
|
16
|
+
<th><%= t("models.task.fields.name", scope: "decidim.time_tracker") %></th>
|
17
|
+
<th><%= t("models.task.fields.activities_count", scope: "decidim.time_tracker") %></th>
|
18
|
+
<th><%= t("models.task.fields.activities_start_at", scope: "decidim.time_tracker") %></th>
|
19
|
+
<th><%= t("models.task.fields.activities_end_at", scope: "decidim.time_tracker") %></th>
|
20
|
+
<th><%= t("models.task.fields.assignations_accepted", scope: "decidim.time_tracker") %></th>
|
21
|
+
<th><%= t("models.task.fields.assignations_pending", scope: "decidim.time_tracker") %></th>
|
22
|
+
<th class="actions"><%= t("actions.title", scope: "decidim.time_tracker.admin") %></th>
|
23
|
+
</tr>
|
24
|
+
</thead>
|
25
|
+
<tbody>
|
26
|
+
<% tasks.each do |task| %>
|
27
|
+
<tr data-id="<%= task.id %>">
|
28
|
+
<td>
|
29
|
+
<%= translated_attribute(task.name) %><br>
|
30
|
+
</td>
|
31
|
+
<td>
|
32
|
+
<%= task.activities.count %><br>
|
33
|
+
</td>
|
34
|
+
<td>
|
35
|
+
<%= l task.starts_at, format: :decidim_short if task.starts_at.present? %><br>
|
36
|
+
</td>
|
37
|
+
<td>
|
38
|
+
<%= l task.ends_at, format: :decidim_short if task.ends_at.present? %><br>
|
39
|
+
</td>
|
40
|
+
<td>
|
41
|
+
<%= task.assignations_count(filter: :accepted) %><br>
|
42
|
+
</td>
|
43
|
+
<td>
|
44
|
+
<%= task.assignations_count(filter: :pending) %><br>
|
45
|
+
</td>
|
46
|
+
<td class="table-list__actions">
|
47
|
+
<% if allowed_to? :update, :task, task: task %>
|
48
|
+
<%= icon_link_to "pencil", edit_task_path(task), t("tasks.actions.edit", scope: "decidim.time_tracker.admin"), class: "action-icon--edit" %>
|
49
|
+
<% end %>
|
50
|
+
|
51
|
+
<% if allowed_to? :destroy, :task, task: task %>
|
52
|
+
<%= icon_link_to "circle-x", task_path(task), t("tasks.actions.destroy", scope: "decidim.time_tracker.admin"), method: :delete, class: "action-icon--remove", data: { confirm: t("tasks.actions.confirm_destroy", scope: "decidim.time_tracker.admin") } %>
|
53
|
+
<% end %>
|
54
|
+
</td>
|
55
|
+
</tr>
|
56
|
+
<% end %>
|
57
|
+
</tbody>
|
58
|
+
</table>
|
59
|
+
</div>
|
60
|
+
</div>
|
61
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<%= render partial: "decidim/time_tracker/admin/breadcrumbs" %>
|
2
|
+
|
3
|
+
<div class="card">
|
4
|
+
<div class="card-divider">
|
5
|
+
<h2 class="card-title">
|
6
|
+
<%= t(".title") %>
|
7
|
+
</h2>
|
8
|
+
</div>
|
9
|
+
<div class="card-section">
|
10
|
+
<%= decidim_form_for(@form, html: { class: "form new_task" }) do |f| %>
|
11
|
+
<%= render partial: "form", object: f, locals: { submit: t(".submit") } %>
|
12
|
+
<% end %>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<%= render partial: "decidim/time_tracker/admin/activities/index", locals: { activities: current_task.activities } %>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<%= render partial: "decidim/time_tracker/admin/breadcrumbs" %>
|
2
|
+
|
3
|
+
<%= render partial: "decidim/time_tracker/admin/tasks/assignations" if assignations.present? %>
|
4
|
+
<%= render partial: "decidim/time_tracker/admin/tasks/index" %>
|
5
|
+
<%= render partial: "decidim/time_tracker/admin/questionnaires/index" %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<div class="card">
|
2
|
+
<div class="card-divider">
|
3
|
+
<h2 class="card-title">
|
4
|
+
<%= t(".title") %>
|
5
|
+
</h2>
|
6
|
+
</div>
|
7
|
+
<div class="card-section">
|
8
|
+
<%= decidim_form_for(@form, html: { class: "form new_task" }) do |f| %>
|
9
|
+
<%= render partial: "form", object: f, locals: { submit: t(".submit") } %>
|
10
|
+
<% end %>
|
11
|
+
</div>
|
12
|
+
</div>
|
@@ -0,0 +1,60 @@
|
|
1
|
+
<div class="row column">
|
2
|
+
<div class="row section columns">
|
3
|
+
<%= link_to root_path, class: "small hollow" do %>
|
4
|
+
<%= icon "chevron-left", class: "icon--small", role: "img", "aria-hidden": true %>
|
5
|
+
<%= t(".back_to_list") %>
|
6
|
+
<% end %>
|
7
|
+
<h2 class="heading2"> <%= t(".assignations_activity", user_name: user.name) %> </h2>
|
8
|
+
<div class="author-data author-data--small">
|
9
|
+
<div class="author-data__main">
|
10
|
+
<div class="author author--inline">
|
11
|
+
<%= link_to decidim.profile_path(user.nickname) do %>
|
12
|
+
<span class="author__avatar">
|
13
|
+
<%= image_tag user.avatar_url %>
|
14
|
+
</span>
|
15
|
+
<span class="author__name">
|
16
|
+
<%= user.name %>
|
17
|
+
</span>
|
18
|
+
<% end %>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div class="row">
|
25
|
+
<div class="columns medium-7 mediumlarge-8">
|
26
|
+
<% activities.each do |activity| %>
|
27
|
+
<div class="row columns large-12">
|
28
|
+
<h4 class="section-heading"><%= translated_attribute(activity.description) %></h4>
|
29
|
+
</div>
|
30
|
+
|
31
|
+
<div class="row small-up-1 medium-up-2 large-up-3 card-grid">
|
32
|
+
<% activity.milestones.where(user: user).each do |milestone| %>
|
33
|
+
<%= card_for milestone %>
|
34
|
+
<% end %>
|
35
|
+
</div>
|
36
|
+
<% end %>
|
37
|
+
</div>
|
38
|
+
|
39
|
+
<div class="section columns medium-5 mediumlarge-4 large-3">
|
40
|
+
<div class="card extra definition-data">
|
41
|
+
<div class="definition-data__item local_area">
|
42
|
+
<span class="definition-data__title"><%= t(".total_time") %></span>
|
43
|
+
<%= clockify_seconds user_total_time_dedicated(user) %>
|
44
|
+
</div>
|
45
|
+
|
46
|
+
<div class="definition-data__item start-date">
|
47
|
+
<span class="definition-data__title"><%= t(".joined_on") %></span>
|
48
|
+
<%= user_joined_at(user).strftime("%d %b %Y") %>
|
49
|
+
</div>
|
50
|
+
|
51
|
+
<div class="definition-data__item end-date">
|
52
|
+
<span class="definition-data__title"><%= t(".last_worked_on") %></span>
|
53
|
+
<%= user_last_milestone(user).created_at.strftime("%d %b %Y") %>
|
54
|
+
</div>
|
55
|
+
</div>
|
56
|
+
</div>
|
57
|
+
</div>
|
58
|
+
</div>
|
59
|
+
|
60
|
+
<%= stylesheet_link_tag "decidim/time_tracker/time_tracker" %>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<div class="row column time-tracker--report">
|
2
|
+
<section class="section">
|
3
|
+
<% if assignations.any? %>
|
4
|
+
<div class="card__extra card--list__data">
|
5
|
+
<div class="card--list__data__number">
|
6
|
+
<%== t(".dedicated_time", time: clockify_seconds(total_time)) %>
|
7
|
+
</div>
|
8
|
+
</div>
|
9
|
+
<div class="card card--list">
|
10
|
+
<% assignations.each do |assignation| %>
|
11
|
+
<%= link_to activity_path(assignation), class: "time-tracker--activity", target: :blank do %>
|
12
|
+
<div class="card--list__item">
|
13
|
+
<div class="card--list__text">
|
14
|
+
<div>
|
15
|
+
<h5 class="card--list__heading">
|
16
|
+
<%= translated_attribute(assignation.activity.description) %>
|
17
|
+
</h5>
|
18
|
+
<span class="text-small">
|
19
|
+
<%= assignation_status_label assignation.status %>
|
20
|
+
<span class="assignation--date"><%= assignation_date(assignation) %></span>
|
21
|
+
</span>
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
<div class="card--list__annotation">
|
25
|
+
<%= clockify_seconds assignation.time_dedicated, padded: true %>
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
<% end %>
|
29
|
+
<% end %>
|
30
|
+
</div>
|
31
|
+
<% else %>
|
32
|
+
<div class="card--list__item">
|
33
|
+
<div class="card--list__text">
|
34
|
+
<%= t(".empty") %>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
<% end %>
|
38
|
+
</section>
|
39
|
+
</div>
|
40
|
+
|
41
|
+
<%= stylesheet_link_tag "decidim/time_tracker/time_tracker" %>
|
@@ -0,0 +1,43 @@
|
|
1
|
+
<div class="time-tracker-activity" id="activity-<%= activity.id %>"
|
2
|
+
data-activity-id="<%= activity.id %>"
|
3
|
+
data-start-endpoint="<%= start_endpoint(activity) %>"
|
4
|
+
data-stop-endpoint="<%= stop_endpoint(activity) %>"
|
5
|
+
data-text-counter-stopped="<%= t ".counter_stopped" %>"
|
6
|
+
data-elapsed-time="<%= activity.user_seconds_elapsed(current_user) %>"
|
7
|
+
data-counter-active="<%= activity.counter_active_for?(current_user) %>"
|
8
|
+
data-remaining-time="<%= activity.user_remaining_for_today(current_user) %>">
|
9
|
+
<div class="content">
|
10
|
+
<div class="left">
|
11
|
+
<h2><%= translated_attribute activity.description %></h2>
|
12
|
+
<span><%= t("activity.info", scope: "decidim.components.time_tracker.views") %></span>
|
13
|
+
<div class="elapsed-time"><%= t("activity.time_elapsed", scope: "decidim.components.time_tracker.views") %> <div class="elapsed-time-clock"><%= clockify_seconds(activity.user_seconds_elapsed(current_user)) %></div></div>
|
14
|
+
</div>
|
15
|
+
<div class="right">
|
16
|
+
<div class="top">
|
17
|
+
<% if activity.status != :open %>
|
18
|
+
<%= render partial: "callout_status", locals: { activity: activity } %>
|
19
|
+
<% else %>
|
20
|
+
<div class="tracker-buttons">
|
21
|
+
<button class="danger button time-tracker-activity-stop hide">
|
22
|
+
<%= icon("media-stop", class: "icon icon--large", aria_label: "stop", role: "img") %>
|
23
|
+
</button>
|
24
|
+
<button class="secondary button time-tracker-activity-pause hide">
|
25
|
+
<%= icon("media-pause", class: "icon icon--large", aria_label: "pause", role: "img") %>
|
26
|
+
</button>
|
27
|
+
<button class="success button time-tracker-activity-start">
|
28
|
+
<%= icon("media-play", class: "icon icon--large", aria_label: "play", role: "img") %>
|
29
|
+
</button>
|
30
|
+
</div>
|
31
|
+
<% end %>
|
32
|
+
</div>
|
33
|
+
<div class="bottom">
|
34
|
+
<% if activity.allow_answers_for?(current_user) %>
|
35
|
+
<%= render partial: "answer_questionnaire", locals: { activity: activity } %>
|
36
|
+
<% end %>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
<div class="callout alert hide"></div>
|
41
|
+
|
42
|
+
<%= render partial: "milestone_form", locals: { activity: activity } %>
|
43
|
+
</div>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<% if activity.answered_by? current_user %>
|
2
|
+
<%= t("questionnaire.answered", scope: "decidim.time_tracker.time_tracker.activity") %>
|
3
|
+
<% else %>
|
4
|
+
<%= link_to task_activity_form_path(task_id: activity.task, activity_id: activity, id: activity.questionnaire) do %>
|
5
|
+
<%= icon "comment-square" %> <%= t("questionnaire.respond", scope: "decidim.time_tracker.time_tracker.activity") %>
|
6
|
+
<% end %>
|
7
|
+
<% end %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="row column time-tracker--assignee-data">
|
2
|
+
<div class="callout announcement large primary">
|
3
|
+
<h4><%= t(".title") %></h4>
|
4
|
+
<p><%= t(".description") %></p>
|
5
|
+
<div class="time-tracker--start-button-wrapper">
|
6
|
+
<%= link_to t(".answer"), assignee_questionnaire_path, class: "button large time-tracker--start-button" %>
|
7
|
+
</div>
|
8
|
+
</div>
|
9
|
+
</div>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<div class="time-tracker-request" data-activity-id="<%= activity.id %>">
|
2
|
+
<div class="content">
|
3
|
+
<div class="left">
|
4
|
+
<h2><%= translated_attribute activity.description %></h2>
|
5
|
+
</div>
|
6
|
+
<div class="right">
|
7
|
+
<% if user_signed_in? %>
|
8
|
+
<div class="top">
|
9
|
+
<% if activity.status != :open %>
|
10
|
+
<%= render partial: "callout_status", locals: { activity: activity } %>
|
11
|
+
<% else %>
|
12
|
+
<% if activity.assignation_pending? current_user %>
|
13
|
+
<div class="callout warning"><%= t ".assignation_pending" %></div>
|
14
|
+
<% elsif activity.assignation_rejected? current_user %>
|
15
|
+
<div class="callout alert"><%= t ".assignation_rejected" %></div>
|
16
|
+
<% end %>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
19
|
+
<div class="bottom">
|
20
|
+
<% if activity.allow_answers_for?(current_user) %>
|
21
|
+
<%= render partial: "answer_questionnaire", locals: { activity: activity } %>
|
22
|
+
<% end %>
|
23
|
+
</div>
|
24
|
+
<% end %>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
</div>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<div class="row milestone hide">
|
2
|
+
<div class="column large-4 card-grid">
|
3
|
+
<h3 class="title">
|
4
|
+
<%= t("title", scope: "decidim.time_tracker.milestone_form") %>
|
5
|
+
</h3>
|
6
|
+
|
7
|
+
<div class="description">
|
8
|
+
<%= t("description", scope: "decidim.time_tracker.milestone_form") %>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
<div class="column large-8 card-grid">
|
12
|
+
|
13
|
+
<%= decidim_form_for(@form, url: milestones_path) do |form| %>
|
14
|
+
<%= form.text_field :title %>
|
15
|
+
<%= form.text_area :description %>
|
16
|
+
|
17
|
+
<%= form.hidden_field :activity_id, value: activity.id %>
|
18
|
+
|
19
|
+
<%= form.fields_for :attachment, @form.attachment do |nested_form| %>
|
20
|
+
<div class="field">
|
21
|
+
<%= nested_form.upload :file, optional: false %>
|
22
|
+
<% if @form.errors[:attachment].present? %>
|
23
|
+
<% @form.errors[:attachment].each do |message| %>
|
24
|
+
<small class="form-error is-visible">
|
25
|
+
<%= message %>
|
26
|
+
</small>
|
27
|
+
<% end %>
|
28
|
+
<% end %>
|
29
|
+
</div>
|
30
|
+
<% end %>
|
31
|
+
|
32
|
+
<%= form.submit t("button_submit", scope: "decidim.time_tracker.milestone_form") %>
|
33
|
+
<% end %>
|
34
|
+
</div>
|
35
|
+
</div>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<div class="time-tracker-request" data-activity-id="<%= activity.id %>">
|
2
|
+
<div class="content">
|
3
|
+
<div class="left">
|
4
|
+
<h2><%= translated_attribute activity.description %></h2>
|
5
|
+
</div>
|
6
|
+
<div class="right">
|
7
|
+
<% if user_signed_in? %>
|
8
|
+
<% if must_fill_in_data? %>
|
9
|
+
<div class="callout warning"><%== t ".assignee_questionnaire", path: assignee_questionnaire_path %></div>
|
10
|
+
<% elsif activity.assignation_pending? current_user %>
|
11
|
+
<div class="callout warning"><%= t ".assignation_pending" %></div>
|
12
|
+
<% elsif activity.assignation_rejected? current_user %>
|
13
|
+
<div class="callout warning"><%= t ".assignation_rejected" %></div>
|
14
|
+
<% else %>
|
15
|
+
<%= button_to requests_path(activity), method: :create, remote: true, data: { activity_id: activity.id }, class: "button large" do %>
|
16
|
+
<%= t("index.request", scope: "decidim.components.time_tracker.views") %>
|
17
|
+
<% end %>
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
</div>
|
@@ -0,0 +1,59 @@
|
|
1
|
+
<%= render partial: "decidim/shared/component_announcement" %>
|
2
|
+
|
3
|
+
<div class="row">
|
4
|
+
<div id="time_tracker" class="columns">
|
5
|
+
<% if activities_empty? %>
|
6
|
+
<div class="callout warning">
|
7
|
+
<%= t(".empty") %>
|
8
|
+
</div>
|
9
|
+
<% else %>
|
10
|
+
<% if !user_signed_in? %>
|
11
|
+
<%= render partial: "sign_in" %>
|
12
|
+
<% elsif must_fill_in_data? %>
|
13
|
+
<%= render partial: "assignee_data" %>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<div id="tasks">
|
17
|
+
<% tasks.each do |task| %>
|
18
|
+
<% next if task.activities.active.empty? %>
|
19
|
+
|
20
|
+
<h2 class="section-heading task-title"><%= translated_attribute task.name %></h2>
|
21
|
+
<div id="activities">
|
22
|
+
<% task.activities.active.each do |activity| %>
|
23
|
+
<div class="section">
|
24
|
+
<% if activity.assignation_accepted? current_user %>
|
25
|
+
<%= render partial: "activity", locals: { activity: activity } %>
|
26
|
+
<% elsif allowed_to? :create, :assignation, activity: activity %>
|
27
|
+
<%= render partial: "request_activity", locals: { activity: activity } %>
|
28
|
+
<% else %>
|
29
|
+
<%= render partial: "idle_activity", locals: { activity: activity } %>
|
30
|
+
<% end %>
|
31
|
+
|
32
|
+
<% milestones_for_activity = assignation_milestones(activity) %>
|
33
|
+
<% if milestones_for_activity.any? %>
|
34
|
+
<div class="section">
|
35
|
+
<div class="row columns large-12" data-toggle="milestones-collection-<%= activity.id %>">
|
36
|
+
<%= icon "caret-right", class: "icon--small" %>
|
37
|
+
<span class="show-milestones">
|
38
|
+
<%= t(".milestones_list") %>
|
39
|
+
<span>
|
40
|
+
</div>
|
41
|
+
|
42
|
+
<div id="milestones-collection-<%= activity.id %>" data-toggler=".hide" class="hide row small-up-1 medium-up-2 large-up-4 card-grid">
|
43
|
+
<% milestones_for_activity.each do |milestone| %>
|
44
|
+
<%= card_for milestone, type: :list %>
|
45
|
+
<% end %>
|
46
|
+
</div>
|
47
|
+
</div>
|
48
|
+
<% end %>
|
49
|
+
<% end %>
|
50
|
+
</div>
|
51
|
+
</div>
|
52
|
+
<% end %>
|
53
|
+
</div>
|
54
|
+
<% end %>
|
55
|
+
</div>
|
56
|
+
</div>
|
57
|
+
|
58
|
+
<%= stylesheet_link_tag "decidim/time_tracker/time_tracker" %>
|
59
|
+
<%= javascript_include_tag "decidim/time_tracker/time_tracker" %>
|