Skip to content

Commit 427af1b

Browse files
committed
Fix and improvement
1 parent 2d7a836 commit 427af1b

9 files changed

Lines changed: 172 additions & 48 deletions

File tree

src/Assets/js/alert.js

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
11
var alertQueue = [];
22
var isAlertActive = false;
33
var isFetching = false;
4+
var audioUnlocked = false;
5+
6+
// Pré-déverrouiller l'audio pour les navigateurs/OBS
7+
(function unlockAudio() {
8+
var ctx = new (window.AudioContext || window.webkitAudioContext)();
9+
if (ctx.state === 'suspended') {
10+
ctx.resume().then(function() { audioUnlocked = true; });
11+
} else {
12+
audioUnlocked = true;
13+
}
14+
// Créer un son silencieux pour débloquer la lecture audio
15+
var silentAudio = new Audio("data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQAAAAA=");
16+
silentAudio.volume = 0;
17+
silentAudio.play().catch(function() {});
18+
})();
419

520
fetchAlerts();
621
setInterval(fetchAlerts, 10000);
@@ -57,21 +72,34 @@ function processAlertQueue() {
5772
messageTemplate.style.marginTop = '10px';
5873
messageTemplate.classList.add('fade');
5974
container.appendChild(messageTemplate);
60-
var audio = new Audio(window.sound);
75+
76+
// Pré-charger le son avant de l'utiliser
77+
var audio = null;
78+
if (window.sound && window.sound.length > 0) {
79+
audio = new Audio(window.sound);
80+
audio.volume = window.sound_volume || 0.5;
81+
audio.preload = 'auto';
82+
audio.load();
83+
}
6184

6285
setTimeout(function () {
6386
mediaElement.classList.add('show');
6487
messageTemplate.classList.add('show');
6588

66-
audio.volume = window.sound_volume;
67-
audio.play();
89+
if (audio) {
90+
audio.play().catch(function(err) {
91+
console.warn('Impossible de jouer le son :', err);
92+
});
93+
}
6894
}, 100)
6995

7096
setTimeout(function () {
7197
mediaElement.classList.remove('show');
7298
messageTemplate.classList.remove('show');
73-
audio.pause();
74-
audio.currentTime = 0;
99+
if (audio) {
100+
audio.pause();
101+
audio.currentTime = 0;
102+
}
75103

76104
container.innerHTML = '';
77105
processAlertQueue();

src/Controllers/AdminController.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ public function index(Request $request, Response $response): Response
4848
"events" => $events,
4949
"messages" => $this->messages->getMessages(),
5050
"currentUser" => $user,
51+
"selectedEventId" => $request->getQueryParams()['eventId'] ?? null,
52+
"openCreateStream" => isset($request->getQueryParams()['createStream']),
5153
];
5254

5355
$template = $user->role === "ADMIN" ? 'stream/index-admin.html.twig' : 'stream/index.html.twig';
@@ -93,11 +95,13 @@ public function editEvent(Request $request, Response $response, array $args): Re
9395
$event = $this->eventRepository->selectByUserAndGuid($user, $args['id']);
9496
$donationGoalWidget = $this->widgetRepository->selectDonationWidgetByGuid(null, $event->guid);
9597
$cardWidget = $this->widgetRepository->selectCardWidgetByGuid(null, $event->guid);
98+
$streams = $this->streamRepository->selectListByEvent($event);
9699
$routeParser = RouteContext::fromRequest($request)->getRouteParser();
97100

98101
$data = [
99102
"logged" => true,
100103
"event" => $event,
104+
"streams" => $streams,
101105
"donationGoalWidget" => $donationGoalWidget,
102106
"cardWidget" => $cardWidget,
103107
"cardWidgetPictureUrl" => ($cardWidget && $cardWidget->image) ? $this->fileManager->getPictureUrl($cardWidget->image) : null,
@@ -189,12 +193,18 @@ public function editStream(Request $request, Response $response, array $args): R
189193
$alertBoxWidget = $this->widgetRepository->selectAlertWidgetByGuid($guid);
190194
$cardWidget = $this->widgetRepository->selectCardWidgetByGuid($guid, null);
191195

196+
$parentEvent = null;
197+
if ($charityStream->charity_event_id) {
198+
$parentEvent = $this->eventRepository->selectByUserAndId($user, $charityStream->charity_event_id);
199+
}
200+
192201
$donationUrl = $_SERVER['HA_URL'] . '/associations/' . $charityStream->organization_slug . '/formulaires/' . $charityStream->form_slug;
193202
$routeParser = RouteContext::fromRequest($request)->getRouteParser();
194203

195204
$data = [
196205
"logged" => true,
197206
"charityStream" => $charityStream,
207+
"parentEvent" => $parentEvent,
198208
"donationGoalWidget" => $donationGoalWidget,
199209
"alertBoxWidget" => $alertBoxWidget,
200210
"alertBoxWidgetPictureUrl" => ($alertBoxWidget && $alertBoxWidget->image) ? $this->fileManager->getPictureUrl($alertBoxWidget->image) : null,

src/views/event/edit.html.twig

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,43 @@
1-
{% block title %}Édition de l'événement{% endblock %}
1+
{% block title %}HelloAsso Widgets - Édition de l'événement{% endblock %}
22
{% extends "layout.html.twig" %}
33
{% block content %}
44
<div class="container mb-5">
55
<h1 class="my-4 text-center">Édition</h1>
66

77
<a href="/admin" class="btn btn-secondary mb-4">Retour</a>
88

9+
{# ── Streams liés à cet événement ────────────────────────── #}
10+
<div class="card mb-4">
11+
<div class="card-header d-flex justify-content-between align-items-center">
12+
<h5 class="mb-0">🎮 Streams rattachés</h5>
13+
<a href="/admin?createStream=1&eventId={{ event.id }}" class="btn btn-sm btn-success">➕ Créer un stream</a>
14+
</div>
15+
<div class="card-body">
16+
{% if streams is not empty %}
17+
<table class="table table-hover align-middle mb-0">
18+
<thead>
19+
<tr>
20+
<th>ID</th>
21+
<th>Titre</th>
22+
<th>Slug formulaire</th>
23+
</tr>
24+
</thead>
25+
<tbody>
26+
{% for stream in streams %}
27+
<tr class="cursor-pointer" onclick="window.location='/admin/stream/{{ stream.guid }}/edit'" title="GUID : {{ stream.guid }}" style="cursor:pointer;">
28+
<td>{{ stream.id | e }}</td>
29+
<td>{{ stream.title | e }}</td>
30+
<td>{{ stream.form_slug | e }}</td>
31+
</tr>
32+
{% endfor %}
33+
</tbody>
34+
</table>
35+
{% else %}
36+
<p class="text-muted mb-0">Aucun stream rattaché à cet événement.</p>
37+
{% endif %}
38+
</div>
39+
</div>
40+
941
<div class="accordion mt-4" id="widgetsAccordion">
1042

1143
{# ── Widget barre de don ────────────────────────────────── #}
@@ -182,6 +214,14 @@
182214
</div>{# /accordion #}
183215
</div>
184216
{% endblock %}
217+
{% block styles %}
218+
<style>
219+
.cursor-pointer { cursor: pointer; }
220+
.table-hover tbody tr.cursor-pointer:hover {
221+
background-color: rgba(var(--bs-primary-rgb), .08) !important;
222+
}
223+
</style>
224+
{% endblock %}
185225
{% block scripts %}
186226
{% if viteEntries.admin.js %}
187227
<script type="module" src="/dist/{{ viteEntries.admin.js }}"></script>

src/views/index.html.twig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11

2-
{% block title %}HelloAssoStream 🎮{% endblock %}
2+
{% block title %}HelloAsso Widgets{% endblock %}
33
{% extends "layout.html.twig" %}
44
{% block content %}
55
<div class="container">
6-
<h1 class="my-4 text-center">HelloAssoStream 🎮</h1>
6+
<h1 class="my-4 text-center">HelloAsso Widgets</h1>
77
<form action="/login" method="POST">
88
<div class="form-group">
99
<label for="email">Email</label>

src/views/layout.html.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html lang="fr" data-bs-theme="dark">
33
<head>
44
<meta charset="UTF-8">
5-
<title>{% block title %}Titre par défaut{% endblock %}</title>
5+
<title>{% block title %}HelloAsso Widgets{% endblock %}</title>
66
<link rel="preconnect" href="https://fonts.googleapis.com">
77
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
88
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap" rel="stylesheet">

src/views/stream/edit.html.twig

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% block title %}Édition du stream{% endblock %}
1+
{% block title %}HelloAsso Widgets - Édition du stream{% endblock %}
22

33

44
{% extends "layout.html.twig" %}
@@ -9,6 +9,13 @@
99

1010
<a href="/admin" class="btn btn-secondary mb-4">Retour</a>
1111

12+
{% if parentEvent %}
13+
<div class="alert alert-info d-flex align-items-center gap-2 mb-3">
14+
<span>📅 Événement parent :</span>
15+
<a href="/admin/event/{{ parentEvent.guid }}/edit" class="fw-bold text-decoration-underline">{{ parentEvent.title }}</a>
16+
</div>
17+
{% endif %}
18+
1219
<h5>
1320
Formulaire de don Helloasso
1421
<a href="{{ donationUrl }}" target="_blank">{{ donationUrl }}</a>

src/views/stream/index-admin.html.twig

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
{% block title %}Administration générale{% endblock %}
2+
{% block title %}HelloAsso Widgets - Administration{% endblock %}
33

44
{% extends "layout.html.twig" %}
55
{% block content %}
@@ -241,7 +241,7 @@
241241
</div>
242242
</div>
243243
<div class="container">
244-
<h1 class="my-4 text-center">Administration générale</h1>
244+
<h1 class="my-4 text-center">HelloAsso Widgets</h1>
245245

246246
<div class="row my-4">
247247
<div class="col-10">
@@ -261,27 +261,27 @@
261261
</div>
262262

263263
<h3>Liste des Charity Events</h3>
264-
<table class="table table-bordered table-striped">
265-
<thead class="thead-dark">
264+
<table class="table table-hover align-middle">
265+
<thead>
266266
<tr>
267267
<th>Id</th>
268-
<th>Guid</th>
269268
<th>Titre</th>
270269
<th>Admin</th>
270+
<th>Date de création</th>
271271
<th>Actions</th>
272272
</tr>
273273
</thead>
274274
<tbody>
275275
{% for event in events %}
276-
<tr>
276+
<tr class="cursor-pointer" onclick="window.location='/admin/event/{{ event.guid }}/edit'" title="GUID : {{ event.guid }}">
277277
<td>{{ event.id | e }}</td>
278-
<td>{{ event.guid | e }}</td>
279278
<td>{{ event.title | e }}</td>
280279
<td>{{ event.admin | e }}</td>
281-
<td class="d-flex justify-content-evenly">
282-
<a href="/admin/event/{{ event.guid }}/edit" class="btn btn-primary mb-3" data-bs-toggle="tooltip" data-bs-title="Édition">📝</a>
280+
<td>{{ event.creation_date ? event.creation_date|date('d/m/Y H:i') : '' }}</td>
281+
<td class="d-flex gap-2" onclick="event.stopPropagation()">
282+
<a href="/admin/event/{{ event.guid }}/edit" class="btn btn-sm btn-outline-primary" data-bs-toggle="tooltip" data-bs-title="Édition">📝</a>
283283
<form action="/admin/event/{{ event.guid }}/delete" method="POST">
284-
<button type="submit" class="btn btn-danger" name="delete" data-bs-toggle="tooltip" data-bs-title="Suppression" onclick="confirmDelete(event)">🗑️</button>
284+
<button type="submit" class="btn btn-sm btn-outline-danger" name="delete" data-bs-toggle="tooltip" data-bs-title="Suppression" onclick="confirmDelete(event)">🗑️</button>
285285
</form>
286286
</td>
287287
</tr>
@@ -290,11 +290,10 @@
290290
</table>
291291

292292
<h3>Liste des Charity Streams</h3>
293-
<table class="table table-bordered table-striped">
294-
<thead class="thead-dark">
293+
<table class="table table-hover align-middle">
294+
<thead>
295295
<tr>
296296
<th>ID</th>
297-
<th>GUID</th>
298297
<th>Titre</th>
299298
<th>Admin</th>
300299
<th>Slug formulaire</th>
@@ -304,18 +303,17 @@
304303
</thead>
305304
<tbody>
306305
{% for stream in streams %}
307-
<tr>
306+
<tr class="cursor-pointer" onclick="window.location='/admin/stream/{{ stream.guid }}/edit'" title="GUID : {{ stream.guid }}">
308307
<td>{{ stream.id | e }}</td>
309-
<td>{{ stream.guid | e }}</td>
310308
<td>{{ stream.title | e }}</td>
311309
<td>{{ stream.admin | e }}</td>
312310
<td>{{ stream.form_slug | e }}</td>
313311
<td>{{ stream.organization_slug | e }}</td>
314-
<td class="d-flex justify-content-evenly">
315-
<a href="/admin/stream/{{ stream.guid }}/edit" class="btn btn-primary mb-3" data-bs-toggle="tooltip" data-bs-title="Édition">📝</a>
316-
<a href="/redirect_auth_page?organizationSlug={{ stream.organization_slug }}" class="btn btn-success mb-3" data-bs-toggle="tooltip" data-bs-title="Mire d'authorisation" target="_blank">🔑</a>
312+
<td class="d-flex gap-2" onclick="event.stopPropagation()">
313+
<a href="/admin/stream/{{ stream.guid }}/edit" class="btn btn-sm btn-outline-primary" data-bs-toggle="tooltip" data-bs-title="Édition">📝</a>
314+
<a href="/redirect_auth_page?organizationSlug={{ stream.organization_slug }}" class="btn btn-sm btn-outline-success" data-bs-toggle="tooltip" data-bs-title="Mire d'authorisation" target="_blank">🔑</a>
317315
<form action="/admin/stream/{{ stream.guid }}/delete" method="POST">
318-
<button type="submit" class="btn btn-danger" name="delete" data-bs-toggle="tooltip" data-bs-title="Suppression" onclick="confirmDelete(event)">🗑️</button>
316+
<button type="submit" class="btn btn-sm btn-outline-danger" name="delete" data-bs-toggle="tooltip" data-bs-title="Suppression" onclick="confirmDelete(event)">🗑️</button>
319317
</form>
320318
</td>
321319
</tr>
@@ -354,6 +352,12 @@
354352
{% endblock %}
355353
{% block styles %}
356354
<style>
355+
/* ── Lignes de tableau cliquables ── */
356+
.cursor-pointer { cursor: pointer; }
357+
.table-hover tbody tr.cursor-pointer:hover {
358+
background-color: rgba(var(--bs-primary-rgb), .08) !important;
359+
}
360+
357361
/* ── Cartes de sélection de mode ── */
358362
.stream-mode-card {
359363
cursor: pointer;
@@ -407,6 +411,19 @@
407411
{% block scripts %}
408412
<script>
409413
document.addEventListener('DOMContentLoaded', function() {
414+
/* ── Auto-ouverture de la modal de création de stream ── */
415+
{% if openCreateStream %}
416+
var createStreamModal = document.getElementById('createStreamModal');
417+
if (createStreamModal) {
418+
var modal = new bootstrap.Modal(createStreamModal);
419+
modal.show();
420+
{% if selectedEventId %}
421+
var parentEventSelect = document.getElementById('parent_event');
422+
if (parentEventSelect) parentEventSelect.value = '{{ selectedEventId }}';
423+
{% endif %}
424+
}
425+
{% endif %}
426+
410427
/* ── Validation Bootstrap ── */
411428
document.querySelectorAll('.needs-validation').forEach(function(form) {
412429
form.addEventListener('submit', function(e) {

0 commit comments

Comments
 (0)