Ajout de la génération de QR codes de contact (vCard)

This commit is contained in:
florian committed 2026-08-27 15:35:27 +02:00
1 parent 636296e154
commit fb93aff837
3 files changed
+110 -9

No files matched your search

+69 -8
View File
@@ -4,12 +4,20 @@
const modeEl = document.getElementById("qr-mode");
const modeTextWrap = document.getElementById("mode-text");
const modeWifiWrap = document.getElementById("mode-wifi");
const modeVcardWrap = document.getElementById("mode-vcard");
const textEl = document.getElementById("qr-text");
const wifiSsidEl = document.getElementById("wifi-ssid");
const wifiEncryptionEl = document.getElementById("wifi-encryption");
const wifiPasswordEl = document.getElementById("wifi-password");
const wifiPasswordField = document.getElementById("wifi-password-field");
const wifiHiddenEl = document.getElementById("wifi-hidden");
const vcardFirstnameEl = document.getElementById("vcard-firstname");
const vcardLastnameEl = document.getElementById("vcard-lastname");
const vcardPhoneEl = document.getElementById("vcard-phone");
const vcardEmailEl = document.getElementById("vcard-email");
const vcardOrgEl = document.getElementById("vcard-org");
const vcardTitleEl = document.getElementById("vcard-title");
const vcardWebsiteEl = document.getElementById("vcard-website");
const cellSizeEl = document.getElementById("qr-cell-size");
const correctionEl = document.getElementById("qr-correction");
const fgColorEl = document.getElementById("qr-fg-color");
@@ -68,10 +76,40 @@
return payload;
}
function escapeVcardField(value) {
return String(value).replace(/([\\;,])/g, "\\$1").replace(/\n/g, "\\n");
}
function buildVcardPayload() {
const firstName = vcardFirstnameEl.value.trim();
const lastName = vcardLastnameEl.value.trim();
const phone = vcardPhoneEl.value.trim();
const email = vcardEmailEl.value.trim();
const org = vcardOrgEl.value.trim();
const title = vcardTitleEl.value.trim();
const website = vcardWebsiteEl.value.trim();
if (!firstName && !lastName) return "";
const fullName = [firstName, lastName].filter(Boolean).join(" ");
let payload = "BEGIN:VCARD\nVERSION:3.0\n";
payload += `N:${escapeVcardField(lastName)};${escapeVcardField(firstName)};;;\n`;
payload += `FN:${escapeVcardField(fullName)}\n`;
if (org) payload += `ORG:${escapeVcardField(org)}\n`;
if (title) payload += `TITLE:${escapeVcardField(title)}\n`;
if (phone) payload += `TEL;TYPE=CELL:${escapeVcardField(phone)}\n`;
if (email) payload += `EMAIL:${escapeVcardField(email)}\n`;
if (website) payload += `URL:${escapeVcardField(website)}\n`;
payload += "END:VCARD";
return payload;
}
function updateModeVisibility() {
const isWifi = modeEl.value === "wifi";
modeTextWrap.style.display = isWifi ? "none" : "block";
modeWifiWrap.style.display = isWifi ? "block" : "none";
const mode = modeEl.value;
modeTextWrap.style.display = mode === "text" ? "block" : "none";
modeWifiWrap.style.display = mode === "wifi" ? "block" : "none";
modeVcardWrap.style.display = mode === "vcard" ? "block" : "none";
wifiPasswordField.style.display = wifiEncryptionEl.value === "nopass" ? "none" : "block";
}
@@ -87,18 +125,41 @@
el.addEventListener("change", render);
});
[
vcardFirstnameEl,
vcardLastnameEl,
vcardPhoneEl,
vcardEmailEl,
vcardOrgEl,
vcardTitleEl,
vcardWebsiteEl,
].forEach((el) => {
el.addEventListener("input", render);
});
function render() {
const isWifi = modeEl.value === "wifi";
const text = isWifi ? buildWifiPayload() : textEl.value;
const mode = modeEl.value;
let text;
if (mode === "wifi") {
text = buildWifiPayload();
} else if (mode === "vcard") {
text = buildVcardPayload();
} else {
text = textEl.value;
}
statusEl.classList.remove("error");
if (!text) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
canvas.width = 280;
canvas.height = 280;
statusEl.textContent = isWifi
? "Renseignez au moins le nom du réseau (SSID) pour générer le QR code."
: "Saisissez un texte ou une URL pour générer le QR code.";
if (mode === "wifi") {
statusEl.textContent = "Renseignez au moins le nom du réseau (SSID) pour générer le QR code.";
} else if (mode === "vcard") {
statusEl.textContent = "Renseignez au moins un prénom ou un nom pour générer le QR code.";
} else {
statusEl.textContent = "Saisissez un texte ou une URL pour générer le QR code.";
}
return;
}