Skip to content

Commit 7d39de3

Browse files
committed
Added ability to edit cattle
1 parent fd064ad commit 7d39de3

File tree

5 files changed

+167
-5
lines changed

5 files changed

+167
-5
lines changed

src/controllers/CattleController.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,19 @@ export class CattleController {
3131
'Brahman'
3232
];
3333
}
34+
35+
updateCattle(id, updates) {
36+
for (let i = 0; i < this.cattle.length; i++) {
37+
if (this.cattle[i].id === id) {
38+
this.cattle[i].status = updates.status;
39+
}
40+
}
41+
42+
const index = this.cattle.findIndex(cow => cow.id === id);
43+
if (index === -1) {
44+
throw new Error('Cattle not found');
45+
}
46+
const cattle = this.cattle[index];
47+
return cattle;
48+
}
3449
}

src/views/CattleCard.css

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,91 @@
6060
color: #cc6600;
6161
}
6262

63+
.status-section {
64+
display: flex;
65+
align-items: center;
66+
gap: 1rem;
67+
margin-top: 0.5rem;
68+
}
69+
70+
.edit-status-button {
71+
background-color: #4CAF50;
72+
color: white;
73+
border: none;
74+
padding: 0.25rem 0.5rem;
75+
border-radius: 4px;
76+
cursor: pointer;
77+
font-size: 0.8rem;
78+
transition: background-color 0.3s ease;
79+
}
80+
81+
.edit-status-button:hover {
82+
background-color: #45a049;
83+
}
84+
85+
.edit-status-form {
86+
margin-top: 1rem;
87+
padding: 1rem;
88+
background-color: #f5f5f5;
89+
border-radius: 4px;
90+
}
91+
92+
.edit-status-form h3 {
93+
margin: 0 0 1rem 0;
94+
font-size: 1rem;
95+
color: #333;
96+
}
97+
98+
.edit-status-form .form-group {
99+
margin-bottom: 1rem;
100+
}
101+
102+
.edit-status-form label {
103+
display: block;
104+
margin-bottom: 0.5rem;
105+
color: #666;
106+
}
107+
108+
.edit-status-form select {
109+
width: 100%;
110+
padding: 0.5rem;
111+
border: 1px solid #ddd;
112+
border-radius: 4px;
113+
background-color: white;
114+
}
115+
116+
.edit-status-form .form-actions {
117+
display: flex;
118+
gap: 0.5rem;
119+
}
120+
121+
.edit-status-form .submit-button,
122+
.edit-status-form .cancel-button {
123+
padding: 0.5rem 1rem;
124+
border: none;
125+
border-radius: 4px;
126+
cursor: pointer;
127+
font-size: 0.9rem;
128+
}
129+
130+
.edit-status-form .submit-button {
131+
background-color: #4CAF50;
132+
color: #FFF;
133+
}
134+
135+
.edit-status-form .cancel-button {
136+
background-color: #f44336;
137+
color: white;
138+
}
139+
140+
.edit-status-form .submit-button:hover {
141+
background-color: #45a049;
142+
}
143+
144+
.edit-status-form .cancel-button:hover {
145+
background-color: #da190b;
146+
}
147+
63148
.pregnancy-status {
64149
padding: 0.25rem 0.5rem;
65150
border-radius: 4px;

src/views/CattleCard.jsx

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
import React, { useState } from 'react';
2+
import { EditStatusForm } from './EditStatusForm';
23
import './CattleCard.css';
34

4-
export function CattleCard({ cattle }) {
5+
export function CattleCard({ cattle, onStatusUpdate }) {
56
const [imageError, setImageError] = useState(false);
7+
const [showEditForm, setShowEditForm] = useState(false);
8+
9+
const handleStatusUpdate = (updates) => {
10+
onStatusUpdate(cattle.id, updates);
11+
setShowEditForm(false);
12+
};
613

714
return (
815
<div className="cattle-card">
@@ -33,9 +40,24 @@ export function CattleCard({ cattle }) {
3340
)}
3441
</p>
3542
)}
36-
<p className={`status ${cattle.getStatusClass()}`}>
37-
Status: {cattle.status}
38-
</p>
43+
<div className="status-section">
44+
<p className={`status ${cattle.getStatusClass()}`}>
45+
Status: {cattle.status}
46+
</p>
47+
<button
48+
className="edit-status-button"
49+
onClick={() => setShowEditForm(true)}
50+
>
51+
Edit Status
52+
</button>
53+
</div>
54+
{showEditForm && (
55+
<EditStatusForm
56+
cattle={cattle}
57+
onSubmit={handleStatusUpdate}
58+
onCancel={() => setShowEditForm(false)}
59+
/>
60+
)}
3961
</div>
4062
);
4163
}

src/views/CattleList.jsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@ function CattleList({ cattle = [], controller, onCattleUpdate }) {
1515
setShowAddForm(false)
1616
}
1717

18+
let handleStatusUpdate = (id, updates) => {
19+
let updatedCow = controller.updateCattle(id, updates)
20+
onCattleUpdate(cattle.map(
21+
cow =>
22+
cow.id === id ? updatedCow : cow
23+
))
24+
}
25+
1826
const handleLocationChange = (location) => {
1927
setCurrentLocation(location)
2028
}
@@ -55,7 +63,11 @@ function CattleList({ cattle = [], controller, onCattleUpdate }) {
5563

5664
<div className="cattle-grid">
5765
{(filteredCattle || []).map((cow) => (
58-
<CattleCard key={cow.id} cattle={cow} />
66+
<CattleCard
67+
key={cow.id}
68+
cattle={cow}
69+
onStatusUpdate={handleStatusUpdate}
70+
/>
5971
))}
6072
</div>
6173
</div>

src/views/EditStatusForm.jsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import React from 'react';
2+
3+
export function EditStatusForm({ cattle, onSubmit, onCancel }) {
4+
const handleSubmit = (e) => {
5+
e.preventDefault();
6+
const formData = new FormData(e.target);
7+
onSubmit({
8+
status: formData.get('status')
9+
});
10+
};
11+
12+
return (
13+
<form onSubmit={handleSubmit} className="edit-status-form">
14+
<h3>Edit Status</h3>
15+
<div className="form-group">
16+
<label htmlFor="status">Status:</label>
17+
<select id="status" name="status" required defaultValue={cattle.status}>
18+
<option value="Healthy">Healthy</option>
19+
<option value="Vet Check Needed">Vet Check Needed</option>
20+
</select>
21+
</div>
22+
<div className="form-actions">
23+
<button type="submit" className="submit-button">Save Status</button>
24+
<button type="button" onClick={onCancel} className="cancel-button">Cancel</button>
25+
</div>
26+
</form>
27+
);
28+
}

0 commit comments

Comments
 (0)