Merge branch 'develop' into trunk

This commit is contained in:
Vincent BRIDIER 2023-10-11 12:13:13 +02:00
commit 80294115f6
No known key found for this signature in database
GPG key ID: 8571BFA20420D512
49 changed files with 2314 additions and 3532 deletions

View file

@ -4,8 +4,13 @@
"stylelint-config-sass-guidelines",
"stylelint-config-idiomatic-order"
],
"plugins": ["stylelint-scss"],
"files": ["**/*.css", "**/*.scss"],
"plugins": [
"stylelint-scss"
],
"files": [
"**/*.css",
"**/*.scss"
],
"ignoreFiles": [
"**/vendor/*.css",
"**/vendor/**/*.css",
@ -18,15 +23,12 @@
],
"customSyntax": "postcss-scss",
"rules": {
"indentation": 4,
"string-quotes": "double",
"declaration-property-value-no-unknown": true,
"selector-max-id": null,
"color-no-invalid-hex": true,
"order/properties-alphabetical-order": null,
"max-nesting-depth": 5,
"selector-max-compound-selectors": 5,
"declaration-colon-space-after": "always-single-line",
"function-parentheses-space-inside": "never-single-line",
"declaration-colon-newline-after": null,
"value-list-comma-newline-after": null,
"scss/double-slash-comment-empty-line-before": [

View file

@ -33,7 +33,6 @@ class Authenticate extends Middleware
}
return route('login');
}
abort(401);
return null;
}

View file

@ -3,7 +3,6 @@
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
class RedirectIfAuthenticated
@ -24,10 +23,10 @@ class RedirectIfAuthenticated
$guards = empty($guards) ? [null] : $guards;
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
if (auth($guard)->check()) {
switch ($guard) {
case 'frontend':
return \redirect()->route('home');
return \redirect()->route('fo.homepage');
case 'backend':
if (!$request->routeIs('bo.*')) {
continue;

View file

@ -39,7 +39,7 @@ class SecureHeaders
$jsDev = config('app.debug') ? "'unsafe-eval' 'unsafe-inline'" : "'nonce-{$nonce}' 'strict-dynamic'";
$scheme = config('app.env') === 'local' ? 'http' : 'https';
$reportUri = Route::has('cspReportUri') ?
\sprintf(' report-uri %s ;', \parse_url(route('cspReportUri'), \PHP_URL_PATH)) : '';
\sprintf(' report-uri %s ;', \parse_url(route('cspReportUri'), \PHP_URL_PATH)) : '';
$this->removeUnwantedHeaders($this->unwantedHeaderList);
$response = $next($request);
$response->headers->set('Referrer-Policy', 'no-referrer-when-downgrade');
@ -51,23 +51,17 @@ class SecureHeaders
"default-src 'none';",
"manifest-src 'self';",
// * CKEDITOR Specific https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/csp.html
'connect-src ' . implode(" ", [
'\'self\'',
'https://yl.s-web.fr',
'https://api-adresse.data.gouv.fr',
]) . ' blob:;',
"connect-src 'self' blob:;",
"img-src * data: blob:;",
"frame-src 'self' data: " . implode(' ', [
'frame-src ' . implode(' ', [
'https://www.google.com/recaptcha/',
'https://recaptcha.google.com/recaptcha/',
'https://www.google.com/maps/',
'https://www.youtube.com'
'https://www.google.com/maps/'
]) . ';',
"font-src 'self' data: https://fonts.gstatic.com;",
// ! Using CKEditor will must have unsafe-inline style
// phpcs:ignore Generic.Files.LineLength.TooLong
"style-src 'self' 'unsafe-inline' " . \implode(' ', [
"https://unpkg.com",
'https://cdnjs.cloudflare.com',
// * File Manager
'https://fonts.googleapis.com',
@ -83,6 +77,7 @@ class SecureHeaders
'https://unpkg.com',
'https://www.googletagmanager.com',
'https://cdnjs.cloudflare.com',
"$scheme://www.google-analytics.com",
]) . ';'
];
@ -100,7 +95,7 @@ class SecureHeaders
* @param array $headerList
* @return void
*/
private function removeUnwantedHeaders(array $headerList)
private function removeUnwantedHeaders(array $headerList): void
{
foreach ($headerList as $header) {
header_remove($header);

View file

@ -20,7 +20,7 @@ class TrustProxies extends Middleware
* @var integer
*/
protected $headers =
Request::HEADER_X_FORWARDED_FOR |
Request::HEADER_X_FORWARDED_FOR |
Request::HEADER_X_FORWARDED_HOST |
Request::HEADER_X_FORWARDED_PORT |
Request::HEADER_X_FORWARDED_PROTO |

View file

@ -1,6 +1,6 @@
<?php
namespace App\Lib;
namespace App\Lib\Helpers;
use Illuminate\Container\Container;
use Illuminate\Pagination\LengthAwarePaginator;

View file

@ -132,7 +132,10 @@ class Recipe extends Model
*/
public function getCookingTimeLabelAttribute(): string
{
return self::convertMinutesToHourMinutes($this->cooking_time);
if ($this->cooking_time) {
return self::convertMinutesToHourMinutes($this->cooking_time);
}
return '';
}
/**

View file

@ -3,7 +3,7 @@
"type": "project",
"description": "Site de la marque Lionor",
"require": {
"php": "^8.1",
"php": "^8.2",
"axlon/laravel-postal-code-validation": "^3.3",
"diglactic/laravel-breadcrumbs": "^8.1.1",
"guzzlehttp/guzzle": "^7.2",

5058
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -12,63 +12,50 @@
"stylelint-ci": "node ./node_modules/.bin/stylelint --config './.stylelintrc.json' --max-warnings 0 '**/resources/**/*.scss' -f json"
},
"devDependencies": {
"@babel/types": "^7.21.2",
"@fancyapps/ui": "^5.0.19",
"@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0",
"@fortawesome/free-solid-svg-icons": "^6.4.0",
"@fancyapps/ui": "^5.0.24",
"@fortawesome/fontawesome-svg-core": "latest",
"@fortawesome/free-brands-svg-icons": "latest",
"@fortawesome/free-regular-svg-icons": "latest",
"@fortawesome/free-solid-svg-icons": "latest",
"@fortawesome/vue-fontawesome": "^3.0.3",
"@ldc-web/cookie-notice": "^3.0.8",
"@rushstack/eslint-patch": "^1.3.2",
"@sipec/vue3-tags-input": "^3.0.4",
"@types/bootstrap": "^5.2.6",
"@types/bootstrap": "^5.2.7",
"@types/cropperjs": "^1.3.0",
"@types/leaflet": "^1.9.3",
"@types/toastify-js": "^1.11.1",
"@types/webpack-env": "^1.18.1",
"@typescript-eslint/eslint-plugin": "^5.60.0",
"@typescript-eslint/parser": "^5.60.0",
"@vitejs/plugin-legacy": "^4.0.1",
"@vitejs/plugin-vue": "^4.0.0",
"@vue/eslint-config-typescript": "^11.0.3",
"@vitejs/plugin-legacy": "latest",
"@vitejs/plugin-vue": "latest",
"@vue/compiler-sfc": "latest",
"@vue/eslint-config-typescript": "latest",
"@vue/tsconfig": "latest",
"axios": "^1.1.2",
"bootstrap": "^5.2.3",
"cropperjs": "^1.5.13",
"eslint": "^8.43.0",
"eslint-import-resolver-alias": "^1.1.2",
"eslint-plugin-vue": "^9.15.0",
"cropperjs": "^1.6.1",
"eslint": "latest",
"eslint-plugin-vue": "latest",
"fslightbox": "^3.4.1",
"laravel-vite-plugin": "^0.7.2",
"laravel-vite-plugin": "latest",
"leaflet": "^1.9.4",
"postcss": "^8.4.24",
"postcss-discard-comments": "^5.1.2",
"postcss-html": "^1.5.0",
"postcss-scss": "^4.0.6",
"prettier": "2.8.8",
"prettier": "latest",
"print-js": "^1.6.0",
"resolve-url-loader": "^5.0.0",
"sass": "^1.63.6",
"sass": "latest",
"slugify": "^1.6.6",
"stylelint": "^14.16.1",
"stylelint-config-idiomatic-order": "^8.1.0",
"stylelint-config-sass-guidelines": "^9.0.1",
"stylelint-config-standard-scss": "^6.1.0",
"stylelint-scss": "^4.7.0",
"stylelint-webpack-plugin": "^3.3.0",
"sweetalert2": "^11.7.12",
"stylelint-config-idiomatic-order": "github:ream88/stylelint-config-idiomatic-order",
"stylelint-config-sass-guidelines": "latest",
"stylelint-config-standard-scss": "latest",
"sweetalert2": "^11.7.32",
"terser": "latest",
"toastify-js": "^1.12.0",
"ts-loader": "^9.4.3",
"typescript": "^4.9.5",
"typescript-eslint": "^0.0.1-alpha.0",
"vite": "^4.0.0",
"vite-plugin-checker": "^0.5.6",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-stylelint": "^4.2.0",
"vue": "^3.2.38",
"vue-eslint-parser": "^9.3.1",
"vue-loader": "^16.8.3",
"vue-tsc": "^1.8.1",
"typescript": "latest",
"vite-plugin-checker": "latest",
"vite-plugin-eslint": "latest",
"vite-plugin-stylelint": "latest",
"vue": "latest",
"vue-tsc": "1.6.0",
"vue3-nestable": "^3.0.3"
}
}

View file

@ -96,10 +96,10 @@
border-width: 1px;
border-style: solid;
border-color: #0073aa #006799 #006799;
border-radius: 3px;
margin: 0;
appearance: none;
background: #0085ba;
border-radius: 3px;
box-shadow: 0 1px 0 #006799;
color: #fff;
cursor: pointer;

View file

@ -213,7 +213,7 @@ $dkmoonlight: "DK Moonlight Serenade";
}
}
@media screen and (min-width: 992px) {
@media screen and (width >= 992px) {
.font-amatic {
&-before::before {
display: block;

View file

@ -5,10 +5,10 @@
@import "utilities/bootstrap-variables";
// 2. Include functions first (so you can manipulate colors, SVGs, calc, etc)
@import "~bootstrap/scss/functions";
@import "~/bootstrap/scss/functions";
// 3. Include remainder of required Bootstrap stylesheets
@import "~bootstrap/scss/variables";
@import "~/bootstrap/scss/variables";
// * Laravel mail vendor
@ -146,8 +146,8 @@ p {
-premailer-width: 100%;
width: 100%;
padding: 0;
border-top: 1px solid $bg-lightened;
border-bottom: 1px solid $bg-lightened;
border-top: 1px solid #{$bg-lightened};
border-bottom: 1px solid #{$bg-lightened};
margin: 0;
background-color: $bg-lightened;
-premailer-cellpadding: 0;
@ -160,9 +160,9 @@ p {
padding: 0;
border-width: 1px;
border-color: color.scale($body-bg, $lightness: -30%);
border-radius: 2px;
margin: 0 auto;
background-color: $body-bg;
border-radius: 2px;
box-shadow: 0 2px 0 rgb(0 0 150 / 2.5%), 2px 4px 0 rgb(0 0 150 / 1.5%);
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
@ -255,29 +255,29 @@ p {
.button-blue,
.button-primary {
border-top: 8px solid $color-primary;
border-right: 18px solid $color-primary;
border-bottom: 8px solid $color-primary;
border-left: 18px solid $color-primary;
background-color: $color-primary;
border-top: 8px solid #{$color-primary};
border-right: 18px solid #{$color-primary};
border-bottom: 8px solid #{$color-primary};
border-left: 18px solid #{$color-primary};
background-color: #{$color-primary};
}
.button-green,
.button-success {
border-top: 8px solid $color-success;
border-right: 18px solid $color-success;
border-bottom: 8px solid $color-success;
border-left: 18px solid $color-success;
background-color: $color-success;
border-top: 8px solid #{$color-success};
border-right: 18px solid #{$color-success};
border-bottom: 8px solid #{$color-success};
border-left: 18px solid #{$color-success};
background-color: #{$color-success};
}
.button-red,
.button-error {
border-top: 8px solid $color-danger;
border-right: 18px solid $color-danger;
border-bottom: 8px solid $color-danger;
border-left: 18px solid $color-danger;
background-color: $color-danger;
border-top: 8px solid #{$color-danger};
border-right: 18px solid #{$color-danger};
border-bottom: 8px solid #{$color-danger};
border-left: 18px solid #{$color-danger};
background-color: #{$color-danger};
}
/* Panels */

View file

@ -1,15 +1,15 @@
.search {
.form-control {
padding-left: 40px;
border-radius: 30px 0 0 30px;
background-image: url("@/images/location-arrow.png");
background-position: left 10px center;
background-repeat: no-repeat;
border-radius: 30px 0 0 30px;
}
.btn {
background-color: $red;
border-radius: 0 30px 30px 0;
background-color: $red;
color: $white;
}
}

View file

@ -12,6 +12,6 @@
h3 {
padding-right: 70px;
border-bottom: 1px solid $gray-300;
border-bottom: 1px solid #{$gray-300};
}
}

View file

@ -22,7 +22,7 @@
}
}
@media screen and (max-width: 992px) {
@media screen and (width <= 992px) {
.steps .steps-list {
justify-content: space-between;
}

View file

@ -91,11 +91,8 @@
.dropdown-menu .dropdown-item {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: transparent;
inset: 0;
}
.dropdown-toggle::after {
@ -114,8 +111,8 @@
left: 0;
width: 47px;
height: 3px;
background-color: $red;
border-radius: 4px;
background-color: $red;
content: "";
}
@ -203,7 +200,7 @@
// END FORM
@media screen and (min-width: 1400px) {
@media screen and (width >= 1400px) {
.navbar {
.navbar-collapse {
margin-top: -25px;
@ -216,7 +213,7 @@
}
}
@media screen and (min-width: 992px) {
@media screen and (width >= 992px) {
.navbar-brand {
position: relative;
z-index: 10;
@ -257,8 +254,8 @@
display: flex;
flex-direction: row;
border: 0 none;
background-color: transparent;
border-radius: 0;
background-color: transparent;
}
}
@ -283,20 +280,20 @@
}
}
@media (min-width: 992px) and (max-width: 1400px) {
@media (width >= 992px) and (width <= 1400px) {
.nav-item:nth-child(-n + 3)::after {
margin-right: 8px;
margin-left: 8px;
}
}
@media (min-width: 790px) and (max-width: 1200px) {
@media (width >= 790px) and (width <= 1200px) {
.navbar {
margin-top: 14px;
}
}
@media screen and (max-width: 992px) {
@media screen and (width <= 992px) {
.navbar .dropdown-menu li {
display: flex;
align-items: center;

View file

@ -91,13 +91,13 @@
}
}
@media screen and (min-width: 1200px) {
@media screen and (width >= 1200px) {
.hero-content {
position: absolute;
}
}
@media screen and (min-width: 992px) {
@media screen and (width >= 992px) {
.hero {
&_left {
padding-right: 45px;
@ -120,7 +120,7 @@
}
}
@media screen and (max-width: 1305px) {
@media screen and (width <= 1305px) {
.hero {
&_left {
padding-right: 30px;
@ -140,7 +140,7 @@
}
}
@media screen and (max-width: 768px) {
@media screen and (width <= 768px) {
.hero {
> img {
display: none;

View file

@ -17,7 +17,7 @@
}
}
@media screen and (min-width: 992px) {
@media screen and (width >= 992px) {
.local {
h2::after {
position: absolute;
@ -39,7 +39,7 @@
}
}
@media screen and (max-width: 991px) {
@media screen and (width <= 991px) {
.local > div:first-of-type {
text-align: center;
}

View file

@ -34,13 +34,13 @@
left: 0;
width: 47px;
height: 3px;
background-color: $red;
border-radius: 4px;
background-color: $red;
content: "";
}
}
@media screen and (max-width: 991px) {
@media screen and (width <= 991px) {
.navigation nav,
#navbar-supported-content {
position: absolute;
@ -79,21 +79,21 @@
}
}
@media screen and (min-width: 768px) {
@media screen and (width >= 768px) {
.navigation nav,
#navbar-supported-content {
top: 93px;
}
}
@media screen and (max-width: 767px) {
@media screen and (width <= 767px) {
.navigation nav,
#navbar-supported-content {
top: 65px;
}
}
@media screen and (min-width: 992px) {
@media screen and (width >= 992px) {
#menu-btn {
display: none;
}

View file

@ -9,7 +9,7 @@
}
}
@media screen and (min-width: 992px) {
@media screen and (width >= 992px) {
.reassurances {
&::before {
position: absolute;

View file

@ -39,7 +39,7 @@
}
}
@media screen and (min-width: 769px) {
@media screen and (width >= 769px) {
.site-footer {
&::before {
position: absolute;

View file

@ -6,7 +6,7 @@
left: 0;
}
@media screen and (max-width: 991px) {
@media screen and (width <= 991px) {
.site-header {
background-color: $white;
}

View file

@ -19,7 +19,7 @@
.socials {
padding-top: 8px;
padding-bottom: 8px;
border-top: 1px solid $gray-300;
border-bottom: 1px solid $gray-300;
border-top: 1px solid #{$gray-300};
border-bottom: 1px solid #{$gray-300};
}
}

View file

@ -10,8 +10,8 @@
z-index: 1;
width: 30px;
height: 30px;
background-color: $red;
border-radius: 50%;
background-color: $red;
content: "";
}
@ -22,7 +22,7 @@
height: 0;
border-top: 6px solid transparent;
border-bottom: 6px solid transparent;
border-left: 6px solid $white;
border-left: 6px solid #{$white};
content: "";
}
}

View file

@ -1,3 +1,5 @@
@use "sass:color";
a {
text-decoration: none;
}
@ -14,7 +16,7 @@ a {
}
.bckg-yellow {
background-color: rgba($yellow, 0.9);
background-color: rgba(color.red($yellow), color.green($yellow), color.blue($yellow), 90%);
}
.bckg-yellow:not(.opacity) {
@ -22,7 +24,7 @@ a {
}
.bckg-red {
background-color: rgba($red, 0.9);
background-color: rgba(color.red($red), color.green($red), color.blue($red), 90%);
.btn.btn-primary {
border-color: $white;
@ -62,7 +64,7 @@ h2 span {
}
.separator {
border: 1px solid $gray-300;
border: 1px solid #{$gray-300};
content: "";
}
@ -119,7 +121,7 @@ h2 span {
.section {
padding-bottom: 6px;
border-bottom: 1px solid $gray-400;
border-bottom: 1px solid #{$gray-400};
&.fw-bold {
font-size: 20px;
@ -145,9 +147,9 @@ ol:not(.breadcrumb) li::before {
height: 28px;
align-items: center;
justify-content: center;
border-radius: 50%;
margin-right: 10px;
background-color: $yellow;
border-radius: 50%;
color: $white;
content: counter(my-awesome-counter) "";
}
@ -193,7 +195,7 @@ li strong {
object-position: top;
}
@media screen and (min-width: 1200px) {
@media screen and (width >= 1200px) {
.navbar-brand {
width: 260px;
max-width: 260px;
@ -424,7 +426,7 @@ li strong {
}
}
@media screen and (min-width: 576px) {
@media screen and (width >= 576px) {
.stripes {
position: relative;
z-index: 1;
@ -457,7 +459,7 @@ li strong {
}
}
@media screen and (min-width: 769px) {
@media screen and (width >= 769px) {
.special {
&::before {
position: absolute;
@ -481,7 +483,7 @@ li strong {
}
}
@media (min-width: 790px) and (max-width: 1200px) {
@media (width >= 790px) and (width <= 1200px) {
.navbar .container {
.nav-link {
padding-right: 0;
@ -490,7 +492,7 @@ li strong {
}
}
@media (min-width: 1200px) and (max-width: 1399px) {
@media (width >= 1200px) and (width <= 1399px) {
.about-two {
> div::after {
position: absolute;
@ -520,7 +522,7 @@ li strong {
}
}
@media (min-width: 993px) and (max-width: 1199px) {
@media (width >= 993px) and (width <= 1199px) {
.about-two {
> div::after {
position: absolute;
@ -550,7 +552,7 @@ li strong {
}
}
@media screen and (max-width: 1200px) {
@media screen and (width <= 1200px) {
.navbar-brand {
width: 19%;
max-width: 19%;

View file

@ -62,5 +62,5 @@
/// @param {Length} $height
@mixin size-fract($width, $fract: 4 / 3) {
width: $width;
height: calc($width / $fract);
height: calc(#{$width} / #{$fract});
}

View file

@ -2,43 +2,43 @@
@import "./../utilities/bootstrap-variables";
// 2. Include functions first (so you can manipulate colors, SVGs, calc, etc)
@import "~/bootstrap/scss/functions";
@import "bootstrap/scss/functions";
// 3. Include remainder of required Bootstrap stylesheets
@import "~/bootstrap/scss/variables";
@import "~/bootstrap/scss/variables-dark";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
// 4. Include remainder of required parts
@import "~/bootstrap/scss/maps";
@import "~/bootstrap/scss/mixins";
@import "~/bootstrap/scss/root";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/root";
// 5. Optionally include any other parts as needed
@import "~/bootstrap/scss/alert";
@import "~/bootstrap/scss/buttons";
@import "~/bootstrap/scss/button-group";
@import "~/bootstrap/scss/containers";
@import "~/bootstrap/scss/dropdown";
@import "~/bootstrap/scss/forms";
@import "~/bootstrap/scss/grid";
@import "~/bootstrap/scss/helpers";
@import "~/bootstrap/scss/images";
@import "~/bootstrap/scss/list-group";
@import "~/bootstrap/scss/nav";
@import "~/bootstrap/scss/navbar";
@import "~/bootstrap/scss/pagination";
@import "~/bootstrap/scss/spinners";
@import "~/bootstrap/scss/reboot";
@import "~/bootstrap/scss/tables";
@import "~/bootstrap/scss/tooltip";
@import "~/bootstrap/scss/transitions";
@import "~/bootstrap/scss/type";
@import "~/bootstrap/scss/utilities";
@import "~/bootstrap/scss/close";
@import "~/bootstrap/scss/breadcrumb";
@import "bootstrap/scss/alert";
@import "bootstrap/scss/buttons";
@import "bootstrap/scss/button-group";
@import "bootstrap/scss/containers";
@import "bootstrap/scss/dropdown";
@import "bootstrap/scss/forms";
@import "bootstrap/scss/grid";
@import "bootstrap/scss/helpers";
@import "bootstrap/scss/images";
@import "bootstrap/scss/list-group";
@import "bootstrap/scss/nav";
@import "bootstrap/scss/navbar";
@import "bootstrap/scss/pagination";
@import "bootstrap/scss/spinners";
@import "bootstrap/scss/reboot";
@import "bootstrap/scss/tables";
@import "bootstrap/scss/tooltip";
@import "bootstrap/scss/transitions";
@import "bootstrap/scss/type";
@import "bootstrap/scss/utilities";
@import "bootstrap/scss/close";
@import "bootstrap/scss/breadcrumb";
// 6. Optionally include utilities API last to generate classes based on the Sass map in `_utilities.scss`
@import "~/bootstrap/scss/utilities/api";
@import "bootstrap/scss/utilities/api";
// 7 Overload bootstrap classes
@import "./../utilities/bootstrap-custom";

View file

@ -9,7 +9,6 @@
@import "~/bootstrap/scss/functions";
@import "~/bootstrap/scss/variables";
@import "~/bootstrap/scss/variables-dark";
@import "~/bootstrap/scss/maps";
@import "~/bootstrap/scss/mixins";
@import "~/bootstrap/scss/root";

View file

@ -1,13 +0,0 @@
// ASSETS
import.meta.glob(["./../assets/images/**"]);
// UTILITIES
import "./utilities/bootstrap";
import "./utilities/fontawesome";
// MODULES
import "./modules/sweetalert";
// CUSTOM
import "./bo/common";
import "./bo/vue-bo";

View file

@ -0,0 +1,48 @@
import type { SweetAlertResult } from "sweetalert2";
import sweetalert from "../../modules/sweetalertConfirm";
window.addEventListener("DOMContentLoaded", () => {
/**
* Popup delete item.
*/
const elements = document.getElementsByClassName(
"confirmDeleteTS"
) as HTMLCollectionOf<Element>;
for (const element of elements) {
element.addEventListener("submit", function (e) {
e.preventDefault();
const el = e.target;
if (!el || !(el instanceof HTMLFormElement)) {
throw new Error(
"confirmDoneJS can only be executed on an exising form"
);
}
sweetalert.methods.confirm(
"Êtes-vous sûr ?",
"Toutes les données vont être perdu",
el as HTMLFormElement,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function (response: SweetAlertResult<any>) {
(el as HTMLFormElement).submit();
},
{ icon: "warning" }
);
return false;
});
}
});
document.addEventListener("DOMContentLoaded", function () {
const formSubmit = document.getElementById(
"formSubmit"
) as HTMLFormElement | null,
formSubmitClone = document.getElementById(
"formSubmitClone"
) as HTMLButtonElement | null;
if (formSubmit && formSubmitClone) {
formSubmitClone.addEventListener("click", (event) => {
event.preventDefault();
formSubmit.submit();
});
}
});

15
resources/ts/bo/bo.ts Normal file
View file

@ -0,0 +1,15 @@
// ASSETS
/// <reference types="vite/client" />
import.meta.glob(["./../../assets/images/**"]);
// UTILITIES
import "./utilities/bootstrap";
import "./utilities/fontawesome";
import "./utilities/vue-bo";
// MODULES
import "../modules/sweetalert";
// CUSTOM
import "./base/common";

View file

@ -1,14 +0,0 @@
document.addEventListener("DOMContentLoaded", function () {
const formSubmit = document.getElementById(
"formSubmit"
) as HTMLFormElement | null,
formSubmitClone = document.getElementById(
"formSubmitClone"
) as HTMLButtonElement | null;
if (formSubmit && formSubmitClone) {
formSubmitClone.addEventListener("click", (event) => {
event.preventDefault();
formSubmit.submit();
});
}
});

View file

@ -0,0 +1,21 @@
import axios from "axios";
import * as bootstrap from "bootstrap";
import bsTooltips from "./../../modules/bsTooltips";
/**
* We'll load the axios HTTP library which allows us to easily issue requests
* to our Laravel back-end. This library automatically handles sending the
* CSRF token as a header based on the value of the "XSRF" token cookie.
*/
axios.defaults.headers.common = {
Accept: "application/json, text/plain, */*",
"X-Requested-With": "XMLHttpRequest",
"X-CSRF-TOKEN": document
.querySelector("meta[name=\"csrf-token\"]")!
.getAttribute("content"),
};
window.axios = axios;
window.bootstrap = bootstrap;
bsTooltips.methods.initTooltips();

View file

@ -0,0 +1,92 @@
import { config, dom, library } from "@fortawesome/fontawesome-svg-core";
import {
faArrowAltCircleDown,
faArrowAltCircleUp,
faArrowDown,
faArrowLeft,
faArrowLeftLong,
faArrowRight,
faArrowRightFromBracket,
faArrowUp,
faArrowsAltH,
faArrowsAltV,
faBackspace,
faBan,
faCheck,
faChevronLeft,
faChevronRight,
faCircleCheck,
faCircleExclamation,
faCircleInfo,
faCircleNotch,
faCircleXmark,
faCopy,
faCrop,
faEraser,
faEye,
faEyeSlash,
faFolderOpen,
faListUl,
faPaintRoller,
faPencil,
faPlus,
faQuestionCircle,
faRedoAlt,
faSearch,
faSearchMinus,
faSearchPlus,
faSliders,
faSyncAlt,
faTimes,
faTrash,
faUndoAlt,
faWandMagic
} from "@fortawesome/free-solid-svg-icons";
config.autoReplaceSvg = false;
library.add(faEraser);
library.add(faArrowLeftLong);
library.add(faPlus);
library.add(faTrash);
library.add(faEye);
library.add(faEyeSlash);
library.add(faFolderOpen);
library.add(faCrop);
library.add(faQuestionCircle);
library.add(faCheck);
library.add(faUndoAlt);
library.add(faRedoAlt);
library.add(faSyncAlt);
library.add(faSearchPlus);
library.add(faSearchMinus);
library.add(faArrowLeft);
library.add(faArrowRight);
library.add(faArrowUp);
library.add(faArrowDown);
library.add(faArrowsAltH);
library.add(faArrowsAltV);
library.add(faWandMagic);
library.add(faPencil);
library.add(faTimes);
library.add(faBackspace);
library.add(faSearch);
library.add(faArrowRightFromBracket);
library.add(faArrowAltCircleDown);
library.add(faArrowAltCircleUp);
library.add(faCircleCheck);
library.add(faCircleXmark);
library.add(faCopy);
library.add(faListUl);
library.add(faBan);
library.add(faCircleExclamation);
library.add(faCircleInfo);
library.add(faPaintRoller);
// Front
library.add(faChevronLeft);
library.add(faChevronRight);
library.add(faCircleXmark);
library.add(faCircleNotch);
library.add(faSliders);
dom.watch();

View file

@ -1,4 +1,5 @@
import { App, Component, createApp } from "vue";
import type { App, Component } from "vue";
import { createApp } from "vue";
document.addEventListener("DOMContentLoaded", () => {
const setupApp = (app: App<Element>) => {
@ -7,7 +8,8 @@ document.addEventListener("DOMContentLoaded", () => {
};
// Register components
const vues = import.meta.glob("./../bo/components/*.vue") as Record<
/// <reference types="vite/client" />
const vues = import.meta.glob("./../components/*.vue") as Record<
string,
() => Promise<{ default: Component }>
>;

View file

@ -1,9 +1,11 @@
// ASSETS
import.meta.glob(["./../assets/images/**"]);
/// <reference types="vite/client" />
import.meta.glob(["./../../assets/images/**"]);
// UTILITIES
import "./utilities/bootstrap";
import "./utilities/fontawesome";
import "./utilities/vue-fo";
// LDCWEB Cookies
import CookieNotice from "@ldc-web/cookie-notice";
@ -17,6 +19,6 @@ window.Fancybox = Fancyapps.Fancybox;
import "fslightbox";
// CUSTOM
import "./fo/common";
import "./fo/burgermenu";
import "./fo/vue-fo";
import "./base/common";
import "./burgermenu";

View file

@ -0,0 +1,21 @@
import axios from "axios";
import * as bootstrap from "bootstrap";
import bsTooltips from "./../../modules/bsTooltips";
/**
* We'll load the axios HTTP library which allows us to easily issue requests
* to our Laravel back-end. This library automatically handles sending the
* CSRF token as a header based on the value of the "XSRF" token cookie.
*/
axios.defaults.headers.common = {
Accept: "application/json, text/plain, */*",
"X-Requested-With": "XMLHttpRequest",
"X-CSRF-TOKEN": document
.querySelector("meta[name=\"csrf-token\"]")!
.getAttribute("content"),
};
window.axios = axios;
window.bootstrap = bootstrap;
bsTooltips.methods.initTooltips();

View file

@ -0,0 +1,90 @@
import { dom, library, config } from "@fortawesome/fontawesome-svg-core";
import {
faEraser,
faArrowLeftLong,
faPlus,
faTrash,
faEye,
faFolderOpen,
faCrop,
faQuestionCircle,
faCheck,
faUndoAlt,
faRedoAlt,
faSyncAlt,
faSearchPlus,
faSearchMinus,
faArrowLeft,
faArrowRight,
faArrowUp,
faArrowDown,
faArrowsAltH,
faArrowsAltV,
faWandMagic,
faPencil,
faTimes,
faBackspace,
faSearch,
faArrowRightFromBracket,
faArrowAltCircleDown,
faArrowAltCircleUp,
faChevronLeft,
faChevronRight,
faCircleNotch,
faSliders,
faCircleCheck,
faCircleXmark,
faCopy,
faListUl,
faBan,
faEyeSlash,
faCircleExclamation,
faCircleInfo
} from "@fortawesome/free-solid-svg-icons";
config.autoReplaceSvg = false;
library.add(faEraser);
library.add(faArrowLeftLong);
library.add(faPlus);
library.add(faTrash);
library.add(faEye);
library.add(faEyeSlash);
library.add(faFolderOpen);
library.add(faCrop);
library.add(faQuestionCircle);
library.add(faCheck);
library.add(faUndoAlt);
library.add(faRedoAlt);
library.add(faSyncAlt);
library.add(faSearchPlus);
library.add(faSearchMinus);
library.add(faArrowLeft);
library.add(faArrowRight);
library.add(faArrowUp);
library.add(faArrowDown);
library.add(faArrowsAltH);
library.add(faArrowsAltV);
library.add(faWandMagic);
library.add(faPencil);
library.add(faTimes);
library.add(faBackspace);
library.add(faSearch);
library.add(faArrowRightFromBracket);
library.add(faArrowAltCircleDown);
library.add(faArrowAltCircleUp);
library.add(faCircleCheck);
library.add(faCircleXmark);
library.add(faCopy);
library.add(faListUl);
library.add(faBan);
library.add(faCircleExclamation);
library.add(faCircleInfo);
// Front
library.add(faChevronLeft);
library.add(faChevronRight);
library.add(faCircleXmark);
library.add(faCircleNotch);
library.add(faSliders);
dom.watch();

View file

@ -1,4 +1,5 @@
import { App, Component, createApp } from "vue";
import type { App, Component } from "vue";
import { createApp } from "vue";
document.addEventListener("DOMContentLoaded", () => {
const setupApp = (app: App<Element>) => {
@ -7,7 +8,8 @@ document.addEventListener("DOMContentLoaded", () => {
};
// Register components
const vues = import.meta.glob("./../fo/components/*.vue") as Record<
/// <reference types="vite/client" />
const vues = import.meta.glob("./../components/*.vue") as Record<
string,
() => Promise<{ default: Component }>
>;

View file

@ -1,4 +1,4 @@
import { SweetAlertResult } from "sweetalert2";
import type { SweetAlertResult } from "sweetalert2";
import confirm from "./sweetalertConfirm";
window.addEventListener("DOMContentLoaded", () => {

View file

@ -1,6 +1,6 @@
// SweetAlert
import Swal, { SweetAlertResult } from "sweetalert2";
import { SweetAlertOptions } from "sweetalert2";
import type { SweetAlertOptions, SweetAlertResult } from "sweetalert2";
import Swal from "sweetalert2";
import * as trans from "../modules/trans";
@ -23,6 +23,7 @@ export default {
Swal.fire({
title: title,
text: text,
color: getComputedStyle(document.body).getPropertyValue("--bs-body-color"),
icon: icon,
showCancelButton: true,
confirmButtonText:
@ -34,10 +35,11 @@ export default {
reverseButtons: true,
// * Bootstrap Styling
customClass: {
confirmButton: "btn btn-lg btn-success ms-3 me-3",
cancelButton: "btn btn-lg btn-danger ms-3 me-3",
confirmButton: "btn btn-primary mx-1",
cancelButton: "btn btn-danger mx-1",
},
buttonsStyling: false,
background: getComputedStyle(document.body).getPropertyValue("--bs-body-bg"),
}).then((result) => {
if (result.isConfirmed) {
if (after) {
@ -51,12 +53,14 @@ export default {
title: trans.default.methods.__(
"L'opération n'as pas été effectuée"
),
color: getComputedStyle(document.body).getPropertyValue("--bs-body-color"),
confirmButtonText: trans.default.methods.__("Ok"),
// * Bootstrap Styling
customClass: {
confirmButton: "btn btn-lg btn-primary",
confirmButton: "btn btn-primary",
},
buttonsStyling: false,
background: getComputedStyle(document.body).getPropertyValue("--bs-body-bg"),
});
}
});
@ -73,12 +77,14 @@ export default {
Swal.fire({
title: title,
text: text,
color: getComputedStyle(document.body).getPropertyValue("--bs-body-color"),
icon: icon,
// * Bootstrap Styling
customClass: {
confirmButton: "btn btn-lg btn-primary",
},
buttonsStyling: false,
background: getComputedStyle(document.body).getPropertyValue("--bs-body-bg"),
}).then((result) => {
if (after) {
if (self) {

View file

@ -1,5 +1,5 @@
import Toastify from "toastify-js";
import { Options } from "toastify-js";
import type { Options } from "toastify-js";
import * as Toastify from "toastify-js";
export default {
methods: {
@ -22,7 +22,7 @@ export default {
stopOnFocus: true,
};
options.text = message;
Toastify(options).showToast();
Toastify.default(options).showToast();
},
notify(message: string, duration = 4000): void {
this.toast(message, duration, "notifications");

View file

@ -11,12 +11,12 @@
<a class="navbar-brand rounded px-2 py-1" href="{{ url('/') }}">
{{ config('app.name', 'Laravel') }}
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"
<button class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" type="button"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<div class="navbar-collapse collapse" id="navbarSupportedContent">
<!-- Left Side Of Navbar -->
@include('bo.layouts.nav-menu')
@ -24,38 +24,40 @@
<ul class="navbar-nav ms-auto">
<!-- Authentication Links -->
@guest('backend')
@if (Route::has('bo.login'))
<li class="nav-item">
<a class="nav-link" href="{{ route('bo.login') }}">{{ __('Connexion') }}</a>
</li>
@endif
@if (Route::has('bo.login'))
<li class="nav-item">
<a class="nav-link" href="{{ route('bo.login') }}">{{ __('Connexion') }}</a>
</li>
@endif
@if (Route::has('bo.register'))
<li class="nav-item">
<a class="nav-link" href="{{ route('bo.register') }}">{{ __('Créer un compte') }}</a>
</li>
@endif
@if (Route::has('bo.register'))
<li class="nav-item">
<a class="nav-link" href="{{ route('bo.register') }}">{{ __('Créer un compte') }}</a>
</li>
@endif
@endguest
@auth('backend')
<li class="nav-item dropdown">
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{ auth('backend')->user()->firstname }}&nbsp;{{ auth('backend')->user()->lastname}} <span class="caret"></span>
</a>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" id="navbarDropdown" data-bs-toggle="dropdown" href="#" role="button"
aria-haspopup="true" aria-expanded="false">
{{ auth('backend')->user()->firstname }}&nbsp;{{ auth('backend')->user()->lastname }} <span
class="caret"></span>
</a>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
<form action="{{ route('bo.logout') }}" method="POST" class="text-center">
@csrf
<button class="btn btn-link p-0 text-decoration-none text-muted text-capitalize" type="submit">{{ __('Déconnexion') }}</button>
</form>
</div>
</li>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
<form class="text-center" action="{{ route('bo.logout') }}" method="POST">
@csrf
<button class="btn btn-link text-decoration-none text-muted text-capitalize p-0"
type="submit">{{ __('Déconnexion') }}</button>
</form>
</div>
</li>
@endauth
</ul>
</div>
</div>
</nav>
<main class="container-fluid pt-2 @yield('bg-color')">
<main class="container-fluid @yield('bg-color') pt-2">
<div class="row justify-content-center">
<div class="col col-md-6">
@include('modules.flash-messages')
@ -67,14 +69,14 @@
</div>
</div>
<div class="row p-md-3 justify-content-center">
<div class="col-12 col-md-10 col-lg-8 pt-3 p-md-0">
<div class="col-12 col-md-10 col-lg-8 p-md-0 pt-3">
@yield('content')
</div>
</div>
</main>
@stack('scripts-constants')
@include('modules.script-constants')
@vite(['resources/ts/bo.ts'])
@vite(['resources/ts/bo/bo.ts'])
@stack('scripts')
</body>

View file

@ -8,7 +8,7 @@
<body>
@include('fo.layouts.header')
<main class="container-fluid p-0 @yield('bg-color')">
<main class="container-fluid @yield('bg-color') p-0">
@yield('content')
</main>
@ -18,8 +18,8 @@
@stack('script-constants')
@include('modules.script-constants')
@include('modules.script-routes')
@vite(['resources/ts/fo.ts'])
@vite(['resources/ts/fo/fo.ts'])
@stack('scripts')
</body>
</html>
</html>

View file

@ -6,19 +6,21 @@
@section('canonical', route('ranges.products', ['publishedRange' => $publishedRange]))
@section('breadcrumb', request()->route()->getName())
@section('breadcrumb',
request()->route()->getName())
@section('content')
<div class="g-0 pb-md-5 position-relative hero">
<img src="{{ Vite::asset('resources/assets/images/100LOCAL-V1.png') }}" alt="Logo 100% local" class="img-fluid">
<img class="img-fluid" src="{{ Vite::asset('resources/assets/images/100LOCAL-V1.png') }}" alt="Logo 100% local">
<div class="position-relative hero-fix-height">
<img src="{{ Vite::asset('resources/assets/images/Panoramique2.jpg') }}" alt="Des saucisses de volailles cuites accompagnées de salade, d'oignons et de tomates cerise" class="img-fluid">
<img class="img-fluid w-100" src="{{ asset($publishedRange->banner) }}" title="{{ $publishedRange->banner_title }}"
alt="{{ $publishedRange->banner_alt }}">
</div>
<!-- breadcrumb -->
<div class="container breadcrumb-obj small mt-3">
<div class="breadcrumb-obj small container mt-3">
<div class="row">
<div class="col-12 d-flex ">
<div class="col-12 d-flex">
<p class="fst-italic me-2">Vous êtes ici</p>
@include('modules/breadcrumb/breadcrumb-body', ['brParam' => $publishedRange])
</div>
@ -27,7 +29,7 @@
<!-- END breadcrumb -->
</div>
<div class="container-fluid pt-5 position-relative bckg-illustration bckg-illustration--fromage bckg-illustration--tomates">
<div class="container-fluid position-relative bckg-illustration bckg-illustration--fromage bckg-illustration--tomates pt-5">
<div class="row">
<div class="col-md-8 offset-md-2">
<div class="container">
@ -41,15 +43,18 @@
<!-- FICHES PRODUIT -->
<div class="row mt-4 text-center">
@foreach ($products as $product)
<div class="col-md-4 product-item mb-5">
<div class="card">
<img src="{{ asset($product->sticker) }}" alt="{{ $product->sticker_alt }}" title="{{ $product->sticker_title }}" class="card-img-top">
<div class="card-body">
<h3 class="card-title text-uppercase font-amatic font-amatic-46 mt-4">{{ $product->name }}</h3>
<a href="{{ route('products.show', ['publishedProduct' => $product]) }}" title="{{ $product->name }}" class="btn btn-primary text-uppercase">{{ __('Découvrir >') }}</a>
<div class="col-md-4 product-item mb-5">
<div class="card">
<img class="card-img-top" src="{{ asset($product->sticker) }}" title="{{ $product->sticker_title }}"
alt="{{ $product->sticker_alt }}">
<div class="card-body">
<h3 class="card-title text-uppercase font-amatic font-amatic-46 mt-4">{{ $product->name }}</h3>
<a class="btn btn-primary text-uppercase"
href="{{ route('products.show', ['publishedProduct' => $product]) }}"
title="{{ $product->name }}">{{ __('Découvrir >') }}</a>
</div>
</div>
</div>
</div>
@endforeach
</div>

View file

@ -1,11 +1,11 @@
import legacy from "@vitejs/plugin-legacy";
import vue from "@vitejs/plugin-vue";
import laravel from "laravel-vite-plugin";
import path from "path";
import { defineConfig } from "vite";
import checker from "vite-plugin-checker";
import eslint from "vite-plugin-eslint";
import laravel from "laravel-vite-plugin";
import legacy from "@vitejs/plugin-legacy";
import path from "path";
import stylelint from "vite-plugin-stylelint";
import vue from "@vitejs/plugin-vue";
export default defineConfig({
build: {
@ -22,7 +22,6 @@ export default defineConfig({
}[hash].[ext]`,
},
},
chunkSizeWarningLimit: 700,
emptyOutDir: true,
sourcemap: process.env.NODE_ENV === "local" ? "inline" : false,
},
@ -62,9 +61,9 @@ export default defineConfig({
laravel({
input: [
"resources/sass/bo/bo.scss",
"resources/ts/bo.ts",
"resources/ts/bo/bo.ts",
"resources/sass/fo/fo.scss",
"resources/ts/fo.ts",
"resources/ts/fo/fo.ts",
],
}),
stylelint({
@ -74,12 +73,7 @@ export default defineConfig({
chokidar: true,
quiet: false,
include: ["**/resources/**/*.scss", "**/resources/**/*.css"],
exclude: [
"**/node_modules/**/*.scss",
"**/node_modules/**/*.css",
"**/vendor/**/*.scss",
"**/vendor/**/*.css",
],
exclude: ["node_modules", "vendor"],
lintOnStart: false,
emitError: true,
emitWarning: true,
@ -90,6 +84,7 @@ export default defineConfig({
cache: false,
extensions: ["js", "ts"],
include: "**/*.ts",
exclude: ["node_modules", "vendor"],
lintOnStart: false,
emitWarning: true,
emitError: true,
@ -97,7 +92,8 @@ export default defineConfig({
failOnError: false,
}),
vue({
isProduction: process.env.NODE_ENV !== "development" ? true : false,
isProduction: process.env.NODE_ENV !== "local" ? true : false,
exclude: ["node_modules", "vendor"],
}),
legacy({
targets: "last 3 version, not dead, >0.3%",