diff --git a/ansible/deploy.yml.disabled b/ansible/deploy.yml.disabled
index f6a8dd0..61af1eb 100644
--- a/ansible/deploy.yml.disabled
+++ b/ansible/deploy.yml.disabled
@@ -288,6 +288,23 @@
job: "docker compose -f /var/www/crm-siteconseil/docker-compose-prod.yml exec -T php php bin/console app:cloudflare:clean --env=prod >> /var/log/crm-siteconseil-cloudflare-clean.log 2>&1"
user: bot
+ - name: Configure pending delete cleanup cron (daily at 2am)
+ cron:
+ name: "crm-siteconseil clean pending delete"
+ minute: "0"
+ hour: "2"
+ job: "docker compose -f /var/www/crm-siteconseil/docker-compose-prod.yml exec -T php php bin/console app:clean:pending-delete --env=prod >> /var/log/crm-siteconseil-clean-pending.log 2>&1"
+ user: bot
+
+ - name: Configure Meilisearch full reindex cron (weekly Sunday at 4am)
+ cron:
+ name: "crm-siteconseil meilisearch reindex"
+ minute: "0"
+ hour: "4"
+ weekday: "0"
+ job: "docker compose -f /var/www/crm-siteconseil/docker-compose-prod.yml exec -T php php bin/console app:meilisearch:setup --env=prod >> /var/log/crm-siteconseil-meilisearch-reindex.log 2>&1"
+ user: bot
+
post_tasks:
- name: Disable maintenance mode
command: make maintenance_off
diff --git a/assets/app.js b/assets/app.js
index e26d819..ee21e54 100644
--- a/assets/app.js
+++ b/assets/app.js
@@ -29,11 +29,56 @@ document.addEventListener('DOMContentLoaded', () => {
});
}
- // data-confirm
+ // data-confirm — modal glassmorphism custom
+ const confirmModal = document.createElement('div');
+ confirmModal.id = 'confirm-modal';
+ confirmModal.className = 'hidden fixed inset-0 z-[100] flex items-center justify-center';
+ confirmModal.innerHTML = `
+
+
+
+
+
+
+
+
+
+
+
`;
+ document.body.appendChild(confirmModal);
+
+ let pendingForm = null;
+ const confirmMessage = document.getElementById('confirm-message');
+ const confirmCancel = document.getElementById('confirm-cancel');
+ const confirmOk = document.getElementById('confirm-ok');
+ const confirmOverlay = document.getElementById('confirm-overlay');
+
+ const closeConfirm = () => { confirmModal.classList.add('hidden'); pendingForm = null; };
+
+ confirmCancel.addEventListener('click', closeConfirm);
+ confirmOverlay.addEventListener('click', closeConfirm);
+ document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && pendingForm) closeConfirm(); });
+
+ confirmOk.addEventListener('click', () => {
+ if (pendingForm) {
+ confirmModal.classList.add('hidden');
+ pendingForm.removeAttribute('data-confirm');
+ pendingForm.requestSubmit();
+ }
+ });
+
document.querySelectorAll('form[data-confirm]').forEach(form => {
form.addEventListener('submit', (e) => {
- if (!confirm(form.dataset.confirm)) {
+ if (form.dataset.confirm) {
e.preventDefault();
+ pendingForm = form;
+ confirmMessage.textContent = form.dataset.confirm;
+ confirmModal.classList.remove('hidden');
}
});
});
diff --git a/docker/cron/crontab b/docker/cron/crontab
index fca8a24..2c175af 100644
--- a/docker/cron/crontab
+++ b/docker/cron/crontab
@@ -5,3 +5,8 @@
*/5 * * * * php /app/bin/console app:infra:snapshot --env=dev >> /proc/1/fd/1 2>&1
0 4 * * * echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] START app:attestations:clean" >> /proc/1/fd/1 && php /app/bin/console app:attestations:clean --env=dev >> /proc/1/fd/1 2>&1 && echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] END app:attestations:clean" >> /proc/1/fd/1
*/15 * * * * echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] START app:services:check" >> /proc/1/fd/1 && php /app/bin/console app:services:check --env=dev >> /proc/1/fd/1 2>&1 && echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] END app:services:check" >> /proc/1/fd/1
+0 2 * * * echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] START app:clean:pending-delete" >> /proc/1/fd/1 && php /app/bin/console app:clean:pending-delete --env=dev >> /proc/1/fd/1 2>&1 && echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] END app:clean:pending-delete" >> /proc/1/fd/1
+0 5 * * * echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] START app:email-tracking:purge" >> /proc/1/fd/1 && php /app/bin/console app:email-tracking:purge --env=dev >> /proc/1/fd/1 2>&1 && echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] END app:email-tracking:purge" >> /proc/1/fd/1
+0 6 * * * echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] START app:dns:check" >> /proc/1/fd/1 && php /app/bin/console app:dns:check --env=dev >> /proc/1/fd/1 2>&1 && echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] END app:dns:check" >> /proc/1/fd/1
+0 4 * * 0 echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] START app:meilisearch:setup" >> /proc/1/fd/1 && php /app/bin/console app:meilisearch:setup --env=dev >> /proc/1/fd/1 2>&1 && echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] END app:meilisearch:setup" >> /proc/1/fd/1
+0 7 * * * echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] START app:cloudflare:clean" >> /proc/1/fd/1 && php /app/bin/console app:cloudflare:clean --env=dev >> /proc/1/fd/1 2>&1 && echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] END app:cloudflare:clean" >> /proc/1/fd/1