Compare commits

..

No commits in common. "1974d44a35e72b7e4967ea1853b0b3851e85c885" and "6ef6930766f9576839beb2d69d5d42ba16e39302" have entirely different histories.

16 changed files with 398 additions and 252 deletions

View File

@ -2,40 +2,9 @@
namespace Lycoreco\Apps\Index\Controllers;
use Lycoreco\Apps\Recipes\Models\CategoryModel;
use Lycoreco\Apps\Recipes\Models\RecipeModel;
use Lycoreco\Apps\Recipes\Models\RecipeUserMenu;
use Lycoreco\Includes\BaseController;
require_once(INCLUDES_PATH . '/Const/recipes.php');
class HomepageController extends BaseController
{
protected $template_name = APPS_PATH . '/Index/Templates/index.php';
public function get_context_data() {
$context = parent::get_context_data();
$context['latest_recipes'] = RecipeModel::filter(array(
[
'name' => 'obj.status',
'type' => '=',
'value' => 'publish'
]),
['-obj.created_at'],
3
);
$context['categories'] = CategoryModel::filter();
$dayNumber = date("w");
$dayofweek = DAYS_OF_WEEK[$dayNumber];
if(CURRENT_USER) {
$context['usermenu_recipe_prefetch'] = RecipeUserMenu::get_prefetch_recipes(CURRENT_USER, $dayofweek);
}
else {
$context['usermenu_recipe_prefetch'] = [ ];
}
return $context;
}
}

View File

@ -1,6 +1,4 @@
<?php
require_once APPS_PATH . '/Recipes/components.php';
the_header(
<?php the_header(
'Welcome',
"Discover delicious recipes using the ingredients you already have. Fridgebites helps you create tasty meals with what's in your fridge",
'frontpage',
@ -34,21 +32,42 @@ the_header(
<!-- Additional required wrapper -->
<div class="swiper-wrapper">
<!-- Slides -->
<?php foreach($context['latest_recipes'] as $recipe): ?>
<div class="swiper-slide">
<a href="<?= $recipe->get_absolute_url() ?>" class="recent-recipe hover-anim">
<a href="#" class="recent-recipe hover-anim">
<div class="recipe-img">
<img src="<?= $recipe->get_image_url() ?>" alt="Recipe 1" class="recipe-img__img">
<img src="media/recipe1.png" alt="Recipe 1" class="recipe-img__img">
</div>
<div class="recipe-info">
<p class="recipe-info__title"><?= $recipe->field_title ?></p>
<p class="recipe-info__meta"><i class="fa-solid fa-user"></i> <?= $recipe->author_username ?></p>
<p class="recipe-info__title">Spaghetti Bolognese</p>
<p class="recipe-info__meta"><i class="fa-solid fa-user"></i> GreenDavid004</p>
</div>
</a>
</div>
<div class="swiper-slide">
<a href="#" class="recent-recipe hover-anim">
<div class="recipe-img">
<img src="media/recipe1.jpeg" alt="Recipe 1" class="recipe-img__img">
</div>
<div class="recipe-info">
<p class="recipe-info__title">Spaghetti Bolognese</p>
<p class="recipe-info__meta"><i class="fa-solid fa-user"></i> GreenDavid004</p>
</div>
</a>
</div>
<div class="swiper-slide">
<a href="#" class="recent-recipe hover-anim">
<div class="recipe-img">
<img src="media/recipe1.jpeg" alt="Recipe 1" class="recipe-img__img">
</div>
<div class="recipe-info">
<p class="recipe-info__title">Spaghetti Bolognese</p>
<p class="recipe-info__meta"><i class="fa-solid fa-user"></i> GreenDavid004</p>
</div>
</a>
</div>
<?php endforeach; ?>
</div>
<!-- If we need pagination -->
@ -67,14 +86,87 @@ the_header(
<div class="swiper categories-swiper">
<div class="swiper-wrapper">
<?php foreach($context['categories'] as $cat): ?>
<div class="swiper-slide">
<a href="<?= get_permalink('recipes:catalog') . '?category=' . $cat->get_id() ?>" class="category hover-anim">
<p class="category-title"><?= $cat->field_name ?></p>
<a href="#" class="category hover-anim">
<!-- <div class="category-img">
<img src="media/category1.png" alt="Category 1" class="category-img__img">
</div> -->
<p class="category-title">Mexican</p>
</a>
</div>
<div class="swiper-slide">
<a href="#" class="category hover-anim">
<!-- <div class="category-img">
<img src="media/category1.png" alt="Category 1" class="category-img__img">
</div> -->
<p class="category-title">Mexican</p>
</a>
</div>
<div class="swiper-slide">
<a href="#" class="category hover-anim">
<!-- <div class="category-img">
<img src="media/category1.png" alt="Category 1" class="category-img__img">
</div> -->
<p class="category-title">Mexican</p>
</a>
</div>
<div class="swiper-slide">
<a href="#" class="category hover-anim">
<!-- <div class="category-img">
<img src="media/category1.png" alt="Category 1" class="category-img__img">
</div> -->
<p class="category-title">Mexican</p>
</a>
</div>
<div class="swiper-slide">
<a href="#" class="category hover-anim">
<!-- <div class="category-img">
<img src="media/category1.png" alt="Category 1" class="category-img__img">
</div> -->
<p class="category-title">Mexican</p>
</a>
</div>
<div class="swiper-slide">
<a href="#" class="category hover-anim">
<!-- <div class="category-img">
<img src="media/category1.png" alt="Category 1" class="category-img__img">
</div> -->
<p class="category-title">Mexican</p>
</a>
</div>
<div class="swiper-slide">
<a href="#" class="category hover-anim">
<!-- <div class="category-img">
<img src="media/category1.png" alt="Category 1" class="category-img__img">
</div> -->
<p class="category-title">Mexican</p>
</a>
</div>
<div class="swiper-slide">
<a href="#" class="category hover-anim">
<!-- <div class="category-img">
<img src="media/category1.png" alt="Category 1" class="category-img__img">
</div> -->
<p class="category-title">Mexican</p>
</a>
</div>
<div class="swiper-slide">
<a href="#" class="category hover-anim">
<!-- <div class="category-img">
<img src="media/category1.png" alt="Category 1" class="category-img__img">
</div> -->
<p class="category-title">Mexican</p>
</a>
</div>
<?php endforeach; ?>
</div>
<div class="swiper-button-prev"></div>
@ -186,18 +278,137 @@ the_header(
</a>
</div>
</div>
<?php if(CURRENT_USER): ?>
<div class="daily-meals">
<h2 class="title">Your Menu for <?= date("l"); ?></h2>
<h2 class="title">Your Menu for Monday</h2>
<div class="daily-meals-grid">
<?php
foreach ($context['usermenu_recipe_prefetch'] as $recipe_pref) {
the_product_recipes_item($recipe_pref['origin'], $recipe_pref['relations']);
}
?>
<a href="#" class="daily-meal hover-anim">
<div class="meal-img">
<img src="media/recipe1.jpeg" alt="meal-img">
</div>
<div class="daily-meal-info">
<div class="daily-meal-title">
<h3>Goulash</h3>
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
</div>
<div class="daily-meal-ingredients">
<ul class="ingredients-list">
<li>Ground beef</li>
<li>Tomato sauce</li>
<li>Onion</li>
<li>Macaroni</li>
<li>Garlic</li>
<li>Cheese</li>
</ul>
</div>
</div>
</a>
<a href="#" class="daily-meal hover-anim">
<div class="meal-img">
<img src="media/recipe1.jpeg" alt="meal-img">
</div>
<div class="daily-meal-info">
<div class="daily-meal-title">
<h3>Goulash</h3>
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
</div>
<div class="daily-meal-ingredients">
<ul class="ingredients-list">
<li>Ground beef</li>
<li>Tomato sauce</li>
<li>Onion</li>
<li>Macaroni</li>
<li>Garlic</li>
<li>Cheese</li>
</ul>
</div>
</div>
</a>
<a href="#" class="daily-meal hover-anim">
<div class="meal-img">
<img src="media/recipe1.jpeg" alt="meal-img">
</div>
<div class="daily-meal-info">
<div class="daily-meal-title">
<h3>Goulash</h3>
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
</div>
<div class="daily-meal-ingredients">
<ul class="ingredients-list">
<li>Ground beef</li>
<li>Tomato sauce</li>
<li>Onion</li>
<li>Macaroni</li>
<li>Garlic</li>
<li>Cheese</li>
</ul>
</div>
</div>
</a>
<a href="#" class="daily-meal hover-anim">
<div class="meal-img">
<img src="media/recipe1.jpeg" alt="meal-img">
</div>
<div class="daily-meal-info">
<div class="daily-meal-title">
<h3>Goulash</h3>
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
</div>
<div class="daily-meal-ingredients">
<ul class="ingredients-list">
<li>Ground beef</li>
<li>Tomato sauce</li>
<li>Onion</li>
<li>Macaroni</li>
<li>Garlic</li>
<li>Cheese</li>
</ul>
</div>
</div>
</a>
<a href="#" class="daily-meal hover-anim">
<div class="meal-img">
<img src="media/recipe1.jpeg" alt="meal-img">
</div>
<div class="daily-meal-info">
<div class="daily-meal-title">
<h3>Goulash</h3>
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
</div>
<div class="daily-meal-ingredients">
<ul class="ingredients-list">
<li>Ground beef</li>
<li>Tomato sauce</li>
<li>Onion</li>
<li>Macaroni</li>
<li>Garlic</li>
<li>Cheese</li>
</ul>
</div>
</div>
</a>
<a href="#" class="daily-meal hover-anim">
<div class="meal-img">
<img src="media/recipe1.jpeg" alt="meal-img">
</div>
<div class="daily-meal-info">
<div class="daily-meal-title">
<h3>Goulash</h3>
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
</div>
<div class="daily-meal-ingredients">
<ul class="ingredients-list">
<li>Ground beef</li>
<li>Tomato sauce</li>
<li>Onion</li>
<li>Macaroni</li>
<li>Garlic</li>
<li>Cheese</li>
</ul>
</div>
</div>
</a>
</div>
</div>
<?php endif; ?>
</div>

View File

@ -9,7 +9,7 @@ use Lycoreco\Apps\Recipes\Models\{
};
use Lycoreco\Includes\BaseController;
define('CATALOG_MAX_RECIPES', 10);
define('CATALOG_MAX_RECIPES', 20);
class CatalogController extends BaseController
{
@ -45,12 +45,10 @@ class CatalogController extends BaseController
);
}
$context['recipes_count'] = RecipeModel::count($fields);
$context['recipes'] = RecipeModel::filter(
$fields,
['-obj.created_at'],
CATALOG_MAX_RECIPES,
offset: calc_page_offset(CATALOG_MAX_RECIPES, $context['page'])
CATALOG_MAX_RECIPES
);
return $context;

View File

@ -2,26 +2,12 @@
namespace Lycoreco\Apps\Recipes\Controllers;
use Lycoreco\Apps\Recipes\Models\RecipeUserMenu;
use Lycoreco\Includes\BaseController;
require_once(INCLUDES_PATH . '/Const/recipes.php');
class DailyMealsController extends BaseController
{
protected $template_name = APPS_PATH . '/Recipes/Templates/daily-meals.php';
protected $allow_role = 'user';
function get_context_data() {
$context = parent::get_context_data();
$context['weeks'] = array();
foreach (DAYS_OF_WEEK as $week) {
$context['weeks'][$week] = RecipeUserMenu::get_prefetch_recipes(CURRENT_USER, $week);
}
return $context;
}
}

View File

@ -2,48 +2,24 @@
namespace Lycoreco\Apps\Recipes\Controllers;
use Lycoreco\Apps\Recipes\Models\FavoriteModel;
use Lycoreco\Apps\Recipes\Models\RecipeModel;
use Lycoreco\Includes\BaseController;
define('FAVORITES_MAX_RECIPES', 500);
define('FAVORITES_MAX_RECIPES', 20);
class FavoritesController extends BaseController
{
protected $template_name = APPS_PATH . '/Recipes/Templates/favorites.php';
protected $allow_role = 'user';
public function get_context_data()
{
$context = parent::get_context_data();
$favorite_recipes = FavoriteModel::filter(array(
[
'name' => 'obj.user_id',
'type' => '=',
'value' => CURRENT_USER->get_id()
]
));
$fav_ids = array_map(function($recipe) {
return $recipe->field_recipe_id;
}, $favorite_recipes);
if(!empty($fav_ids)) {
$context['recipes'] = RecipeModel::filter(
array(
[
'name' => 'obj.id',
'type' => 'IN',
'value' => $fav_ids
]
),
[],
['-obj.created_at'],
FAVORITES_MAX_RECIPES
);
}
else {
$context['recipes'] = [];
}
return $context;
}

View File

@ -16,9 +16,7 @@ class RecipeModel extends BaseModel
public $field_created_at;
public $category_name;
public $author_username;
public $is_in_favorite = 0;
public $in_usermenu = false;
const STATUS = [['publish', 'Publish'], ['pending', 'Pending']];
@ -32,12 +30,6 @@ class RecipeModel extends BaseModel
],
'join_table' => 'categories tb1 ON tb1.id = obj.category_id'
],
[
'field' => [
'us.username AS author_username'
],
'join_table' => 'users us ON us.id = obj.author_id'
],
[
'field' => [
@ -71,16 +63,6 @@ class RecipeModel extends BaseModel
]
));
}
if(CURRENT_USER) {
$add_fields = array_merge($add_fields, array(
[
"field" => [
"MAX(m.dayofweek) AS in_usermenu"
],
"join_table" => "recipe_usermenu m ON m.recipe_id = obj.id AND m.user_id = " . CURRENT_USER->get_id()
]
));
}
return $add_fields;
}

View File

@ -2,7 +2,6 @@
namespace Lycoreco\Apps\Recipes\Models;
use Lycoreco\Apps\Users\Models\UserModel;
use Lycoreco\Includes\Model\BaseModel;
class RecipeUserMenu extends BaseModel
@ -55,39 +54,4 @@ class RecipeUserMenu extends BaseModel
return true;
}
public static function get_prefetch_recipes(UserModel $user, string $week) {
$usermenus = RecipeUserMenu::filter(array(
[
'name' => 'obj.user_id',
'type' => '=',
'value' => $user->get_id(),
],
[
'name' => 'obj.dayofweek',
'type' => '=',
'value' => $week
]
), count: 100);
if(empty($usermenus))
return [];
$usermenu_ids = array_map(function($usermenu) {
return $usermenu->field_recipe_id;
}, $usermenus);
$recipes = RecipeModel::filter(array(
[
'name' => 'obj.id',
'type' => 'IN',
'value' => $usermenu_ids
]
));
$prefetch_recipes_ings = prefetch_related($recipes, 'Recipes:IngredientInRecipeModel', 'recipe_id');
return $prefetch_recipes_ings;
}
}

View File

@ -13,7 +13,6 @@ the_header(
?>
<div class="container">
<div class="catalog">
<div class="catalog-items__inner">
<div class="catalog-items">
<?php
foreach ($context['recipes'] as $recipe) {
@ -21,8 +20,6 @@ the_header(
}
?>
</div>
<?php the_pagination($context['recipes_count'], CATALOG_MAX_RECIPES, $context["page"]); ?>
</div>
<div class="filters-container">
<div class="filters">
<div class="filters-inner">

View File

@ -1,18 +0,0 @@
<a href="<?= $recipe->get_absolute_url() ?>" class="daily-meal hover-anim">
<div class="meal-img">
<img src="<?= $recipe->get_image_url() ?>" alt="meal-img">
</div>
<div class="daily-meal-info">
<div class="daily-meal-title">
<h3><?= $recipe->field_title ?></h3>
<span class="meta"><i class="fa-regular fa-clock"></i><?= $recipe->field_estimated_time ?>mins to make</span>
</div>
<div class="daily-meal-ingredients">
<ul class="ingredients-list">
<?php for ($i=0; $i < count($ingredients) && $i <= 6; $i++): ?>
<li><?= $ingredients[$i]->ingredient_name ?></li>
<?php endfor; ?>
</ul>
</div>
</div>
</a>

View File

@ -1,5 +1,4 @@
<?php
require_once APPS_PATH . '/Recipes/components.php';
require_once(INCLUDES_PATH . '/Const/recipes.php');
the_header(
@ -15,17 +14,137 @@ the_header(
<div class="container">
<div class="daily-recipes">
<?php
foreach ($context['weeks'] as $day => $recipe_prefetches) {
foreach (DAYS_OF_WEEK as $day) {
?>
<div class="daily-meals">
<h2 class="title">Your Menu for <?= ucfirst($day) ?></h2>
<div class="daily-meals-grid">
<?php
foreach ($recipe_prefetches as $recipe_pref) {
the_product_recipes_item($recipe_pref['origin'], $recipe_pref['relations']);
}
?>
<a href="#" class="daily-meal hover-anim">
<div class="meal-img">
<img src="media/recipe1.jpeg" alt="meal-img">
</div>
<div class="daily-meal-info">
<div class="daily-meal-title">
<h3>Goulash</h3>
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
</div>
<div class="daily-meal-ingredients">
<ul class="ingredients-list">
<li>Ground beef</li>
<li>Tomato sauce</li>
<li>Onion</li>
<li>Macaroni</li>
<li>Garlic</li>
<li>Cheese</li>
</ul>
</div>
</div>
</a>
<a href="#" class="daily-meal hover-anim">
<div class="meal-img">
<img src="media/recipe1.jpeg" alt="meal-img">
</div>
<div class="daily-meal-info">
<div class="daily-meal-title">
<h3>Goulash</h3>
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
</div>
<div class="daily-meal-ingredients">
<ul class="ingredients-list">
<li>Ground beef</li>
<li>Tomato sauce</li>
<li>Onion</li>
<li>Macaroni</li>
<li>Garlic</li>
<li>Cheese</li>
</ul>
</div>
</div>
</a>
<a href="#" class="daily-meal hover-anim">
<div class="meal-img">
<img src="media/recipe1.jpeg" alt="meal-img">
</div>
<div class="daily-meal-info">
<div class="daily-meal-title">
<h3>Goulash</h3>
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
</div>
<div class="daily-meal-ingredients">
<ul class="ingredients-list">
<li>Ground beef</li>
<li>Tomato sauce</li>
<li>Onion</li>
<li>Macaroni</li>
<li>Garlic</li>
<li>Cheese</li>
</ul>
</div>
</div>
</a>
<a href="#" class="daily-meal hover-anim">
<div class="meal-img">
<img src="media/recipe1.jpeg" alt="meal-img">
</div>
<div class="daily-meal-info">
<div class="daily-meal-title">
<h3>Goulash</h3>
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
</div>
<div class="daily-meal-ingredients">
<ul class="ingredients-list">
<li>Ground beef</li>
<li>Tomato sauce</li>
<li>Onion</li>
<li>Macaroni</li>
<li>Garlic</li>
<li>Cheese</li>
</ul>
</div>
</div>
</a>
<a href="#" class="daily-meal hover-anim">
<div class="meal-img">
<img src="media/recipe1.jpeg" alt="meal-img">
</div>
<div class="daily-meal-info">
<div class="daily-meal-title">
<h3>Goulash</h3>
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
</div>
<div class="daily-meal-ingredients">
<ul class="ingredients-list">
<li>Ground beef</li>
<li>Tomato sauce</li>
<li>Onion</li>
<li>Macaroni</li>
<li>Garlic</li>
<li>Cheese</li>
</ul>
</div>
</div>
</a>
<a href="#" class="daily-meal hover-anim">
<div class="meal-img">
<img src="media/recipe1.jpeg" alt="meal-img">
</div>
<div class="daily-meal-info">
<div class="daily-meal-title">
<h3>Goulash</h3>
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
</div>
<div class="daily-meal-ingredients">
<ul class="ingredients-list">
<li>Ground beef</li>
<li>Tomato sauce</li>
<li>Onion</li>
<li>Macaroni</li>
<li>Garlic</li>
<li>Cheese</li>
</ul>
</div>
</div>
</a>
</div>
</div>
<?php

View File

@ -13,21 +13,16 @@ the_header(
<div class="container">
<div class="favorites">
<?php if(!empty($context['recipes'])): ?>
<div class="favorites-items">
<?php
for( $i = 0; $i < 5; $i++) {
foreach ($context['recipes'] as $recipe) {
the_product_item($recipe);
}
}
?>
</div>
<?php else: ?>
<div class="nothing">
Nothing to show
</div>
<?php endif; ?>
</div>
</div>

View File

@ -12,7 +12,6 @@ the_header(
?>
<div id="recipe-id" hidden><?= $context['recipe']->get_id() ?></div>
<div id="in-usermenu" hidden><?= $context['recipe']->in_usermenu; ?></div>
<div class="container">
<div class="single-recipe">

View File

@ -6,7 +6,3 @@ function the_product_item(RecipeModel $recipe)
{
include APPS_PATH . '/Recipes/Templates/components/catalog-item.php';
}
function the_product_recipes_item(RecipeModel $recipe, array $ingredients)
{
include APPS_PATH . '/Recipes/Templates/components/recipe-ings-item.php';
}

View File

@ -15,41 +15,13 @@ document.addEventListener('click', (e) => {
const options = document.querySelectorAll('.dropdown-item');
const inUsermenu = document.getElementById('in-usermenu').textContent;
if (inUsermenu) {
options.forEach(option => {
if (option.getAttribute('data-value') === inUsermenu && option.getAttribute('data-value') !== 'remove') {
option.classList.add('dropdown-selected');
toggleBtn.textContent = option.textContent;
}
});
}
options.forEach(option => {
option.addEventListener('click', async (e) => {
option.addEventListener('click', () => {
const selectedValue = option.getAttribute('data-value');
options.forEach(opt => opt.classList.remove('dropdown-selected'));
const formData = new FormData();
formData.append('action', 'usermenu');
formData.append('recipe_id', recipeId);
formData.append('dayofweek', selectedValue);
const response = await fetch('/ajax', {
method: 'POST',
body: formData
});
const json = await response.json();
if (!response.ok) {
const message = json.error;
showToastify(message, 'error');
return;
}
if (selectedValue === 'remove') {
toggleBtn.textContent = 'Add to list';
} else {
@ -59,7 +31,7 @@ options.forEach(option => {
dropdown.classList.add('hidden');
showToastify(json.success, 'success');
alert(`You selected: ${selectedValue}`);
});
});

View File

@ -133,13 +133,13 @@ function the_pagination(int $count, int $elem_per_page, int $current_page)
continue;
$GET['page'] = $i;
?>
<li><a class="btn btn-secondary" href="<?php the_GET_request($GET) ?>"><?php echo $i ?></a></li>
<li><a class="btn page-btn" href="<?php the_GET_request($GET) ?>"><?php echo $i ?></a></li>
<?php endfor; ?>
<!-- Current page -->
<?php if ($current_page > 0 && $current_page <= $total_pages): ?>
<li>
<div class="btn btn-primary"><?php echo $current_page ?></div>
<div class="btn active page-btn"><?php echo $current_page ?></div>
</li>
<?php endif ?>
@ -147,7 +147,7 @@ function the_pagination(int $count, int $elem_per_page, int $current_page)
<?php for ($i = $current_page + 1; $i <= $total_pages && $i <= $current_page + 2; $i++):
$GET['page'] = $i;
?>
<li><a class="btn btn-secondary" href="<?php the_GET_request($GET) ?>"><?php echo $i ?></a></li>
<li><a class="btn page-btn" href="<?php the_GET_request($GET) ?>"><?php echo $i ?></a></li>
<?php endfor; ?>
</ul>
</nav>

View File

@ -1,5 +1,5 @@
<?php
define('DAYS_OF_WEEK', array(
1 => 'monday', 2 => 'tuesday', 3 => 'wednesday', 4 => 'thursday', 5 => 'friday', 6 => 'saturday', 0 => 'sunday'
'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'
));