✨Enhancements
This commit is contained in:
@@ -14,3 +14,9 @@ services:
|
|||||||
- PROJECT_SLUG=199996 # Remplacez par le slug de votre campagne
|
- PROJECT_SLUG=199996 # Remplacez par le slug de votre campagne
|
||||||
- REFRESH_INTERVAL=10 # En secondes
|
- REFRESH_INTERVAL=10 # En secondes
|
||||||
- PORT=2106
|
- PORT=2106
|
||||||
|
networks:
|
||||||
|
- supabase_default
|
||||||
|
|
||||||
|
networks:
|
||||||
|
supabase_default:
|
||||||
|
external: true
|
||||||
|
Before Width: | Height: | Size: 2.7 MiB After Width: | Height: | Size: 2.7 MiB |
@@ -15,7 +15,7 @@
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
background-color: #2c5282;
|
background-color: #2c5282;
|
||||||
/* Couleur de secours si l'image ne charge pas */
|
/* Couleur de secours si l'image ne charge pas */
|
||||||
background-image: url('background.png');
|
background-image: url('/background.png');
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
background-attachment: fixed;
|
background-attachment: fixed;
|
||||||
@@ -35,18 +35,26 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.card {
|
.card {
|
||||||
background-color: #1a365d;
|
background-color: rgba(26, 54, 93, 0.6);
|
||||||
/* Bleu plus foncé pour les cartes */
|
/* Bleu foncé semi-transparent */
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
/* Effet de flou */
|
||||||
|
-webkit-backdrop-filter: blur(10px);
|
||||||
|
/* Pour Safari */
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
|
/* Bordure légère */
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
margin: 10px;
|
margin: 10px;
|
||||||
width: 280px;
|
width: 280px;
|
||||||
transition: transform 0.3s ease;
|
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card:hover {
|
.card:hover {
|
||||||
transform: translateY(-5px);
|
transform: translateY(-5px);
|
||||||
|
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.25);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.wide-card {
|
.wide-card {
|
||||||
@@ -54,6 +62,10 @@
|
|||||||
max-height: none;
|
max-height: none;
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
background-color: rgba(26, 54, 93, 0.6);
|
||||||
|
/* Même style que .card */
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
-webkit-backdrop-filter: blur(10px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.contributor-info {
|
.contributor-info {
|
||||||
@@ -92,10 +104,9 @@
|
|||||||
/* Mis à jour la structure du contributeur-item pour mieux gérer l'espace */
|
/* Mis à jour la structure du contributeur-item pour mieux gérer l'espace */
|
||||||
.contributor-item {
|
.contributor-item {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
border-bottom: 1px solid #2d4a7d;
|
border-bottom: 1px solid rgba(45, 74, 125, 0.5);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
/* Changé de row à column */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.contributor-details {
|
.contributor-details {
|
||||||
@@ -162,7 +173,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.goal {
|
.goal {
|
||||||
color: #a0aec0;
|
color: white;
|
||||||
/* Texte gris clair pour la lisibilité */
|
/* Texte gris clair pour la lisibilité */
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
@@ -269,9 +280,13 @@
|
|||||||
.reward-item {
|
.reward-item {
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
background-color: #233876;
|
background-color: rgba(35, 56, 118, 0.6);
|
||||||
|
/* Légèrement plus foncé mais toujours transparent */
|
||||||
|
backdrop-filter: blur(5px);
|
||||||
|
-webkit-backdrop-filter: blur(5px);
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.08);
|
||||||
}
|
}
|
||||||
|
|
||||||
.reward-title {
|
.reward-title {
|
||||||
@@ -369,12 +384,10 @@
|
|||||||
<div id="supporters" class="value">--</div>
|
<div id="supporters" class="value">--</div>
|
||||||
<div id="days-left" class="goal">Jours restants: --</div>
|
<div id="days-left" class="goal">Jours restants: --</div>
|
||||||
<div id="source-tag" class="source-tag">Source: --</div>
|
<div id="source-tag" class="source-tag">Source: --</div>
|
||||||
|
<div class="last-update">Dernière mise à jour: <span id="last-update">--</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="last-update">Dernière mise à jour: <span id="last-update">--</span></p>
|
|
||||||
|
|
||||||
<div class="dashboard">
|
|
||||||
<div class="card contributors-list">
|
<div class="card contributors-list">
|
||||||
<h2>Derniers contributeurs</h2>
|
<h2>Derniers contributeurs</h2>
|
||||||
<div id="contributors-container">
|
<div id="contributors-container">
|
||||||
@@ -390,7 +403,6 @@
|
|||||||
<p>Chargement des récompenses...</p>
|
<p>Chargement des récompenses...</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Définir l'URL de la campagne en dur
|
// Définir l'URL de la campagne en dur
|
||||||
@@ -559,15 +571,14 @@
|
|||||||
data.contributors.forEach(contributor => {
|
data.contributors.forEach(contributor => {
|
||||||
// Formater la date si elle existe
|
// Formater la date si elle existe
|
||||||
let dateStr = '';
|
let dateStr = '';
|
||||||
if (contributor.date_joined) {
|
if (contributor.date_ordered) {
|
||||||
const date = new Date(contributor.date_joined);
|
const date = new Date(contributor.date_ordered);
|
||||||
dateStr = date.toLocaleDateString('fr-FR', { year: 'numeric', month: 'short', day: 'numeric' });
|
dateStr = getRelativeDateStr(date);
|
||||||
}
|
}
|
||||||
|
|
||||||
let rewardName = '';
|
let rewardName = '';
|
||||||
if (contributor.reward) {
|
if (contributor.reward) {
|
||||||
rewardName = contributor.reward;
|
rewardName = contributor.reward;
|
||||||
console.log(rewardName);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const avatarUrl = contributor.avatar || 'https://s3-eu-west-1.amazonaws.com/com.ulule.assets/site/build/img/avatars/avatar-blue.png';
|
const avatarUrl = contributor.avatar || 'https://s3-eu-west-1.amazonaws.com/com.ulule.assets/site/build/img/avatars/avatar-blue.png';
|
||||||
@@ -582,7 +593,7 @@
|
|||||||
<div class="contributor-name">${contributor.name || 'Contributeur anonyme'}</div>
|
<div class="contributor-name">${contributor.name || 'Contributeur anonyme'}</div>
|
||||||
${rewardName ? `<div class="contributor-reward">${rewardName}</div>` : ''}
|
${rewardName ? `<div class="contributor-reward">${rewardName}</div>` : ''}
|
||||||
${contributor.location ? `<div class="contributor-location">${contributor.location}</div>` : ''}
|
${contributor.location ? `<div class="contributor-location">${contributor.location}</div>` : ''}
|
||||||
${dateStr ? `<div class="contributor-date">Depuis le ${dateStr}</div>` : ''}
|
${dateStr ? `<div class="contributor-date">${dateStr}</div>` : ''}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -595,6 +606,38 @@
|
|||||||
contributorsContainer.innerHTML = html;
|
contributorsContainer.innerHTML = html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getRelativeDateStr(dateToFormat) {
|
||||||
|
const now = new Date();
|
||||||
|
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
||||||
|
const yesterday = new Date(today);
|
||||||
|
yesterday.setDate(yesterday.getDate() - 1);
|
||||||
|
const sixDaysAgo = new Date(today);
|
||||||
|
sixDaysAgo.setDate(sixDaysAgo.getDate() - 6);
|
||||||
|
|
||||||
|
const dateOnly = new Date(dateToFormat.getFullYear(), dateToFormat.getMonth(), dateToFormat.getDate());
|
||||||
|
|
||||||
|
// Pour comparer seulement les dates sans l'heure
|
||||||
|
if (dateOnly.getTime() === today.getTime()) {
|
||||||
|
return "Aujourd'hui" + " à " + dateToFormat.toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' });
|
||||||
|
} else if (dateOnly.getTime() === yesterday.getTime()) {
|
||||||
|
return "Hier" + " à " + dateToFormat.toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' });
|
||||||
|
} else if (dateOnly >= sixDaysAgo) {
|
||||||
|
// Si la date est dans les 6 derniers jours, afficher le nom du jour
|
||||||
|
const options = { weekday: 'long' };
|
||||||
|
return dateToFormat.toLocaleDateString('fr-FR', options) + " à " +
|
||||||
|
dateToFormat.toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' });
|
||||||
|
} else {
|
||||||
|
// Sinon, afficher la date complète
|
||||||
|
return dateToFormat.toLocaleString('fr-FR', {
|
||||||
|
year: 'numeric',
|
||||||
|
month: 'short',
|
||||||
|
day: 'numeric',
|
||||||
|
hour: '2-digit',
|
||||||
|
minute: '2-digit'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Fonction pour charger toutes les données
|
// Fonction pour charger toutes les données
|
||||||
async function loadAllData() {
|
async function loadAllData() {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ app.get('/api/ulule/:slug', async (req, res) => {
|
|||||||
goal: projectData.goal || 0,
|
goal: projectData.goal || 0,
|
||||||
currency: projectData.currency || "EUR",
|
currency: projectData.currency || "EUR",
|
||||||
supporters_count: projectData.supporters_count || 0,
|
supporters_count: projectData.supporters_count || 0,
|
||||||
|
orders_count: projectData.orders_count || 0,
|
||||||
days_left: 0,
|
days_left: 0,
|
||||||
percent: projectData.percent || 0,
|
percent: projectData.percent || 0,
|
||||||
success: true,
|
success: true,
|
||||||
@@ -199,7 +200,7 @@ app.get('/api/ulule/:slug/supporters', async (req, res) => {
|
|||||||
reward: reward,
|
reward: reward,
|
||||||
amount: amount,
|
amount: amount,
|
||||||
avatar: supporter.avatar ? (supporter.avatar['90'] || '') : '',
|
avatar: supporter.avatar ? (supporter.avatar['90'] || '') : '',
|
||||||
date_joined: supporter.date_joined,
|
date_ordered: supporter.latest_project_order.created_at || '',
|
||||||
comment: comment,
|
comment: comment,
|
||||||
location: supporter.location || ''
|
location: supporter.location || ''
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user