diff --git a/.gitignore b/.gitignore index d4820f92..84901990 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,5 @@ Homestead.json Homestead.yaml Thumbs.db .npmrc +bootstrap/ssr +public/favicon-back diff --git a/Ssr-Dockerfile b/Ssr-Dockerfile new file mode 100644 index 00000000..ee7c8a8a --- /dev/null +++ b/Ssr-Dockerfile @@ -0,0 +1,28 @@ +FROM node:20 + +WORKDIR /app + +COPY package*.json ./ +RUN npm ci + +COPY resources/ resources/ +COPY vite.config.ts ./ +COPY tsconfig.json ./ + +RUN npm run build +RUN npm run build:ssr + +CMD ["node", "bootstrap/ssr/ssr.js"] + + +apiVersion: v1 +kind: Service +metadata: + name: inertia-ssr +spec: + selector: + app: inertia-ssr + ports: + - port: 13714 + targetPort: 13714 + type: ClusterIP diff --git a/app/Http/Controllers/Front/ContactController.php b/app/Http/Controllers/Front/ContactController.php new file mode 100644 index 00000000..33b59cb4 --- /dev/null +++ b/app/Http/Controllers/Front/ContactController.php @@ -0,0 +1,83 @@ +validated(); + dd($validatedData); + $messageContact = new MailContactData($validatedData); + // $contactMessage = ""; + // $hasContactError = false; + // $newsletterMessage = null; + // $hasNewsletterError = false; + + // /** @var boolean $isNewsletter */ + // $isNewsletter = isset($validatedData['newsletter']) ? $validatedData['newsletter'] : false; + + // try { + // dispatch(new SendContactMail($messageContact)) + // ->onConnection('database') + // ->onQueue('database'); + // } catch (AbortContactMailer $e) { + // Log::error('Fail to build mail from contact page', [ + // 'exception' => $e + // ]); + // $hasContactError = true; + // $contactMessage = trans('Une erreur est survenue lors de l\'envoi du message de contact.'); + // } + // if ($isNewsletter) { + // try { + // SingleOptin::setStatus($request->email, true); + // $newsletterMessage = trans("Votre inscription à la newsletter a été prise en compte"); + // } catch (ApiErrorException $e) { + // if ($e->getApiError()->equals(ApiError::singleOptinCustomerExists)) { + // $newsletterMessage = trans("Vous êtes déjà inscrit avec cette adresse email"); + // } + // report($e); + // $hasNewsletterError = true; + // // phpcs:ignore Generic.Files.LineLength + // $newsletterMessage = trans('Une erreur est survenue lors de l\'inscription à la newsletter, merci de réessayer ultérieurement.'); + // } catch (CrmException $e) { + // report($e); + // $hasNewsletterError = true; + // // phpcs:ignore Generic.Files.LineLength + // $newsletterMessage = trans('Une erreur est survenue lors de l\'inscription à la newsletter, merci de réessayer ultérieurement.'); + // } + // } + // ContactCount::updateOrInsert( + // ['type' => $validatedData['enumType']], + // ['submissions' => DB::raw('submissions + 1')] + // ); + + // $contactMessage = trans('Votre message a bien été envoyé.'); + // $message = $newsletterMessage ? $contactMessage . '
' . $newsletterMessage : $contactMessage; + // return redirect()->back() + // ->with( + // $hasContactError || $hasNewsletterError ? 'info' : 'success', + // new HtmlString($message) + // ); + } +} diff --git a/app/Http/Middlewares/HandleInertiaRequests.php b/app/Http/Middlewares/HandleInertiaRequests.php index ce6b919a..0f43ff5b 100644 --- a/app/Http/Middlewares/HandleInertiaRequests.php +++ b/app/Http/Middlewares/HandleInertiaRequests.php @@ -6,6 +6,7 @@ use App\Enums\Contact\ActivitySectorEnum; use App\Enums\Contact\ObjectEnum; use Illuminate\Http\Request; use Inertia\Middleware; +use Tighten\Ziggy\Ziggy; use Uwil\LaravelCommon\Helpers\InertiaHelper; use Uwil\LaravelCommon\Support\InertiaSharedRegistry; use Uwil\LaravelDynamicPages\Enums\PageStatusEnum; @@ -41,7 +42,19 @@ class HandleInertiaRequests extends Middleware 'recaptchaKey' => config('services.google.recaptcha.public'), 'dynamicPages' => $dynamicPages, 'activitySectorEnum' => ActivitySectorEnum::toArray(), - 'objectEnum' => ObjectEnum::toArray() + 'objectEnum' => ObjectEnum::toArray(), + 'cookieEnv' => [ + "matomoSiteId" => config('cookie-notice.matomo.site_id'), + "recaptchaKey" => config('cookie-notice.google.recaptcha.public'), + "recaptchaBypassKey" => config('cookie-notice.google.recaptcha.bypassKey'), + "gaMeasurementId" => config('cookie-notice.google.analytics.id') + ], + 'ziggy' => fn (): array => [ + // Routes ziggy. + ...new Ziggy()->toArray(), + // Use for route().current() by ziggy. + 'location' => $request->url(), + ], // More props here. ]; diff --git a/app/Http/Requests/Front/Contact/ContactRequest.php b/app/Http/Requests/Front/Contact/ContactRequest.php new file mode 100644 index 00000000..078bb314 --- /dev/null +++ b/app/Http/Requests/Front/Contact/ContactRequest.php @@ -0,0 +1,36 @@ +|string> + */ + public function rules(): array + { + // ToolboxHelper::validateRecaptcha($this, \config('services.google.recaptcha.version')); + + $rules = [ + 'phone' => ['required', 'min:1', 'max:60'], + 'name' => ['required', 'min:1', 'max:60'], + 'firstName' => ['required', 'min:1', 'max:60'], + 'message' => ['required', 'min:10', 'max:255'], + 'mail' => ['required', 'min:1', 'max:60', 'email:rfc,dns,spoof'], + 'entrepriseName' => ['nullable', 'min:1', 'max:60'], + 'activitySector' => ['nullable', Rule::enum(ActivitySectorEnum::class)], + 'object' => ['required', Rule::enum(ObjectEnum::class)], + 'terms' => 'boolean', + 'optin' => 'boolean' + ]; + return $rules; + } +} diff --git a/config/cookie-notice.php b/config/cookie-notice.php new file mode 100644 index 00000000..b2a34533 --- /dev/null +++ b/config/cookie-notice.php @@ -0,0 +1,19 @@ + [ + 'recaptcha' => [ + 'public' => env('GOOGLE_RECAPTCHA_PUBLIC'), + 'private' => env('GOOGLE_RECAPTCHA_PRIVATE'), + 'version' => env('GOOGLE_RECAPTCHA_VERSION', "3") === "3" ? true : false, + 'bypassKey' => "bypass" + ], + 'analytics' => [ + 'id' => env('GOOGLE_ANALYTICS_ID') + ] + ], + + 'matomo' => [ + 'site_id' => env('MATOMO_SITE_ID') + ] +]; diff --git a/config/services.php b/config/services.php index 12df8ee2..f32e12f1 100644 --- a/config/services.php +++ b/config/services.php @@ -35,11 +35,5 @@ return [ ], ], - 'google' => [ - 'recaptcha' => [ - 'public' => env('GOOGLE_RECAPTCHA_PUBLIC'), - 'private' => env('GOOGLE_RECAPTCHA_PRIVATE'), - 'version' => env('GOOGLE_RECAPTCHA_VERSION', "3") === "3" ? true : false - ] - ], + ]; diff --git a/lang/de/cookie-notice.php b/lang/de/cookie-notice.php new file mode 100644 index 00000000..4041ef8a --- /dev/null +++ b/lang/de/cookie-notice.php @@ -0,0 +1,55 @@ + 'Cookies', + 'banner_text' => 'We use cookies to ensure the proper functioning of our site and for analytical purposes. + You can change your mind at any time by clicking on the icon on any page of our site. + By authorizing these third-party services, you agree to the deposit and reading of cookies and the use of tracking technologies necessary for their proper operation.', + 'button_validate_and_close' => 'Confirm and close', + 'button_forbid_all' => 'Refuse all', + 'button_allow_all' => 'Accept all', + 'consent_all_text' => 'By clicking on "Accept all", you consent to use our cookies.', + 'banner_title' => 'The :site_name website uses cookies!', + 'learn_more' => 'Learn more', + 'button_close_cookies' => 'Close cookie window', + 'modal_title' => 'Cookie management window', + 'panel_content' => 'Cookie management panel content', + 'button_customize' => 'Customize', + 'preferences_cookies' => 'Preferences cookies', + 'button_toggle_cookie' => 'Accept or refuse :service', + 'open_cookies' => 'Open cookies management panel', + 'button_forbid_all_title' => 'Refuse all cookies and close the cookies panel', + 'button_allow_all_title' => 'Accept all cookies and close the cookies panel', + 'custom' => [ + 'analytics' => [ + 'title' => 'Google Analytics', + 'description' => 'Audience measurement services make it possible to generate attendance statistics useful for improving the site.', + ], + 'vimeo' => [ + 'title' => 'Vimeo', + 'description' => 'Cookies placed via video sharing services are intended to allow the user to view multimedia content directly on the site.', + 'labelLink' => 'Learn more', + 'warning' => 'You must accept cookies to view this video', + 'accept' => 'Accept' + ], + 'youtube' => [ + 'title' => 'Youtube', + 'description' => 'Cookies placed via video sharing services are intended to allow the user to view multimedia content directly on the site.', + 'labelLink' => 'Learn more', + 'warning' => 'You must accept cookies to view this video', + 'accept' => 'Accept' + ], + 'matomo' => [ + 'title' => 'Matomo', + 'description' => 'Audience measurement services are used to generate traffic statistics, which are useful for improving the site.', + 'labelLink' => 'Learn more', + ], + 'recaptcha' => [ + 'title' => 'reCAPTCHA', + 'description' => 'The purpose of the cookies placed on forms via the recaptcha is to prevent them from being submitted by robots.', + 'labelLink' => 'Learn more', + 'warning' => 'You must accept reCAPTCHA cookies to send the form', + 'accept' => 'Accept reCAPTCHA' + ] + ] +]; diff --git a/lang/en/cookie-notice.php b/lang/en/cookie-notice.php index a1386f20..4041ef8a 100644 --- a/lang/en/cookie-notice.php +++ b/lang/en/cookie-notice.php @@ -1,29 +1,37 @@ 'Customize cookies', - 'button_close_cookies' => 'Close cookie window', - 'button_toggle_cookie' => 'Accept or refuse', - 'button_forbid_all' => 'Refuse all', - 'button_allow_all' => 'Accept all', - 'button_forbid_all_title' => 'Refuse all cookies and close the cookies panel', - 'button_allow_all_title' => 'Accept all cookies and close the cookies panel', - 'button_customize' => 'Customize', - 'button_validate_and_close' => 'Confirm and close', - 'button_title_open_new_tab' => 'Open link in new tab', - 'banner_title' => 'The :site_name website uses cookies!', + 'button_banner_cookies' => 'Cookies', 'banner_text' => 'We use cookies to ensure the proper functioning of our site and for analytical purposes. You can change your mind at any time by clicking on the icon on any page of our site. By authorizing these third-party services, you agree to the deposit and reading of cookies and the use of tracking technologies necessary for their proper operation.', + 'button_validate_and_close' => 'Confirm and close', + 'button_forbid_all' => 'Refuse all', + 'button_allow_all' => 'Accept all', + 'consent_all_text' => 'By clicking on "Accept all", you consent to use our cookies.', + 'banner_title' => 'The :site_name website uses cookies!', + 'learn_more' => 'Learn more', + 'button_close_cookies' => 'Close cookie window', 'modal_title' => 'Cookie management window', 'panel_content' => 'Cookie management panel content', - 'picture_cookie_title' => 'Image of a nice big cookie', - 'navigation_title' => 'Cookies panel navigation', - 'custom' => [ + 'button_customize' => 'Customize', + 'preferences_cookies' => 'Preferences cookies', + 'button_toggle_cookie' => 'Accept or refuse :service', + 'open_cookies' => 'Open cookies management panel', + 'button_forbid_all_title' => 'Refuse all cookies and close the cookies panel', + 'button_allow_all_title' => 'Accept all cookies and close the cookies panel', + 'custom' => [ 'analytics' => [ 'title' => 'Google Analytics', 'description' => 'Audience measurement services make it possible to generate attendance statistics useful for improving the site.', ], + 'vimeo' => [ + 'title' => 'Vimeo', + 'description' => 'Cookies placed via video sharing services are intended to allow the user to view multimedia content directly on the site.', + 'labelLink' => 'Learn more', + 'warning' => 'You must accept cookies to view this video', + 'accept' => 'Accept' + ], 'youtube' => [ 'title' => 'Youtube', 'description' => 'Cookies placed via video sharing services are intended to allow the user to view multimedia content directly on the site.', diff --git a/lang/es/cookie-notice.php b/lang/es/cookie-notice.php new file mode 100644 index 00000000..d46b1804 --- /dev/null +++ b/lang/es/cookie-notice.php @@ -0,0 +1,55 @@ + 'Cookies', + 'banner_text' => 'Utilizamos cookies para garantizar el correcto funcionamiento de nuestro sitio y con fines analíticos. + Puede cambiar su decisión en cualquier momento haciendo clic en el icono en cualquier página de nuestro sitio. + Al autorizar estos servicios de terceros, acepta el depósito y la lectura de cookies, así como el uso de tecnologías de seguimiento necesarias para su correcto funcionamiento.', + 'button_validate_and_close' => 'Confirmar y cerrar', + 'button_forbid_all' => 'Rechazar todo', + 'button_allow_all' => 'Aceptar todo', + 'consent_all_text' => 'Al hacer clic en "Aceptar todo", usted acepta el uso de nuestras cookies.', + 'banner_title' => '¡El sitio web :site_name utiliza cookies!', + 'learn_more' => 'Más información', + 'button_close_cookies' => 'Cerrar ventana de cookies', + 'modal_title' => 'Ventana de gestión de cookies', + 'panel_content' => 'Contenido del panel de gestión de cookies', + 'button_customize' => 'Personalizar', + 'preferences_cookies' => 'Cookies de preferencias', + 'button_toggle_cookie' => 'Aceptar o rechazar :service', + 'open_cookies' => 'Abrir panel de gestión de cookies', + 'button_forbid_all_title' => 'Rechazar todas las cookies y cerrar el panel de cookies', + 'button_allow_all_title' => 'Aceptar todas las cookies y cerrar el panel de cookies', + 'custom' => [ + 'analytics' => [ + 'title' => 'Google Analytics', + 'description' => 'Los servicios de medición de audiencia permiten generar estadísticas de visitas útiles para mejorar el sitio.', + ], + 'vimeo' => [ + 'title' => 'Vimeo', + 'description' => 'Las cookies colocadas a través de servicios de vídeo permiten al usuario visualizar contenido multimedia directamente en el sitio.', + 'labelLink' => 'Más información', + 'warning' => 'Debe aceptar las cookies para ver este vídeo', + 'accept' => 'Aceptar' + ], + 'youtube' => [ + 'title' => 'YouTube', + 'description' => 'Las cookies colocadas a través de servicios de vídeo permiten al usuario visualizar contenido multimedia directamente en el sitio.', + 'labelLink' => 'Más información', + 'warning' => 'Debe aceptar las cookies para ver este vídeo', + 'accept' => 'Aceptar' + ], + 'matomo' => [ + 'title' => 'Matomo', + 'description' => 'Los servicios de medición de audiencia se utilizan para generar estadísticas de tráfico útiles para mejorar el sitio.', + 'labelLink' => 'Más información', + ], + 'recaptcha' => [ + 'title' => 'reCAPTCHA', + 'description' => 'Las cookies de reCAPTCHA en formularios se utilizan para evitar envíos por robots.', + 'labelLink' => 'Más información', + 'warning' => 'Debe aceptar las cookies de reCAPTCHA para enviar el formulario', + 'accept' => 'Aceptar reCAPTCHA' + ] + ] +]; diff --git a/lang/fr/cookie-notice.php b/lang/fr/cookie-notice.php index f22b7c04..c0f3faf1 100644 --- a/lang/fr/cookie-notice.php +++ b/lang/fr/cookie-notice.php @@ -1,31 +1,39 @@ 'Personnaliser les cookies', - 'button_close_cookies' => 'Fermer la fenêtre des cookies', - 'button_toggle_cookie' => 'Autoriser ou refuser', - 'button_forbid_all' => 'Tout refuser', - 'button_allow_all' => 'Tout accepter', - 'button_forbid_all_title' => 'Refuser tous les cookies et fermer le panneau des cookies', - 'button_allow_all_title' => 'Accepter tous les cookies et fermer le panneau des cookies', - 'button_customize' => 'Personnaliser', - 'button_validate_and_close' => 'Valider et fermer', - 'button_title_open_new_tab' => 'Ouvrir le lien dans un nouvel onglet', - 'banner_title' => 'Le site internet :site_name utilise des cookies !', + 'button_banner_cookies' => 'Cookies', 'banner_text' => 'Nous utilisons des cookies pour nous assurer du bon fonctionnement de notre site et à des fins analytiques. Vous pouvez changer d’avis à tout moment en cliquant sur l’icône présente sur chaque page de notre site. En autorisant ces services tiers, vous acceptez le dépôt et la lecture de cookies et l’utilisation de technologies de suivi nécessaires à leur bon fonctionnement.', + 'button_validate_and_close' => 'Valider et fermer', + 'button_forbid_all' => 'Tout refuser', + 'button_allow_all' => 'Tout accepter', + 'consent_all_text' => 'En cliquant sur "Tout accepter", vous consentez à utiliser nos cookies.', + 'banner_title' => 'Le site internet :site_name utilise des cookies !', + 'learn_more' => 'En savoir plus', + 'button_close_cookies' => 'Fermer la fenêtre des cookies', 'modal_title' => 'Fenêtre de gestion de cookies', 'panel_content' => 'Contenu du panneau des cookies', - 'picture_cookie_title' => 'Image d’un bon gros cookie', - 'navigation_title' => 'Navigation du panneau des cookies', - 'custom' => [ + 'button_customize' => 'Personnaliser', + 'preferences_cookies' => 'Préferences cookies', + 'button_toggle_cookie' => 'Accepter ou refuser :service', + 'open_cookies' => 'Ouvrir la fenêtre de gestion des cookies', + 'button_forbid_all_title' => 'Refuser tous les cookies et fermer le panneau des cookies', + 'button_allow_all_title' => 'Accepter tous les cookies et fermer le panneau des cookies', + 'custom' => [ 'analytics' => [ 'title' => 'Google Analytics', 'description' => 'Les services de mesure d’audience permettent de générer des statistiques de fréquentation utiles à l’amélioration du site.', ], 'youtube' => [ - 'name' => 'Youtube', + 'title' => 'Youtube', + 'description' => 'Les cookies placés via les services de partage de vidéos sont destinés à permettre à l’utilisateur de visionner des contenus multimédias directement sur le site.', + 'labelLink' => 'En savoir +', + 'warning' => 'Vous devez accepter les cookies pour visionner cette vidéo', + 'accept' => 'Autoriser' + ], + 'vimeo' => [ + 'title' => 'Vimeo', 'description' => 'Les cookies placés via les services de partage de vidéos sont destinés à permettre à l’utilisateur de visionner des contenus multimédias directement sur le site.', 'labelLink' => 'En savoir +', 'warning' => 'Vous devez accepter les cookies pour visionner cette vidéo', diff --git a/lang/nl/cookie-notice.php b/lang/nl/cookie-notice.php new file mode 100644 index 00000000..f8018b55 --- /dev/null +++ b/lang/nl/cookie-notice.php @@ -0,0 +1,55 @@ + 'Cookies', + 'banner_text' => 'Wij gebruiken cookies om de goede werking van onze website te garanderen en voor analytische doeleinden. + U kunt uw keuze op elk moment wijzigen door op het pictogram op elke pagina van onze website te klikken. + Door deze externe diensten te autoriseren, stemt u in met het plaatsen en lezen van cookies en het gebruik van trackingtechnologieën die nodig zijn voor hun goede werking.', + 'button_validate_and_close' => 'Bevestigen en sluiten', + 'button_forbid_all' => 'Alles weigeren', + 'button_allow_all' => 'Alles accepteren', + 'consent_all_text' => 'Door te klikken op "Alles accepteren" stemt u in met het gebruik van onze cookies.', + 'banner_title' => 'De website :site_name gebruikt cookies!', + 'learn_more' => 'Meer informatie', + 'button_close_cookies' => 'Cookievenster sluiten', + 'modal_title' => 'Cookiebeheer venster', + 'panel_content' => 'Inhoud van het cookiebeheer paneel', + 'button_customize' => 'Aanpassen', + 'preferences_cookies' => 'Voorkeurscookies', + 'button_toggle_cookie' => ':service accepteren of weigeren', + 'open_cookies' => 'Cookiebeheer paneel openen', + 'button_forbid_all_title' => 'Alle cookies weigeren en het cookiepaneel sluiten', + 'button_allow_all_title' => 'Alle cookies accepteren en het cookiepaneel sluiten', + 'custom' => [ + 'analytics' => [ + 'title' => 'Google Analytics', + 'description' => 'Diensten voor publieksmeting maken het mogelijk om bezoekersstatistieken te genereren die nuttig zijn om de website te verbeteren.', + ], + 'vimeo' => [ + 'title' => 'Vimeo', + 'description' => 'Cookies geplaatst via videodiensten maken het mogelijk om multimedia-inhoud direct op de website weer te geven.', + 'labelLink' => 'Meer informatie', + 'warning' => 'U moet cookies accepteren om deze video te bekijken', + 'accept' => 'Accepteren' + ], + 'youtube' => [ + 'title' => 'YouTube', + 'description' => 'Cookies geplaatst via videodiensten maken het mogelijk om multimedia-inhoud direct op de website weer te geven.', + 'labelLink' => 'Meer informatie', + 'warning' => 'U moet cookies accepteren om deze video te bekijken', + 'accept' => 'Accepteren' + ], + 'matomo' => [ + 'title' => 'Matomo', + 'description' => 'Diensten voor publieksmeting worden gebruikt om verkeersstatistieken te genereren die nuttig zijn om de website te verbeteren.', + 'labelLink' => 'Meer informatie', + ], + 'recaptcha' => [ + 'title' => 'reCAPTCHA', + 'description' => 'De cookies van reCAPTCHA in formulieren worden gebruikt om inzendingen door robots te voorkomen.', + 'labelLink' => 'Meer informatie', + 'warning' => 'U moet reCAPTCHA-cookies accepteren om het formulier te verzenden', + 'accept' => 'reCAPTCHA accepteren' + ] + ] +]; diff --git a/lang/pl/cookie-notice.php b/lang/pl/cookie-notice.php new file mode 100644 index 00000000..109bc111 --- /dev/null +++ b/lang/pl/cookie-notice.php @@ -0,0 +1,55 @@ + 'Pliki cookie', + 'banner_text' => 'Używamy plików cookie, aby zapewnić prawidłowe działanie naszej strony oraz do celów analitycznych. + Możesz zmienić swoją decyzję w dowolnym momencie, klikając ikonę na każdej stronie naszej witryny. + Wyrażając zgodę na te usługi stron trzecich, akceptujesz zapisywanie i odczytywanie plików cookie oraz wykorzystywanie technologii śledzenia niezbędnych do ich prawidłowego działania.', + 'button_validate_and_close' => 'Potwierdź i zamknij', + 'button_forbid_all' => 'Odrzuć wszystkie', + 'button_allow_all' => 'Akceptuj wszystkie', + 'consent_all_text' => 'Klikając "Akceptuj wszystkie", wyrażasz zgodę na używanie naszych plików cookie.', + 'banner_title' => 'Strona internetowa :site_name używa plików cookie!', + 'learn_more' => 'Dowiedz się więcej', + 'button_close_cookies' => 'Zamknij okno plików cookie', + 'modal_title' => 'Okno zarządzania plikami cookie', + 'panel_content' => 'Zawartość panelu zarządzania plikami cookie', + 'button_customize' => 'Dostosuj', + 'preferences_cookies' => 'Pliki cookie preferencji', + 'button_toggle_cookie' => 'Akceptuj lub odrzuć :service', + 'open_cookies' => 'Otwórz panel zarządzania plikami cookie', + 'button_forbid_all_title' => 'Odrzuć wszystkie pliki cookie i zamknij panel', + 'button_allow_all_title' => 'Akceptuj wszystkie pliki cookie i zamknij panel', + 'custom' => [ + 'analytics' => [ + 'title' => 'Google Analytics', + 'description' => 'Usługi pomiaru ruchu umożliwiają generowanie statystyk odwiedzin przydatnych do ulepszania strony.', + ], + 'vimeo' => [ + 'title' => 'Vimeo', + 'description' => 'Pliki cookie ustawiane przez usługi wideo umożliwiają wyświetlanie treści multimedialnych bezpośrednio na stronie.', + 'labelLink' => 'Dowiedz się więcej', + 'warning' => 'Musisz zaakceptować pliki cookie, aby obejrzeć ten film', + 'accept' => 'Akceptuj' + ], + 'youtube' => [ + 'title' => 'YouTube', + 'description' => 'Pliki cookie ustawiane przez usługi wideo umożliwiają wyświetlanie treści multimedialnych bezpośrednio na stronie.', + 'labelLink' => 'Dowiedz się więcej', + 'warning' => 'Musisz zaakceptować pliki cookie, aby obejrzeć ten film', + 'accept' => 'Akceptuj' + ], + 'matomo' => [ + 'title' => 'Matomo', + 'description' => 'Usługi pomiaru ruchu służą do generowania statystyk odwiedzin, które pomagają ulepszać stronę.', + 'labelLink' => 'Dowiedz się więcej', + ], + 'recaptcha' => [ + 'title' => 'reCAPTCHA', + 'description' => 'Pliki cookie reCAPTCHA w formularzach służą do zapobiegania ich wysyłaniu przez boty.', + 'labelLink' => 'Dowiedz się więcej', + 'warning' => 'Musisz zaakceptować pliki cookie reCAPTCHA, aby wysłać formularz', + 'accept' => 'Akceptuj reCAPTCHA' + ] + ] +]; diff --git a/package-lock.json b/package-lock.json index 8a2fe680..5a5335f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "@inertiajs/core": "^2.1.5", "@inertiajs/react": "^2.3.18", "@ldc-web/cookie-notice": "^6.1.1", + "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-slot": "^1.2.4", "@tanstack/react-table": "^8.21.3", "@tiptap/core": "^3.21.0", @@ -69,7 +70,6 @@ "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-checkbox": "^1.3.3", "@radix-ui/react-collapsible": "^1.1.12", - "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-label": "^2.1.8", "@radix-ui/react-popover": "^1.1.15", diff --git a/resources/ts/app.tsx b/resources/ts/app.tsx index 341e0be7..76c7b4cf 100644 --- a/resources/ts/app.tsx +++ b/resources/ts/app.tsx @@ -3,7 +3,6 @@ import { resolvePageComponent } from "laravel-vite-plugin/inertia-helpers"; import { createRoot } from "react-dom/client"; import axios from "axios"; import CookieNotice from "@ldc-web/cookie-notice"; -import recaptcha from "./hooks/use-recaptcha"; // @ts-expect-error Env is always present. const appName = import.meta.env.VITE_APP_NAME || "Laravel"; @@ -31,4 +30,3 @@ window.axios = axios; window.axios.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest"; window.CookieNotice = CookieNotice; -window.Recaptcha = recaptcha; diff --git a/resources/ts/back/Components/Inputs/SimpleSwitch.tsx b/resources/ts/back/Components/Inputs/SimpleSwitch.tsx index e10d164c..5d8727fc 100644 --- a/resources/ts/back/Components/Inputs/SimpleSwitch.tsx +++ b/resources/ts/back/Components/Inputs/SimpleSwitch.tsx @@ -1,6 +1,6 @@ // * Packages import { usePage } from "@inertiajs/react"; -import { ReactNode } from "react"; +import React, { ReactNode } from "react"; // * Components shadcn import { Switch } from "@/components/ui/switch"; import { Label } from "@/components/ui/label"; @@ -11,50 +11,68 @@ import { cn } from "@/lib/utils"; type SimpleSwitchProps = { name: string; checked?: boolean; + description?: string | React.ReactNode; label?: ReactNode | string; leftHelper?: string; rightHelper?: string; className?: string; + inputClassName?: string; required?: boolean; disabled?: boolean; parentErrors?: Record | null; // eslint-disable-next-line no-unused-vars setData: (name: string, value: boolean) => void; + labelClassName?: string; + descClassName?: string; + title?: string; }; export default function SimpleSwitch({ name, checked, + description, label, leftHelper, rightHelper, className = "", + inputClassName= "", required = false, disabled = false, parentErrors = null, + descClassName = "text-xs", + labelClassName = "text-sm", + title = name, setData, }: SimpleSwitchProps) { const { errors } = usePage().props; const localErrors = parentErrors ?? errors; return ( -
- {label && ( - - )} +
+
+ {label && ( + + )} + {description && ( +

{description}

+ )} +
{leftHelper && {leftHelper}} setData(name, value)} required={required} checked={checked} disabled={disabled} - className={cn({ + className={cn( + inputClassName, + { "border-destructive/50": localErrors[name], })} /> diff --git a/resources/ts/front/Components/Base/Head.tsx b/resources/ts/front/Components/Base/Head.tsx index fbd1d442..43757b6e 100644 --- a/resources/ts/front/Components/Base/Head.tsx +++ b/resources/ts/front/Components/Base/Head.tsx @@ -1,31 +1,39 @@ // * REACT/INERTIA import { Head as InertiaHead, usePage } from "@inertiajs/react"; -import { AppEnv } from "@/types/global"; interface BreadcrumbItem { title: string; url: string; } -type HeadProps = { +interface HeadProps { title?: string; description?: string; - breadcrumbs?: BreadcrumbItem[]; -}; +} +interface Ziggy { + location: string; +} -export default function Head({ title, description, breadcrumbs }: HeadProps) { +export default function Head({ title, description }: HeadProps) { const appEnv = usePage().props.appEnv as AppEnv; + const { breadcrumbs } = usePage().props as { + breadcrumbs?: BreadcrumbItem[]; + }; + const { location } = usePage().props.ziggy as Ziggy; + + const canonical = location.replace("index.php/", "").replace("index.php", ""); return ( {title} {title && } + {description && } - {breadcrumbs && breadcrumbs?.length > 0 && ( + {breadcrumbs && breadcrumbs.length > 0 && (