decidim-time_tracker 0.3

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