Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 46 additions & 36 deletions resources/views/cookies.blade.php
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<aside id="cookies-policy" class="cookies cookies--no-js" data-text="{{ json_encode(__('cookieConsent::cookies.details')) }}">
<aside id="cookies-policy" class="cookies cookies--no-js"
data-text="{{ json_encode(__('cookieConsent::cookies.details')) }}">
<div class="cookies__alert">
<div class="cookies__container">
<div class="cookies__wrapper">
Expand All @@ -15,48 +16,57 @@
</div>
</div>
</div>
<a href="#cookies-policy-customize" class="cookies__btn cookies__btn--customize">
<span>@lang('cookieConsent::cookies.customize')</span>
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<path d="M14.7559 11.9782C15.0814 11.6527 15.0814 11.1251 14.7559 10.7996L10.5893 6.63297C10.433 6.47669 10.221 6.3889 10 6.38889C9.77899 6.38889 9.56703 6.47669 9.41075 6.63297L5.24408 10.7996C4.91864 11.1251 4.91864 11.6527 5.24408 11.9782C5.56951 12.3036 6.09715 12.3036 6.42259 11.9782L10 8.40074L13.5774 11.9782C13.9028 12.3036 14.4305 12.3036 14.7559 11.9782Z" fill="#2C2E30"/>
</svg>
</a>
<a href="#cookies-policy-customize" class="cookies__btn cookies__btn--customize">
<span>@lang('cookieConsent::cookies.customize')</span>
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"
aria-hidden="true">
<path d="M14.7559 11.9782C15.0814 11.6527 15.0814 11.1251 14.7559 10.7996L10.5893 6.63297C10.433 6.47669 10.221 6.3889 10 6.38889C9.77899 6.38889 9.56703 6.47669 9.41075 6.63297L5.24408 10.7996C4.91864 11.1251 4.91864 11.6527 5.24408 11.9782C5.56951 12.3036 6.09715 12.3036 6.42259 11.9782L10 8.40074L13.5774 11.9782C13.9028 12.3036 14.4305 12.3036 14.7559 11.9782Z"
fill="#2C2E30"/>
</svg>
</a>
<div class="cookies__expandable cookies__expandable--custom" id="cookies-policy-customize">
<form action="{{ route('cookieconsent.accept.configuration') }}" method="post" class="cookies__customize">
@csrf
<div class="cookies__sections">
@foreach($cookies->getCategories() as $category)
<div class="cookies__section">
<label for="cookies-policy-check-{{ $category->key() }}" class="cookies__category">
@if ($category->key() === 'essentials')
<input type="hidden" name="categories[]" value="{{ $category->key() }}" />
<input type="checkbox" name="categories[]" value="{{ $category->key() }}" id="cookies-policy-check-{{ $category->key() }}" checked="checked" disabled="disabled" />
@else
<input type="checkbox" name="categories[]" value="{{ $category->key() }}" id="cookies-policy-check-{{ $category->key() }}" />
@endif
<span class="cookies__box">
<strong class="cookies__label">{{ $category->title }}</strong>
</span>
@if($category->description)
<p class="cookies__info">{{ $category->description }}</p>
@endif
</label>
@php
$isChecked = !empty(\Whitecube\LaravelCookieConsent\CookiesManager::$editPreferencesData[$category->key()] ?? null);
@endphp
<div class="cookies__section">
<label for="cookies-policy-check-{{ $category->key() }}" class="cookies__category">
@if ($category->key() === 'essentials')
<input type="hidden" name="categories[]" value="{{ $category->key() }}"/>
<input type="checkbox" name="categories[]" value="{{ $category->key() }}"
id="cookies-policy-check-{{ $category->key() }}" checked="checked"
disabled="disabled"/>
@else
<input type="checkbox" name="categories[]" value="{{ $category->key() }}"
id="cookies-policy-check-{{ $category->key() }}" @checked($isChecked)/>
@endif
<span class="cookies__box">
<strong class="cookies__label">{{ $category->title }}</strong>
</span>
@if($category->description)
<p class="cookies__info">{{ $category->description }}</p>
@endif
</label>

<div class="cookies__expandable" id="cookies-policy-{{ $category->key() }}">
<ul class="cookies__definitions">
@foreach($category->getCookies() as $cookie)
<li class="cookies__cookie">
<p class="cookies__name">{{ $cookie->name }}</p>
<p class="cookies__duration">{{ \Carbon\CarbonInterval::minutes($cookie->duration)->cascade() }}</p>
@if($cookie->description)
<p class="cookies__description">{{ $cookie->description }}</p>
@endif
</li>
@endforeach
</ul>
<div class="cookies__expandable" id="cookies-policy-{{ $category->key() }}">
<ul class="cookies__definitions">
@foreach($category->getCookies() as $cookie)
<li class="cookies__cookie">
<p class="cookies__name">{{ $cookie->name }}</p>
<p class="cookies__duration">{{ \Carbon\CarbonInterval::minutes($cookie->duration)->cascade() }}</p>
@if($cookie->description)
<p class="cookies__description">{{ $cookie->description }}</p>
@endif
</li>
@endforeach
</ul>
</div>
<a href="#cookies-policy-{{ $category->key() }}"
class="cookies__details">@lang('cookieConsent::cookies.details.more')</a>
</div>
<a href="#cookies-policy-{{ $category->key() }}" class="cookies__details">@lang('cookieConsent::cookies.details.more')</a>
</div>
@endforeach
</div>
<div class="cookies__save">
Expand Down
4 changes: 4 additions & 0 deletions routes/web.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?php

use Illuminate\Support\Facades\Route;
use Whitecube\LaravelCookieConsent\Http\Controllers\EditController;
use Whitecube\LaravelCookieConsent\Http\Controllers\ResetController;
use Whitecube\LaravelCookieConsent\Http\Controllers\ScriptController;
use Whitecube\LaravelCookieConsent\Http\Controllers\AcceptAllController;
Expand All @@ -27,4 +28,7 @@

Route::post('reset', ResetController::class)
->name('reset');

Route::post('edit', EditController::class)
->name('edit');
});
54 changes: 53 additions & 1 deletion src/CookiesManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ class CookiesManager
/**
* The user's current consent preferences.
*/
protected ?array $preferences = null;
public ?array $preferences = null;
protected bool $editPreferences = false;
public static ?array $editPreferencesData = null;

/**
* Create a new Service Manager instance.
Expand All @@ -25,6 +27,51 @@ public function __construct(CookiesRegistrar $registrar, Request $request)
{
$this->registrar = $registrar;
$this->preferences = $this->getCurrentConsentSettings($request);
$this->editPreferences = $this->isEditMode($request);
}

/**
* Check if edit mode activated.
*/
protected function isEditMode(Request $request): bool
{
$raw = $request->cookie('edit-cookie');

if (! $raw) {
return false;
}

$this->setEditData($raw);

$this->deleteEditCookie();

return true;
}

/**
* Set edit datas in static variable.
*/
protected function setEditData($raw): void
{
self::$editPreferencesData = json_decode($raw, true) ?? null;
}

/**
* Unset the temp cookie.
*/
protected function deleteEditCookie(): void
{
$forgetCookie = CookieFacade::make(
name: 'edit-cookie',
value: null,
minutes: -3600,
domain: config('cookieconsent.cookie.domain'),
secure: (config('app.env') == 'local') ? false : true
);

CookieFacade::queue(
$forgetCookie
);
}

/**
Expand Down Expand Up @@ -80,6 +127,10 @@ public function shouldDisplayNotice(): bool
return true;
}

if ($this->editPreferences) {
return true;
}

// Check if each defined cookie has been shown to the user yet.
return array_reduce($this->registrar->getCategories(), function($state, $category) {
return $state ? true : array_reduce($category->getCookies(), function(bool $state, Cookie $cookie) {
Expand Down Expand Up @@ -237,6 +288,7 @@ public function renderButton(string $action, ?string $label = null, array $attri
'accept.essentials' => route('cookieconsent.accept.essentials'),
'accept.configuration' => route('cookieconsent.accept.configuration'),
'reset' => route('cookieconsent.reset'),
'edit' => route('cookieconsent.edit'),
default => null,
};

Expand Down
60 changes: 60 additions & 0 deletions src/Http/Controllers/EditController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

namespace Whitecube\LaravelCookieConsent\Http\Controllers;

use Illuminate\Support\Facades\Cookie as CookieFacade;
use Symfony\Component\HttpFoundation\Cookie;
use Whitecube\LaravelCookieConsent\CookiesManager;
use Illuminate\Http\Request;

class EditController
{
public function __invoke(Request $request, CookiesManager $cookies)
{
$cookieData = $this->getEditCookieData($cookies);

$editCookie = $this->getEditCookie($cookieData);

$response = ! $request->expectsJson()
? redirect()->back()
: response()->json([
'status' => 'ok',
'scripts' => $cookies->getNoticeScripts(true),
'notice' => $cookies->getNoticeMarkup(),
]);

return $response->withCookie(
$editCookie
);
}

protected function getEditCookieData(CookiesManager $cookies) : array
{
$categories = $cookies->getCategories();

$currentPreferences = $cookies->preferences ?? [];

$cookiesData = [];

foreach ($categories as $category) {
$cookieNames = collect($category->getCookies())->pluck('name');

$allAccepted = $cookieNames->every(fn($name) => !empty($currentPreferences[$name]));

$cookiesData[$category->key()] = $allAccepted;
}

return $cookiesData;
}

protected function getEditCookie(array $cookieData): Cookie
{
return CookieFacade::make(
name: 'edit-cookie',
value: json_encode($cookieData),
minutes: 0,
domain: config('cookieconsent.cookie.domain'),
secure: (config('app.env') == 'local') ? false : true
);
}
}
2 changes: 1 addition & 1 deletion src/Http/Controllers/ResetController.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ public function __invoke(Request $request, CookiesManager $cookies)
domain: config('cookieconsent.cookie.domain'),
);
}
}
}
1 change: 1 addition & 0 deletions src/Http/Controllers/ScriptController.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ protected function generateConfig(): string
'accept.essentials' => route('cookieconsent.accept.essentials'),
'accept.configuration' => route('cookieconsent.accept.configuration'),
'reset' => route('cookieconsent.reset'),
'edit' => route('cookieconsent.edit'),
]);
}
}