CQ fixes
Build and Push Docker Image / build-and-push (pull_request) Successful in 58s
Python Code Quality / python-code-quality (pull_request) Successful in 10s
Python Test / python-test (pull_request) Successful in 18s

This commit is contained in:
Brian Bjarke Jensen
2025-11-12 17:01:40 +01:00
parent 05560d766a
commit 80156c8909
8 changed files with 73 additions and 50 deletions
+2 -6
View File
@@ -63,12 +63,8 @@ def create_child(
@router.get("", response_model=list[ChildResponse]) @router.get("", response_model=list[ChildResponse])
def get_user_children( def get_user_children(
user_id: Annotated[int, Depends(verify_token)], user_id: Annotated[int, Depends(verify_token)],
child_repo: Annotated[ child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)],
ChildRepositoryInterface, Depends(get_child_repository) user_repo: Annotated[UserRepositoryInterface, Depends(get_user_repository)],
],
user_repo: Annotated[
UserRepositoryInterface, Depends(get_user_repository)
],
) -> list[ChildResponse]: ) -> list[ChildResponse]:
"""Get all children for the authenticated user.""" """Get all children for the authenticated user."""
children = child_repo.get_by_user_id(user_id) children = child_repo.get_by_user_id(user_id)
+8 -4
View File
@@ -321,7 +321,7 @@
if (response.ok) { if (response.ok) {
allChildren = await response.json(); allChildren = await response.json();
// Auto-select first child if no selection exists // Auto-select first child if no selection exists
if (selectedChildId === null && allChildren.length > 0) { if (selectedChildId === null && allChildren.length > 0) {
selectedChildId = allChildren[0].id; selectedChildId = allChildren[0].id;
@@ -371,7 +371,9 @@
content.innerHTML = ` content.innerHTML = `
<div class="controls"> <div class="controls">
${allChildren.length === 1 ? ` ${
allChildren.length === 1
? `
<label for="childDisplay">Child:</label> <label for="childDisplay">Child:</label>
<input <input
type="text" type="text"
@@ -380,12 +382,14 @@
readonly readonly
style="background-color: #f5f5f5; cursor: default; padding: 8px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;" style="background-color: #f5f5f5; cursor: default; padding: 8px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;"
/> />
` : ` `
: `
<label for="childFilter">Child:</label> <label for="childFilter">Child:</label>
<select id="childFilter" onchange="onChildChange(event)"> <select id="childFilter" onchange="onChildChange(event)">
${childOptions} ${childOptions}
</select> </select>
`} `
}
<label for="daysRange">Time Range:</label> <label for="daysRange">Time Range:</label>
<select id="daysRange" onchange="onDaysRangeChange(event)"> <select id="daysRange" onchange="onDaysRangeChange(event)">
+8 -4
View File
@@ -359,7 +359,7 @@
if (response.ok) { if (response.ok) {
allChildren = await response.json(); allChildren = await response.json();
// Auto-select first child if no selection exists // Auto-select first child if no selection exists
if (selectedChildId === null && allChildren.length > 0) { if (selectedChildId === null && allChildren.length > 0) {
selectedChildId = allChildren[0].id; selectedChildId = allChildren[0].id;
@@ -409,7 +409,9 @@
content.innerHTML = ` content.innerHTML = `
<div class="controls"> <div class="controls">
${allChildren.length === 1 ? ` ${
allChildren.length === 1
? `
<label for="childDisplay">Child:</label> <label for="childDisplay">Child:</label>
<input <input
type="text" type="text"
@@ -418,12 +420,14 @@
readonly readonly
style="background-color: #f5f5f5; cursor: default; padding: 8px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;" style="background-color: #f5f5f5; cursor: default; padding: 8px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;"
/> />
` : ` `
: `
<label for="childFilter">Child:</label> <label for="childFilter">Child:</label>
<select id="childFilter" onchange="onChildChange(event)"> <select id="childFilter" onchange="onChildChange(event)">
${childOptions} ${childOptions}
</select> </select>
`} `
}
<label for="daysRange">Time Range:</label> <label for="daysRange">Time Range:</label>
<select id="daysRange" onchange="onDaysRangeChange(event)"> <select id="daysRange" onchange="onDaysRangeChange(event)">
+4 -4
View File
@@ -252,11 +252,11 @@
// Determine return URL based on referrer // Determine return URL based on referrer
function getReturnUrl() { function getReturnUrl() {
const referrer = document.referrer; const referrer = document.referrer;
if (referrer.includes('/diapers.html')) { if (referrer.includes("/diapers.html")) {
return '/diapers.html'; return "/diapers.html";
} }
// Default to home page // Default to home page
return '/'; return "/";
} }
// Check if we're in edit mode // Check if we're in edit mode
@@ -305,7 +305,7 @@
`; `;
} else { } else {
// Multiple children: show dropdown (clear the placeholder first) // Multiple children: show dropdown (clear the placeholder first)
select.innerHTML = ''; select.innerHTML = "";
children.forEach((child) => { children.forEach((child) => {
const option = document.createElement("option"); const option = document.createElement("option");
option.value = child.id; option.value = child.id;
+4 -4
View File
@@ -209,11 +209,11 @@
// Determine return URL based on referrer // Determine return URL based on referrer
function getReturnUrl() { function getReturnUrl() {
const referrer = document.referrer; const referrer = document.referrer;
if (referrer.includes('/feedings.html')) { if (referrer.includes("/feedings.html")) {
return '/feedings.html'; return "/feedings.html";
} }
// Default to home page // Default to home page
return '/'; return "/";
} }
const form = document.getElementById("logFeedingForm"); const form = document.getElementById("logFeedingForm");
@@ -287,7 +287,7 @@
`; `;
} else { } else {
// Multiple children: show dropdown (clear placeholder first) // Multiple children: show dropdown (clear placeholder first)
childSelect.innerHTML = ''; childSelect.innerHTML = "";
children.forEach((child) => { children.forEach((child) => {
const option = document.createElement("option"); const option = document.createElement("option");
option.value = child.id; option.value = child.id;
+4 -4
View File
@@ -199,11 +199,11 @@
// Determine return URL based on referrer // Determine return URL based on referrer
function getReturnUrl() { function getReturnUrl() {
const referrer = document.referrer; const referrer = document.referrer;
if (referrer.includes('/sleep.html')) { if (referrer.includes("/sleep.html")) {
return '/sleep.html'; return "/sleep.html";
} }
// Default to home page // Default to home page
return '/'; return "/";
} }
const form = document.getElementById("logSleepForm"); const form = document.getElementById("logSleepForm");
@@ -277,7 +277,7 @@
`; `;
} else { } else {
// Multiple children: show dropdown (clear placeholder first) // Multiple children: show dropdown (clear placeholder first)
childSelect.innerHTML = ''; childSelect.innerHTML = "";
children.forEach((child) => { children.forEach((child) => {
const option = document.createElement("option"); const option = document.createElement("option");
option.value = child.id; option.value = child.id;
+41 -22
View File
@@ -168,7 +168,7 @@
.shared-badge { .shared-badge {
display: inline-block; display: inline-block;
background: #4CAF50; background: #4caf50;
color: white; color: white;
padding: 4px 10px; padding: 4px 10px;
border-radius: 12px; border-radius: 12px;
@@ -510,20 +510,30 @@
<div style="margin-bottom: 20px"> <div style="margin-bottom: 20px">
<h3 style="color: #333; margin-bottom: 10px" id="editChildName"></h3> <h3 style="color: #333; margin-bottom: 10px" id="editChildName"></h3>
<div style="color: #666; font-size: 14px"> <div style="color: #666; font-size: 14px">
<p><strong>Birth Date:</strong> <span id="editChildBirthDate"></span></p> <p>
<p><strong>Birth Weight:</strong> <span id="editChildBirthWeight"></span>g</p> <strong>Birth Date:</strong> <span id="editChildBirthDate"></span>
</p>
<p>
<strong>Birth Weight:</strong>
<span id="editChildBirthWeight"></span>g
</p>
</div> </div>
</div> </div>
<div id="sharedUsersSection" style="margin-bottom: 20px; display: none"> <div id="sharedUsersSection" style="margin-bottom: 20px; display: none">
<h3 style="color: #333; font-size: 16px; margin-bottom: 10px">👥 Shared With</h3> <h3 style="color: #333; font-size: 16px; margin-bottom: 10px">
<div id="sharedUsersList" style=" 👥 Shared With
background: #f8f9fa; </h3>
padding: 15px; <div
border-radius: 8px; id="sharedUsersList"
color: #666; style="
font-size: 14px; background: #f8f9fa;
"></div> padding: 15px;
border-radius: 8px;
color: #666;
font-size: 14px;
"
></div>
</div> </div>
<button <button
@@ -607,7 +617,7 @@
<div class="child-card"> <div class="child-card">
<div style="display: flex; align-items: center; gap: 10px;"> <div style="display: flex; align-items: center; gap: 10px;">
<h3 style="margin: 0;">👶 ${child.name}</h3> <h3 style="margin: 0;">👶 ${child.name}</h3>
${child.parent_count > 1 ? '<span class="shared-badge">Shared</span>' : ''} ${child.parent_count > 1 ? '<span class="shared-badge">Shared</span>' : ""}
</div> </div>
<div class="child-info"> <div class="child-info">
<p><strong>Birth Date:</strong> ${formatDate(child.birth_time)}</p> <p><strong>Birth Date:</strong> ${formatDate(child.birth_time)}</p>
@@ -644,23 +654,32 @@
if (!child) return; if (!child) return;
// Populate modal with child information // Populate modal with child information
document.getElementById("editChildName").textContent = `👶 ${child.name}`; document.getElementById("editChildName").textContent =
document.getElementById("editChildBirthDate").textContent = formatDate(child.birth_time); `👶 ${child.name}`;
document.getElementById("editChildBirthWeight").textContent = child.birth_weight; document.getElementById("editChildBirthDate").textContent = formatDate(
child.birth_time,
);
document.getElementById("editChildBirthWeight").textContent =
child.birth_weight;
// Show shared users if child is shared // Show shared users if child is shared
const sharedSection = document.getElementById("sharedUsersSection"); const sharedSection = document.getElementById("sharedUsersSection");
const sharedList = document.getElementById("sharedUsersList"); const sharedList = document.getElementById("sharedUsersList");
if (child.parent_usernames && child.parent_usernames.length > 1) { if (child.parent_usernames && child.parent_usernames.length > 1) {
// Filter out current user and show other users // Filter out current user and show other users
const otherUsers = child.parent_usernames.filter(username => username !== currentUser.username); const otherUsers = child.parent_usernames.filter(
(username) => username !== currentUser.username,
);
if (otherUsers.length > 0) { if (otherUsers.length > 0) {
sharedSection.style.display = "block"; sharedSection.style.display = "block";
sharedList.innerHTML = otherUsers.map(username => sharedList.innerHTML = otherUsers
`<div style="padding: 5px 0;">• ${username}</div>` .map(
).join(""); (username) =>
`<div style="padding: 5px 0;">• ${username}</div>`,
)
.join("");
} else { } else {
sharedSection.style.display = "none"; sharedSection.style.display = "none";
} }
+2 -2
View File
@@ -374,7 +374,7 @@
} }
// Populate child filter or show single child // Populate child filter or show single child
const childFilterContainer = document.querySelector('.controls'); const childFilterContainer = document.querySelector(".controls");
if (allChildren.length === 1) { if (allChildren.length === 1) {
// Single child: show as read-only text // Single child: show as read-only text
const child = allChildren[0]; const child = allChildren[0];
@@ -401,7 +401,7 @@
} else { } else {
// Multiple children: show dropdown // Multiple children: show dropdown
const childFilter = document.getElementById("childFilter"); const childFilter = document.getElementById("childFilter");
childFilter.innerHTML = ''; childFilter.innerHTML = "";
allChildren.forEach((child) => { allChildren.forEach((child) => {
const option = document.createElement("option"); const option = document.createElement("option");
option.value = child.id; option.value = child.id;