From f2357865ea44baf21fe649d29e9a9ba713997efa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 13 Sep 2025 23:38:39 +0000 Subject: [PATCH 1/4] Initial plan From 6f7a2f7c6ccc6c8ea5a17bb12a55c46ac428ea7a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 13 Sep 2025 23:49:29 +0000 Subject: [PATCH 2/4] Implement copy feature for food log items Co-authored-by: RMCampos <2219519+RMCampos@users.noreply.github.com> --- src/index.ts | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++ style.css | 9 +++++++ 2 files changed, 84 insertions(+) diff --git a/src/index.ts b/src/index.ts index fbb2845..112cfbc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -251,6 +251,13 @@ function clearEditing() { showFoodPreview(false); getDivById('add-foot-title').innerHTML = 'Add Food Entry'; getButtonById('add-food-btn').innerHTML = 'Add Food'; + getButtonById('cancel-food-btn').style.display = 'none'; + + // Clear edit-specific hidden inputs + getInputById('foodIdToUpdate').value = ''; + getInputById('foodTimeToUpdate').value = ''; + getInputById('foodCaloriesToUpdate').value = ''; + selectedFood = null; } @@ -515,6 +522,7 @@ async function setFoodToEdit(foodId: string) { getDivById('add-foot-title').innerHTML = 'Edit Food Entry'; getButtonById('add-food-btn').innerHTML = 'Save Food'; + getButtonById('cancel-food-btn').style.display = 'inline-block'; getInputById('foodIdToUpdate').value = foodId; getInputById('foodTimeToUpdate').value = foodToEdit[0].time; getInputById('foodCaloriesToUpdate').value = foodToEdit[0].calories; @@ -537,6 +545,53 @@ async function setFoodToEdit(foodId: string) { } } +async function setFoodToCopy(foodId: string) { + showLoading(); + + try { + // get food item + const entries = await AppwriteDB.getFoodEntries(selectedDate); + const foodToCopy = entries.filter(entry => entry.$id === foodId); + if (foodToCopy.length === 0) { + swal('Hey!', 'Unable to get food entry from server', 'error'); + return; + } + + // set the selected food name and quantity (same as original) + const foodData: FoodItem = getFoodItemByName(foodToCopy[0].name); + selectedFood = foodData; + getInputById('foodSearchInput').value = foodToCopy[0].name; + getInputById('gramAmount').value = foodToCopy[0].grams; + previewCalories(foodData) + + // Set UI to copy mode (not edit mode) + getDivById('add-foot-title').innerHTML = 'Copy Food Entry'; + getButtonById('add-food-btn').innerHTML = 'Add Food'; + getButtonById('cancel-food-btn').style.display = 'inline-block'; + + // Clear edit-specific hidden inputs to ensure we're in add mode + getInputById('foodIdToUpdate').value = ''; + getInputById('foodTimeToUpdate').value = ''; + getInputById('foodCaloriesToUpdate').value = ''; + + // Scroll to top + const titleDiv = getDivById('add-foot-title') as HTMLElement; + if (titleDiv) { + titleDiv.scrollIntoView({ + behavior: 'smooth', + block: 'start' + }); + } + + hideLoading(); + } catch (error) { + console.error('Set food to copy error:', error); + swal('Oh no!', 'Failed to load food entry: ' + error.message, 'error'); + } finally { + hideLoading(); + } +} + function deleteCardHandler(e: Event) { e.preventDefault(); e.stopPropagation(); @@ -561,6 +616,18 @@ function editCardHandler(e: Event) { } } +function copyCardHandler(e: Event) { + e.preventDefault(); + e.stopPropagation(); + + const card = e.currentTarget as HTMLElement; + const foodId = card.getAttribute('data-food-id'); + + if (foodId) { + setFoodToCopy(foodId); + } +} + const setupEditAndDeleteEvents = () => { // Setup toggle show cards events const cards = getButtonListByClassName('card-header-toggle'); @@ -569,6 +636,13 @@ const setupEditAndDeleteEvents = () => { card.addEventListener('click', toggleCardHandler); }); + // Setup copy card events + const copyCards = getButtonListByClassName('btn-copy'); + Array.from(copyCards).forEach((card: HTMLElement) => { + card.removeEventListener('click', copyCardHandler); + card.addEventListener('click', copyCardHandler); + }); + // Setup delete card events const deleteCards = getButtonListByClassName('btn-delete'); Array.from(deleteCards).forEach((card: HTMLElement) => { @@ -992,6 +1066,7 @@ function addFoodToView(foodData: FoodStorage, documentId: string) {
${getIcon(foodFromDatabase.info.category)} ${foodFromDatabase.info.category}
+
diff --git a/style.css b/style.css index fd7ba5d..b8991e6 100644 --- a/style.css +++ b/style.css @@ -338,6 +338,15 @@ h1 { background: #4834d4; } +.btn-copy { + background: #2ed573; + color: white; +} + +.btn-copy:hover { + background: #1dd1a1; +} + .empty-state { text-align: center; padding: 60px 20px; From a2508fa9e37b13b12044a8869f60d9f43f33a95c Mon Sep 17 00:00:00 2001 From: Ricardo Campos Date: Wed, 17 Sep 2025 15:44:26 -0300 Subject: [PATCH 3/4] feat: remove icons from food type to free space --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 112cfbc..11a926b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1064,7 +1064,7 @@ function addFoodToView(foodData: FoodStorage, documentId: string) {
- ${getIcon(foodFromDatabase.info.category)} ${foodFromDatabase.info.category} + ${foodFromDatabase.info.category}
From b430a3886f2e0b2d7543f2e829378ef8c48830f7 Mon Sep 17 00:00:00 2001 From: Ricardo Campos Date: Wed, 17 Sep 2025 15:47:55 -0300 Subject: [PATCH 4/4] feat: add broto de feijao --- src/foodDatabase.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/foodDatabase.ts b/src/foodDatabase.ts index a2e4ed3..36cc323 100644 --- a/src/foodDatabase.ts +++ b/src/foodDatabase.ts @@ -122,4 +122,5 @@ export const foodDatabase: FoodItem[] = [ { name: 'Chuchu, cozido', info: { calories: 19, protein: 0.4, fat: 0, carbs: 4.9, fiber: 1.0, category: 'low carb', alkaline: true } }, { name: 'Cogumelo Paris, in natura', info: { calories: 17, protein: 4.9, fat: 0, carbs: 1, fiber: 1.7, category: 'low carb', alkaline: true } }, { name: 'Milho, verde, enlatado, drenado', info: { calories: 98, protein: 3.2, fat: 2.4, carbs: 17.1, fiber: 4.6, category: 'low carb', alkaline: true } }, + { name: 'Broto de Feijão', info: { calories: 23, protein: 2.8, fat: 0, carbs: 2.8, fiber: 0.7, category: 'low carb', alkaline: true } }, ];