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,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,7 @@
1
+ <div class="row column">
2
+ <%= form.translated :text_field, :name, autofocus: true %>
3
+ </div>
4
+
5
+ <div class="button--double form-general-submit">
6
+ <%= form.submit submit %>
7
+ </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,3 @@
1
+ <div class="callout warning">
2
+ <%= t ".#{activity.status}", end_date: l(activity.end_date, format: :short), start_date: l(activity.start_date, format: :short) %>
3
+ </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,5 @@
1
+ <div class="row column">
2
+ <div class="callout warning">
3
+ <%= raw t("index.account_message", scope: "decidim.components.time_tracker.views", sign_in_url: "/users/sign_in", sign_up_url: "/users/sign_up") %>
4
+ </div>
5
+ </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" %>