summaryrefslogtreecommitdiff
path: root/app/views/targets/new.html.erb
blob: 42cb7bd92424d4d5aee28124055567125c82d60f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<% content_for :title, "Ajouter une Cible" %>

<h1 class="display-1">Ajouter une Cible</h1>

<%= form_with(model: @target) do |f| %>
    <div class="card shadow-sm">
	<div class="card-header">
		<%= f.text_field :name, class: "form-control", placeholder: "Nom de la cible" %>
	</div>

	<div class="card-body p-0">
	    <div class="table-responsive">
		<table class="table table-hover align-middle mb-0">
		    <thead class="table-light">
			<tr>
			    <th>Profil</th>
			    <th class="text-end" style="width: 180px;">Proportion</th>
			</tr>
		    </thead>
		    <tbody id="alloc-table-body">
			<%= f.fields_for :target_allocations do |af| %>
			    <% np = af.object.nutrient_profile %>
			    <tr>
				<td>
				    <%= af.hidden_field :nutrient_profile_id %>
				    <strong><%= np&.name.capitalize || "Profil ##{af.object.nutrient_profile_id}" %></strong>
				</td>
				<td class="text-end">
				    <div class="input-group input-group-sm" style="max-width: 160px; margin-left:auto;">
					<%= af.number_field :percentage,
					   in: 0..100, step: 0.5,
					   class: "form-control text-end alloc-input",
					   placeholder: "0.0",
					   data: { action: "input->alloc#sum" } %>
					<span class="input-group-text">%</span>
				    </div>
				</td>
			    </tr>
			<% end %>
		    </tbody>
		    <tfoot>
			<tr>
			    <td class="small text-muted">Ajustez chaque pourcentage pour totaliser 100%.</td>
			    <td class="text-end">
				<span class="badge bg-secondary" id="alloc-total">Total : 0%</span>
			    </td>
			</tr>
		    </tfoot>
		</table>
	    </div>
	</div>

	<div class="card-footer d-flex gap-2 justify-content-end">
	    <div class="btn-group">
		<%= f.submit "Enregistrer l’objectif", class: "btn btn-primary", id: "submit-btn" %>
		<%= link_to "Annuler", targets_path, class: "btn btn-secondary" %>
	    </div>
	</div>
    </div>
<% end %>

<script>
 // Lightweight client-side sum check (no Stimulus required).
 document.addEventListener("turbo:load", initAllocSum);
 document.addEventListener("DOMContentLoaded", initAllocSum);

 function initAllocSum() {
     const inputs = document.querySelectorAll(".alloc-input");
     const totalBadge = document.getElementById("alloc-total");
     const submitBtn = document.getElementById("submit-btn");
     if (!inputs.length || !totalBadge) return;

     function updateTotal() {
	 let sum = 0;
	 inputs.forEach(i => sum += parseFloat(i.value || "0"));
	 const rounded = Math.round(sum * 100) / 100;
	 totalBadge.textContent = `Total : ${rounded}%`;
	 totalBadge.className = "badge " + (Math.abs(rounded - 100) < 0.01 ? "bg-success" : "bg-danger");
	 if (submitBtn) submitBtn.disabled = !(Math.abs(rounded - 100) < 0.01);
     }

     inputs.forEach(i => i.addEventListener("input", updateTotal));
     updateTotal();
 }
</script>
Copyright 2019--2025 Marius PETER