Compare commits
21 Commits
main
...
front_test
Author | SHA1 | Date | |
---|---|---|---|
a1322c64ca | |||
8394bf02f2 | |||
|
f48b570494 | ||
|
0733f8d5af | ||
|
8071c01c5d | ||
4ee3d9bc44 | |||
d75d45e204 | |||
|
9f3754776f | ||
651fb2b1a1 | |||
|
aa5988ce75 | ||
|
9ae18e1e4b | ||
22ebb0e1f4 | |||
09e4b3262f | |||
6a3d4239ab | |||
9d71c93b5b | |||
|
5145b833ae | ||
|
4080cee818 | ||
|
f4d73654d1 | ||
4fda5513a9 | |||
32407b0e8f | |||
b30e1196f4 |
10
front/MyINPulse-front/fake_data/db.json
Normal file
10
front/MyINPulse-front/fake_data/db.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"entrepreneurs": [
|
||||
{ "id": 1, "name": "Alice", "email": "alice@example.com" },
|
||||
{ "id": 2, "name": "Bob", "email": "bob@example.com" },
|
||||
{ "id": 3, "name": "Charlie", "email": "charlie@example.com" }
|
||||
],
|
||||
"data": [
|
||||
{ "canva_data": "this is a fake data to test api" }
|
||||
]
|
||||
}
|
2
front/MyINPulse-front/fake_data/open.sh
Executable file
2
front/MyINPulse-front/fake_data/open.sh
Executable file
@ -0,0 +1,2 @@
|
||||
#!/usr/bin/bash
|
||||
json-server --watch db.json --port 5000
|
@ -4,47 +4,12 @@ import ErrorWrapper from "@/views/errorWrapper.vue";
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
||||
<Header />
|
||||
<error-wrapper></error-wrapper>
|
||||
<div id="main">
|
||||
<ProjectComp
|
||||
v-for="(project, index) in projects"
|
||||
:key="index"
|
||||
:projectName="project.name"
|
||||
/>
|
||||
</div>
|
||||
<RouterLink to="/">Home</RouterLink> |
|
||||
<RouterLink to="/canvas">Canvas</RouterLink>
|
||||
<RouterView />
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
</style>
|
||||
|
||||
<script lang="ts">
|
||||
import Header from "@/components/Header.vue";
|
||||
import ProjectComp from "@/components/Project-comp.vue";
|
||||
|
||||
export default {
|
||||
name: 'App',
|
||||
components: {
|
||||
Header,
|
||||
ProjectComp,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
projects: [
|
||||
{
|
||||
name: 'Projet Alpha',
|
||||
//link: './project-alpha.html',
|
||||
//members: ['Alice', 'Bob', 'Charlie'],
|
||||
},
|
||||
{
|
||||
name: 'Projet Beta',
|
||||
//link: './project-beta.html',
|
||||
//members: ['David', 'Eve', 'Frank'],
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
</script>
|
75
front/MyINPulse-front/src/components/Agenda.vue
Normal file
75
front/MyINPulse-front/src/components/Agenda.vue
Normal file
@ -0,0 +1,75 @@
|
||||
<template>
|
||||
<div id="agenda">
|
||||
<h3>Rendez-vous</h3>
|
||||
<table>
|
||||
<tbody>
|
||||
<tr v-for=" (p, index) in projectRDV" :key="index" >
|
||||
<td>{{ p.projectName }} </td> <td>{{ p.date }}</td> <td>{{ p.lieu }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { defineProps } from "vue";
|
||||
|
||||
interface rendezVous{
|
||||
projectName: String,
|
||||
date: String,
|
||||
lieu: String,
|
||||
}
|
||||
|
||||
const props = defineProps<{
|
||||
projectRDV: rendezVous[]
|
||||
}>();
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
#agenda {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
/* Table Styling */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
font-family: Arial, sans-serif;
|
||||
text-align: left;
|
||||
margin-top: 20px;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
|
||||
/* Header Row (if exists) */
|
||||
th {
|
||||
background-color: #f4f4f4;
|
||||
padding: 12px;
|
||||
font-weight: bold;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
|
||||
/* Table Body Rows */
|
||||
tbody tr {
|
||||
border-bottom: 1px solid #ddd;
|
||||
transition: background-color 0.2s ease; /* Smooth hover effect */
|
||||
}
|
||||
|
||||
tbody tr:hover {
|
||||
background-color: #f9f9f9; /* Highlight row on hover */
|
||||
}
|
||||
|
||||
/* Cells Styling */
|
||||
td {
|
||||
padding: 10px;
|
||||
border: 1px solid #eee;
|
||||
font-size: 14px;
|
||||
vertical-align: middle; /* Align text to middle */
|
||||
}
|
||||
|
||||
/* First Column Styling */
|
||||
td:first-child {
|
||||
text-align: center;
|
||||
width: 50px; /* Adjust width as needed */
|
||||
}
|
||||
|
||||
</style>
|
@ -1,18 +1,129 @@
|
||||
<template>
|
||||
<div class="project">
|
||||
<div @click="goToLink" class="project">
|
||||
<div class="project-header">
|
||||
<h2 >{{ projectName }}</h2>
|
||||
<div class="project-buttons">
|
||||
<button class="contact-btn">Contact</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="project-body">
|
||||
<ul>
|
||||
<li v-for="(name, index) in listName" :key="index">{{ name }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'Project',
|
||||
props: {
|
||||
projectName: String,
|
||||
}
|
||||
<script setup lang="ts">
|
||||
import { defineProps } from "vue";
|
||||
import { useRouter } from 'vue-router'
|
||||
|
||||
|
||||
const props = defineProps<{
|
||||
projectName: string;
|
||||
listName: string[];
|
||||
projectLink: string;
|
||||
}>();
|
||||
|
||||
const router = useRouter();
|
||||
|
||||
const goToLink = () => {
|
||||
if (props.projectLink) {
|
||||
router.push(props.projectLink);
|
||||
}
|
||||
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<style scoped>
|
||||
.project {
|
||||
background: linear-gradient(to right, #f4f4f4, #ffffff);
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 10px;
|
||||
padding: 20px;
|
||||
margin: 20px 0;
|
||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
|
||||
/* Header Styling */
|
||||
.project-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.project-header h2 {
|
||||
font-size: 20px;
|
||||
color: #333;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* Button Container */
|
||||
.project-buttons {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
|
||||
.info-btn {
|
||||
background-color: #4CAF50;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.info-btn:hover {
|
||||
background-color: #45a049;
|
||||
transform: scale(1.05);
|
||||
}
|
||||
|
||||
.contact-btn {
|
||||
background-color: #007BFF;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.contact-btn:hover {
|
||||
background-color: #0056b3;
|
||||
transform: scale(1.05);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.project-body {
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.project-body p {
|
||||
font-size: 16px;
|
||||
color: #555;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.project-body ul {
|
||||
list-style-type: disc;
|
||||
margin: 0;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
.project-body ul li {
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
|
||||
button {
|
||||
padding: 10px 15px;
|
||||
background-color: #007bff;
|
||||
color: white;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
border-radius: 5px;
|
||||
}
|
||||
button:hover {
|
||||
background-color: #0056b3;
|
||||
}
|
||||
|
||||
</style>
|
88
front/MyINPulse-front/src/components/canvas/CanvasItem.vue
Normal file
88
front/MyINPulse-front/src/components/canvas/CanvasItem.vue
Normal file
@ -0,0 +1,88 @@
|
||||
<template>
|
||||
<div :class="['cell', { expanded }]"
|
||||
@click="toggleExpand"
|
||||
:style="{ justifyContent: expanded ? 'flex-start' : 'center' }"> <!-- Looking for finding a way
|
||||
to make this style in the toggleExpand event -->
|
||||
|
||||
<h3>{{ title }}</h3>
|
||||
<p>{{ currentDescription }}</p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, defineProps, onMounted } from "vue";
|
||||
import axios from "axios";
|
||||
|
||||
const props = defineProps<{
|
||||
title: string;
|
||||
description: string;
|
||||
}>();
|
||||
|
||||
const expanded = ref(false);
|
||||
const currentDescription = ref(props.description);
|
||||
|
||||
const fetchData = async () => {
|
||||
try {
|
||||
const response = await axios.get("http://localhost:5000/data"); // Update the URL if needed
|
||||
currentDescription.value = response.data[0].canva_data;
|
||||
} catch (error) {
|
||||
console.error("Erreur lors de la récupération des données :", error);
|
||||
}
|
||||
};
|
||||
|
||||
const toggleExpand = async () => {
|
||||
if (!expanded.value) {
|
||||
await fetchData();
|
||||
} else {
|
||||
currentDescription.value = props.description;
|
||||
}
|
||||
expanded.value = !expanded.value;
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
<style scoped>
|
||||
@import "@/components/canvas/style-project.css";
|
||||
|
||||
.cell {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
transition: all 0.3s ease;
|
||||
cursor: pointer;
|
||||
box-shadow: 0 4px 5px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.cell:not(.expanded):hover {
|
||||
transform: scale(1.05);
|
||||
box-shadow: 0 8px 9px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.cell h3 {
|
||||
font-size: 20px;
|
||||
font-weight: 500;
|
||||
/*margin-bottom: 10px;*/
|
||||
}
|
||||
|
||||
.cell p {
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.expanded {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: white;
|
||||
z-index: 10;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
</style>
|
120
front/MyINPulse-front/src/components/canvas/HeaderCanvas.vue
Normal file
120
front/MyINPulse-front/src/components/canvas/HeaderCanvas.vue
Normal file
@ -0,0 +1,120 @@
|
||||
<template>
|
||||
<header>
|
||||
<img src="../icons/logo inpulse.png" alt="INPulse Logo">
|
||||
<div class="header-buttons">
|
||||
<div class="menu">
|
||||
<button class="contact-button" @click="toggleDropdown">Contact</button>
|
||||
<div class="contact-dropdown" v-bind:class="{ 'dropdown-visible': isDropdownOpen }">
|
||||
<button @click="contactAll">Contact All</button>
|
||||
<button v-for="(email, index) in entrepreneurEmails" :key="index">
|
||||
{{ email }}
|
||||
</button>
|
||||
</div>
|
||||
<button class="return-button">
|
||||
<RouterLink to="/">Return to list project</RouterLink>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
</template>
|
||||
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted } from "vue";
|
||||
import axios from "axios";
|
||||
|
||||
const isDropdownOpen = ref(false);
|
||||
const entrepreneurEmails = ref([]);
|
||||
|
||||
const toggleDropdown = () => {
|
||||
isDropdownOpen.value = !isDropdownOpen.value;
|
||||
console.log("Dropdown toggled:", isDropdownOpen.value); // for debug purposes
|
||||
};
|
||||
|
||||
const fetchEntrepreneurs = async () => {
|
||||
try {
|
||||
const response = await axios.get("http://localhost:5000/entrepreneurs");
|
||||
entrepreneurEmails.value = response.data.map(e => e.email);
|
||||
} catch (error) {
|
||||
console.error("Erreur lors de la récupération des entrepreneurs:", error);
|
||||
}
|
||||
};
|
||||
|
||||
const contactAll = () => {
|
||||
alert("Contacter tous les entrepreneurs : " + entrepreneurEmails.value.join(", "));
|
||||
};
|
||||
|
||||
onMounted(fetchEntrepreneurs);
|
||||
</script>
|
||||
|
||||
|
||||
<style scoped>
|
||||
@import "@/components/canvas/style-project.css";
|
||||
|
||||
header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: flex-start;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.header-buttons {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.menu {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.contact-button, .return-button {
|
||||
background-color: #000;
|
||||
color: white;
|
||||
border: none;
|
||||
padding: 10px;
|
||||
cursor: pointer;
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.return-button a {
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.contact-dropdown {
|
||||
display: none;
|
||||
position: absolute;
|
||||
background-color: white;
|
||||
box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.2);
|
||||
border-radius: 8px;
|
||||
padding: 10px;
|
||||
margin-top: 5px;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.contact-dropdown button {
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding: 5px;
|
||||
text-align: left;
|
||||
border: none;
|
||||
background: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.contact-dropdown button:hover {
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
|
||||
.dropdown-visible {
|
||||
display: block;
|
||||
}
|
||||
|
||||
header img {
|
||||
width: 100px;
|
||||
height: auto;
|
||||
}
|
||||
</style>
|
56
front/MyINPulse-front/src/components/canvas/LeanCanvas.vue
Normal file
56
front/MyINPulse-front/src/components/canvas/LeanCanvas.vue
Normal file
@ -0,0 +1,56 @@
|
||||
<template>
|
||||
<div class="canvas">
|
||||
<CanvasItem
|
||||
v-for="(item, index) in items"
|
||||
:key="index"
|
||||
:title="item.title"
|
||||
:description="item.description"
|
||||
:class="item.class"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from "vue";
|
||||
import CanvasItem from "@/components/canvas/CanvasItem.vue";
|
||||
|
||||
const items = ref([
|
||||
{ title: "1. Problème", description: "3 problèmes essentiels à résoudre pour le client", class: "Probleme" },
|
||||
{ title: "2. Segments", description: "Les segments de clientèle visés", class: "Segments" },
|
||||
{ title: "3. Valeur", description: "La proposition de valeur", class: "Valeur" },
|
||||
{ title: "4. Solution", description: "Les solutions proposées", class: "Solution" },
|
||||
{ title: "5. Avantage", description: "Les avantages concurrentiels", class: "Avantage" },
|
||||
{ title: "6. Canaux", description: "Les canaux de distribution", class: "Canaux" },
|
||||
{ title: "7. Indicateurs", description: "Les indicateurs clés de performance", class: "Indicateurs" },
|
||||
{ title: "8. Coûts", description: "Les coûts associés", class: "Couts" },
|
||||
{ title: "9. Revenus", description: "Les sources de revenus", class: "Revenus" }
|
||||
]);
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
@import "@/components/canvas/style-project.css";
|
||||
|
||||
.canvas {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(10, 1fr);
|
||||
grid-template-rows: repeat(6, 1fr);
|
||||
gap: 10px;
|
||||
padding: 10px;
|
||||
max-width: 1200px;
|
||||
margin: 20px auto;
|
||||
background-color: #fff;
|
||||
position: relative;
|
||||
height: 80vh;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.Probleme { grid-column: 1 / 3; grid-row: 1 / 5; }
|
||||
.Segments { grid-column: 9 / 11; grid-row: 1 / 5; }
|
||||
.Valeur { grid-column: 5 / 7; grid-row: 1 / 5; }
|
||||
.Solution { grid-column: 3 / 5; grid-row: 1 / 3; }
|
||||
.Avantage { grid-column: 7 / 9; grid-row: 1 / 3; }
|
||||
.Canaux { grid-column: 7 / 9; grid-row: 3 / 5; }
|
||||
.Indicateurs { grid-column: 3 / 5; grid-row: 3 / 5; }
|
||||
.Couts { grid-column: 1 / 6; grid-row: 5 / 7; }
|
||||
.Revenus { grid-column: 6 / 11; grid-row: 5 / 7; }
|
||||
</style>
|
156
front/MyINPulse-front/src/components/canvas/style-project.css
Normal file
156
front/MyINPulse-front/src/components/canvas/style-project.css
Normal file
@ -0,0 +1,156 @@
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
margin: 0;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.row {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.cell {
|
||||
flex: 1;
|
||||
border: 1px solid #ddd;
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
background-color: #f1f1f1;
|
||||
}
|
||||
|
||||
.produit {
|
||||
background-color: #f9e4e4;
|
||||
}
|
||||
|
||||
.marche {
|
||||
background-color: #e4f1f9;
|
||||
}
|
||||
|
||||
.valeur {
|
||||
background-color: #f9f4e4;
|
||||
}
|
||||
|
||||
h3 {
|
||||
margin: 0;
|
||||
font-size: 18px;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 5px 0 0;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
|
||||
h1 img {
|
||||
height: 80px;
|
||||
margin: 40px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.row {
|
||||
display: flex;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
#ade {
|
||||
max-width: 1200px;
|
||||
margin: 20px auto;
|
||||
padding: 20px;
|
||||
text-align: center;
|
||||
background-color: #e8f5e9;
|
||||
border: 2px solid #4caf50;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
#ade h3 {
|
||||
color: #2e7d32;
|
||||
}
|
||||
|
||||
#ade p {
|
||||
margin: 10px 0;
|
||||
font-size: 16px;
|
||||
color: #333;
|
||||
}
|
||||
header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 10px 20px;
|
||||
background-color: #fff;
|
||||
border-bottom: 2px solid #ddd;
|
||||
}
|
||||
|
||||
header img {
|
||||
height: 60px;
|
||||
}
|
||||
|
||||
header .contact-menu {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.contact-button, .return {
|
||||
padding: 10px 15px;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
background-color: #2196f3;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.contact-button:hover, .return:hover {
|
||||
background-color: #1976d2;
|
||||
}
|
||||
|
||||
/* Dropdown styling */
|
||||
.contact-dropdown {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 50px;
|
||||
display: none;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
padding: 15px;
|
||||
background-color: #fff;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.contact-dropdown button {
|
||||
padding: 8px 12px;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
background-color: #4caf50;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.contact-dropdown button:hover {
|
||||
background-color: #388e3c;
|
||||
}
|
||||
|
||||
.return {
|
||||
background-color: #f44336;
|
||||
}
|
||||
|
||||
.return:hover {
|
||||
background-color: #d32f2f;
|
||||
}
|
||||
|
||||
.header-buttons {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
}
|
||||
|
||||
|
||||
a{
|
||||
color: white;
|
||||
}
|
Binary file not shown.
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 39 KiB |
@ -29,6 +29,47 @@ keycloakService.CallInit(() => {
|
||||
|
||||
})
|
||||
|
||||
// this shit made by me so i can run the canva vue app
|
||||
createApp(App).use(router).mount('#app');
|
||||
|
||||
// TODO: fix the comment
|
||||
/*
|
||||
function tokenInterceptor () {
|
||||
axios.interceptors.request.use(config => {
|
||||
const keycloak = useKeycloak()
|
||||
if (keycloak.authenticated) {
|
||||
// Note that this is a simple example.
|
||||
// you should be careful not to leak tokens to third parties.
|
||||
// in this example the token is added to all usage of axios.
|
||||
config.headers.Authorization = `Bearer ${keycloak.token}`
|
||||
}
|
||||
return config
|
||||
}, error => {
|
||||
console.error("tokenInterceptor: Rejected")
|
||||
return Promise.reject(error)
|
||||
})
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
app.use(VueKeyCloak,{
|
||||
onReady: (keycloak) => {
|
||||
console.log("Ready !")
|
||||
tokenInterceptor()
|
||||
},
|
||||
init: {
|
||||
onLoad: 'login-required',
|
||||
checkLoginIframe: false,
|
||||
|
||||
},
|
||||
|
||||
config: {
|
||||
realm: 'test',
|
||||
url: 'http://localhost:7080',
|
||||
clientId: 'myinpulse'
|
||||
}
|
||||
} );
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
@ -11,6 +11,19 @@ const router = createRouter({
|
||||
// which is lazy-loaded when the route is visited.
|
||||
component: () => import('../views/test.vue'),
|
||||
},
|
||||
|
||||
{
|
||||
path: '/',
|
||||
name: 'Admin-main',
|
||||
component: () => import('../views/AdminMain.vue'),
|
||||
},
|
||||
|
||||
// route pour les canvas (made by adnane), in fact the two vue apps are separated for now
|
||||
{
|
||||
path: '/canvas',
|
||||
name: 'canvas',
|
||||
component: () => import('../views/CanvasView.vue'),
|
||||
},
|
||||
],
|
||||
})
|
||||
|
||||
|
68
front/MyINPulse-front/src/views/AdminMain.vue
Normal file
68
front/MyINPulse-front/src/views/AdminMain.vue
Normal file
@ -0,0 +1,68 @@
|
||||
<template>
|
||||
<Header />
|
||||
<error-wrapper></error-wrapper>
|
||||
<div id="container">
|
||||
<div id="main">
|
||||
<ProjectComp
|
||||
v-for="(project, index) in projects"
|
||||
:key="index"
|
||||
:projectName="project.name"
|
||||
:listName="project.members"
|
||||
:projectLink="project.link"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<Agenda :projectRDV="rendezVous" />
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import Header from '../components/Header.vue';
|
||||
import Agenda from "../components/Agenda.vue"
|
||||
import ProjectComp from '../components/Project-comp.vue';
|
||||
|
||||
import { ref } from "vue";
|
||||
|
||||
const projects = ref([
|
||||
{
|
||||
name: "Projet Alpha",
|
||||
link: "/canvas", // to test
|
||||
members: ["Alice", "Bob", "Charlie"],
|
||||
},
|
||||
{
|
||||
name: "Projet Beta",
|
||||
link: "./canvas", // to test
|
||||
members: ["David", "Eve", "Frank"],
|
||||
},
|
||||
]);
|
||||
|
||||
const rendezVous = ref([
|
||||
{ projectName: "Projet Alpha", date: "2025-03-10", lieu: "P106" },
|
||||
{ projectName: "Projet Beta", date: "2025-04-15", lieu: "Td10" },
|
||||
]);
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
#container {
|
||||
margin: 0;
|
||||
display: grid;
|
||||
grid-template-columns: 3fr 1fr; /* Main body takes 3/4, agenda 1/4 */
|
||||
height: 100vh; /* Full viewport height */
|
||||
}
|
||||
|
||||
button {
|
||||
padding: 10px 15px;
|
||||
background-color: #007bff;
|
||||
color: white;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
border-radius: 5px;
|
||||
}
|
||||
button:hover {
|
||||
background-color: #0056b3;
|
||||
}
|
||||
|
||||
</style>
|
17
front/MyINPulse-front/src/views/CanvasView.vue
Normal file
17
front/MyINPulse-front/src/views/CanvasView.vue
Normal file
@ -0,0 +1,17 @@
|
||||
<template>
|
||||
<div>
|
||||
<header>
|
||||
<HeaderCanvas />
|
||||
</header>
|
||||
</div>
|
||||
<div>
|
||||
<h1>Page Canvas</h1>
|
||||
<LeanCanvas />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import HeaderCanvas from '../components/canvas/HeaderCanvas.vue';
|
||||
import LeanCanvas from '../components/canvas/LeanCanvas.vue';
|
||||
</script>
|
||||
|
@ -3,7 +3,7 @@ import {store} from "../main.ts";
|
||||
import {callApi} from "@/services/api.ts";
|
||||
import ErrorModal from "@/components/errorModal.vue";
|
||||
import {errorList} from "@/services/popupDisplayer.ts";
|
||||
import TempModal from "@/components/temp-modal.vue";
|
||||
//import TempModal from "@/components/temp-modal.vue";
|
||||
import ErrorWrapper from "@/App.vue";
|
||||
function addResToTable(id: any){
|
||||
return (req: any) => {
|
||||
|
19
tests/example.spec.js
Normal file
19
tests/example.spec.js
Normal file
@ -0,0 +1,19 @@
|
||||
// @ts-check
|
||||
import { test, expect } from '@playwright/test';
|
||||
|
||||
test('has title', async ({ page }) => {
|
||||
await page.goto('https://playwright.dev/');
|
||||
|
||||
// Expect a title "to contain" a substring.
|
||||
await expect(page).toHaveTitle(/Playwright/);
|
||||
});
|
||||
|
||||
test('get started link', async ({ page }) => {
|
||||
await page.goto('https://playwright.dev/');
|
||||
|
||||
// Click the get started link.
|
||||
await page.getByRole('link', { name: 'Get started' }).click();
|
||||
|
||||
// Expects page to have a heading with the name of Installation.
|
||||
await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
|
||||
});
|
123
tests/front.spec.js
Normal file
123
tests/front.spec.js
Normal file
@ -0,0 +1,123 @@
|
||||
import { test,expect } from '@playwright/test'
|
||||
|
||||
test('Title Page',async({page}) =>{
|
||||
await page.goto('http://localhost:5173/')
|
||||
await expect(page).toHaveTitle(/Vite App/)
|
||||
})
|
||||
|
||||
test('Navigation between pages', async ({ page }) => {
|
||||
// Aller à la page d'accueil
|
||||
await page.goto('http://localhost:5173/');
|
||||
|
||||
// Vérifier que l'URL a changé pour la page Canvas
|
||||
await page.click('text=Canvas');
|
||||
await expect(page).toHaveURL(/canvas/);
|
||||
|
||||
// Vérifier que l'URL a changé pour la page Home
|
||||
await page.click('text=Home');
|
||||
await expect(page).toHaveURL(/\//);
|
||||
|
||||
|
||||
});
|
||||
test.describe('Tests de la Page Canvas', () => {
|
||||
test('Vérifier que tous les blocs Canvas sont affichés', async ({ page }) => {
|
||||
// Aller à la page Canvas
|
||||
await page.goto('http://localhost:5173/canvas');
|
||||
await expect(page.locator('h1')).toHaveText('Page Canvas');
|
||||
|
||||
const sections = [
|
||||
'1. Problème', '2. Segments', '3. Valeur', '4. Solution',
|
||||
'5. Avantage', '6. Canaux', '7. Indicateurs', '8. Coûts', '9. Revenus'
|
||||
];
|
||||
|
||||
for (const section of sections) {
|
||||
await expect(page.locator(`text=${section}`)).toBeVisible();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
test('Vérifier le contenu de la page Canvas', async ({ page }) => {
|
||||
await page.goto('http://localhost:5173/canvas');
|
||||
|
||||
// Attendre le chargement des éléments
|
||||
await page.waitForSelector('.canvas');
|
||||
|
||||
// Vérifier le titre
|
||||
await expect(page.locator('h1')).toHaveText('Page Canvas');
|
||||
|
||||
// Nouveau sélecteur plus précis
|
||||
const canvasItems = page.locator('.canvas > div'); // Sélectionne les div directes dans .canvas
|
||||
|
||||
// Vérifier le nombre d'éléments
|
||||
await expect(canvasItems).toHaveCount(9);
|
||||
|
||||
// Contenu attendu
|
||||
const expectedContent = [
|
||||
{ title: '1. Problème', description: '3 problèmes essentiels à résoudre pour le client' },
|
||||
{ title: '2. Segments', description: 'Les segments de clientèle visés' },
|
||||
{ title: '3. Valeur', description: 'La proposition de valeur' },
|
||||
{ title: '4. Solution', description: 'Les solutions proposées' },
|
||||
{ title: '5. Avantage', description: 'Les avantages concurrentiels' },
|
||||
{ title: '6. Canaux', description: 'Les canaux de distribution' },
|
||||
{ title: '7. Indicateurs', description: 'Les indicateurs clés de performance' },
|
||||
{ title: '8. Coûts', description: 'Les coûts associés' },
|
||||
{ title: '9. Revenus', description: 'Les sources de revenus' }
|
||||
];
|
||||
|
||||
// Vérifier chaque élément
|
||||
for (let i = 0; i < expectedContent.length; i++) {
|
||||
const item = canvasItems.nth(i);
|
||||
await expect(item.locator('h3')).toHaveText(expectedContent[i].title);
|
||||
await expect(item.locator('p')).toHaveText(expectedContent[i].description);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('Tests de la page Home', () => {
|
||||
|
||||
test('Vérifier la présence des projets', async ({ page }) => {
|
||||
await page.goto('http://localhost:5173');
|
||||
|
||||
// Vérifier les titres des projets avec getByRole pour éviter les doublons
|
||||
await expect(page.getByRole('heading', { name: 'Projet Alpha' })).toBeVisible();
|
||||
await expect(page.getByRole('heading', { name: 'Projet Beta' })).toBeVisible();
|
||||
});
|
||||
|
||||
test('Vérifier les membres des projets', async ({ page }) => {
|
||||
await page.goto('http://localhost:5173');
|
||||
|
||||
const membresAlpha = ['Alice', 'Bob', 'Charlie'];
|
||||
const membresBeta = ['David', 'Eve', 'Frank'];
|
||||
|
||||
for (const membre of membresAlpha) {
|
||||
await expect(page.getByText(membre)).toBeVisible();
|
||||
}
|
||||
for (const membre of membresBeta) {
|
||||
await expect(page.getByText(membre)).toBeVisible();
|
||||
}
|
||||
});
|
||||
|
||||
test('Vérifier les boutons Contact', async ({ page }) => {
|
||||
await page.goto('http://localhost:5173');
|
||||
|
||||
// Vérifier que les boutons "Contact" existent et sont visibles
|
||||
const contactButtons = await page.locator('button:has-text("Contact")').count();
|
||||
expect(contactButtons).toBe(2); // Vérifie qu'il y a bien 2 boutons Contact
|
||||
});
|
||||
|
||||
test('Vérifier la table des rendez-vous', async ({ page }) => {
|
||||
await page.goto('http://localhost:5173');
|
||||
|
||||
await expect(page.getByRole('heading', { name: 'Rendez-vous' })).toBeVisible();
|
||||
|
||||
// Vérifier la première ligne du tableau
|
||||
await expect(page.locator('table').getByRole('cell', { name: 'Projet Alpha' })).toBeVisible();
|
||||
await expect(page.getByText('2025-03-10')).toBeVisible();
|
||||
await expect(page.getByText('P106')).toBeVisible();
|
||||
|
||||
// Vérifier la deuxième ligne du tableau
|
||||
await expect(page.locator('table').getByRole('cell', { name: 'Projet Beta' })).toBeVisible();
|
||||
await expect(page.getByText('2025-04-15')).toBeVisible();
|
||||
await expect(page.getByText('Td10')).toBeVisible();
|
||||
});
|
||||
});
|
Loading…
x
Reference in New Issue
Block a user