diff --git a/public/content/inspirations/1_shape-of-the-nature/20878a95a67b25e122365f351f1ec1a7.jpg.txt b/public/content/inspirations/1_shape-of-the-nature/20878a95a67b25e122365f351f1ec1a7.jpg.txt index b1e6444..e502190 100644 --- a/public/content/inspirations/1_shape-of-the-nature/20878a95a67b25e122365f351f1ec1a7.jpg.txt +++ b/public/content/inspirations/1_shape-of-the-nature/20878a95a67b25e122365f351f1ec1a7.jpg.txt @@ -1,3 +1,11 @@ +Alt: + +---- + +Favoriteforusers: + +---- + Description: ---- diff --git a/public/content/inspirations/1_shape-of-the-nature/d82f18573c439d6edd434ffca62471a7.png.txt b/public/content/inspirations/1_shape-of-the-nature/d82f18573c439d6edd434ffca62471a7.png.txt index b799303..2e8c181 100644 --- a/public/content/inspirations/1_shape-of-the-nature/d82f18573c439d6edd434ffca62471a7.png.txt +++ b/public/content/inspirations/1_shape-of-the-nature/d82f18573c439d6edd434ffca62471a7.png.txt @@ -1,3 +1,11 @@ +Alt: + +---- + +Favoriteforusers: - user://WWjXgPWk + +---- + Favoriteforclients: - page://G418qZ4ABsoWFx4i diff --git a/public/site/blueprints/files/inspiration.yml b/public/site/blueprints/files/inspiration.yml index 72df070..b7b4926 100644 --- a/public/site/blueprints/files/inspiration.yml +++ b/public/site/blueprints/files/inspiration.yml @@ -5,7 +5,11 @@ accept: type: image fields: + alt: + label: Texte alternatif + type: text favoriteForUsers: label: | Dans les favoris des utilisateurs : type: users + disabled: true diff --git a/public/site/config/config.php b/public/site/config/config.php index 795178d..1b6e547 100644 --- a/public/site/config/config.php +++ b/public/site/config/config.php @@ -16,89 +16,10 @@ return [ 'language' => 'fr', 'css' => 'assets/css/panel.css', 'favicon' => 'assets/favicons/favicon.svg', - 'menu' => [ - 'site' => [ - 'label' => 'Dashboard', - 'icon' => 'dashboard', - 'current' => function (string $current): bool { - // the links of all your custom menu entries - $links = [ - 'pages/clients', - 'pages/projects', - 'pages/inspirations', - 'pages/notifications', - 'pages/events' - ]; - $path = Kirby\Cms\App::instance()->path(); - return - $current === 'site' && - A::every($links, fn ($link) => Str::contains($path, $link) === false); - } - ], - 'clients' => [ - 'label' => 'Clients', - 'icon' => 'account', - 'link' => 'pages/clients', - 'current' => function (string $current): bool { - $path = Kirby\Cms\App::instance()->path(); - return Str::contains($path, 'pages/clients'); - } - ], - 'projects' => [ - 'label' => 'Projets', - 'icon' => 'folder', - 'link' => 'pages/projects', - 'current' => function (string $current): bool { - $path = Kirby\Cms\App::instance()->path(); - return Str::contains($path, 'pages/projects'); - } - ], - 'inspirations' => [ - 'label' => 'Inspirations', - 'icon' => 'images', - 'link' => 'pages/inspirations', - 'current' => function (string $current): bool { - $path = Kirby\Cms\App::instance()->path(); - return Str::contains($path, 'pages/inspirations'); - } - ], - '-', - 'notifications' => [ - 'label' => 'Notifications', - 'icon' => 'bell', - 'link' => 'pages/notifications', - 'current' => function (string $current): bool { - $path = Kirby\Cms\App::instance()->path(); - return Str::contains($path, 'pages/notifications'); - } - ], - 'events' => [ - 'label' => 'Événements', - 'icon' => 'calendar', - 'link' => 'pages/events', - 'current' => function (string $current): bool { - $path = Kirby\Cms\App::instance()->path(); - return Str::contains($path, 'pages/events'); - } - ], - '-', - 'users', - 'system' - ] + 'menu' => require(__DIR__ . '/menu.php'), ], 'routes' => [ - [ - 'pattern' => '(:all)logout.php', - 'action' => function () { - $kirby = kirby(); - $user = $kirby->user(); - $user->logout(); - session_start(); - - go($_SESSION['redirect_url']); - - return 'logout'; - } - ] + require(__DIR__ . '/routes/logout.php'), + require(__DIR__ . '/routes/toggle-favorite.php'), ] ]; diff --git a/public/site/config/menu.php b/public/site/config/menu.php new file mode 100644 index 0000000..fbfbccc --- /dev/null +++ b/public/site/config/menu.php @@ -0,0 +1,71 @@ + [ + 'label' => 'Dashboard', + 'icon' => 'dashboard', + 'current' => function (string $current): bool { + // the links of all your custom menu entries + $links = [ + 'pages/clients', + 'pages/projects', + 'pages/inspirations', + 'pages/notifications', + 'pages/events' + ]; + $path = Kirby\Cms\App::instance()->path(); + return + $current === 'site' && + A::every($links, fn ($link) => Str::contains($path, $link) === false); + } + ], + 'clients' => [ + 'label' => 'Clients', + 'icon' => 'account', + 'link' => 'pages/clients', + 'current' => function (string $current): bool { + $path = Kirby\Cms\App::instance()->path(); + return Str::contains($path, 'pages/clients'); + } + ], + 'projects' => [ + 'label' => 'Projets', + 'icon' => 'folder', + 'link' => 'pages/projects', + 'current' => function (string $current): bool { + $path = Kirby\Cms\App::instance()->path(); + return Str::contains($path, 'pages/projects'); + } + ], + 'inspirations' => [ + 'label' => 'Inspirations', + 'icon' => 'images', + 'link' => 'pages/inspirations', + 'current' => function (string $current): bool { + $path = Kirby\Cms\App::instance()->path(); + return Str::contains($path, 'pages/inspirations'); + } + ], + '-', + 'notifications' => [ + 'label' => 'Notifications', + 'icon' => 'bell', + 'link' => 'pages/notifications', + 'current' => function (string $current): bool { + $path = Kirby\Cms\App::instance()->path(); + return Str::contains($path, 'pages/notifications'); + } + ], + 'events' => [ + 'label' => 'Événements', + 'icon' => 'calendar', + 'link' => 'pages/events', + 'current' => function (string $current): bool { + $path = Kirby\Cms\App::instance()->path(); + return Str::contains($path, 'pages/events'); + } + ], + '-', + 'users', + 'system' +]; \ No newline at end of file diff --git a/public/site/config/routes/logout.php b/public/site/config/routes/logout.php new file mode 100644 index 0000000..ff9d5b6 --- /dev/null +++ b/public/site/config/routes/logout.php @@ -0,0 +1,13 @@ + '(:all)logout.php', + 'action' => function () { + $kirby = kirby(); + $user = $kirby->user(); + $user->logout(); + session_start(); + + go(site()->url()); + } +]; \ No newline at end of file diff --git a/public/site/config/routes/toggle-favorite.php b/public/site/config/routes/toggle-favorite.php new file mode 100644 index 0000000..a609b9c --- /dev/null +++ b/public/site/config/routes/toggle-favorite.php @@ -0,0 +1,33 @@ + '(:all)toggle-favorite.json', + 'method' => 'post', + 'action' => function () { + $json = file_get_contents('php://input'); + $data = json_decode($json); + + $fileName = $data->fileName; + + $page = page($data->inspirationUri); + $file = $page->files()->find($fileName); + + $user = Find::user($data->userUuid); + $favoriteForUsers = $file->favoriteForUsers()->toUsers(); + + if ($favoriteForUsers->has($user)) { + $favoriteForUsers->remove($user); + } else { + $favoriteForUsers->add($user); + } + + $array = $favoriteForUsers->toArray(); + $yaml = Data::encode($array, 'yaml'); + + $file->update([ + 'favoriteForUsers' => $yaml + ]); + + return $favoriteForUsers->toJson(); + } +]; \ No newline at end of file diff --git a/public/site/snippets/footer.php b/public/site/snippets/footer.php index 3c52612..0526bd8 100644 --- a/public/site/snippets/footer.php +++ b/public/site/snippets/footer.php @@ -1,7 +1,9 @@ \ No newline at end of file diff --git a/public/site/snippets/generic-template.php b/public/site/snippets/generic-template.php index f7d9cc5..e5d4929 100644 --- a/public/site/snippets/generic-template.php +++ b/public/site/snippets/generic-template.php @@ -1,3 +1,9 @@ -
+user()) { + echo '
'; + } else { + go($site->panel()->url()); + } +?> \ No newline at end of file diff --git a/public/site/templates/inspirations.json.php b/public/site/templates/inspirations.json.php index bdb70b2..488c8bf 100644 --- a/public/site/templates/inspirations.json.php +++ b/public/site/templates/inspirations.json.php @@ -7,12 +7,16 @@ $inspirations = $page->children()->map(function ($child) { 'new' => $child->new()->value() === "true" ? true : false, 'date' => $child->date()->toDate('Y-MM-d'), 'url' => $child->url(), + 'uri' => $child->uri(), 'modified' => $child->modified('Y-MM-d'), 'status' => $child->status(), 'cover' => $child->cover()->toFile()->url(), 'media' => $child->media()->toFiles()->map(function ($file) { return [ - 'url' => $file->url() + 'url' => $file->url(), + 'ald' => $file->alt()->value(), + 'favoriteForUsers' => $file->favoriteForUsers()->value(), + 'name' => $file->filename() ]; })->values() ]; diff --git a/src/components/inspirations/Image.vue b/src/components/inspirations/Image.vue new file mode 100644 index 0000000..1aadd8d --- /dev/null +++ b/src/components/inspirations/Image.vue @@ -0,0 +1,114 @@ + + + diff --git a/src/stores/api.js b/src/stores/api.js index 8d34664..0d648c5 100644 --- a/src/stores/api.js +++ b/src/stores/api.js @@ -97,5 +97,28 @@ export const useApiStore = defineStore("api", () => { }); } - return { fetchDataThroughKQL, fetchPageData }; + async function fetchRoute(path, method, data) { + const config = { + method: method, + }; + + if (data) { + config.body = JSON.stringify(data); + } + + try { + const response = await fetch(path, config); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + const data = await response.json(); + console.log("La route " + path + " a fonctionné."); + return data; + } catch (error) { + console.error("La route " + path + " n'a pas fonctionné.", error); + throw error; + } + } + + return { fetchDataThroughKQL, fetchPageData, fetchRoute }; }); diff --git a/src/views/Inspirations.vue b/src/views/Inspirations.vue index 9b94981..e22f3a3 100644 --- a/src/views/Inspirations.vue +++ b/src/views/Inspirations.vue @@ -9,34 +9,12 @@
- +
@@ -48,6 +26,7 @@ import Menu from "../components/Menu.vue"; import Selector from "../components/inspirations/Selector.vue"; import Header from "../components/inspirations/Header.vue"; import Tabs from "../components/Tabs.vue"; +import Image from "../components/inspirations/Image.vue"; import { ref, computed } from "vue"; const { data } = defineProps({ @@ -94,60 +73,4 @@ function changeTab(newValue) { grid-auto-rows: 12rem; grid-auto-flow: dense; } -.masonry > * { - position: relative; - grid-row: span var(--rows); - width: 100%; - height: 100%; - margin: 0; - border-radius: var(--rounded-2xl); - overflow: hidden; -} -.masonry img { - width: 100%; - height: 100%; - object-fit: cover; -} -.masonry > *:hover::after { - content: ""; - position: absolute; - inset: 0; - background: var(--color-black-20); - z-index: 1; -} -.masonry > *:hover .favorite { - display: initial; -} - -/* Favorite button */ -.favorite { - position: absolute; - top: 0; - right: 0; - width: 3.5rem; - height: 3.5rem; - margin: var(--space-8); - padding: var(--space-8); - color: var(--color-grey-400); - display: none; - z-index: 10; -} -.favorite[aria-pressed="false"]:hover::before { - content: "Ajouter dans mes favoris"; - background: var(--color-background); - padding: 1.3rem 3.5rem 1.25rem 1rem; - position: absolute; - z-index: -1; - inset: -2px; - left: unset; - width: max-content; - border-radius: var(--rounded-xl); - color: var(--color-grey-700); - letter-spacing: var(--tracking-wide); - font-weight: 500; - font-size: var(--text-sm); -} -.favorite[aria-pressed="true"] { - color: var(--color-brand); -}