This commit is contained in:
Ludovic CANDELLIER
2022-04-13 23:49:48 +02:00
parent 8afb3467f8
commit 2f77b5fc23
56 changed files with 948 additions and 336 deletions

View File

@@ -0,0 +1,69 @@
<?php
namespace App\Http\Controllers\Admin\Shop;
use Illuminate\Http\Request;
use App\Repositories\Shop\Merchandises;
use App\Repositories\Shop\TagGroups;
use App\Datatables\Shop\MerchandisesDataTable;
use App\Models\Shop\Merchandise;
class MerchandiseController extends Controller
{
public function index(MerchandisesDataTable $dataTable)
{
return $dataTable->render('Admin.Shop.Merchandises.list');
}
public function create()
{
$data['tags_list'] = TagGroups::getTreeTags();
return view('Admin.Shop.Merchandises.create', $data);
}
public function store(Request $request)
{
$data = $request->all();
Merchandises::storeFull($data);
return redirect()->route('Admin.Shop.Merchandises.index');
}
public function show($id)
{
return view('Admin.Shop.Merchandises.view', Merchandises::get($id));
}
public function edit($id)
{
$data['merchandise'] = Merchandises::getFull($id);
$data['tags_list'] = TagGroups::getTreeTags();
return view('Admin.Shop.Merchandises.edit', $data);
}
public function destroy($id)
{
return Merchandises::destroy($id);
}
public function getImages(Request $request, $id = false, $can_edit = true)
{
$id = $id ? $id : $request->input('id');
$data['images'] = Merchandises::getImages($id);
$data['can_edit'] = $can_edit;
return view('components.uploader.mini-gallery-items', $data);
}
public function deleteImage(Request $request)
{
$id = $request->input('id');
$index = $request->input('index');
return Merchandises::deleteImage($id, $index);
}
public function exportExcel()
{
return Merchandises::exportExcel();
}
}

View File

@@ -6,8 +6,6 @@ use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Repositories\Layout;
use Carbon\Carbon;
class LoginController extends Controller class LoginController extends Controller
{ {
@@ -22,25 +20,11 @@ class LoginController extends Controller
public function showLoginForm() public function showLoginForm()
{ {
$data = \App\Repositories\Config::init(); return view('Shop.auth.login', $data);
return view('auth.login', $data);
} }
public function authenticated(Request $request, $user) public function authenticated(Request $request, $user)
{ {
$request->session()->forget('password_expired_id');
if ($user->passwordSecurity->password_expiry_days > 0) {
$password_updated_at = $user->passwordSecurity->password_updated_at;
$password_expiry_days = $user->passwordSecurity->password_expiry_days;
$password_expiry_at = Carbon::parse($password_updated_at)->addDays($password_expiry_days);
if ($password_expiry_at->lessThan(Carbon::now())) {
$request->session()->put('password_expired_id', $user->id);
auth()->logout();
return redirect('/reset-password')->with('message', "Your password is expired. You need to change your password.");
}
}
return redirect()->intended($this->redirectPath()); return redirect()->intended($this->redirectPath());
} }

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Http\Controllers\Shop\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Contracts\View\View;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
class ForgotPasswordController extends Controller
{
use SendsPasswordResetEmails;
/**
* Get password request form view.
*
* @return Application|Factory|View
*/
public function showLinkRequestForm()
{
return view('boilerplate::auth.passwords.email');
}
}

View File

@@ -40,49 +40,43 @@ class LoginController extends Controller
*/ */
public function __construct() public function __construct()
{ {
$this->middleware('customer')->except('logout'); // $this->middleware('guest')->except('logout');
} }
public function showLoginForm() public function showLoginForm()
{ {
$data['url'] = route('Shop.Auth.login.post'); $data['url'] = route('Shop.login.post');
return view('Shop.Auth.login', $data); return view('Shop.auth.login', $data);
} }
protected function guard() protected function guard()
{ {
return Auth::guard('customer'); return Auth::guard('guest');
} }
public function login(Request $request) public function login(Request $request)
{ {
$this->validate($request, [ $this->validate($request, [
'username' => 'required|email', 'username' => 'required|email',
'password' => 'required|min:6' 'password' => 'required|min:8'
]); ]);
if (Auth::guard('customer')->attempt(['username' => $request->username, 'password' => $request->password], $request->get('remember'))) { if (Auth::guard('guest')->attempt(['username' => $request->username, 'password' => $request->password], $request->get('remember'))) {
return redirect()->intended(route('Conferencing.event')); return redirect()->intended(route('home'));
} }
return back()->withInput($request->only('username', 'remember')); return back()->withInput($request->only('username', 'remember'));
} }
public function logout(Request $request) public function logout(Request $request)
{ {
// Get the session key for this user
$sessionKey = $this->guard()->getName(); $sessionKey = $this->guard()->getName();
$this->guard()->logout(); $this->guard()->logout();
// Delete single session key (just for this user)
$request->session()->forget($sessionKey); $request->session()->forget($sessionKey);
return redirect()->route('home'); return redirect()->route('home');
} }
public function username() public function username()
{ {
return 'username'; return 'email';
} }
} }

View File

@@ -0,0 +1,161 @@
<?php
namespace App\Http\Controllers\Shop\Auth;
use App\Http\Controllers\Controller;
use Carbon\Carbon;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Contracts\View\View;
use Illuminate\Foundation\Auth\EmailVerificationRequest;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use Sebastienheyd\Boilerplate\Rules\Password;
class RegisterController extends Controller
{
use RegistersUsers;
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo;
/**
* Is registering the first user ?
*
* @var bool
*/
protected $firstUser;
/**
* Create a new controller instance.
*/
public function __construct()
{
$userModel = config('auth.providers.users.model');
$this->firstUser = $userModel::whereRoleIs('admin')->count() === 0;
}
/**
* Return route where to redirect after login success.
*
* @return string
*/
protected function redirectTo()
{
return route(config('boilerplate.app.redirectTo', 'boilerplate.dashboard'));
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'last_name' => 'required|max:255',
'first_name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users,email,NULL,id,deleted_at,NULL',
'password' => ['required', 'confirmed', new Password()],
]);
}
/**
* Show the application registration form.
*
* @return Application|Factory|View
*/
public function showRegistrationForm()
{
if (! $this->firstUser && ! config('boilerplate.auth.register')) {
abort('404');
}
return view('boilerplate::auth.register', ['firstUser' => $this->firstUser]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return mixed
*/
protected function create(array $data)
{
if (! $this->firstUser && ! config('boilerplate.auth.register')) {
abort('404');
}
$userModel = config('auth.providers.users.model');
$roleModel = config('laratrust.models.role');
$user = $userModel::withTrashed()->updateOrCreate(['email' => $data['email']], [
'active' => true,
'first_name' => $data['first_name'],
'last_name' => $data['last_name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'last_login' => Carbon::now()->toDateTimeString(),
]);
if ($this->firstUser) {
$admin = $roleModel::whereName('admin')->first();
$user->attachRole($admin);
} else {
$user->restore();
$role = $roleModel::whereName(config('boilerplate.auth.register_role'))->first();
$user->roles()->sync([$role->id]);
}
return $user;
}
/**
* Show message to verify e-mail.
*
* @return Application|Factory|View
*/
public function emailVerify()
{
if (Auth::user()->hasVerifiedEmail()) {
return redirect(route(config('boilerplate.app.redirectTo', 'boilerplate.dashboard')));
}
return view('boilerplate::auth.verify-email');
}
/**
* If e-mail has been verified, redirect to the given route.
*
* @param EmailVerificationRequest $request
* @return Application|RedirectResponse|Redirector
*/
public function emailVerifyRequest(EmailVerificationRequest $request)
{
$request->fulfill();
return redirect(route(config('boilerplate.app.redirectTo', 'boilerplate.dashboard')));
}
/**
* Send verification e-mail.
*
* @param Request $request
* @return RedirectResponse
*/
public function emailSendVerification(Request $request)
{
$request->user()->sendEmailVerificationNotification();
return back()->with('message', 'Verification link sent!');
}
}

View File

@@ -7,6 +7,8 @@ use App\Http\Controllers\Controller;
use App\Repositories\Core\User\ShopCart; use App\Repositories\Core\User\ShopCart;
use App\Repositories\Shop\Offers; use App\Repositories\Shop\Offers;
use App\Repositories\Shop\Orders;
class BasketController extends Controller class BasketController extends Controller
{ {
@@ -52,6 +54,12 @@ class BasketController extends Controller
return ShopCart::count(); return ShopCart::count();
} }
public function getSummary()
{
$data = ShopCart::getSummary();
return response()->json(['data' => $data, 'code' => '200']);
}
public function order(Request $request) public function order(Request $request)
{ {
ShopCart::clear(); ShopCart::clear();
@@ -60,8 +68,6 @@ class BasketController extends Controller
$data['user_id'] = Users::getId(); $data['user_id'] = Users::getId();
Orders::newOrder($data); Orders::newOrder($data);
return response()->json(['code' => '200']); return response()->json(['code' => '200']);
// return redirect()->route('ThirdParty.select');
} }
public function clearBasket() public function clearBasket()

View File

@@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers\Commercial;
use App\Http\Controllers\Controller as ParentController;
class Controller extends ParentController
{
public function __construct()
{
// $this->middleware('auth:guest');
}
}

View File

@@ -6,19 +6,11 @@ use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Repositories\Shop\Articles; use App\Repositories\Shop\Articles;
use App\Repositories\Shop\Categories;
use App\Repositories\Shop\Offers;
use App\Repositories\Shop\Tags;
use App\Repositories\Shop\TagGroups; use App\Repositories\Shop\TagGroups;
use App\Repositories\Shop\Homepages; use App\Repositories\Shop\Homepages;
class HomeController extends Controller class HomeController extends Controller
{ {
public function __construct()
{
// $this->middleware('auth');
}
public function index(Request $request) public function index(Request $request)
{ {
$input = $request->input(); $input = $request->input();

View File

@@ -9,18 +9,24 @@ class Botanic
{ {
public function make(Builder $menu) public function make(Builder $menu)
{ {
$menu->add('Botanique', [ 'permission' => 'backend_access', 'icon' => 'leaf' ]) $menu->add('Botanique', ['icon' => 'leaf' ])
->id('botanic') ->id('botanic')
->activeIfRoute('botanic')
->order(5); ->order(5);
$menu->addTo('botanic', 'Familles', [ 'route' => 'Admin.Botanic.Families.index', 'permission' => 'backend_access' ]) $menu->addTo('botanic', 'Familles', [
->activeIfRoute(['Admin.Botanic.Families.*'])->order(1); 'route' => 'Admin.Botanic.Families.index',
$menu->addTo('botanic', 'Genres', [ 'route' => 'Admin.Botanic.Genres.index', 'permission' => 'backend_access' ]) ])->activeIfRoute(['Admin.Botanic.Families.*'])->order(1);
->activeIfRoute(['Admin.Botanic.Genres.*'])->order(2);
$menu->addTo('botanic', 'Espèces', [ 'route' => 'Admin.Botanic.Species.index', 'permission' => 'backend_access' ]) $menu->addTo('botanic', 'Genres', [
->activeIfRoute(['Admin.Botanic.Species.*'])->order(3); 'route' => 'Admin.Botanic.Genres.index',
$menu->addTo('botanic', 'Variétés', [ 'route' => 'Admin.Botanic.Varieties.index', 'permission' => 'backend_access' ]) ])->activeIfRoute(['Admin.Botanic.Genres.*'])->order(2);
->activeIfRoute(['Admin.Botanic.Varieties.*'])->order(4);
$menu->addTo('botanic', 'Espèces', [
'route' => 'Admin.Botanic.Species.index',
])->activeIfRoute(['Admin.Botanic.Species.*'])->order(3);
$menu->addTo('botanic', 'Variétés', [
'route' => 'Admin.Botanic.Varieties.index',
])->activeIfRoute(['Admin.Botanic.Varieties.*'])->order(4);
} }
} }

View File

@@ -8,15 +8,12 @@ class Customers
{ {
public function make(Builder $menu) public function make(Builder $menu)
{ {
$menu->add('Clients finaux', [ 'permission' => 'backend_access', 'icon' => 'address-card' ]) $menu->add('Clients finaux', ['icon' => 'address-card' ])
->id('customers') ->id('customers')
->activeIfRoute('customers')
->order(4); ->order(4);
$menu->addTo('customers', __('customer.customers.name'), [ $menu->addTo('customers', __('customer.customers.name'), [
'route' => 'Admin.Shop.Customers.index', 'route' => 'Admin.Shop.Customers.index',
'permission' => 'backend_access', ])->activeIfRoute(['Admin.Shop.Customers.*'])->order(1);
])
->activeIfRoute(['Admin.Shop.Customers.*'])->order(1);
} }
} }

View File

@@ -8,24 +8,16 @@ class Deliveries
{ {
public function make(Builder $menu) public function make(Builder $menu)
{ {
$menu->add('Modes de vente', [ $menu->add('Modes de vente', ['icon' => 'store'])
'permission' => 'backend_access',
'icon' => 'address-card'
])
->id('sales_mode') ->id('sales_mode')
->activeIfRoute('sales_mode')
->order(3); ->order(3);
$menu->addTo('sales_mode', __('shop.sale_channels.name'), [ $menu->addTo('sales_mode', __('shop.sale_channels.name'), [
'route' => 'Admin.Shop.SaleChannels.index', 'route' => 'Admin.Shop.SaleChannels.index',
'permission' => 'backend_access', ])->activeIfRoute(['Admin.Shop.SaleChannels.*'])->order(1);
])
->activeIfRoute(['Admin.Shop.SaleChannels.*'])->order(1);
$menu->addTo('sales_mode', __('shop.deliveries.title'), [ $menu->addTo('sales_mode', __('shop.deliveries.title'), [
'route' => 'Admin.Shop.Deliveries.index', 'route' => 'Admin.Shop.Deliveries.index',
'permission' => 'backend_access', ])->activeIfRoute(['Admin.Shop.Deliveries.*'])->order(1);
])
->activeIfRoute(['Admin.Shop.Deliveries.*'])->order(1);
} }
} }

View File

@@ -8,18 +8,24 @@ class Orders
{ {
public function make(Builder $menu) public function make(Builder $menu)
{ {
$menu->add('Commandes', [ 'permission' => 'backend_access', 'icon' => 'shopping-basket' ]) $menu->add('Commandes', ['icon' => 'shopping-basket'])
->id('orders') ->id('orders')
->activeIfRoute('orders')
->order(1); ->order(1);
$menu->addTo('orders', 'Commandes', [ 'route' => 'Admin.Shop.Orders.index', 'permission' => 'backend_access' ]) $menu->addTo('orders', 'Commandes', [
->activeIfRoute(['Admin.Shop.Orders.*'])->order(1); 'route' => 'Admin.Shop.Orders.index',
$menu->addTo('orders', 'Factures', [ 'route' => 'Admin.Shop.Invoices.index', 'permission' => 'backend_access' ]) ])->activeIfRoute(['Admin.Shop.Orders.*'])->order(1);
->activeIfRoute(['Admin.Shop.Invoices.*'])->order(2);
$menu->addTo('orders', 'Avoirs', [ 'route' => 'Admin.Shop.Invoices.index', 'permission' => 'backend_access' ]) $menu->addTo('orders', 'Factures', [
->activeIfRoute(['Admin.Shop.Invoices.*'])->order(3); 'route' => 'Admin.Shop.Invoices.index',
$menu->addTo('orders', 'Bons de livraison', [ 'route' => 'Admin.Shop.Invoices.index', 'permission' => 'backend_access' ]) ])->activeIfRoute(['Admin.Shop.Invoices.*'])->order(2);
->activeIfRoute(['Admin.Shop.Invoices.*'])->order(4);
$menu->addTo('orders', 'Avoirs', [
'route' => 'Admin.Shop.Invoices.index',
])->activeIfRoute(['Admin.Shop.Invoices.*'])->order(3);
$menu->addTo('orders', 'Bons de livraison', [
'route' => 'Admin.Shop.Invoices.index',
])->activeIfRoute(['Admin.Shop.Invoices.*'])->order(4);
} }
} }

View File

@@ -8,43 +8,57 @@ class Shop
{ {
public function make(Builder $menu) public function make(Builder $menu)
{ {
$menu->add('En vente', [ 'permission' => 'backend_access', 'icon' => 'store' ]) $menu->add('En vente', ['icon' => 'shopping-cart' ])
->id('shop') ->id('shop')
->activeIfRoute('shop') ->activeIfRoute('shop')
->order(2); ->order(2);
$menu->addTo('shop', 'Articles', [ 'route' => 'Admin.Shop.Articles.index', 'permission' => 'backend_access' ]) $menu->addTo('shop', 'Articles', [
->activeIfRoute(['Admin.Shop.Articles.*'])->order(1); 'route' => 'Admin.Shop.Articles.index',
$menu->addTo('shop', 'Déclinaisons', [ 'route' => 'Admin.Shop.Variations.index', 'permission' => 'backend_access' ]) ])->activeIfRoute(['Admin.Shop.Articles.*'])->order(1);
->activeIfRoute(['Admin.Shop.Variations.*'])->order(2);
$menu->addTo('shop', 'Tarifs', [ 'route' => 'Admin.Shop.Tariffs.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.Tariffs.*'])->order(3);
$menu->addTo('shop', 'Offres', [ 'route' => 'Admin.Shop.Offers.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.Offers.*'])->order(4);
$menu->addTo('shop', 'Rayons', [ 'route' => 'Admin.Shop.Categories.index', 'permission' => 'backend_access' ]) $menu->addTo('shop', 'Déclinaisons', [
->activeIfRoute(['Admin.Shop.Categories.*'])->order(6); 'route' => 'Admin.Shop.Variations.index',
])->activeIfRoute(['Admin.Shop.Variations.*'])->order(2);
$menu->addTo('shop', 'Tags', [ 'route' => 'Admin.Shop.Tags.index', 'permission' => 'backend_access' ]) $menu->addTo('shop', 'Tarifs', [
->activeIfRoute(['Admin.Shop.Tags.*'])->order(8); 'route' => 'Admin.Shop.Tariffs.index',
])->activeIfRoute(['Admin.Shop.Tariffs.*'])->order(3);
$menu->addTo('shop', 'Groupes de tags', [ 'route' => 'Admin.Shop.TagGroups.index', 'permission' => 'backend_access' ]) $menu->addTo('shop', 'Offres', [
->activeIfRoute(['Admin.Shop.TagGroups.*'])->order(8); 'route' => 'Admin.Shop.Offers.index',
])->activeIfRoute(['Admin.Shop.Offers.*'])->order(4);
$menu->addTo('shop', 'Natures d\'articles', [ 'route' => 'Admin.Shop.ArticleNatures.index', 'permission' => 'backend_access' ]) $menu->addTo('shop', 'Rayons', [
->activeIfRoute(['Admin.Shop.ArticleNatures.*'])->order(9); 'route' => 'Admin.Shop.Categories.index',
])->activeIfRoute(['Admin.Shop.Categories.*'])->order(6);
$menu->addTo('shop', 'Packages', [ 'route' => 'Admin.Shop.Packages.index', 'permission' => 'backend_access' ]) $menu->addTo('shop', 'Tags', [
->activeIfRoute(['Admin.Shop.Packages.*'])->order(12); 'route' => 'Admin.Shop.Tags.index',
])->activeIfRoute(['Admin.Shop.Tags.*'])->order(8);
$menu->addTo('shop', 'Unités de tarifs', [ 'route' => 'Admin.Shop.TariffUnities.index', 'permission' => 'backend_access' ]) $menu->addTo('shop', 'Groupes de tags', [
->activeIfRoute(['Admin.Shop.TariffUnities.*'])->order(13); 'route' => 'Admin.Shop.TagGroups.index',
])->activeIfRoute(['Admin.Shop.TagGroups.*'])->order(8);
$menu->addTo('shop', 'Unités', [ 'route' => 'Admin.Shop.Unities.index', 'permission' => 'backend_access' ]) $menu->addTo('shop', 'Natures d\'articles', [
->activeIfRoute(['Admin.Shop.Unities.*'])->order(14); 'route' => 'Admin.Shop.ArticleNatures.index',
])->activeIfRoute(['Admin.Shop.ArticleNatures.*'])->order(9);
$menu->addTo('shop', 'Accueil', [ 'route' => 'Admin.Shop.Homepages.index', 'permission' => 'backend_access' ]) $menu->addTo('shop', 'Packages', [
->activeIfRoute(['Admin.Shop.Homepages.*'])->order(14); 'route' => 'Admin.Shop.Packages.index',
])->activeIfRoute(['Admin.Shop.Packages.*'])->order(12);
$menu->addTo('shop', 'Unités de tarifs', [
'route' => 'Admin.Shop.TariffUnities.index',
])->activeIfRoute(['Admin.Shop.TariffUnities.*'])->order(13);
$menu->addTo('shop', 'Unités', [
'route' => 'Admin.Shop.Unities.index',
])->activeIfRoute(['Admin.Shop.Unities.*'])->order(14);
$menu->addTo('shop', 'Accueil', [
'route' => 'Admin.Shop.Homepages.index',
])->activeIfRoute(['Admin.Shop.Homepages.*'])->order(14);
} }
} }

View File

@@ -2,22 +2,15 @@
namespace App\Models\Shop; namespace App\Models\Shop;
use Illuminate\Database\Eloquent\Model;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
// use Rinvex\Categories\Traits\Categorizable;
use Cesargb\Database\Support\CascadeDelete; use Cesargb\Database\Support\CascadeDelete;
use Rinvex\Tags\Traits\Taggable; use Rinvex\Tags\Traits\Taggable;
use Wildside\Userstamps\Userstamps; use Wildside\Userstamps\Userstamps;
// use Kalnoy\Nestedset\NodeTrait;
use Rinvex\Categories\Models\Category as parentCategory; use Rinvex\Categories\Models\Category as parentCategory;
use Kalnoy\Nestedset\NestedSet; use Kalnoy\Nestedset\NestedSet;
use App\Repositories\Shop\SaleChannels;
class Category extends parentCategory class Category extends parentCategory
{ {
use CascadeDelete, Taggable, Userstamps; use CascadeDelete, Taggable, Userstamps;
@@ -72,4 +65,12 @@ class Category extends parentCategory
{ {
return $query->where('id', '<>', 1); return $query->where('id', '<>', 1);
} }
public function scopeHasAvailableOffers($query, $sale_channel_id = false)
{
$sale_channel_id = $sale_channel_id ? $sale_channel_id : SaleChannels::getDefaultID();
return $query->whereHas('articles', function ($query) use ($sale_channel_id) {
$query->WithAvailableOffers($sale_channel_id);
});
}
} }

View File

@@ -7,4 +7,6 @@ use Illuminate\Database\Eloquent\Model;
class Homepage extends Model class Homepage extends Model
{ {
protected $guarded = ['id']; protected $guarded = ['id'];
protected $table = 'shop_homepages';
} }

View File

@@ -33,9 +33,10 @@ class Categories
return self::getModel()->defaultOrder()->get()->toTree(); return self::getModel()->defaultOrder()->get()->toTree();
} }
public static function getCategoryTreeVisibles() public static function getCategoryTreeVisibles($sale_channel_id = false)
{ {
return self::getModel()->defaultOrder()->where('visible', 1)->get()->toTree(); // return self::getModel()->defaultOrder()->visible()->hasAvailableOffers($sale_channel_id)->get()->toTree();
return self::getModel()->defaultOrder()->visible()->get()->toTree();
} }
public static function getChildren($data, $withFolder = false) public static function getChildren($data, $withFolder = false)

View File

@@ -19,6 +19,15 @@ class ShopCart
]; ];
} }
public static function getSummary()
{
return [
'count' => self::count(),
'quantity' => self::getTotalQuantity(),
'total' => self::getTotal(),
];
}
public static function remove($id) public static function remove($id)
{ {
return self::get()->remove($id); return self::get()->remove($id);

View File

@@ -486,5 +486,4 @@ class Articles
{ {
return self::update(['homepage' => $homepage], $id); return self::update(['homepage' => $homepage], $id);
} }
} }

View File

@@ -33,7 +33,7 @@ trait Imageable
public static function getPreviewSrc($image) public static function getPreviewSrc($image)
{ {
return $image ? Medias::getPreviewSrc($image) : null; return $image ? Medias::getPreviewSrc($image) : '/img/visuel-non-disponible.jpg';
} }
public static function getImage($image) public static function getImage($image)
@@ -43,7 +43,7 @@ trait Imageable
public static function getImageSrc($image) public static function getImageSrc($image)
{ {
return $image ? Medias::getImageSrc($image) : null; return $image ? Medias::getImageSrc($image) : '/img/visuel-non-disponible.jpg';
} }
public static function deleteImage($id, $index) public static function deleteImage($id, $index)

View File

@@ -12,7 +12,6 @@ $(document).on('click', '.dropdown-menu', function (e) {
} }
$('.dropdown').on('hide.bs.dropdown', function () { $('.dropdown').on('hide.bs.dropdown', function () {
$(this).find('.submenu').hide(); $(this).find('.submenu').hide();
}) });
}); });
} }

View File

@@ -62,7 +62,6 @@
"mpdf/mpdf": "^8.0", "mpdf/mpdf": "^8.0",
"mpociot/teamwork": "^6.1", "mpociot/teamwork": "^6.1",
"nicmart/tree": "^0.3", "nicmart/tree": "^0.3",
"olssonm/laravel-backup-shield": "^3.1",
"orangehill/iseed": "^3.0", "orangehill/iseed": "^3.0",
"php-console/php-console": "^3.1", "php-console/php-console": "^3.1",
"proengsoft/laravel-jsvalidation": "^4.5", "proengsoft/laravel-jsvalidation": "^4.5",
@@ -79,7 +78,7 @@
"spatie/eloquent-sortable": "^4.0", "spatie/eloquent-sortable": "^4.0",
"spatie/image-optimizer": "^1.4", "spatie/image-optimizer": "^1.4",
"spatie/laravel-activitylog": "^3.6", "spatie/laravel-activitylog": "^3.6",
"spatie/laravel-backup": "^6.16", "spatie/laravel-backup": "^7.0",
"spatie/laravel-mail-preview": "^4.0", "spatie/laravel-mail-preview": "^4.0",
"spatie/laravel-medialibrary": "^9.6", "spatie/laravel-medialibrary": "^9.6",
"spatie/laravel-stats": "^1.0", "spatie/laravel-stats": "^1.0",

View File

@@ -41,6 +41,11 @@ return [
'provider' => 'users', 'provider' => 'users',
], ],
'guest' => [
'driver' => 'session',
'provider' => 'guests',
],
'api' => [ 'api' => [
'driver' => 'token', 'driver' => 'token',
'provider' => 'users', 'provider' => 'users',
@@ -71,6 +76,11 @@ return [
'model' => App\User::class, 'model' => App\User::class,
], ],
'guests' => [
'driver' => 'eloquent',
'model' => App\Models\Shop\Customer::class,
],
// 'users' => [ // 'users' => [
// 'driver' => 'database', // 'driver' => 'database',
// 'table' => 'users', // 'table' => 'users',
@@ -99,6 +109,12 @@ return [
'expire' => 60, 'expire' => 60,
'throttle' => 60, 'throttle' => 60,
], ],
'guests' => [
'provider' => 'guests',
'table' => 'shop_customer_password_resets',
'expire' => 60,
'throttle' => 60,
],
], ],
/* /*

View File

@@ -1,12 +0,0 @@
<?php
return [
'password' => env('APP_KEY'),
'encryption' => \Olssonm\BackupShield\Encryption::ENCRYPTION_DEFAULT
// Available encryption methods:
// \Olssonm\BackupShield\Encryption::ENCRYPTION_DEFAULT (AES 128)
// \Olssonm\BackupShield\Encryption::ENCRYPTION_WINZIP_AES_128 (AES 128)
// \Olssonm\BackupShield\Encryption::ENCRYPTION_WINZIP_AES_192 (AES 192)
// \Olssonm\BackupShield\Encryption::ENCRYPTION_WINZIP_AES_256 (AES 256)
];

View File

@@ -13,5 +13,5 @@ return [
// Backend locale // Backend locale
'locale' => config('app.locale'), 'locale' => config('app.locale'),
'logs' => false, 'logs' => true,
]; ];

View File

@@ -15,13 +15,14 @@ class CreateShopCustomersTable extends Migration {
Schema::create('shop_customers', function(Blueprint $table) Schema::create('shop_customers', function(Blueprint $table)
{ {
$table->increments('id'); $table->increments('id');
$table->string('name', 50)->default('0'); $table->string('first_name')->nullable();
$table->string('address1', 50)->default('0'); $table->string('last_name')->nullable();
$table->string('address2', 50)->default('0'); $table->string('email')->unique();
$table->string('zipcode', 50)->default('0'); $table->dateTime('email_verified_at')->nullable();
$table->string('city', 50)->default('0'); $table->string('password');
$table->string('country', 50)->default('0'); $table->string('remember_token', 100)->nullable();
$table->timestamps(); $table->timestamps();
$table->softDeletes();
}); });
} }

View File

@@ -1,83 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
class TeamworkSetupTables extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table(\Config::get('teamwork.users_table'), function (Blueprint $table) {
$table->integer('current_team_id')->unsigned()->nullable();
});
Schema::create(\Config::get('teamwork.teams_table'), function (Blueprint $table) {
$table->increments('id')->unsigned();
$table->integer('owner_id')->unsigned()->nullable();
$table->string('name');
$table->timestamps();
});
Schema::create(\Config::get('teamwork.team_user_table'), function (Blueprint $table) {
$table->bigInteger('user_id')->unsigned();
$table->integer('team_id')->unsigned();
$table->timestamps();
$table->foreign('user_id')
->references(\Config::get('teamwork.user_foreign_key'))
->on(\Config::get('teamwork.users_table'))
->onUpdate('cascade')
->onDelete('cascade');
$table->foreign('team_id')
->references('id')
->on(\Config::get('teamwork.teams_table'))
->onDelete('cascade');
});
Schema::create(\Config::get('teamwork.team_invites_table'), function (Blueprint $table) {
$table->increments('id');
$table->bigInteger('user_id')->unsigned();
$table->integer('team_id')->unsigned();
$table->enum('type', ['invite', 'request']);
$table->string('email');
$table->string('accept_token');
$table->string('deny_token');
$table->timestamps();
$table->foreign('team_id')
->references('id')
->on(\Config::get('teamwork.teams_table'))
->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table(\Config::get('teamwork.users_table'), function (Blueprint $table) {
$table->dropColumn('current_team_id');
});
Schema::table(\Config::get('teamwork.team_user_table'), function (Blueprint $table) {
if (DB::getDriverName() !== 'sqlite') {
$table->dropForeign(\Config::get('teamwork.team_user_table').'_user_id_foreign');
}
if (DB::getDriverName() !== 'sqlite') {
$table->dropForeign(\Config::get('teamwork.team_user_table').'_team_id_foreign');
}
});
Schema::drop(\Config::get('teamwork.team_user_table'));
Schema::drop(\Config::get('teamwork.team_invites_table'));
Schema::drop(\Config::get('teamwork.teams_table'));
}
}

View File

@@ -86,6 +86,7 @@
"handlebars-layouts": "^3.1.4", "handlebars-layouts": "^3.1.4",
"highcharts": "^9.1.2", "highcharts": "^9.1.2",
"highcharts-export-server": "^2.1.0", "highcharts-export-server": "^2.1.0",
"html-number-spinner": "^1.1.2",
"icheck": "^1.0.2", "icheck": "^1.0.2",
"icheck-bootstrap": "^3.0.1", "icheck-bootstrap": "^3.0.1",
"input-switch": "^1.1.0", "input-switch": "^1.1.0",

View File

@@ -0,0 +1,11 @@
@extends('layout.index', [
'title' => __('shop.merchandises.title'),
'subtitle' => __('shop.merchandises.add'),
'breadcrumb' => [__('shop.merchandises.title'), __('shop.merchandises.add')]
])
@section('content')
{{ Form::open(['route' => 'Admin.Shop.Merchandises.store', 'id' => 'form', 'autocomplete' => 'off', 'files' => true]) }}
@include('Admin.Shop.Merchandises.form')
</form>
@endsection

View File

@@ -0,0 +1,12 @@
@extends('layout.index', [
'title' => __('Shop.merchandises.title'),
'subtitle' => __('Shop.merchandises.edit'),
'breadcrumb' => [__('Shop.merchandises.title'), __('Shop.merchandises.edit')]
])
@section('content')
{{ Form::open(['route' => 'Admin.Shop.Merchandises.store', 'id' => 'form', 'autocomplete' => 'off', 'files' => true]) }}
<input type="hidden" name="id" id="id" value="{{ $variety['id'] }}">
@include('Admin.Shop.Merchandises.form')
</form>
@endsection

View File

@@ -0,0 +1,62 @@
<div class="row">
<div class="col-md-8">
<div class="row mb-3">
<div class="col-6">
{{ Form::label('name', 'Nom') }}
@include('components.form.input', ['name' => 'name', 'value' => $variety['name'] ?? null, 'required' => true])
</div>
<div class="col-6">
{{ Form::label('genre', 'Espèce') }}
@include('components.form.select', ['name' => 'specie_id', 'list' => $species, 'value' => $variety['specie_id'] ?? null, 'class' => 'select2 form-control', 'with_empty' => '', 'required' => false])
</div>
</div>
<div class="row mb-3">
<div class="col-12">
{{ Form::label('tags', 'Tags') }}
@include('components.form.selects.select-tree', ['name' => 'tags[]', 'list' => $tags_list, 'values' => $variety['tags'] ?? null, 'class' => 'select2 form-control', 'multiple' => true])
</div>
</div>
<div class="row mb-3">
<div class="col-12">
{{ Form::label('description', 'Description') }}
@include('components.form.textarea', ['name' => 'description', 'value' => $variety['description'] ?? null, 'class' => 'editor', 'rows' => 5, 'required' => false])
</div>
</div>
<div class="row mb-3">
<div class="col-12">
{{ Form::label('memo', 'Descriptif sachet') }}
@include('components.form.textarea', ['name' => 'memo', 'value' => $variety['memo'] ?? null, 'class' => 'editor', 'rows' => 5, 'required' => false])
</div>
</div>
</div>
<div class="col-md-4">
@include('components.uploader.widget', ['load_url' => route('Admin.Botanic.Varieties.getImages', ['id' => $variety['id'] ?? false]), 'delete_url' => route('Admin.Botanic.Varieties.deleteImage'), 'name' => 'images'])
</div>
</div>
@include('components.save')
@include('load.form.appender')
@include('load.form.editor')
@include('load.form.save')
@include('load.form.select2')
@include('load.layout.chevron')
@include('boilerplate::load.fileinput')
@include('boilerplate::load.tinymce')
@push('js')
<script>
$(function() {
initSelect2();
initChevron();
initEditor();
initSaveForm();
});
</script>
@endpush

View File

@@ -0,0 +1,12 @@
@extends('layout.index', [
'title' => __('Botanic.varieties.title'),
'subtitle' => __('Botanic.varieties.list'),
'breadcrumb' => [__('Botanic.varieties.title')]
])
@section('content')
@component('components.card')
@include('components.datatable', ['route' => route('Admin.Botanic.Varieties.index'), 'model' => 'varieties'])
@endcomponent
@endsection

View File

@@ -0,0 +1,30 @@
@extends('layout.index', [
'title' => __('products.title'),
'subtitle' => __('products.title'),
'breadcrumb' => [__('products.title')]
])
@section('content')
<div class="row">
<div class="col-md-offset-2 col-md-8">
<div class="box box-info">
<div class="box-body">
<div class="col-md-6">
<h3>{{ name }}</h3>
<h4>
{{ $product.section.name }}<br>
</h4>
</div>
<div class="col-md-12">
@include('components.carousel')
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -52,7 +52,7 @@
'basket-form', 'basket-form',
"{{ route('Shop.Basket.modalBasket') }}/" + offer_id + '/' + quantity, "{{ route('Shop.Basket.modalBasket') }}/" + offer_id + '/' + quantity,
"{{ route('Shop.Basket.addBasket') }}", "{{ route('Shop.Basket.addBasket') }}",
false, refreshBasketTop(),
false, false,
true, true,
buttons buttons

View File

@@ -1,14 +1,10 @@
<a href="{{ route('Shop.Articles.show', ['id' => $article['semences']['article_id'] ?? false ]) }}"> <a href="{{ route('Shop.Articles.show', ['id' => $article['semences']['article_id'] ?? false ]) }}" class="green-dark">
<div class="card"> <div class="card bg-green-light">
@if ($article['image'] !== null)
<img src="{{ App\Repositories\Shop\Articles::getPreviewSrc($article['image'] ?? false) }}" class="card-img-top" alt="{{ $product_name }}"> <img src="{{ App\Repositories\Shop\Articles::getPreviewSrc($article['image'] ?? false) }}" class="card-img-top" alt="{{ $product_name }}">
@else
<img src="img/visuel-non-disponible.jpg" class="card-img-top">
@endif
<div class="card-body"> <div class="card-body">
<div class="row card-title"> <div class="row card-title">
<div class="col-10" style="font-weight: bold; color: green;"> <div class="col-10">
<h2 style="font-size: 1.3em;">{{ $article['parent_name'] }}</h2> <div class="mb-0" style="font-size: 1.3em;">{{ $article['parent_name'] }}</div>
{{ $article['product_name'] }} {{ $article['product_name'] }}
</div> </div>
<div class="col-2 p-0 text-right" style="font-size: 2em; color: red;"> <div class="col-2 p-0 text-right" style="font-size: 2em; color: red;">
@@ -16,22 +12,22 @@
</div> </div>
</div> </div>
<div class="row" style="color: green;"> <div class="row">
<div class="col-6"> <div class="col-6">
<strong>Semence</strong>
@if ($article['semences'] ?? false) @if ($article['semences'] ?? false)
<span style="font-size: 1.4em; font-weight: bold;">{{ $article['semences']['price'] ?? null }}</span> <br> <span style="font-size: 1.4em">{{ $article['semences']['price'] ?? null }}</span> <br>
@else @else
Indisponible<br> Indisponible<br>
@endif @endif
Semence
</div> </div>
<div class="col-6"> <div class="col-6">
<strong>Plant</strong>
@if ($article['plants'] ?? false) @if ($article['plants'] ?? false)
<span style="font-size: 1.4em; font-weight: bold;">{{ $article['plants']['price'] }}</span> <br> <span style="font-size: 1.4em">{{ $article['plants']['price'] }}</span> <br>
@else @else
Indisponible<br> Indisponible<br>
@endif @endif
Plant
</div> </div>
</div> </div>
</div> </div>

View File

@@ -9,10 +9,10 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-5"> <div class="col-4">
{!! $article['image_big'] !!} {!! $article['image_big'] !!}
</div> </div>
<div class="col-4"> <div class="col-5">
{!! $article['description'] !!} {!! $article['description'] !!}
</div> </div>
<div class="col-3"> <div class="col-3">

View File

@@ -4,7 +4,7 @@
@section('content') @section('content')
@if ($basket) @if ($basket)
<div class="row"> <div class="row m-0">
<div class="col-8"> <div class="col-8">
<div class="row mb-3"> <div class="row mb-3">
<div class="col-4"> <div class="col-4">
@@ -17,7 +17,7 @@
</div> </div>
</div> </div>
@foreach ($basket as $nature => $items) @foreach ($basket as $nature => $items)
<div class="row mb-3 p-2" style="background-color: #ccc;"> <div class="row mb-3 p-2 bg-green-light">
<div class="col-12"> <div class="col-12">
<h2 style="font-size: 1.6em;">{{ ucfirst($nature) }}</h2> <h2 style="font-size: 1.6em;">{{ ucfirst($nature) }}</h2>
@foreach ($items as $item) @foreach ($items as $item)
@@ -28,7 +28,7 @@
@endforeach @endforeach
</div> </div>
<div class="col-4"> <div class="col-4">
@component('components.card') @component('components.card', ['class' => 'shadow'])
<div class="row mb-3"> <div class="row mb-3">
<div class="col-6 text-uppercase"> <div class="col-6 text-uppercase">
Tarif appliqué Tarif appliqué

View File

@@ -16,10 +16,10 @@
'class' => 'basket-quantity', 'class' => 'basket-quantity',
]) ])
</div> </div>
<div class="col-2 text-right" style="font-size: 2em;" id="basket_total-{{ $item['id'] }}"> <div class="col-3 text-right" style="font-size: 2em;" id="basket_total-{{ $item['id'] }}">
<span class="basket-total-row">{{ $item['quantity'] * $item['price'] }}</span> <span class="basket-total-row">{{ $item['quantity'] * $item['price'] }}</span>
</div> </div>
<div class="col-2"> <div class="col-1 text-center">
<i class="btn fa fa-fw fa-trash basket-delete" style="font-size: 1.6em;" data-id={{ $item['id'] }}></i> <i class="btn fa fa-fw fa-trash basket-delete" style="font-size: 1.6em;" data-id={{ $item['id'] }}></i>
</div> </div>
</div> </div>

View File

@@ -0,0 +1,30 @@
@extends('boilerplate::auth.layout', [
'title' => __('boilerplate::auth.firstlogin.title'),
'bodyClass' => 'hold-transition login-page'
])
@section('content')
@component('boilerplate::auth.loginbox')
{{ Form::open(['route' => 'boilerplate.users.firstlogin', 'autocomplete' => 'off']) }}
<input type="hidden" name="token" value="{{ $token }}">
<div class="alert alert-info">
<p>{{ __('boilerplate::auth.firstlogin.intro') }}</p>
</div>
<div class="form-group {{ $errors->has('password') ? 'has-error' : '' }}">
{{ Form::label('password', __('boilerplate::auth.fields.password')) }}
{{ Form::input('password', 'password', Request::old('password'), ['class' => 'form-control', 'autofocus']) }}
{!! $errors->first('password','<p class="text-danger">:message</p>') !!}
</div>
<div class="form-group {{ $errors->has('password_confirmation') ? 'has-error' : '' }}">
{{ Form::label('password_confirmation', __('boilerplate::auth.fields.password_confirm')) }}
{{ Form::input('password', 'password_confirmation', Request::old('password_confirmation'), ['class' => 'form-control']) }}
{!! $errors->first('password_confirmation','<p class="text-danger">:message</p>') !!}
</div>
<div class="form-group text-center">
<button type="submit" class="btn btn-primary">
{{ __('boilerplate::auth.firstlogin.button') }}
</button>
</div>
</form>
@endcomponent
@endsection

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html lang="{{ App::getLocale() }}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, nofollow">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ $title }} | {{ config('app.name') }}</title>
<link rel="stylesheet" href="{{ mix('/adminlte.min.css', '/assets/vendor/boilerplate') }}">
@stack('css')
</head>
<body class="{{ $bodyClass ?? 'login-page'}}">
@yield('content')
<script src="{{ mix('/boilerplate.min.js', '/assets/vendor/boilerplate') }}"></script>
@stack('js')
</body>
</html>

View File

@@ -0,0 +1,46 @@
@extends('auth.layout', [
'title' => __('boilerplate::auth.login.title'),
'bodyClass' => 'hold-transition login-page'
])
@section('content')
{!! Form::open(['route' => 'boilerplate.login', 'method' => 'post', 'autocomplete'=> 'off']) !!}
<div class="row" style="width: 380px;">
<div class="col-12 text-center">
<img src="/img/logo.png" height="128">
</div>
</div>
<div class="form-group has-feedback">
<div class="form-group {{ $errors->has('email') ? 'has-error' : '' }}">
{{ Form::email('email', old('email'), ['class' => 'form-control', 'placeholder' => __('boilerplate::auth.fields.email'), 'required', 'autofocus']) }}
<span class="glyphicon glyphicon-envelope form-control-feedback"></span>
{!! $errors->first('email','<p class="text-danger"><strong>:message</strong></p>') !!}
</div>
</div>
<div class="form-group has-feedback">
<div class="form-group {{ $errors->has('password') ? 'has-error' : '' }}">
{{ Form::password('password', ['class' => 'form-control', 'placeholder' => __('boilerplate::auth.fields.password')]) }}
<span class="glyphicon glyphicon-lock form-control-feedback"></span>
{!! $errors->first('password','<p class="text-danger"><strong>:message</strong></p>') !!}
</div>
</div>
<div class="row">
<div class="col-12 col-lg-8">
<div class="checkbox icheck">
<label style="padding-left: 0">
<input type="checkbox" name="remember" class="icheck" {{ old('remember') ? 'checked' : '' }}>
{{ __('boilerplate::auth.login.rememberme') }}
</label>
</div>
</div>
<div class="col-12 col-lg-4 mbs">
<button type="submit" class="btn btn-primary btn-block btn-flat">{{ __('boilerplate::auth.login.signin') }}</button>
</div>
</div>
{!! Form::close() !!}
<a href="{{ route('boilerplate.password.request') }}">{{ __('boilerplate::auth.login.forgotpassword') }}</a><br>
@if(config('boilerplate.auth.register'))
<a href="{{ route('boilerplate.register') }}" class="text-center">{{ __('boilerplate::auth.login.register') }}</a>
@endif
@endsection

View File

@@ -0,0 +1,8 @@
@if (config('app.name') == 'CRM')
@include('auth.crm')
@endif
@if (config('app.name') == 'HestImmo')
@include('auth.hestimmo')
@endif

View File

@@ -0,0 +1,47 @@
<div class="modal fade" id="changepasswordModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<form role="form" id="password-form-data" method="post" autocomplete="off">
{{ csrf_field() }}
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">{{ __('change_your_password') }}</h5>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body">
<div class="row" style="padding: 10px 20px;">
<div class="col-xs-12 text-center" id="changePasswordMessage"></div>
</div>
<div class="row" style="padding: 10px 20px;">
<label for="new-password" class="col-md-6 control-label text-right">{{ __('current_password') }}</label>
<div class="col-md-6">
<input id="current-password" type="password" class="form-control" name="current-password" required>
</div>
</div>
<div class="row" style="padding: 10px 20px;">
<label for="new-password" class="col-md-6 control-label text-right">{{ __('new_password') }}</label>
<div class="col-md-6">
<input id="new-password" type="password" class="form-control" name="new-password" required>
</div>
</div>
<div class="row" style="padding: 10px 20px;">
<label for="new-password-confirm" class="col-md-6 control-label text-right">{{ __('confirm_new_password') }}</label>
<div class="col-md-6">
<input id="new-password-confirm" type="password" class="form-control" name="new-password_confirmation" required>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" id="changePassword-submit">
{{ __('save') }}
</button>
</div>
</form>
</div>
</div>
</div>

View File

@@ -0,0 +1,28 @@
@extends('boilerplate::auth.layout', ['title' => __('boilerplate::auth.password.title'), 'bodyClass' => 'hold-transition login-page'])
@section('content')
@component('boilerplate::auth.loginbox')
<p class="login-box-msg">{{ __('boilerplate::auth.password.intro') }}</p>
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
{!! Form::open(['route' => 'boilerplate.password.email', 'method' => 'post', 'autocomplete'=> 'off']) !!}
<div class="form-group {{ $errors->has('email') ? 'has-error' : '' }}">
{{ Form::email('email', old('email'), ['class' => 'form-control', 'placeholder' => __('boilerplate::auth.fields.email'), 'required', 'autofocus']) }}
{!! $errors->first('email','<p class="text-danger"><strong>:message</strong></p>') !!}
</div>
<div class="form-group">
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 text-center">
<button type="submit" class="btn btn-primary">
{{ __('boilerplate::auth.password.submit') }}
</button>
</div>
</div>
</div>
{!! Form::close() !!}
<a href="{{ route('boilerplate.login') }}">{{ __('boilerplate::auth.password.login_link') }}</a><br>
@endcomponent
@endsection

View File

@@ -0,0 +1,27 @@
@extends('boilerplate::auth.layout', ['title' => __('boilerplate::auth.password_reset.title')])
@section('content')
@component('boilerplate::auth.loginbox')
<p class="login-box-msg">{{ __('boilerplate::auth.password_reset.intro') }}</p>
{!! Form::open(['route' => 'boilerplate.password.reset.post', 'method' => 'post', 'autocomplete'=> 'off']) !!}
{!! Form::hidden('token', $token) !!}
<div class="form-group {{ $errors->has('email') ? 'has-error' : '' }}">
{{ Form::email('email', old('email', $email), ['class' => 'form-control', 'placeholder' => __('boilerplate::auth.fields.email'), 'required', 'autofocus']) }}
{!! $errors->first('email','<p class="text-danger"><strong>:message</strong></p>') !!}
</div>
<div class="form-group {{ $errors->has('password') ? 'has-error' : '' }}">
{{ Form::password('password', ['class' => 'form-control', 'placeholder' => __('boilerplate::auth.fields.password'), 'required']) }}
{!! $errors->first('password','<p class="text-danger"><strong>:message</strong></p>') !!}
</div>
<div class="form-group {{ $errors->has('password_confirmation') ? 'has-error' : '' }}">
{{ Form::password('password_confirmation', ['class' => 'form-control', 'placeholder' => __('boilerplate::auth.fields.password_confirm'), 'required']) }}
{!! $errors->first('password_confirmation','<p class="text-danger"><strong>:message</strong></p>') !!}
</div>
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 text-center">
<button class="btn btn-primary" type="submit">{{ __('boilerplate::auth.password_reset.submit') }}</button>
</div>
</div>
{!! Form::close() !!}
@endcomponent
@endsection

View File

@@ -0,0 +1,39 @@
@extends('boilerplate::auth.layout', ['title' => __('boilerplate::auth.register.title'), 'bodyClass' => 'hold-transition login-page'])
@section('content')
@component('boilerplate::auth.loginbox')
<p class="login-box-msg">{{ __('boilerplate::auth.register.intro') }}</p>
{!! Form::open(['route' => 'boilerplate.register', 'method' => 'post', 'autocomplete'=> 'off']) !!}
<div class="form-group {{ $errors->has('first_name') ? 'has-error' : '' }}">
{{ Form::text('first_name', old('first_name'), ['class' => 'form-control', 'placeholder' => __('boilerplate::auth.fields.first_name'), 'required', 'autofocus']) }}
{!! $errors->first('first_name','<p class="text-danger"><strong>:message</strong></p>') !!}
</div>
<div class="form-group {{ $errors->has('last_name') ? 'has-error' : '' }}">
{{ Form::text('last_name', old('last_name'), ['class' => 'form-control', 'placeholder' => __('boilerplate::auth.fields.last_name'), 'required']) }}
{!! $errors->first('last_name','<p class="text-danger"><strong>:message</strong></p>') !!}
</div>
<div class="form-group {{ $errors->has('email') ? 'has-error' : '' }}">
{{ Form::email('email', old('email'), ['class' => 'form-control', 'placeholder' => __('boilerplate::auth.fields.email'), 'required']) }}
{!! $errors->first('email','<p class="text-danger"><strong>:message</strong></p>') !!}
</div>
<div class="form-group {{ $errors->has('password') ? 'has-error' : '' }}">
{{ Form::password('password', ['class' => 'form-control', 'placeholder' => __('boilerplate::auth.fields.password'), 'required']) }}
{!! $errors->first('password','<p class="text-danger"><strong>:message</strong></p>') !!}
</div>
<div class="form-group {{ $errors->has('password_confirmation') ? 'has-error' : '' }}">
{{ Form::password('password_confirmation', ['class' => 'form-control', 'placeholder' => __('boilerplate::auth.fields.password_confirm'), 'required']) }}
{!! $errors->first('password_confirmation','<p class="text-danger"><strong>:message</strong></p>') !!}
</div>
<div class="row mbm">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 text-center">
<button type="submit" class="btn btn-primary">
{{ __('boilerplate::auth.register.register_button') }}
</button>
</div>
</div>
{!! Form::close() !!}
@if(!$firstUser)
<a href="{{ route('boilerplate.login') }}">{{ __('boilerplate::auth.register.login_link') }}</a><br>
@endif
@endcomponent
@endsection

View File

@@ -0,0 +1,24 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('Verify Your Email Address') }}</div>
<div class="card-body">
@if (session('resent'))
<div class="alert alert-success" role="alert">
{{ __('A fresh verification link has been sent to your email address.') }}
</div>
@endif
{{ __('Before proceeding, please check your email for a verification link.') }}
{{ __('If you did not receive the email') }}, <a href="{{ route('verification.resend') }}">{{ __('click here to request another') }}</a>.
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -7,7 +7,7 @@
@if (!empty($text)) @if (!empty($text))
<div class="row m-0 mb-3"> <div class="row m-0 mb-3">
<div class="col-12 p-3 green-dark bg-yellow rounded drop-shadow" style="font-size: 1.4em;">{!! $text !!}</div> <div class="col-12 p-3 green-dark bg-yellow rounded drop-shadow" style="font-size: 1.2em;">{!! $text !!}</div>
</div> </div>
@endif @endif

View File

@@ -21,9 +21,9 @@
</head> </head>
<body id="index"> <body class="bg-green-dark">
<div class="wrapper"> <div class="container bg-white" style="min-height: 100vh;">
<main> <main>
@include("Shop.layout.partials.header") @include("Shop.layout.partials.header")
<div class="content-wrapper"> <div class="content-wrapper">
@@ -58,6 +58,16 @@
@stack('js') @stack('js')
<script>
function refreshBasketTop() {
$.get("{{ route('Shop.Basket.getSummary') }}", function(response) {
console.log(response);
$('#count-basket').html(response.data.quantity);
$('#total-basket').html(response.data.total);
});
}
</script>
</body> </body>
</html> </html>

View File

@@ -1,7 +1,7 @@
<div class="row"> <div class="row">
@if ($articles) @if ($articles)
@foreach ($articles as $product_name => $article) @foreach ($articles as $product_name => $article)
<div class="col-sm-3 col-lg-2"> <div class="col-3 mb-3">
@include('Shop.Articles.partials.article') @include('Shop.Articles.partials.article')
</div> </div>
@endforeach @endforeach

View File

@@ -1,15 +1,17 @@
<div class="row"> <div class="row">
<div class="col-6 d-none"> <div class="col-12 text-right p-2">
<div id="header-favorite" class="text-light" data-refresh-url="/favorite">
<i class="fa fa-3x fa-heart"></i>
</div>
</div>
<div class="col-6 text-center">
<div id="header-basket" class="text-light mr-3" data-refresh-url="/basket">
<a href="{{ route('Shop.Basket.basket') }}" style="color: white;"> <a href="{{ route('Shop.Basket.basket') }}" style="color: white;">
<i class="fa fa-3x fa-shopping-basket"></i> <button type="button" class="btn bg-green-dark basket light">
<i class="fa fa-2x fa-fw fa-shopping-basket mr-2"></i>
<span class="ml-2 badge bg-yellow green-dark">
<span id="count-basket">{{ \App\Repositories\Core\User\ShopCart::getTotalQuantity() }}</span>
Articles
</span>
<span class="ml-2 badge bg-yellow green-dark">
<span id="total-basket">{{ \App\Repositories\Core\User\ShopCart::getTotal() }}</span>
TTC
</span>
</button>
</a> </a>
</div> </div>
</div> </div>
</div>

View File

@@ -1,19 +1,19 @@
<div class="row bg-green mr-0"> <div class="row bg-green">
<div class="col-4 col-md-2 form-inline pl-4"> <div class="col-3 form-inline pl-4">
<a href="/"><img src="/img/logo.jpg" class="img-responvive"></a> <a href="/"><img src="/img/logo.jpg" class="img-responvive"></a>
<a id="filters" href="#" class="text-white pl-3"><i class="fa fa-2x fa-bars"></i></a> <a id="filters" href="#" class="text-white pl-3"><i class="fa fa-2x fa-bars"></i></a>
</div> </div>
<div class="col-8 col-md-6 form-inline"> <div class="col-5 form-inline">
@include("Shop.layout.partials.search") @include("Shop.layout.partials.search")
</div> </div>
<div class="col-6 col-md-2"> <div class="col-1">
@include("Shop.layout.partials.header-profile") @include("Shop.layout.partials.header-profile")
</div> </div>
<div class="col-6 col-md-2 text-right"> <div class="col-3 text-right">
@include("Shop.layout.partials.header-basket") @include("Shop.layout.partials.header-basket")
</div> </div>

View File

@@ -1,7 +1,9 @@
<div class="user-info dropdown js-dropdown"> <div class="row">
<span class="account-logo expand-more" data-toggle="dropdown" role="button">Compte client <div class="col-12 text-right p-2">
<i class="material-icons expand-more">&#xE313;</i> <button type="button" class="btn bg-green-dark light" data-toggle="dropdown">
</span> <i class="fa fa-2x fa-fw fa-user mr-2"></i>
<span id="username" class="ml-2 badge bg-yellow green-dark"></span>
</button>
<ul class="dropdown-menu" aria-labelledby="dLabel"> <ul class="dropdown-menu" aria-labelledby="dLabel">
<li> <li>
@@ -10,4 +12,6 @@
</a> </a>
</li> </li>
</ul> </ul>
</div>
</div> </div>

View File

@@ -1,6 +1,8 @@
<div class="row shadow mb-3">
<div class="col-8 pl-0">
<nav class="navbar navbar-expand-lg navbar-light bg-light "> <nav class="navbar navbar-expand-lg navbar-light bg-light ">
<div class="collapse navbar-collapse" id="navbarContent"> <div class="collapse navbar-collapse" id="navbarContent">
<ul class="navbar-nav mx-auto"> <ul class="navbar-nav">
@foreach ($categories as $category) @foreach ($categories as $category)
<li class="nav-item dropdown megamenu"> <li class="nav-item dropdown megamenu">
<a id="megamenu_{{ $category['id'] }}" href="{{ route('Shop.Categories.show', ['id' => $category['id']]) }}" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" class="nav-link dropdown-toggle font-weight-bold text-uppercase"> <a id="megamenu_{{ $category['id'] }}" href="{{ route('Shop.Categories.show', ['id' => $category['id']]) }}" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" class="nav-link dropdown-toggle font-weight-bold text-uppercase">
@@ -14,10 +16,12 @@
</li> </li>
@endforeach @endforeach
</ul> </ul>
<span style="font-family: Arial Narrow; font-size: 1.1em; font-weight: 900;">
Variétés Paysannes de la Semence à l'Assiette
</span>
</div> </div>
</nav> </nav>
</div>
<div class="col-4 text-right p-3">
<span style="font-size: 1.2em; font-weight: 600;">
Variétés Paysannes de la Semence à l'Assiette
</span>
</div>
</div>

View File

@@ -5,7 +5,7 @@
@section('content') @section('content')
@include('Shop.Tags.partials.filter') @include('Shop.Tags.partials.filter')
<div class="row"> <div class="row mb-3">
<div class="col-8"> <div class="col-8">
<h1 style="font-size: 2em;">{{ $category['name'] }}</h1> <h1 style="font-size: 2em;">{{ $category['name'] }}</h1>
<h3 style="font-size: 1.2em;">{!! $category['description'] !!}</h3> <h3 style="font-size: 1.2em;">{!! $category['description'] !!}</h3>
@@ -14,6 +14,7 @@
@include('Shop.layout.partials.category_add') @include('Shop.layout.partials.category_add')
</div> </div>
</div> </div>
@if ($display_by_rows ?? false) @if ($display_by_rows ?? false)
@include('Shop.layout.partials.category_articles_rows') @include('Shop.layout.partials.category_articles_rows')
@else @else

View File

@@ -5,6 +5,7 @@ Route::prefix('Basket')->name('Basket.')->group(function () {
Route::post('addBasket', 'BasketController@addBasket')->name('addBasket'); Route::post('addBasket', 'BasketController@addBasket')->name('addBasket');
Route::get('modalBasket/{offer_id?}/{quantity?}', 'BasketController@modalBasket')->name('modalBasket'); Route::get('modalBasket/{offer_id?}/{quantity?}', 'BasketController@modalBasket')->name('modalBasket');
Route::get('getBasket', 'BasketController@getBasket')->name('getBasket'); Route::get('getBasket', 'BasketController@getBasket')->name('getBasket');
Route::get('getSummary', 'BasketController@getSummary')->name('getSummary');
Route::get('countBasket', 'BasketController@countBasket')->name('countBasket'); Route::get('countBasket', 'BasketController@countBasket')->name('countBasket');
Route::get('clearBasket', 'BasketController@clearBasket')->name('clearBasket'); Route::get('clearBasket', 'BasketController@clearBasket')->name('clearBasket');
Route::get('basket', 'BasketController@basket')->name('basket'); Route::get('basket', 'BasketController@basket')->name('basket');

View File

@@ -1,5 +1,14 @@
<?php <?php
Route::prefix('Shop')->namespace('Shop')->name('Shop.')->group(function () {
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login')->name('login.post');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
Route::get('invite/{token?}/{event_id?}', 'Auth\LoginController@invite')->name('invite');
Route::get('password/reset/{token?}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset')->name('password.update');
});
Route::prefix('Shop')->namespace('Shop')->name('Shop.')->group(function () { Route::prefix('Shop')->namespace('Shop')->name('Shop.')->group(function () {
include( __DIR__ . '/Articles.php'); include( __DIR__ . '/Articles.php');
include( __DIR__ . '/Baskets.php'); include( __DIR__ . '/Baskets.php');