update layout for multiple CRUD - issue #52

This commit is contained in:
Alexis Gousseau 2024-01-10 17:59:21 +01:00
parent f790757bcf
commit 73f7215951
35 changed files with 1276 additions and 1943 deletions

26
.vscode/settings.json vendored
View file

@ -1,26 +0,0 @@
{
"workbench.colorCustomizations": {
"activityBar.activeBackground": "#e4f100",
"activityBar.activeBorder": "#1a1d02",
"activityBar.background": "#e4f100",
"activityBar.foreground": "#15202b",
"activityBar.inactiveForeground": "#15202b99",
"activityBarBadge.background": "#00b5bf",
"activityBarBadge.foreground": "#15202b",
"sash.hoverBorder": "#e4f100",
"statusBar.background": "#b4be00",
"statusBar.foreground": "#15202b",
"statusBarItem.hoverBackground": "#848b00",
"statusBarItem.remoteBackground": "#b4be00",
"statusBarItem.remoteForeground": "#15202b",
"titleBar.activeBackground": "#b4be00",
"titleBar.activeForeground": "#15202b",
"titleBar.inactiveBackground": "#b4be0099",
"titleBar.inactiveForeground": "#15202b99",
"commandCenter.border": "#15202b99"
},
"peacock.remoteColor": "#B4BE00",
"intelephense.environment.phpVersion": "8.2.0",
"intelephense.completion.fullyQualifyGlobalConstantsAndFunctions": true,
"intelephense.phpdoc.useFullyQualifiedNames": true
}

View file

@ -8,6 +8,7 @@ use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;
use Illuminate\Support\Str;
class UserCreate extends Command
{
@ -200,18 +201,22 @@ class UserCreate extends Command
try {
$tmp = $this->choice(
'Select his role',
[RoleEnum::conceptor->label(), RoleEnum::admin->label(), RoleEnum::visitor->label()],
RoleEnum::visitor->label(),
[
Str::ucFirst(RoleEnum::conceptor->label()),
Str::ucFirst(RoleEnum::admin->label()),
Str::ucFirst(RoleEnum::visitor->label())
],
Str::ucFirst(RoleEnum::visitor->label()),
$maxAttempts = null,
$allowMultipleSelections = false
);
if ($tmp === RoleEnum::conceptor->label()) {
if ($tmp === Str::ucFirst(RoleEnum::conceptor->label())) {
$tmp = RoleEnum::conceptor;
}
if ($tmp === RoleEnum::admin->label()) {
if ($tmp === Str::ucFirst(RoleEnum::admin->label())) {
$tmp = RoleEnum::admin;
}
if ($tmp === RoleEnum::visitor->label()) {
if ($tmp === Str::ucFirst(RoleEnum::visitor->label())) {
$tmp = RoleEnum::visitor;
}
$validator = Validator::make(['role' => $tmp], [

View file

@ -10,6 +10,7 @@ enum BootstrapThemeEnum: int
case light = 1;
case dark = 2;
case beige = 3;
/**
* Optionnal labels definition
@ -17,5 +18,6 @@ enum BootstrapThemeEnum: int
private const LABELS = [
self::light->name => 'enums.bootstrap-theme.light',
self::dark->name => 'enums.bootstrap-theme.dark',
self::beige->name => 'enums.bootstrap-theme.beige',
];
}

View file

@ -10,7 +10,7 @@ enum RoleEnum: int
case conceptor = 1;
case admin = 2;
case visitor = 3;
case visitor = 99;
/**
* Optionnal labels definition.

View file

@ -103,7 +103,7 @@ class ActivityLog extends Model
$activity->model_id
)->first();
if ($targetModel != null) {
// phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
// phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed
$targetModelTypes = collect($targetModel->toArray())
->map(function ($field, $fieldIndex) use ($targetModel) {
return Schema::getColumnType($targetModel->getTable(), $fieldIndex);

View file

@ -1,8 +1,8 @@
{
"name": "uwil/laravel-base-project",
"version": "1.0.0",
"name": "uwil/le-gaulois",
"version": "2.0.0",
"type": "project",
"description": "Laravel base project reference.",
"description": "Le Gaulois project.",
"support": {
"email": "equipe.web@ldc.fr"
},

2419
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -36,8 +36,7 @@ class UserFactory extends Factory
*/
public function unverified(): static
{
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass
return $this->state(fn (array $attributes) => [
return $this->state(fn () => [
'email_verified_at' => null,
]);
}

7
package-lock.json generated
View file

@ -12,7 +12,6 @@
"@fortawesome/free-regular-svg-icons": "^6.5.1",
"@fortawesome/free-solid-svg-icons": "^6.5.1",
"@fortawesome/vue-fontawesome": "^3.0.5",
"@ldc-web/cookie-notice": "^3.1.2",
"@sipec/vue3-tags-input": "^3.0.4",
"@types/bootstrap": "^5.2.7",
"@types/node": "^20.8.2",
@ -1048,12 +1047,6 @@
"integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==",
"dev": true
},
"node_modules/@ldc-web/cookie-notice": {
"version": "3.1.3",
"resolved": "https://lab.s-web.fr/api/v4/projects/50/packages/npm/@ldc-web/cookie-notice/-/@ldc-web/cookie-notice-3.1.3.tgz",
"integrity": "sha1-+VPwI1VOhD+nWZeutLhT+on02CU=",
"dev": true
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -3,7 +3,7 @@
<msapplication>
<tile>
<square150x150logo src="/mstile-150x150.png"/>
<TileColor>#2b5797</TileColor>
<TileColor>#000000</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 963 B

After

Width:  |  Height:  |  Size: 396 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 575 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -2,108 +2,32 @@
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="680.000000pt" height="680.000000pt" viewBox="0 0 680.000000 680.000000"
width="155.000000pt" height="155.000000pt" viewBox="0 0 155.000000 155.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.14, written by Peter Selinger 2001-2017
</metadata>
<g transform="translate(0.000000,680.000000) scale(0.100000,-0.100000)"
<g transform="translate(0.000000,155.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M3378 6575 c-2 -1 -61 -5 -133 -9 -161 -7 -208 -12 -365 -38 -448
-73 -906 -257 -1278 -515 -247 -171 -495 -397 -647 -588 -22 -27 -43 -52 -46
-55 -4 -3 -46 -59 -94 -124 -239 -329 -418 -714 -514 -1106 -16 -69 -32 -136
-35 -150 -26 -146 -41 -260 -51 -385 -5 -67 -6 -403 -1 -450 2 -16 7 -65 10
-107 4 -43 9 -88 11 -100 2 -13 9 -54 15 -93 46 -294 145 -604 285 -890 71
-143 181 -331 248 -423 51 -69 141 -187 147 -192 3 -3 29 -34 59 -70 64 -76
250 -263 334 -335 290 -248 669 -467 1019 -590 77 -27 256 -81 298 -89 14 -3
34 -7 45 -10 59 -15 231 -46 282 -52 32 -3 61 -8 64 -10 37 -23 711 -22 749 1
3 2 33 6 68 9 34 4 119 18 189 32 1118 222 2042 1038 2407 2128 37 110 93 325
110 426 14 84 17 101 35 230 17 119 11 630 -9 770 -127 904 -598 1679 -1340
2205 -429 304 -894 479 -1485 560 -22 3 -107 8 -190 11 -82 3 -158 7 -167 8
-9 2 -18 3 -20 1z m-74 -317 c0 -54 -2 -99 -5 -102 -2 -2 -49 -6 -104 -10 -55
-3 -115 -8 -132 -11 -18 -3 -45 -7 -60 -9 -95 -13 -287 -55 -358 -76 -543
-168 -959 -431 -1315 -831 -111 -125 -200 -240 -245 -317 -5 -9 -12 -19 -15
-22 -15 -13 -123 -206 -167 -295 -152 -311 -247 -665 -269 -1000 -4 -55 -8
-102 -10 -104 -2 -2 -48 -4 -101 -5 l-98 0 1 59 c1 75 16 236 30 315 2 14 7
41 10 60 28 173 122 480 206 668 99 223 256 484 389 647 150 183 379 414 481
483 13 9 25 18 28 22 13 15 156 115 250 175 139 88 386 211 541 267 114 42
308 101 369 113 14 3 70 13 125 24 108 21 155 28 255 37 36 4 66 7 67 8 1 1
30 1 65 1 l63 0 -1 -97z m431 86 c28 -2 61 -7 75 -9 14 -3 41 -7 60 -10 427
-66 835 -225 1199 -469 58 -39 113 -76 121 -83 8 -7 31 -25 51 -40 103 -81
146 -120 279 -253 171 -171 247 -263 378 -460 259 -388 428 -848 477 -1295 4
-33 8 -71 10 -83 8 -46 8 -152 1 -159 -10 -10 -187 -10 -193 1 -3 4 -7 31 -8
60 -7 129 -14 180 -61 439 -3 15 -21 81 -39 147 -215 753 -732 1376 -1434
1730 -240 121 -542 221 -771 256 -19 2 -46 7 -60 9 -78 14 -168 22 -257 24
l-53 1 0 106 0 106 88 -6 c48 -4 110 -9 137 -12z m-180 -398 c500 -20 1018
-215 1444 -543 128 -99 364 -340 467 -478 295 -394 469 -844 511 -1320 9 -109
9 -361 0 -468 -19 -215 -92 -526 -162 -692 -60 -145 -96 -221 -147 -313 -349
-628 -937 -1084 -1622 -1258 -110 -28 -181 -43 -241 -50 -22 -3 -47 -7 -55 -9
-67 -18 -427 -26 -575 -12 -400 38 -739 150 -1094 358 -233 138 -502 372 -682
594 -269 333 -461 755 -533 1172 -14 79 -19 118 -31 243 -5 50 -5 358 0 405 2
22 7 65 10 95 3 30 7 64 9 75 2 11 7 40 11 65 18 112 24 135 62 268 149 519
449 969 878 1316 300 242 757 454 1105 511 19 3 58 10 85 15 85 16 125 20 260
26 72 4 131 8 133 9 2 2 11 1 20 -1 9 -1 76 -5 147 -8z m-2924 -2733 c0 -32 2
-67 4 -78 1 -11 6 -51 9 -90 19 -203 114 -566 191 -733 14 -29 25 -55 25 -58
0 -4 51 -107 115 -234 39 -75 185 -290 270 -395 102 -127 277 -304 385 -390
41 -33 77 -62 80 -65 3 -3 30 -23 60 -45 184 -135 418 -263 639 -350 139 -54
393 -125 501 -140 14 -2 52 -8 85 -14 60 -10 129 -18 239 -26 32 -2 62 -8 65
-14 9 -14 7 -173 -2 -188 -4 -7 -13 -10 -20 -8 -7 2 -50 6 -97 9 -74 4 -267
28 -325 40 -289 60 -494 127 -740 245 -212 102 -409 226 -600 379 -100 81
-350 332 -429 432 -37 47 -73 92 -79 100 -103 130 -272 425 -352 615 -81 193
-159 457 -190 640 -3 17 -7 39 -9 50 -2 11 -7 49 -11 85 -4 36 -9 73 -10 82
-2 9 -7 60 -10 112 l-7 96 106 0 106 0 1 -57z m5763 27 c-4 -63 -16 -203 -19
-218 -1 -9 -6 -42 -9 -72 -9 -81 -42 -246 -66 -330 -115 -414 -268 -728 -513
-1055 -141 -188 -367 -417 -532 -540 -22 -16 -42 -33 -45 -36 -13 -16 -235
-162 -323 -213 -237 -136 -574 -269 -790 -312 -10 -2 -26 -5 -35 -8 -9 -3 -30
-8 -47 -11 -31 -5 -62 -11 -105 -20 -14 -3 -41 -7 -60 -9 -19 -3 -55 -7 -80
-10 -66 -9 -127 -14 -195 -17 l-60 -3 -3 102 c-3 100 -2 102 20 103 54 2 241
22 318 34 560 86 1124 376 1526 787 173 175 294 329 407 514 54 88 177 324
177 338 0 3 9 25 20 49 81 172 177 554 196 780 6 71 12 146 13 165 1 10 26 12
104 10 102 -3 102 -3 101 -28z"/>
<path d="M5081 3581 c-12 -7 -14 -48 -15 -210 l-1 -200 40 -7 c142 -27 216 21
218 139 1 67 -18 113 -56 137 -27 16 -82 22 -111 10 -24 -9 -24 -8 -22 66 1
68 -1 74 -19 74 -11 0 -26 -4 -34 -9z m148 -198 c26 -22 36 -86 20 -125 -12
-30 -66 -54 -97 -44 -16 5 -19 18 -19 87 -1 74 0 81 20 89 34 13 53 12 76 -7z"/>
<path d="M1619 3543 c-81 -24 -119 -75 -127 -169 -13 -169 94 -249 281 -208
l27 6 0 92 0 93 -35 1 -35 1 0 -68 c0 -76 -4 -81 -59 -75 -77 9 -116 68 -106
157 6 59 26 94 61 107 34 13 101 13 126 -1 23 -12 38 1 38 34 0 34 -99 52
-171 30z"/>
<path d="M2789 3550 c-91 -16 -150 -88 -154 -189 -5 -158 106 -235 284 -196
l27 6 0 92 -1 92 -30 1 c-16 1 -32 -2 -35 -7 -3 -5 -5 -35 -5 -68 2 -65 -2
-69 -54 -65 -80 6 -110 48 -108 147 2 57 6 70 28 93 31 31 100 43 149 26 28
-10 32 -9 40 14 13 32 13 31 -7 39 -37 14 -99 21 -134 15z"/>
<path d="M4215 3542 c-1 -2 1 -20 6 -40 50 -215 62 -263 76 -299 14 -38 19
-43 47 -43 32 0 33 2 69 104 20 57 37 109 37 115 0 6 4 11 8 11 4 0 23 -46 41
-102 18 -57 38 -109 43 -115 6 -7 23 -13 38 -13 25 0 29 6 48 63 11 34 30 105
42 157 12 52 26 110 30 127 10 37 6 41 -34 39 -31 -2 -39 -15 -51 -96 -11 -73
-39 -190 -43 -185 -3 3 -22 56 -42 117 -36 109 -39 113 -68 116 l-30 3 -38
-122 c-37 -117 -39 -121 -50 -93 -6 16 -21 81 -34 145 l-23 116 -34 -1 c-19
-1 -36 -2 -38 -4z"/>
<path d="M1936 3440 c-52 -26 -71 -64 -70 -135 0 -52 5 -69 27 -98 29 -39 83
-58 144 -50 57 6 63 10 63 38 0 25 -2 26 -51 21 -27 -3 -60 0 -73 5 -25 12
-49 45 -42 58 3 5 46 8 96 7 54 -1 90 3 91 9 13 122 -83 197 -185 145z m106
-62 c19 -19 20 -22 4 -33 -17 -13 -106 -14 -106 -2 0 4 0 11 0 16 0 18 32 41
56 41 13 0 34 -10 46 -22z"/>
<path d="M2255 3453 c-67 -13 -61 1 -61 -153 l0 -140 33 0 32 0 3 118 3 117
30 3 c59 6 70 -14 73 -132 l4 -106 28 0 c15 0 30 6 32 13 10 24 1 195 -11 223
-6 16 -21 36 -33 43 -22 13 -96 21 -133 14z"/>
<path d="M3053 3450 c-24 -10 -27 -18 -18 -42 4 -11 19 -13 56 -10 55 5 79 -8
79 -42 0 -19 -5 -21 -34 -18 -80 9 -141 -40 -130 -104 11 -67 79 -90 201 -69
l32 6 -3 112 c-3 113 -13 149 -46 163 -26 10 -114 13 -137 4z m117 -200 c0
-40 0 -40 -38 -40 -40 0 -62 14 -62 40 0 26 22 40 62 40 38 0 38 0 38 -40z"/>
<path d="M3360 3451 l-35 -6 -3 -143 -3 -143 33 3 33 3 2 105 c0 58 2 111 2
118 1 7 15 12 36 12 47 0 58 -24 59 -140 l2 -95 32 -3 33 -3 -3 115 -3 116 33
6 c37 7 61 -8 67 -42 2 -10 4 -59 4 -107 l1 -88 33 3 32 3 -1 112 c-1 130 -12
156 -71 173 -30 9 -47 9 -82 -4 -34 -11 -49 -12 -65 -4 -24 13 -84 17 -136 9z"/>
<path d="M3848 3436 c-70 -46 -88 -160 -35 -229 36 -47 127 -66 195 -42 19 7
11 61 -8 57 -50 -11 -85 -10 -110 3 -17 9 -30 20 -30 24 0 5 -2 16 -5 24 -5
11 11 14 90 13 l95 -1 0 38 c0 47 -22 97 -52 116 -37 23 -103 22 -140 -3z
m104 -48 c8 -7 18 -22 20 -33 5 -19 1 -21 -51 -19 -31 1 -60 2 -64 3 -9 1 12
43 27 53 17 12 51 9 68 -4z"/>
<path d="M4822 3450 c-56 -24 -85 -74 -85 -146 0 -62 29 -116 72 -134 62 -25
179 -14 167 16 -3 9 -6 22 -6 30 0 9 -5 12 -11 8 -19 -12 -79 -13 -107 -3 -29
11 -42 26 -42 50 0 13 13 16 83 14 45 0 87 1 93 3 14 4 11 64 -5 104 -19 50
-104 81 -159 58z m94 -75 c9 -14 14 -29 10 -32 -4 -4 -31 -8 -61 -8 -60 -2
-70 11 -38 47 24 27 69 23 89 -7z"/>
<path d="M0 775 l0 -775 775 0 775 0 0 775 0 775 -775 0 -775 0 0 -775z m1530
-5 l0 -750 -750 0 -750 0 0 750 0 750 750 0 750 0 0 -750z"/>
<path d="M226 1214 c-9 -8 -16 -30 -16 -47 0 -18 -7 -57 -16 -87 -25 -88 -55
-250 -57 -315 -4 -114 63 -174 195 -175 71 0 98 14 98 50 0 34 -28 50 -88 50
-80 0 -102 17 -102 78 1 52 29 207 54 292 29 102 16 170 -34 170 -10 0 -26 -7
-34 -16z"/>
<path d="M595 909 c-47 -26 -93 -88 -106 -143 -21 -97 23 -146 132 -146 85 0
130 38 150 124 14 65 2 107 -37 124 -13 7 -24 16 -24 21 0 6 -17 15 -37 20
-47 13 -53 13 -78 0z m80 -130 c-3 -10 -8 -28 -11 -39 -4 -16 -14 -20 -44 -20
-38 0 -39 0 -30 30 12 42 49 71 73 58 12 -6 16 -16 12 -29z"/>
<path d="M863 845 c-23 -14 -45 -35 -49 -47 -4 -12 -13 -28 -20 -36 -8 -7 -14
-26 -14 -42 0 -70 47 -110 129 -110 l51 0 0 -80 c0 -73 -2 -81 -25 -96 -25
-17 -45 -12 -45 11 0 20 -28 45 -50 45 -46 0 -67 -72 -34 -118 36 -52 131 -69
174 -32 13 11 27 20 31 20 5 0 18 19 30 42 20 40 21 50 14 230 -7 183 -8 190
-32 214 -33 34 -103 33 -160 -1z m67 -110 c0 -18 -5 -25 -20 -25 -23 0 -24 4
-10 31 15 27 30 24 30 -6z"/>
<path d="M1166 847 c-36 -31 -50 -85 -36 -137 6 -22 16 -44 23 -50 7 -6 25
-21 40 -35 23 -20 39 -25 83 -25 121 0 187 87 138 183 -32 62 -79 87 -162 87
-47 0 -64 -5 -86 -23z m148 -93 c19 -19 20 -26 4 -42 -29 -29 -88 -4 -88 37 0
17 6 21 34 21 19 0 42 -7 50 -16z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -4,6 +4,7 @@ return [
'bootstrap-theme' => [
"light" => "light",
"dark" => "dark",
"beige" => "beige",
],
'user-role' => [
"conceptor" => "conceptor",

View file

@ -4,6 +4,7 @@ return [
'bootstrap-theme' => [
"light" => "clair",
"dark" => "sombre",
"beige" => "beige",
],
'user-role' => [
"conceptor" => "concepteur",

View file

@ -1,13 +1,44 @@
// * LAYOUT
body {
&:has(.sidebar.show) {
overflow: hidden;
}
> header {
height: $bo-header-height;
}
> main {
min-height: calc(100vh - #{$bo-header-height} - #{$bo-footer-height});
margin-top: $bo-header-height;
.sidebar {
position: fixed;
top: $bo-header-height;
left: 0;
overflow-y: auto;
@include media-breakpoint-up(md) {
height: calc(100vh - #{$bo-header-height});
}
.sidemenu {
height: calc(100vh - #{$bo-header-height});
@include media-breakpoint-up(md) {
height: fit-content;
}
}
}
}
> footer {
box-shadow: 0 -0.125rem 0.25rem rgb(0 0 0 / 7.5%) !important;
@include media-breakpoint-up(md) {
z-index: 2 !important;
}
}
}

View file

@ -6,7 +6,7 @@ $color-success: #198754;
$color-danger: #dc3545;
$color-info: #0dcaf0;
$color-warning: #ffc107;
$color-primary: #0d6efd;
$color-primary: #29507c;
$color-secondary: #6c757d;
// * FONTS
@ -19,3 +19,10 @@ $line-default-height-base: 1.5;
// * DIMENSIONS
$bo-header-height: 62px;
$bo-footer-height: 40px;
// * BOOTSTRAP THEME CUSTOM
[data-bs-theme="beige"] {
--bs-tertiary-bg: #f3ebe4;
--bs-secondary-bg-rgb: #{243, 235, 228};
--bs-tertiary-bg-rgb: #{243, 235, 228};
}

View file

@ -38,6 +38,7 @@
@import "bootstrap/scss/card";
@import "bootstrap/scss/breadcrumb";
@import "bootstrap/scss/badge";
@import "bootstrap/scss/offcanvas";
// 6. Optionally include utilities API last to generate classes based on the Sass map in `_utilities.scss`
@import "bootstrap/scss/utilities/api";

View file

@ -340,12 +340,12 @@ export default defineComponent({
border-radius: 0 0 0.375rem 0.375rem !important;
}
.ck-word-count {
background-color: #fafafa;
border: 1px solid #c4c4c4;
background-color: rgb(var(--bs-secondary-bg-rgb));
border: var(--bs-border-width) solid var(--bs-border-color);
border-bottom: 0px;
border-top-left-radius: 0.375rem;
border-top-right-radius: 0.375rem;
color: initial;
color: var(--bs-body-color);
display: flex;
flex-direction: row;
justify-content: space-around !important;

View file

@ -8,6 +8,7 @@ import {
faArrowRight,
faArrowRightFromBracket,
faArrowUp,
faArrowUpRightFromSquare,
faArrowsAltH,
faArrowsAltV,
faBackspace,
@ -18,14 +19,16 @@ import {
faCircleCheck,
faCircleExclamation,
faCircleInfo,
faCircleNotch,
faCircleXmark,
faCopy,
faCrop,
faEllipsisVertical,
faEraser,
faEye,
faEyeSlash,
faFile,
faFolderOpen,
faHouse,
faListUl,
faPaintRoller,
faPencil,
@ -35,7 +38,6 @@ import {
faSearch,
faSearchMinus,
faSearchPlus,
faSliders,
faSyncAlt,
faTimes,
faTrash,
@ -81,12 +83,11 @@ library.add(faBan);
library.add(faCircleExclamation);
library.add(faCircleInfo);
library.add(faPaintRoller);
// Front
library.add(faFile);
library.add(faChevronLeft);
library.add(faChevronRight);
library.add(faCircleXmark);
library.add(faCircleNotch);
library.add(faSliders);
library.add(faHouse);
library.add(faArrowUpRightFromSquare);
library.add(faEllipsisVertical);
dom.watch();

View file

@ -1,90 +1,6 @@
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";
import { config, dom } from "@fortawesome/fontawesome-svg-core";
import { } 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

@ -3,65 +3,72 @@
@section('description', __('Formulaire d\'authentification au back-office.'))
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8 p-0">
<div class="card">
<div class="card-header">{{ __('Connexion') }}</div>
<div class="card-body">
<form method="POST" action="{{ route('bo.login') }}">
@csrf
<div class="row mb-3">
<label for="email" class="col-md-4 col-form-label text-md-end">{{ __('Adresse Email') }}</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email"
value="{{ old('email') }}" autocomplete="email" autofocus required>
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="row mb-3">
<label for="password" class="col-md-4 col-form-label text-md-end">{{ __('Mot de passe') }}</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror"
name="password" autocomplete="current-password" required>
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="row mb-3">
<div class="col-md-6 offset-md-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>
<label class="form-check-label user-select-none" for="remember">
{{ __('Se souvenir de moi') }}
</label>
<div class="container">
<div class="row justify-content-center">
<div class="col-12 p-2 text-center">
<img class="logo img-fluid" src="{{ Vite::asset('resources/assets/images/logo.png') }}" alt="{{ config('app.name') }}">
</div>
<div class="col-md-8 p-0">
<div class="mt-2">
@include('modules.flash-messages')
</div>
<div class="card">
<div class="card-header fw-bold">{{ __('Connexion') }}</div>
<div class="card-body">
<form method="POST" action="{{ route('bo.login') }}">
@csrf
<div class="row mb-3">
<label class="col-md-4 col-form-label text-md-end" for="email">{{ __('Adresse Email') }}</label>
<div class="col-md-6">
<input class="form-control @error('email') is-invalid @enderror" id="email" name="email"
type="email" value="{{ old('email') }}" autocomplete="email" autofocus required>
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
</div>
<div class="row mb-0">
<div class="col-md-8 offset-md-4">
<button type="submit" class="btn btn-primary">
<span>{{ __('Connexion') }}</span>
<i class="fa-solid fa-arrow-right-from-bracket"></i>
</button>
@if (Route::has('bo.password.request'))
<a class="btn btn-link" href="{{ route('bo.password.request') }}">
{{ __('Mot de passe oublié ?') }}
</a>
@endif
<div class="row mb-3">
<label class="col-md-4 col-form-label text-md-end" for="password">{{ __('Mot de passe') }}</label>
<div class="col-md-6">
<input class="form-control @error('password') is-invalid @enderror" id="password" name="password"
type="password" autocomplete="current-password" required>
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
</div>
</form>
<div class="row mb-3">
<div class="col-md-6 offset-md-4">
<div class="form-check">
<input class="form-check-input" id="remember" name="remember" type="checkbox"
{{ old('remember') ? 'checked' : '' }}>
<label class="form-check-label user-select-none" for="remember">
{{ __('Se souvenir de moi') }}
</label>
</div>
</div>
</div>
<div class="row mb-0">
<div class="col-md-8 offset-md-4">
<button class="btn btn-primary" type="submit">
<span>{{ __('Connexion') }}</span>
<i class="fa-solid fa-arrow-right-from-bracket"></i>
</button>
@if (Route::has('bo.password.request'))
<a class="btn btn-link" href="{{ route('bo.password.request') }}">
{{ __('Mot de passe oublié ?') }}
</a>
@endif
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View file

@ -9,23 +9,16 @@
data-bs-theme="{{ (\App\Enums\Theme\BootstrapThemeEnum::make(intval(Cache::get('theme'))) ?? \App\Enums\Theme\BootstrapThemeEnum::light)->name() }}">
<!-- Navigation -->
@include('bo.layouts.header')
<!-- Main content -->
<main class="container-fluid">
<div class="row justify-content-center p-3">
<!-- Show a message when an action is performed -->
<div class="container">
<div class="row justify-content-center">
<div class="col-12 col-md-10 col-lg-8 px-2">
@include('modules.flash-messages')
</div>
</div>
</div>
<!-- Main content -->
<div class="row justify-content-center">
<div class="col-12 col-md-10 col-lg-8 p-md-0 pt-3">
@yield('content')
</div>
<main
class="@auth('backend') container-fluid @else container d-flex flex-column align-items-center justify-content-center pb-5 @endauth @yield('bg-color')"
id="main-container">
<div class="row justify-content-center @guest w-100 mx-auto @endguest">
@include('bo.layouts.sidemenu')
<div class="@auth('backend') col-md-8 col-lg-9 col-xxl-10 ms-sm-auto p-3 py-2 py-md-3 z-1 @else col px-md-4 pb-5 @endauth">
@auth('backend')
@include('modules.flash-messages')
@endauth
@yield('content')
</div>
</div>
</main>

View file

@ -1,4 +1,4 @@
<footer class="bg-body-tertiary px-0 text-center" id="footer">
<footer class="bg-body-tertiary position-relative px-0 text-center" id="footer">
<div class="p-2 text-center">
@if (isset($cpsr_name) && isset($cpsr_version))
<span class="text-reset">{{ $cpsr_name }}&nbsp;-&nbsp;{{ $cpsr_version }}</span>

View file

@ -1,83 +1,118 @@
<nav class="navbar navbar-expand-lg position-fixed fixed-top bg-body-tertiary shadow-sm" id="top-navbar">
<div class="container">
<a class="navbar-brand" data-bs-toggle="tooltip" data-bs-placement="bottom" href="{{ route('fo.homepage') }}"
<header class="navbar @auth('backend') navbar-expand-md @else navbar-expand @endauth position-fixed fixed-top bg-body-tertiary shadow-sm"
id="top-navbar">
<div class="container-fluid">
{{-- BUTTON MENU NAVIGATION --}}
@auth('backend')
<button class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#menuNavigation" type="button" aria-controls="menuNavigation"
aria-expanded="false" aria-label="{{ __('Afficher/Masquer le menu de navigation') }}">
<i class="fa-solid fa-ellipsis-vertical fa-lg"></i>
</button>
@endauth
<a class="navbar-brand fs-4 fw-bold @canAny(['isConceptor', 'viewAny'], \App\Models\User::class) border-md-end @endcan me-md-2 pe-md-3 m-0 p-0"
data-bs-toggle="tooltip" data-bs-placement="bottom" href="{{ route('fo.homepage') }}"
title="{{ __('Accéder au front du projet') }}" target="_blank">
{{ config('app.name', 'Laravel') }}
</a>
@auth
<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 MENU USER --}}
@auth('backend')
<button class="navbar-toggler" data-bs-toggle="offcanvas" data-bs-target="#menuUser" type="button" aria-controls="menuUser"
aria-expanded="false" aria-label="{{ __('Afficher/Masquer le menu d\'utilisateur') }}">
<span class="navbar-toggler-icon fa-sm"></span>
</button>
@endauth
<div class="navbar-collapse collapse" id="navbarSupportedContent">
<!-- Left Side Of Navbar -->
@include('bo.layouts.nav-list')
<!-- Right Side Of Navbar -->
<ul class="navbar-nav ms-auto">
<!-- Bootstrap themes -->
<li class="nav-item dropdown @auth border-end @endauth">
<button class="btn nav-link dropdown-toggle d-flex align-items-center h-100 flex-row border-0 pe-3"
data-bs-toggle="dropdown" type="button" aria-expanded="false">
<i class="fa-solid fa-paint-roller"></i>
</button>
<form class="dropdown-menu dropdown-menu-end text-center" id="theme-selector" action="{{ route('bo.theme.set') }}"
method="POST">
@push('scripts')
<script @if (!empty($nonce)) nonce="{{ $nonce }}" @endif>
document.addEventListener('DOMContentLoaded', function() {
const themeSelector = document.getElementById('theme-selector');
if (themeSelector) {
themeSelector.addEventListener('change', function() {
this.submit();
});
}
});
</script>
@endpush
@csrf
@php $theme = intval(Cache::get('theme')); @endphp
@foreach (\App\Enums\Theme\BootstrapThemeEnum::toArray() as $key => $bootstrapTheme)
<input class="d-none form-check-input" id="theme{{ $key }}" name="theme" type="radio"
value="{{ $bootstrapTheme->value }}">
<label class="dropdown-item w-100 text-decoration-none @if ($bootstrapTheme->value === intval(Cache::get('theme'))) active @endif p-2"
for="theme{{ $key }}" role="button">
{{ Str::of($bootstrapTheme->label)->ucFirst() }}
</label>
@endforeach
</form>
</li>
<!-- Authentication Links -->
@auth
<li class="nav-item dropdown">
<button class="btn nav-link dropdown-toggle d-flex align-items-center h-100 flex-row border-0 ps-3" id="navbarDropdown"
data-bs-toggle="dropdown" type="button">
<div class="d-flex flex-column align-items-end lh-1">
<span
class="fw-bold">{{ auth('backend')->user()->first_name }}&nbsp;{{ auth('backend')->user()->last_name }}</span>
<small class="text-secondary-body">{{ Str::of(auth('backend')->user()->role->label())->ucFirst() }}</small>
</div>
{{-- MENU USER --}}
<div class="offcanvas offcanvas-end" id="menuUser" aria-labelledby="menuUserContent" tabindex="-1">
<div class="offcanvas-header border border-top-0 border-start-0 border-end-0 border-2 border-secondary">
<h5 class="offcanvas-title" id="menuUserContent">{{ __('Menu utilisateur') }}</h5>
<button class="btn-close" data-bs-dismiss="offcanvas" type="button" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<!-- Left Side Of Navbar -->
@canAny(['isConceptor', 'viewAny'], \App\Models\User::class)
<ul class="navbar-nav me-auto">
@can('viewAny', \App\Models\User::class)
<li class="nav-item">
<a class="nav-link d-flex align-items-center h-100 @if (request()->routeIs('bo.users.*')) active @endif"
data-bs-toggle="tooltip" href="{{ route('bo.users.index') }}"
title="{{ __('crud.helpers.list_all', ['model' => Str::plural(__('models.classes.user'))]) }}">
{{ Str::of(__('models.classes.user'))->plural()->ucfirst() }}
</a>
</li>
@endcan
@can('isConceptor')
<li class="nav-item">
<a class="nav-link d-flex align-items-center h-100 @if (request()->routeIs('bo.activity_logs.*')) active @endif"
data-bs-toggle="tooltip" href="{{ route('bo.activity_logs.index') }}"
title="{{ __('crud.helpers.list_all', ['model' => trans_choice('models.classes.activity_log', '*')]) }}">
{{ Str::of(trans_choice('models.classes.activity_log', '*'))->ucfirst() }}
</a>
</li>
@endcan
</ul>
@endcan
<!-- Right Side Of Navbar -->
<ul class="navbar-nav ms-auto">
<!-- Bootstrap themes -->
<li class="nav-item dropdown @auth('backend') border-md-end @endauth">
<button class="btn nav-link dropdown-toggle d-flex align-items-center h-100 flex-row border-0 pe-3"
data-bs-toggle="dropdown" type="button" aria-expanded="false" aria-label="Changer les couleurs de l'interface du back-office">
<span class="fa-solid fa-paint-roller"></span>
</button>
<div class="dropdown-menu dropdown-menu-end m-0 text-center" aria-labelledby="navbarDropdown">
<a class="dropdown-item w-100 text-decoration-none p-2" data-bs-toggle="tooltip" data-bs-placement="left"
href="{{ route('bo.users.edit',auth('backend')->user()->getKey()) }}"
title="{{ __('Accéder à son profile') }}">
{{ __('Profile') }}
</a>
<hr class="dropdown-divider m-0">
<form class="m-0 text-center" id="logout-form" action="{{ route('bo.logout') }}" method="POST">
@csrf
<button class="dropdown-item w-100 text-decoration-none p-2" data-bs-toggle="tooltip" data-bs-placement="left"
type="submit" title="{{ __('Se déconnecter du back-office') }}">
{{ __('Déconnexion') }}
</button>
</form>
</div>
<form class="dropdown-menu dropdown-menu-end text-center" id="theme-selector" action="{{ route('bo.theme.set') }}"
method="POST">
@push('scripts')
<script @if (!empty($nonce)) nonce="{{ $nonce }}" @endif>
document.addEventListener('DOMContentLoaded', function() {
const themeSelector = document.getElementById('theme-selector');
if (themeSelector) {
themeSelector.addEventListener('change', function() {
this.submit();
});
}
});
</script>
@endpush
@csrf
@php $theme = intval(Cache::get('theme')); @endphp
@foreach (\App\Enums\Theme\BootstrapThemeEnum::toArray() as $key => $bootstrapTheme)
<input class="d-none form-check-input" id="theme{{ $key }}" name="theme" type="radio"
value="{{ $bootstrapTheme->value }}">
<label class="dropdown-item w-100 text-decoration-none @if ($bootstrapTheme->value === intval(Cache::get('theme'))) active @endif p-2"
for="theme{{ $key }}" role="button">
{{ Str::of($bootstrapTheme->label)->ucFirst() }}
</label>
@endforeach
</form>
</li>
@endauth
</ul>
<!-- Authentication Links -->
@auth('backend')
<li class="nav-item dropdown">
<button class="btn nav-link dropdown-toggle d-flex align-items-center h-100 ps-md-3 flex-row border-0" id="navbarDropdown"
data-bs-toggle="dropdown" type="button">
<div class="d-flex flex-column align-items-start align-items-md-end lh-1">
<span
class="fw-bold">{{ auth('backend')->user()->first_name }}&nbsp;{{ auth('backend')->user()->last_name }}</span>
<small class="text-secondary-body">{{ Str::of(auth('backend')->user()->role->label())->ucFirst() }}</small>
</div>
</button>
<div class="dropdown-menu dropdown-menu-end m-0 text-center" aria-labelledby="navbarDropdown">
<a class="dropdown-item w-100 text-decoration-none p-2" data-bs-toggle="tooltip" data-bs-placement="left"
href="{{ route('bo.users.edit',auth('backend')->user()->getKey()) }}" title="{{ __('Accéder à son profile') }}">
{{ __('Profile') }}
</a>
<hr class="dropdown-divider m-0">
<form class="m-0 text-center" id="logout-form" action="{{ route('bo.logout') }}" method="POST">
@csrf
<button class="dropdown-item w-100 text-decoration-none p-2" data-bs-toggle="tooltip" data-bs-placement="left"
type="submit" title="{{ __('Se déconnecter du back-office') }}">
{{ __('Déconnexion') }}
</button>
</form>
</div>
</li>
@endauth
</ul>
</div>
</div>
</div>
</nav>
</header>

View file

@ -1,49 +0,0 @@
@auth('backend')
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link @if (request()->routeIs('bo.dashboard')) active @endif" data-bs-toggle="tooltip" href="{{ route('bo.dashboard') }}"
title="{{ __('Revenir à l\'accueil') }}">
{{ __('Accueil') }}
</a>
</li>
@can('viewAny', \App\Models\StaticPage::class)
<li class="nav-item">
<a class="nav-link @if (request()->routeIs('bo.static_pages.*')) active @endif" data-bs-toggle="tooltip"
href="{{ route('bo.static_pages.index') }}"
title="{{ __('crud.helpers.list_all', ['model' => Str::of(trans_choice('models.classes.static_page', '*'))->title()]) }}">
{{ Str::of(trans_choice('models.classes.static_page', '*'))->title() }}
</a>
</li>
@endcan
@canAny(['isConceptor', 'viewAny'], \App\Models\User::class)
<li class="nav-item">
<div class="dropdown">
<a class="nav-link @if (request()->routeIs('bo.users.*') || request()->routeIs('bo.activity_logs.*')) active @endif dropdown-toggle" data-bs-toggle="dropdown" type="button"
aria-expanded="false">
{{ __('Avancé') }}
</a>
<ol class="dropdown-menu">
@can('viewAny', \App\Models\User::class)
<li>
<a class="dropdown-item @if (request()->routeIs('bo.users.*')) active @endif" data-bs-toggle="tooltip"
href="{{ route('bo.users.index') }}"
title="{{ __('crud.helpers.list_all', ['model' => Str::plural(__('models.classes.user'))]) }}">
{{ Str::of(__('models.classes.user'))->plural()->ucfirst() }}
</a>
</li>
@endcan
@can('isConceptor')
<li>
<a class="dropdown-item @if (request()->routeIs('bo.activity_logs.*')) active @endif" data-bs-toggle="tooltip"
href="{{ route('bo.activity_logs.index') }}"
title="{{ __('crud.helpers.list_all', ['model' => trans_choice('models.classes.activity_log', '*')]) }}">
{{ Str::of(trans_choice('models.classes.activity_log', '*'))->ucfirst() }}
</a>
</li>
@endcan
</ol>
</a>
</li>
@endcan
</ul>
@endauth

View file

@ -0,0 +1,17 @@
@auth('backend')
<nav class="col-md-4 col-lg-3 col-xxl-2 d-md-block bg-body-tertiary sidebar z-2 collapse" id="menuNavigation">
<div class="sidemenu py-2">
{{-- HOME --}}
<a class="btn btn-primary w-100 @if (request()->routeIs('bo.dashboard')) fw-bold active @endif" data-bs-toggle="tooltip"
href="{{ route('bo.dashboard') }}" title="{{ __('Accéder à la page d\'accueil du back-office') }}" role="button">
<i class="fa-solid fa-house"></i>&nbsp;{{ __('Accueil') }}
</a>
{{-- STATIC PAGES --}}
<a class="btn btn-primary w-100 @if (request()->routeIs('bo.static_pages.*')) fw-bold active @endif mt-1" data-bs-toggle="tooltip"
href="{{ route('bo.static_pages.index') }}"
title="{{ __('crud.helpers.list_all', ['model' => trans_choice('models.classes.static_page', '*')]) }}" role="button">
<i class="fa-solid fa-file"></i>&nbsp;{{ Str::of(trans_choice('models.classes.static_page', '*'))->title() }}
</a>
</div>
</nav>
@endauth

View file

@ -1,33 +1,29 @@
@extends('bo.layout')
@section('title', __('Accueil'))
@section('description', __('Description site'))
@section('breadcrumb', 'no')
@section('title', __('Accueil back-office'))
@section('description', __('Page d\'accueil de la partie administration du site :site', ['site' => config('app.name')]))
@section('content')
<div class="row">
<div class="col">
<div class="card text-center">
<div class="card-header fw-bold">
<h1 class="h2 fw-bold">{{ __('Dashboard') }}</h1>
</div>
<div class="card-body">
<h5 class="card-title">
{{ __('Bonjour :first_name :last_name !', [
'first_name' => auth('backend')->user()->first_name,
'last_name' => auth('backend')->user()->last_name,
]) }}
</h5>
<p class="card-text m-0">
{{ __('Bienvenue dans le back-office, où vous pouvez gérer votre application web.') }}
</p>
<p class="card-text">
{{ __('Pour tout problème ou évolution souhaitée, veuillez nous contacter via notre outil : ') }}
<a data-bs-toggle="tooltip" href="https://support.uwil.fr/" title="{{ __('Accéder à notre outil de ticketing') }}"
target="blank">https://support.uwil.fr/</a>.
</p>
</div>
</div>
<div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap">
@include('modules.breadcrumbs.breadcrumb-body')
</div>
<div class="border-start-0 border-end-0 border-bottom-0 border-secondary mt-2 border border-2">
<h5 class="card-title py-2">
{{ __('Bonjour :first_name :last_name !', [
'first_name' => auth('backend')->user()->first_name,
'last_name' => auth('backend')->user()->last_name,
]) }}
</h5>
<p class="card-text m-0">
{{ __('Bienvenue dans le back-office, où vous pouvez gérer votre application web.') }}
</p>
<p class="card-text">
{{ __('Pour tout problème ou évolution souhaitée, veuillez nous contacter via notre outil : ') }}
<a class="btn btn-primary btn-sm" data-bs-toggle="tooltip" href="https://support.uwil.fr/"
title="{{ __('Accéder à notre outil de ticketing') }}" target="blank">
{{ __('Uwil Support') }}
<i class="fa-solid fa-arrow-up-right-from-square ms-1"></i>
</a>
</p>
</div>
</div>
@endsection

View file

@ -1,6 +1,6 @@
@if (!request()->routeIs('login'))
@if ($message = Session::get('success', Session::get('bo.success')))
<div class="alert alert-success alert-dismissible fade show m-0 my-4 mb-3" role="alert">
<div class="alert alert-success alert-dismissible fade show m-0 mb-3" role="alert">
<i class="fa-solid fa-circle-check"></i>
<strong>{!! nl2br(e($message)) !!}</strong>
<button class="btn-close" data-bs-dismiss="alert" type="button" aria-label="{{ __('Fermer') }}"></button>
@ -8,7 +8,7 @@
@endif
@if ($message = Session::get('error', Session::get('bo.error')))
<div class="alert alert-danger alert-dismissible fade show m-0 my-4 mb-3" role="alert">
<div class="alert alert-danger alert-dismissible fade show m-0 mb-3" role="alert">
<i class="fa-solid fa-circle-xmark"></i>
<strong>{!! nl2br(e($message)) !!}</strong>
<button class="btn-close" data-bs-dismiss="alert" type="button" aria-label="{{ __('Fermer') }}"></button>
@ -16,7 +16,7 @@
@endif
@if ($message = Session::get('warning', Session::get('bo.warning')))
<div class="alert alert-warning alert-dismissible fade show m-0 my-4 mb-3" role="alert">
<div class="alert alert-warning alert-dismissible fade show m-0 mb-3" role="alert">
<i class="fa-solid fa-circle-exclamation"></i>
<strong>{!! nl2br(e($message)) !!}</strong>
<button class="btn-close" data-bs-dismiss="alert" type="button" aria-label="{{ __('Fermer') }}"></button>
@ -24,7 +24,7 @@
@endif
@if ($message = Session::get('status', Session::get('bo.status')))
<div class="alert alert-info alert-dismissible fade show m-0 my-4 mb-3" role="alert">
<div class="alert alert-info alert-dismissible fade show m-0 mb-3" role="alert">
<i class="fa-solid fa-circle-info"></i>
<strong>{!! nl2br(e($message)) !!}</strong>
<button class="btn-close" data-bs-dismiss="alert" type="button" aria-label="{{ __('Fermer') }}"></button>
@ -32,7 +32,7 @@
@endif
@if ($message = Session::get('info', Session::get('bo.info')))
<div class="alert alert-info alert-dismissible fade show m-0 my-4 mb-3" role="alert">
<div class="alert alert-info alert-dismissible fade show m-0 mb-3" role="alert">
<i class="fa-solid fa-circle-info"></i>
<strong>{!! nl2br(e($message)) !!}</strong>
<button class="btn-close" data-bs-dismiss="alert" type="button" aria-label="{{ __('Fermer') }}"></button>
@ -40,7 +40,7 @@
@endif
@if ($errors->any())
<div class="alert alert-danger alert-dismissible fade show m-0 my-4 mb-3" role="alert">
<div class="alert alert-danger alert-dismissible fade show m-0 mb-3" role="alert">
<p class="fw-bold m-0"><i class="fa-solid fa-circle-exclamation"></i>&nbsp;Liste des erreurs :</p>
@if ($errors->any())
<ul class="list-unstyled m-0">

View file

@ -7,6 +7,14 @@ use Diglactic\Breadcrumbs\Breadcrumbs;
use Diglactic\Breadcrumbs\Generator;
use Illuminate\Support\Str;
// * DASHBOARD
Breadcrumbs::for('bo.dashboard', function (Generator $trail) {
$trail->push(
Str::of(trans('accueil'))->ucfirst(),
route('bo.dashboard')
);
});
// * USERS
Breadcrumbs::for('bo.users.index', function (Generator $trail) {
$trail->push(