From 5b3549068b11828c3a16b8a493f8417718f9018e Mon Sep 17 00:00:00 2001 From: isUnknown Date: Wed, 30 Apr 2025 15:27:01 +0200 Subject: [PATCH 01/21] create login page --- public/site/controllers/site.php | 44 ++++++++++++++------------- public/site/templates/login.json.php | 13 ++++++++ public/site/templates/login.php | 1 + src/App.vue | 4 +-- src/router/routes.js | 45 +++++++++++++++------------- src/views/Login.vue | 23 ++++++++++++++ 6 files changed, 88 insertions(+), 42 deletions(-) create mode 100644 public/site/templates/login.json.php create mode 100644 public/site/templates/login.php create mode 100644 src/views/Login.vue diff --git a/public/site/controllers/site.php b/public/site/controllers/site.php index 73ff66a..ab60617 100644 --- a/public/site/controllers/site.php +++ b/public/site/controllers/site.php @@ -1,27 +1,31 @@ user()) { - go($site->panel()->url()); - } - $data = $page->toArray(); - $data['template'] = (string) $page->template(); - $data['newInspirations'] = (bool) page('inspirations')->children()->findBy('new', 'true'); + if (!$kirby->user() && $page->uri() != 'login') { + go('/login'); + } else { + $data = $page->toArray(); + $data['template'] = (string) $page->template(); + $data['newInspirations'] = (bool) page('inspirations')->children()->findBy('new', 'true'); - $userData = [ - "role" => (string) $kirby->user()->role(), - "uuid" => (string) $kirby->user()->uuid() - ]; - - if ($kirby->user()->client()->exists() && $kirby->user()->client()->isNotEmpty()) { - $userData['client'] = [ - "name" => (string) $kirby->user()->client()->toPage()->title(), - "uuid" => (string) $kirby->user()->client()->toPage()->uuid() + if ($kirby->user()) { + $userData = [ + "role" => (string) $kirby->user()->role(), + "uuid" => (string) $kirby->user()->uuid() + ]; + + if ($kirby->user()->client()->exists() && $kirby->user()->client()->isNotEmpty()) { + $userData['client'] = [ + "name" => (string) $kirby->user()->client()->toPage()->title(), + "uuid" => (string) $kirby->user()->client()->toPage()->uuid() + ]; + } + } + + + return [ + 'genericData' => $data, + 'userData' => $userData ?? null ]; } - - return [ - 'genericData' => $data, - 'userData' => $userData - ]; }; \ No newline at end of file diff --git a/public/site/templates/login.json.php b/public/site/templates/login.json.php new file mode 100644 index 0000000..8c7cbe7 --- /dev/null +++ b/public/site/templates/login.json.php @@ -0,0 +1,13 @@ + $page->exampleField(), + "exampleHardData" => 'Example hard value' +]; + +$pageData = array_merge($genericData, $specificData); + +echo json_encode([ + "page" => $pageData, + "user" => $userData +]); \ No newline at end of file diff --git a/public/site/templates/login.php b/public/site/templates/login.php new file mode 100644 index 0000000..4ed6305 --- /dev/null +++ b/public/site/templates/login.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.vue b/src/App.vue index 2bd1586..0afe36b 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,7 +1,7 @@ diff --git a/src/router/routes.js b/src/router/routes.js index 59af90b..be32a81 100644 --- a/src/router/routes.js +++ b/src/router/routes.js @@ -1,60 +1,65 @@ -import Home from "../views/Home.vue"; -import Notifications from "../views/Notifications.vue"; -import Reunions from "../views/Reunions.vue"; -import Inspirations from "../views/Inspirations.vue"; -import Kanban from "../views/Kanban.vue"; -import Brief from "../views/Brief.vue"; -import DesignToLight from "../views/DesignToLight.vue"; +import Home from '../views/Home.vue'; +import Notifications from '../views/Notifications.vue'; +import Reunions from '../views/Reunions.vue'; +import Inspirations from '../views/Inspirations.vue'; +import Kanban from '../views/Kanban.vue'; +import Brief from '../views/Brief.vue'; +import DesignToLight from '../views/DesignToLight.vue'; +import Login from '../views/Login.vue'; const routes = [ { - path: "/", + path: '/', component: Home, }, { - path: "/notifications", + path: '/login', + component: Login, + }, + { + path: '/notifications', component: Notifications, }, { - path: "/reunions", + path: '/reunions', component: Reunions, }, { - path: "/inspirations", + path: '/inspirations', component: Inspirations, }, { - path: "/design-to-light", + path: '/design-to-light', component: DesignToLight, }, { - path: "/projects/:id", + path: '/projects/:id', component: Kanban, }, { - path: "/projects/:id/client-brief", + path: '/projects/:id/client-brief', component: Brief, }, { - path: "/projects/:id/extended-brief", + path: '/projects/:id/extended-brief', component: Brief, }, // Redirections { - path: "/projects/:id/industrial-ideation", + path: '/projects/:id/industrial-ideation', redirect: (to) => { return ( - "/projects/" + + '/projects/' + to.params.id + - "?dialog=industrial-ideation&comments=true" + '?dialog=industrial-ideation&comments=true' ); }, }, { - path: "/projects/:id/proposal", + path: '/projects/:id/proposal', redirect: (to) => { - return "/projects/" + to.params.id + "?dialog=proposal&comments=true"; + return '/projects/' + to.params.id + '?dialog=proposal&comments=true'; }, }, ]; diff --git a/src/views/Login.vue b/src/views/Login.vue new file mode 100644 index 0000000..2b304c9 --- /dev/null +++ b/src/views/Login.vue @@ -0,0 +1,23 @@ + + From de52c5e6becfe407dfa12e142493ca596786c015 Mon Sep 17 00:00:00 2001 From: isUnknown Date: Wed, 30 Apr 2025 16:09:24 +0200 Subject: [PATCH 02/21] route /login managed through vue router --- public/site/controllers/site.php | 44 +++++++++++-------------- public/site/templates/projects.json.php | 10 +++++- src/router/router.js | 18 ++++++---- src/router/routes.js | 1 + 4 files changed, 41 insertions(+), 32 deletions(-) diff --git a/public/site/controllers/site.php b/public/site/controllers/site.php index ab60617..7d2d7c2 100644 --- a/public/site/controllers/site.php +++ b/public/site/controllers/site.php @@ -1,31 +1,27 @@ user() && $page->uri() != 'login') { - go('/login'); - } else { - $data = $page->toArray(); - $data['template'] = (string) $page->template(); - $data['newInspirations'] = (bool) page('inspirations')->children()->findBy('new', 'true'); + $data = $page->toArray(); + $data['template'] = (string) $page->template(); + $data['newInspirations'] = (bool) page('inspirations')->children()->findBy('new', 'true'); - if ($kirby->user()) { - $userData = [ - "role" => (string) $kirby->user()->role(), - "uuid" => (string) $kirby->user()->uuid() - ]; - - if ($kirby->user()->client()->exists() && $kirby->user()->client()->isNotEmpty()) { - $userData['client'] = [ - "name" => (string) $kirby->user()->client()->toPage()->title(), - "uuid" => (string) $kirby->user()->client()->toPage()->uuid() - ]; - } - } - - - return [ - 'genericData' => $data, - 'userData' => $userData ?? null + if ($kirby->user()) { + $userData = [ + "role" => (string) $kirby->user()->role(), + "uuid" => (string) $kirby->user()->uuid() ]; + + if ($kirby->user()->client()->exists() && $kirby->user()->client()->isNotEmpty()) { + $userData['client'] = [ + "name" => (string) $kirby->user()->client()->toPage()->title(), + "uuid" => (string) $kirby->user()->client()->toPage()->uuid() + ]; + } } + + + return [ + 'genericData' => $data, + 'userData' => $userData ?? null + ]; }; \ No newline at end of file diff --git a/public/site/templates/projects.json.php b/public/site/templates/projects.json.php index cabb5c7..ba74b69 100644 --- a/public/site/templates/projects.json.php +++ b/public/site/templates/projects.json.php @@ -1,7 +1,15 @@ user()) { + return json_encode([ + 'page' => $genericData, + 'user' => [] + ]); +} + function getProjectData($project) -{ +{ + $data = [ 'title' => $project->title()->value(), 'url' => $project->url(), diff --git a/src/router/router.js b/src/router/router.js index 0e25560..22dae89 100644 --- a/src/router/router.js +++ b/src/router/router.js @@ -1,9 +1,9 @@ -import { createWebHistory, createRouter } from "vue-router"; -import routes from "./routes"; -import { useApiStore } from "../stores/api"; -import { usePageStore } from "../stores/page"; -import { useUserStore } from "../stores/user"; -import { getActivePinia } from "pinia"; +import { createWebHistory, createRouter } from 'vue-router'; +import routes from './routes'; +import { useApiStore } from '../stores/api'; +import { usePageStore } from '../stores/page'; +import { useUserStore } from '../stores/user'; +import { getActivePinia } from 'pinia'; const router = createRouter({ history: createWebHistory(), @@ -12,10 +12,14 @@ const router = createRouter({ router.beforeEach(async (to, from, next) => { const pinia = getActivePinia(); - const api = useApiStore(pinia); const pageStore = usePageStore(pinia); const userStore = useUserStore(pinia); + if (to.path === '/login') next(); + + if (!userStore.user) next('/login'); + + const api = useApiStore(pinia); try { const res = await api.fetchData(to.path); diff --git a/src/router/routes.js b/src/router/routes.js index be32a81..2320150 100644 --- a/src/router/routes.js +++ b/src/router/routes.js @@ -13,6 +13,7 @@ const routes = [ component: Home, }, { + name: 'Login', path: '/login', component: Login, }, From 009752ff329e4cd753055538cedc629e118b9636 Mon Sep 17 00:00:00 2001 From: isUnknown Date: Wed, 30 Apr 2025 16:21:56 +0200 Subject: [PATCH 03/21] fix user login page display --- src/App.vue | 4 +++- src/router/router.js | 4 ++-- src/stores/user.js | 15 ++++++++++----- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/App.vue b/src/App.vue index 0afe36b..c7c1cb3 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,7 +1,7 @@ @@ -11,6 +11,7 @@ import { storeToRefs } from 'pinia'; import Menu from './components/Menu.vue'; import { usePageStore } from './stores/page'; import { detect } from 'detect-browser'; +import { useUserStore } from './stores/user'; const browser = detect(); @@ -20,4 +21,5 @@ if (browser) { ).dataset.browser = `${browser.name} ${browser.version} ${browser.os}`; } const { page } = storeToRefs(usePageStore()); +const { isLogged } = storeToRefs(useUserStore()); diff --git a/src/router/router.js b/src/router/router.js index 22dae89..984f883 100644 --- a/src/router/router.js +++ b/src/router/router.js @@ -17,12 +17,12 @@ router.beforeEach(async (to, from, next) => { if (to.path === '/login') next(); - if (!userStore.user) next('/login'); - const api = useApiStore(pinia); try { const res = await api.fetchData(to.path); + if (!res.user) next('/login'); + pageStore.page = res.page; userStore.user = res.user; next(); diff --git a/src/stores/user.js b/src/stores/user.js index 7fe5956..17aa2fe 100644 --- a/src/stores/user.js +++ b/src/stores/user.js @@ -1,10 +1,14 @@ -import { defineStore, storeToRefs } from "pinia"; -import { ref, computed } from "vue"; -import { useProjectsStore } from "./projects"; +import { defineStore, storeToRefs } from 'pinia'; +import { ref, computed } from 'vue'; +import { useProjectsStore } from './projects'; -export const useUserStore = defineStore("user", () => { +export const useUserStore = defineStore('user', () => { const user = ref(null); + const isLogged = computed(() => { + return user.value?.hasOwnProperty('role'); + }); + const { projects } = storeToRefs(useProjectsStore()); const notifications = computed(() => { @@ -22,7 +26,7 @@ export const useUserStore = defineStore("user", () => { }); function readNotification(notificationId, projectId) { - console.log("Read notification", notificationId, projectId); + console.log('Read notification', notificationId, projectId); projects.value = projects.value.map((project) => ({ ...project, notifications: @@ -57,6 +61,7 @@ export const useUserStore = defineStore("user", () => { return { user, + isLogged, notifications, readNotification, readAllNotifications, From b4ba43acf5a536118015bb174caac7f1a20c9bfd Mon Sep 17 00:00:00 2001 From: timotheegoguely Date: Wed, 30 Apr 2025 16:31:38 +0200 Subject: [PATCH 04/21] Update login form markup --- src/views/Login.vue | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/views/Login.vue b/src/views/Login.vue index 2b304c9..4e9750a 100644 --- a/src/views/Login.vue +++ b/src/views/Login.vue @@ -1,19 +1,33 @@ + + From 443369ee231159320d03c28b96a315da57f9495c Mon Sep 17 00:00:00 2001 From: isUnknown Date: Fri, 2 May 2025 17:58:50 +0200 Subject: [PATCH 06/21] front > account : start --- public/site/controllers/site.php | 12 ++++++ public/site/templates/account.json.php | 6 +++ public/site/templates/account.php | 1 + src/router/routes.js | 6 +++ src/views/Account.vue | 58 ++++++++++++++++++++++++++ 5 files changed, 83 insertions(+) create mode 100644 public/site/templates/account.json.php create mode 100644 public/site/templates/account.php create mode 100644 src/views/Account.vue diff --git a/public/site/controllers/site.php b/public/site/controllers/site.php index 7d2d7c2..fccf18e 100644 --- a/public/site/controllers/site.php +++ b/public/site/controllers/site.php @@ -7,6 +7,8 @@ return function ($page, $kirby, $site) { if ($kirby->user()) { $userData = [ + "name" => (string) $kirby->user()->name()->or(null), + "email" => (string) $kirby->user()->email(), "role" => (string) $kirby->user()->role(), "uuid" => (string) $kirby->user()->uuid() ]; @@ -17,6 +19,16 @@ return function ($page, $kirby, $site) { "uuid" => (string) $kirby->user()->client()->toPage()->uuid() ]; } + + if ($kirby->user()->projects()->exists() && $kirby->user()->projects()->isNotEmpty()) { + $userData['projects'] = $kirby->user()->projects()->toPages()->map(function ($project) { + return [ + "title" => (string) $project->title(), + "uri" => (string) $project->uri(), + "step" => (string) $project->getStepLabel(), + ]; + })->data; + } } diff --git a/public/site/templates/account.json.php b/public/site/templates/account.json.php new file mode 100644 index 0000000..032de0f --- /dev/null +++ b/public/site/templates/account.json.php @@ -0,0 +1,6 @@ + $genericData, + "user" => $userData +]); \ No newline at end of file diff --git a/public/site/templates/account.php b/public/site/templates/account.php new file mode 100644 index 0000000..4ed6305 --- /dev/null +++ b/public/site/templates/account.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/router/routes.js b/src/router/routes.js index 2320150..12d0f18 100644 --- a/src/router/routes.js +++ b/src/router/routes.js @@ -6,6 +6,7 @@ import Kanban from '../views/Kanban.vue'; import Brief from '../views/Brief.vue'; import DesignToLight from '../views/DesignToLight.vue'; import Login from '../views/Login.vue'; +import Account from '../views/Account.vue'; const routes = [ { @@ -17,6 +18,11 @@ const routes = [ path: '/login', component: Login, }, + { + name: 'Account', + path: '/account', + component: Account, + }, { path: '/notifications', component: Notifications, diff --git a/src/views/Account.vue b/src/views/Account.vue new file mode 100644 index 0000000..c299e20 --- /dev/null +++ b/src/views/Account.vue @@ -0,0 +1,58 @@ + + + + From c3119a5cabba4658f24ce2e4711cddadf02d495c Mon Sep 17 00:00:00 2001 From: isUnknown Date: Mon, 5 May 2025 14:01:03 +0200 Subject: [PATCH 07/21] account : add class is-editing --- src/views/Account.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/Account.vue b/src/views/Account.vue index c299e20..d4d3e4d 100644 --- a/src/views/Account.vue +++ b/src/views/Account.vue @@ -4,7 +4,7 @@
  • Nom : {{ user.name }}

  • -
  • +
  • Date: Mon, 5 May 2025 15:53:12 +0200 Subject: [PATCH 08/21] front > menu > account : link conditionally to panel or front account depending on user role --- public/site/controllers/site.php | 3 ++ src/components/Menu.vue | 80 +++++++++++++++++--------------- 2 files changed, 45 insertions(+), 38 deletions(-) diff --git a/public/site/controllers/site.php b/public/site/controllers/site.php index fccf18e..471bc23 100644 --- a/public/site/controllers/site.php +++ b/public/site/controllers/site.php @@ -18,6 +18,9 @@ return function ($page, $kirby, $site) { "name" => (string) $kirby->user()->client()->toPage()->title(), "uuid" => (string) $kirby->user()->client()->toPage()->uuid() ]; + if ($kirby->user()->client()->toPage()->logo()->isNotEmpty()) { + $userData['client']["logo"] = $kirby->user()->client()->toPage()->logo()->toFile()->url(); + } } if ($kirby->user()->projects()->exists() && $kirby->user()->projects()->isNotEmpty()) { diff --git a/src/components/Menu.vue b/src/components/Menu.vue index 2197a96..82327d0 100644 --- a/src/components/Menu.vue +++ b/src/components/Menu.vue @@ -15,7 +15,7 @@ xmlns="http://www.w3.org/2000/svg" > - {{ isExpanded ? "Masquer le menu" : "Afficher le menu" }} + {{ isExpanded ? 'Masquer le menu' : 'Afficher le menu' }} {{ "Nouveautés" }}{{ 'Nouveautés' }}
  • @@ -95,7 +95,11 @@