Patient intake form
First-visit details for a clinic. Leave out anything the visit does not need.
הטופס הזה אינו רשומה רפואית. אל תשלחו אבחנות, תוצאות בדיקות או פרטי בריאות אחרים שאינם נחוצים לפנייה. נתוני בריאות הם קטגוריה מיוחדת לפי ה-GDPR.
תצוגה מקדימה
קוד הטופס
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Patient intake form</title>
<style>
body { font-family: "Segoe UI", sans-serif; color: #12263a; margin: 0; background: #fff; }
main { max-width: 640px; margin: 0 auto; padding: 32px 20px 64px; }
h1 { font-size: 28px; font-weight: 650; letter-spacing: -0.02em; line-height: 1.2; }
h2 { font-size: 18px; margin: 18px 0 0; }
p { line-height: 1.5; }
form { display: grid; gap: 14px; position: relative; }
.field { display: grid; gap: 6px; }
label span, .check span { font-size: 14px; }
input, select, textarea { font: inherit; color: inherit; padding: 10px 12px; border: 1px solid #b4bdce; border-radius: 8px; width: 100%; box-sizing: border-box; background: #fff; }
textarea { min-height: 96px; }
.check { display: flex; gap: 8px; align-items: flex-start; }
.check input { width: auto; margin-top: 4px; }
button { background: #3c4ad8; color: #fff; border: 0; border-radius: 8px; padding: 12px 18px; font: inherit; cursor: pointer; }
.note { background: #fff6eb; padding: 12px 14px; border-radius: 8px; }
form [data-show-if] { display: none; }
form:has(select[name="medications"] option[value="yes"]:checked) [data-show-if="medications"][data-show-equals="yes"] { display: grid; }
</style>
</head>
<body>
<main>
<h1 data-i18n="title">Patient intake form</h1>
<p data-i18n="lede">First-visit details for a clinic. Leave out anything the visit does not need.</p>
<p class="note" data-i18n="disclaimer">This form is not a medical record. Do not send diagnoses, test results, or other health details you do not need for the request. Health data is a special category under the GDPR.</p>
<form id="fg-form" action="https://formgong.com/submit" method="POST">
<input type="hidden" name="access_key" value="fk_your_access_key">
<div aria-hidden="true" style="position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden"><label>Leave this field empty<input name="botcheck" tabindex="-1" autocomplete="off"></label></div>
<section><h2 data-i18n="section.patient">Patient</h2>
<div class="field"><label for="fg-name"><span data-i18n="name">Name</span></label><input id="fg-name" name="name" type="text" required maxlength="80" autocomplete="name"></div>
<div class="field"><label for="fg-birth_date"><span data-i18n="birth_date">Date of birth</span></label><input id="fg-birth_date" name="birth_date" type="date" required></div>
<div class="field"><label for="fg-phone"><span data-i18n="phone">Phone</span></label><input id="fg-phone" name="phone" type="tel" required maxlength="40" autocomplete="tel"></div>
<div class="field"><label for="fg-email"><span data-i18n="email">Email</span></label><input id="fg-email" name="email" type="email" maxlength="120" autocomplete="email"></div></section>
<section><h2 data-i18n="section.visit">This visit</h2>
<div class="field"><label for="fg-first_visit"><span data-i18n="first_visit">Is this your first visit here?</span></label><select id="fg-first_visit" name="first_visit" required><option value="">—</option><option value="yes" data-i18n="first_visit.yes">Yes</option><option value="no" data-i18n="first_visit.no">No</option></select></div>
<div class="field"><label for="fg-reason"><span data-i18n="reason">Why are you coming in?</span></label><textarea id="fg-reason" name="reason" required maxlength="500"></textarea></div>
<div class="field"><label for="fg-medications"><span data-i18n="medications">Do you take regular medication the clinic should know about?</span></label><select id="fg-medications" name="medications" required><option value="">—</option><option value="yes" data-i18n="medications.yes">Yes</option><option value="no" data-i18n="medications.no">No</option></select></div>
<div class="field" data-show-if="medications" data-show-equals="yes"><label for="fg-medication_note"><span data-i18n="medication_note">Which medicines? Leave blank if the visit does not need the list.</span></label><textarea id="fg-medication_note" name="medication_note" maxlength="500"></textarea></div></section>
<section><h2 data-i18n="section.emergency">Emergency contact</h2>
<div class="field"><label for="fg-emergency_name"><span data-i18n="emergency_name">Name</span></label><input id="fg-emergency_name" name="emergency_name" type="text" maxlength="80" autocomplete="name"></div>
<div class="field"><label for="fg-emergency_phone"><span data-i18n="emergency_phone">Phone</span></label><input id="fg-emergency_phone" name="emergency_phone" type="tel" maxlength="40" autocomplete="tel"></div></section>
<section><h2 data-i18n="section.consent">Consent</h2>
<div class="field"><label class="check"><input id="fg-consent_contact" name="consent_contact" type="checkbox" value="yes" required><span data-i18n="consent_contact">I agree to be contacted about this request.</span></label></div>
<div class="field"><label class="check"><input id="fg-consent_privacy" name="consent_privacy" type="checkbox" value="yes" required><span data-i18n="consent_privacy">I agree that these answers are stored so the request can be handled.</span></label></div></section>
<!-- Turnstile hook: enable Turnstile on this form in Formgong, then set your site key.
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<div class="cf-turnstile" data-sitekey="YOUR_TURNSTILE_SITE_KEY"></div>
-->
<button type="submit" data-i18n="submit">Send</button>
<p data-status role="status"></p>
</form>
</main>
<script type="application/json" id="fg-labels">{"uk":{"title":"Форма первинного прийому пацієнта","lede":"Дані для першого візиту. Не додавайте те, без чого прийом можна провести.","submit":"Надіслати","thanks":"Надіслано. Дякуємо.","file_too_big":"Файл більший за 24 КБ. Додайте посилання.","disclaimer":"Ця форма не є медичним записом. Не надсилайте діагнози, результати аналізів чи інші дані про здоров'я, без яких заявку не обробити. Дані про здоров'я — особлива категорія за GDPR.","section.patient":"Пацієнт","name":"Ім'я","birth_date":"Дата народження","phone":"Телефон","email":"Електронна пошта","section.visit":"Цей візит","first_visit":"Це ваш перший візит сюди?","first_visit.yes":"Так","first_visit.no":"Ні","reason":"Чому ви приходите?","medications":"Чи є регулярні ліки, про які клініці варто знати?","medications.yes":"Так","medications.no":"Ні","medication_note":"Які ліки? Залиште порожнім, якщо для візиту список не потрібен.","section.emergency":"Екстрений контакт","emergency_name":"Ім'я","emergency_phone":"Телефон","section.consent":"Згода","consent_contact":"Погоджуюсь, щоб зі мною зв'язалися щодо цієї заявки.","consent_privacy":"Погоджуюсь, що ці відповіді зберігаються, щоб заявку можна було обробити."},"en":{"title":"Patient intake form","lede":"First-visit details for a clinic. Leave out anything the visit does not need.","submit":"Send","thanks":"Sent. Thank you.","file_too_big":"That file is over 24 KB. Paste a link instead.","disclaimer":"This form is not a medical record. Do not send diagnoses, test results, or other health details you do not need for the request. Health data is a special category under the GDPR.","section.patient":"Patient","name":"Name","birth_date":"Date of birth","phone":"Phone","email":"Email","section.visit":"This visit","first_visit":"Is this your first visit here?","first_visit.yes":"Yes","first_visit.no":"No","reason":"Why are you coming in?","medications":"Do you take regular medication the clinic should know about?","medications.yes":"Yes","medications.no":"No","medication_note":"Which medicines? Leave blank if the visit does not need the list.","section.emergency":"Emergency contact","emergency_name":"Name","emergency_phone":"Phone","section.consent":"Consent","consent_contact":"I agree to be contacted about this request.","consent_privacy":"I agree that these answers are stored so the request can be handled."},"pl":{"title":"Formularz wywiadu pacjenta","lede":"Dane na pierwszą wizytę. Pomiń to, bez czego wizyta może się odbyć.","submit":"Wyślij","thanks":"Wysłano. Dziękujemy.","file_too_big":"Plik ma ponad 24 KB. Wklej link.","disclaimer":"Ten formularz nie jest dokumentacją medyczną. Nie wysyłaj rozpoznań, wyników badań ani innych danych o zdrowiu, które nie są potrzebne do obsługi zgłoszenia. Dane o zdrowiu to szczególna kategoria w RODO.","section.patient":"Pacjent","name":"Imię","birth_date":"Data urodzenia","phone":"Telefon","email":"E-mail","section.visit":"Ta wizyta","first_visit":"Czy to pierwsza wizyta tutaj?","first_visit.yes":"Tak","first_visit.no":"Nie","reason":"Po co przychodzisz?","medications":"Czy przyjmujesz leki, o których przychodnia powinna wiedzieć?","medications.yes":"Tak","medications.no":"Nie","medication_note":"Jakie leki? Zostaw puste, jeśli wizyta nie wymaga listy.","section.emergency":"Kontakt alarmowy","emergency_name":"Imię","emergency_phone":"Telefon","section.consent":"Zgoda","consent_contact":"Zgadzam się na kontakt w sprawie tego zgłoszenia.","consent_privacy":"Zgadzam się, aby te odpowiedzi zostały zapisane w celu obsługi zgłoszenia."},"tr":{"title":"Hasta kabul formu","lede":"İlk ziyaret için bilgiler. Ziyaret onsuz yapılabiliyorsa eklemeyin.","submit":"Gönder","thanks":"Gönderildi. Teşekkürler.","file_too_big":"Dosya 24 KB'den büyük. Bağlantı ekleyin.","disclaimer":"Bu form bir tıbbi kayıt değildir. Tanı, tahlil sonucu veya talep için gerekmeyen başka sağlık verisi göndermeyin. Sağlık verisi GDPR'de özel nitelikli veridir.","section.patient":"Hasta","name":"Ad","birth_date":"Doğum tarihi","phone":"Telefon","email":"E-posta","section.visit":"Bu ziyaret","first_visit":"Buraya ilk gelişiniz mi?","first_visit.yes":"Evet","first_visit.no":"Hayır","reason":"Neden geliyorsunuz?","medications":"Kliniğin bilmesi gereken düzenli bir ilaç var mı?","medications.yes":"Evet","medications.no":"Hayır","medication_note":"Hangi ilaçlar? Ziyaret için liste gerekmiyorsa boş bırakın.","section.emergency":"Acil durumda","emergency_name":"Ad","emergency_phone":"Telefon","section.consent":"Onay","consent_contact":"Bu talep hakkında benimle iletişime geçilmesini kabul ediyorum.","consent_privacy":"Bu yanıtların talebin işlenmesi için saklanmasını kabul ediyorum."}}</script>
<script>
(function () {
var MAX = 24576;
var form = document.getElementById("fg-form");
var packNode = document.getElementById("fg-labels");
if (!form || !packNode) return;
var pack = JSON.parse(packNode.textContent);
function code() {
var q = new URLSearchParams(location.search).get("lang") || "";
var raw = (q || document.documentElement.lang || (navigator.language || "en")).slice(0, 2).toLowerCase();
return pack[raw] ? raw : "en";
}
function apply() {
var dict = pack[code()];
document.querySelectorAll("[data-i18n]").forEach(function (node) {
var key = node.getAttribute("data-i18n");
if (key && typeof dict[key] === "string") node.textContent = dict[key];
});
}
apply();
var status = form.querySelector("[data-status]");
form.addEventListener("submit", function (event) {
event.preventDefault();
var dict = pack[code()];
var body = {};
var files = [];
new FormData(form).forEach(function (value, key) {
if (typeof File !== "undefined" && value instanceof File) {
if (value.size) files.push([key, value]);
return;
}
body[key] = String(value);
});
if (files.some(function (pair) { return pair[1].size > MAX; })) {
if (status) status.textContent = dict.file_too_big;
return;
}
Promise.all(files.map(function (pair) {
return readFile(pair[1]).then(function (data) {
body[pair[0] + "_filename"] = pair[1].name;
body[pair[0] + "_data"] = data;
});
})).then(function () {
return fetch(form.action, {
method: "POST",
headers: { "Content-Type": "application/json", Accept: "application/json" },
body: JSON.stringify(body)
});
}).then(function (response) { return response.json(); }).then(function (result) {
if (status) status.textContent = result && result.success ? dict.thanks : ((result && result.message) || "error");
}).catch(function () {
if (status) status.textContent = "error";
});
});
function readFile(file) {
return new Promise(function (resolve, reject) {
var reader = new FileReader();
reader.onload = function () {
var raw = String(reader.result || "");
var comma = raw.indexOf(",");
resolve(comma === -1 ? raw : raw.slice(comma + 1));
};
reader.onerror = function () { reject(reader.error); };
reader.readAsDataURL(file);
});
}
})();
</script>
</body>
</html>
// Generated from src/content/industries.ts — npm run templates:write
import { useState } from "react";
const ENDPOINT = "https://formgong.com/submit";
const FILE_MAX = 24576;
const LABELS = {
"uk": {
"title": "Форма первинного прийому пацієнта",
"lede": "Дані для першого візиту. Не додавайте те, без чого прийом можна провести.",
"submit": "Надіслати",
"thanks": "Надіслано. Дякуємо.",
"file_too_big": "Файл більший за 24 КБ. Додайте посилання.",
"disclaimer": "Ця форма не є медичним записом. Не надсилайте діагнози, результати аналізів чи інші дані про здоров'я, без яких заявку не обробити. Дані про здоров'я — особлива категорія за GDPR.",
"section.patient": "Пацієнт",
"name": "Ім'я",
"birth_date": "Дата народження",
"phone": "Телефон",
"email": "Електронна пошта",
"section.visit": "Цей візит",
"first_visit": "Це ваш перший візит сюди?",
"first_visit.yes": "Так",
"first_visit.no": "Ні",
"reason": "Чому ви приходите?",
"medications": "Чи є регулярні ліки, про які клініці варто знати?",
"medications.yes": "Так",
"medications.no": "Ні",
"medication_note": "Які ліки? Залиште порожнім, якщо для візиту список не потрібен.",
"section.emergency": "Екстрений контакт",
"emergency_name": "Ім'я",
"emergency_phone": "Телефон",
"section.consent": "Згода",
"consent_contact": "Погоджуюсь, щоб зі мною зв'язалися щодо цієї заявки.",
"consent_privacy": "Погоджуюсь, що ці відповіді зберігаються, щоб заявку можна було обробити."
},
"en": {
"title": "Patient intake form",
"lede": "First-visit details for a clinic. Leave out anything the visit does not need.",
"submit": "Send",
"thanks": "Sent. Thank you.",
"file_too_big": "That file is over 24 KB. Paste a link instead.",
"disclaimer": "This form is not a medical record. Do not send diagnoses, test results, or other health details you do not need for the request. Health data is a special category under the GDPR.",
"section.patient": "Patient",
"name": "Name",
"birth_date": "Date of birth",
"phone": "Phone",
"email": "Email",
"section.visit": "This visit",
"first_visit": "Is this your first visit here?",
"first_visit.yes": "Yes",
"first_visit.no": "No",
"reason": "Why are you coming in?",
"medications": "Do you take regular medication the clinic should know about?",
"medications.yes": "Yes",
"medications.no": "No",
"medication_note": "Which medicines? Leave blank if the visit does not need the list.",
"section.emergency": "Emergency contact",
"emergency_name": "Name",
"emergency_phone": "Phone",
"section.consent": "Consent",
"consent_contact": "I agree to be contacted about this request.",
"consent_privacy": "I agree that these answers are stored so the request can be handled."
},
"pl": {
"title": "Formularz wywiadu pacjenta",
"lede": "Dane na pierwszą wizytę. Pomiń to, bez czego wizyta może się odbyć.",
"submit": "Wyślij",
"thanks": "Wysłano. Dziękujemy.",
"file_too_big": "Plik ma ponad 24 KB. Wklej link.",
"disclaimer": "Ten formularz nie jest dokumentacją medyczną. Nie wysyłaj rozpoznań, wyników badań ani innych danych o zdrowiu, które nie są potrzebne do obsługi zgłoszenia. Dane o zdrowiu to szczególna kategoria w RODO.",
"section.patient": "Pacjent",
"name": "Imię",
"birth_date": "Data urodzenia",
"phone": "Telefon",
"email": "E-mail",
"section.visit": "Ta wizyta",
"first_visit": "Czy to pierwsza wizyta tutaj?",
"first_visit.yes": "Tak",
"first_visit.no": "Nie",
"reason": "Po co przychodzisz?",
"medications": "Czy przyjmujesz leki, o których przychodnia powinna wiedzieć?",
"medications.yes": "Tak",
"medications.no": "Nie",
"medication_note": "Jakie leki? Zostaw puste, jeśli wizyta nie wymaga listy.",
"section.emergency": "Kontakt alarmowy",
"emergency_name": "Imię",
"emergency_phone": "Telefon",
"section.consent": "Zgoda",
"consent_contact": "Zgadzam się na kontakt w sprawie tego zgłoszenia.",
"consent_privacy": "Zgadzam się, aby te odpowiedzi zostały zapisane w celu obsługi zgłoszenia."
},
"tr": {
"title": "Hasta kabul formu",
"lede": "İlk ziyaret için bilgiler. Ziyaret onsuz yapılabiliyorsa eklemeyin.",
"submit": "Gönder",
"thanks": "Gönderildi. Teşekkürler.",
"file_too_big": "Dosya 24 KB'den büyük. Bağlantı ekleyin.",
"disclaimer": "Bu form bir tıbbi kayıt değildir. Tanı, tahlil sonucu veya talep için gerekmeyen başka sağlık verisi göndermeyin. Sağlık verisi GDPR'de özel nitelikli veridir.",
"section.patient": "Hasta",
"name": "Ad",
"birth_date": "Doğum tarihi",
"phone": "Telefon",
"email": "E-posta",
"section.visit": "Bu ziyaret",
"first_visit": "Buraya ilk gelişiniz mi?",
"first_visit.yes": "Evet",
"first_visit.no": "Hayır",
"reason": "Neden geliyorsunuz?",
"medications": "Kliniğin bilmesi gereken düzenli bir ilaç var mı?",
"medications.yes": "Evet",
"medications.no": "Hayır",
"medication_note": "Hangi ilaçlar? Ziyaret için liste gerekmiyorsa boş bırakın.",
"section.emergency": "Acil durumda",
"emergency_name": "Ad",
"emergency_phone": "Telefon",
"section.consent": "Onay",
"consent_contact": "Bu talep hakkında benimle iletişime geçilmesini kabul ediyorum.",
"consent_privacy": "Bu yanıtların talebin işlenmesi için saklanmasını kabul ediyorum."
}
};
export function IndustryForm({ lang = "en", accessKey = "fk_your_access_key" }) {
const t = LABELS[lang] || LABELS.en;
const [status, setStatus] = useState("");
const [values, setValues] = useState({ medications: "" });
function setField(name, value) {
setValues((current) => ({ ...current, [name]: value }));
}
async function onSubmit(event) {
const form = event.currentTarget;
event.preventDefault();
const body = {};
const files = [];
for (const [key, value] of new FormData(form).entries()) {
if (value instanceof File) {
if (value.size) files.push([key, value]);
continue;
}
body[key] = String(value);
}
if (files.some((pair) => pair[1].size > FILE_MAX)) {
setStatus(t.file_too_big);
return;
}
for (const [key, file] of files) {
body[key + "_filename"] = file.name;
body[key + "_data"] = await readFile(file);
}
const response = await fetch(ENDPOINT, {
method: "POST",
headers: { "Content-Type": "application/json", Accept: "application/json" },
body: JSON.stringify(body),
});
const result = await response.json();
setStatus(result.success ? t.thanks : (result.message || "error"));
}
return (
<form onSubmit={onSubmit}>
<h1>{t.title}</h1>
<p>{t.lede}</p>
{t.disclaimer ? <p>{t.disclaimer}</p> : null}
<input type="hidden" name="access_key" value={accessKey} />
<div aria-hidden="true" style={{ position: "absolute", left: "-10000px", width: 1, height: 1, overflow: "hidden" }}>
<input name="botcheck" tabIndex={-1} autoComplete="off" />
</div>
<section><h2>{t["section.patient"]}</h2>
<label><span>{t["name"]}</span><input name="name" type="text" required maxLength={80} autoComplete="name" /></label>
<label><span>{t["birth_date"]}</span><input name="birth_date" type="date" required /></label>
<label><span>{t["phone"]}</span><input name="phone" type="tel" required maxLength={40} autoComplete="tel" /></label>
<label><span>{t["email"]}</span><input name="email" type="email" maxLength={120} autoComplete="email" /></label></section>
<section><h2>{t["section.visit"]}</h2>
<label><span>{t["first_visit"]}</span><select name="first_visit" required><option value="">—</option><option value="yes">{t["first_visit.yes"]}</option><option value="no">{t["first_visit.no"]}</option></select></label>
<label><span>{t["reason"]}</span><textarea name="reason" required maxLength={500} /></label>
<label><span>{t["medications"]}</span><select name="medications" required value={values["medications"]} onChange={(event) => setField("medications", event.target.value)}><option value="">—</option><option value="yes">{t["medications.yes"]}</option><option value="no">{t["medications.no"]}</option></select></label>
{values["medications"] === "yes" ? (<label><span>{t["medication_note"]}</span><textarea name="medication_note" maxLength={500} /></label>) : null}</section>
<section><h2>{t["section.emergency"]}</h2>
<label><span>{t["emergency_name"]}</span><input name="emergency_name" type="text" maxLength={80} autoComplete="name" /></label>
<label><span>{t["emergency_phone"]}</span><input name="emergency_phone" type="tel" maxLength={40} autoComplete="tel" /></label></section>
<section><h2>{t["section.consent"]}</h2>
<label className="check"><input name="consent_contact" type="checkbox" value="yes" required /><span>{t["consent_contact"]}</span></label>
<label className="check"><input name="consent_privacy" type="checkbox" value="yes" required /><span>{t["consent_privacy"]}</span></label></section>
{/* Turnstile hook: enable Turnstile on this form in Formgong, load https://challenges.cloudflare.com/turnstile/v0/api.js, and render <div className="cf-turnstile" data-sitekey="YOUR_TURNSTILE_SITE_KEY" /> */}
<button type="submit">{t.submit}</button>
<p>{status}</p>
</form>
);
}
function readFile(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
const raw = String(reader.result || "");
const comma = raw.indexOf(",");
resolve(comma === -1 ? raw : raw.slice(comma + 1));
};
reader.onerror = () => reject(reader.error);
reader.readAsDataURL(file);
});
}
<!-- Generated from src/content/industries.ts — npm run templates:write -->
<script setup>
import { reactive, ref, computed } from "vue";
const props = defineProps({
lang: { type: String, default: "en" },
accessKey: { type: String, default: "fk_your_access_key" },
});
const ENDPOINT = "https://formgong.com/submit";
const FILE_MAX = 24576;
const LABELS = {
"uk": {
"title": "Форма первинного прийому пацієнта",
"lede": "Дані для першого візиту. Не додавайте те, без чого прийом можна провести.",
"submit": "Надіслати",
"thanks": "Надіслано. Дякуємо.",
"file_too_big": "Файл більший за 24 КБ. Додайте посилання.",
"disclaimer": "Ця форма не є медичним записом. Не надсилайте діагнози, результати аналізів чи інші дані про здоров'я, без яких заявку не обробити. Дані про здоров'я — особлива категорія за GDPR.",
"section.patient": "Пацієнт",
"name": "Ім'я",
"birth_date": "Дата народження",
"phone": "Телефон",
"email": "Електронна пошта",
"section.visit": "Цей візит",
"first_visit": "Це ваш перший візит сюди?",
"first_visit.yes": "Так",
"first_visit.no": "Ні",
"reason": "Чому ви приходите?",
"medications": "Чи є регулярні ліки, про які клініці варто знати?",
"medications.yes": "Так",
"medications.no": "Ні",
"medication_note": "Які ліки? Залиште порожнім, якщо для візиту список не потрібен.",
"section.emergency": "Екстрений контакт",
"emergency_name": "Ім'я",
"emergency_phone": "Телефон",
"section.consent": "Згода",
"consent_contact": "Погоджуюсь, щоб зі мною зв'язалися щодо цієї заявки.",
"consent_privacy": "Погоджуюсь, що ці відповіді зберігаються, щоб заявку можна було обробити."
},
"en": {
"title": "Patient intake form",
"lede": "First-visit details for a clinic. Leave out anything the visit does not need.",
"submit": "Send",
"thanks": "Sent. Thank you.",
"file_too_big": "That file is over 24 KB. Paste a link instead.",
"disclaimer": "This form is not a medical record. Do not send diagnoses, test results, or other health details you do not need for the request. Health data is a special category under the GDPR.",
"section.patient": "Patient",
"name": "Name",
"birth_date": "Date of birth",
"phone": "Phone",
"email": "Email",
"section.visit": "This visit",
"first_visit": "Is this your first visit here?",
"first_visit.yes": "Yes",
"first_visit.no": "No",
"reason": "Why are you coming in?",
"medications": "Do you take regular medication the clinic should know about?",
"medications.yes": "Yes",
"medications.no": "No",
"medication_note": "Which medicines? Leave blank if the visit does not need the list.",
"section.emergency": "Emergency contact",
"emergency_name": "Name",
"emergency_phone": "Phone",
"section.consent": "Consent",
"consent_contact": "I agree to be contacted about this request.",
"consent_privacy": "I agree that these answers are stored so the request can be handled."
},
"pl": {
"title": "Formularz wywiadu pacjenta",
"lede": "Dane na pierwszą wizytę. Pomiń to, bez czego wizyta może się odbyć.",
"submit": "Wyślij",
"thanks": "Wysłano. Dziękujemy.",
"file_too_big": "Plik ma ponad 24 KB. Wklej link.",
"disclaimer": "Ten formularz nie jest dokumentacją medyczną. Nie wysyłaj rozpoznań, wyników badań ani innych danych o zdrowiu, które nie są potrzebne do obsługi zgłoszenia. Dane o zdrowiu to szczególna kategoria w RODO.",
"section.patient": "Pacjent",
"name": "Imię",
"birth_date": "Data urodzenia",
"phone": "Telefon",
"email": "E-mail",
"section.visit": "Ta wizyta",
"first_visit": "Czy to pierwsza wizyta tutaj?",
"first_visit.yes": "Tak",
"first_visit.no": "Nie",
"reason": "Po co przychodzisz?",
"medications": "Czy przyjmujesz leki, o których przychodnia powinna wiedzieć?",
"medications.yes": "Tak",
"medications.no": "Nie",
"medication_note": "Jakie leki? Zostaw puste, jeśli wizyta nie wymaga listy.",
"section.emergency": "Kontakt alarmowy",
"emergency_name": "Imię",
"emergency_phone": "Telefon",
"section.consent": "Zgoda",
"consent_contact": "Zgadzam się na kontakt w sprawie tego zgłoszenia.",
"consent_privacy": "Zgadzam się, aby te odpowiedzi zostały zapisane w celu obsługi zgłoszenia."
},
"tr": {
"title": "Hasta kabul formu",
"lede": "İlk ziyaret için bilgiler. Ziyaret onsuz yapılabiliyorsa eklemeyin.",
"submit": "Gönder",
"thanks": "Gönderildi. Teşekkürler.",
"file_too_big": "Dosya 24 KB'den büyük. Bağlantı ekleyin.",
"disclaimer": "Bu form bir tıbbi kayıt değildir. Tanı, tahlil sonucu veya talep için gerekmeyen başka sağlık verisi göndermeyin. Sağlık verisi GDPR'de özel nitelikli veridir.",
"section.patient": "Hasta",
"name": "Ad",
"birth_date": "Doğum tarihi",
"phone": "Telefon",
"email": "E-posta",
"section.visit": "Bu ziyaret",
"first_visit": "Buraya ilk gelişiniz mi?",
"first_visit.yes": "Evet",
"first_visit.no": "Hayır",
"reason": "Neden geliyorsunuz?",
"medications": "Kliniğin bilmesi gereken düzenli bir ilaç var mı?",
"medications.yes": "Evet",
"medications.no": "Hayır",
"medication_note": "Hangi ilaçlar? Ziyaret için liste gerekmiyorsa boş bırakın.",
"section.emergency": "Acil durumda",
"emergency_name": "Ad",
"emergency_phone": "Telefon",
"section.consent": "Onay",
"consent_contact": "Bu talep hakkında benimle iletişime geçilmesini kabul ediyorum.",
"consent_privacy": "Bu yanıtların talebin işlenmesi için saklanmasını kabul ediyorum."
}
};
const t = computed(() => LABELS[props.lang] || LABELS.en);
const status = ref("");
const values = reactive({ medications: "" });
function readFile(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
const raw = String(reader.result || "");
const comma = raw.indexOf(",");
resolve(comma === -1 ? raw : raw.slice(comma + 1));
};
reader.onerror = () => reject(reader.error);
reader.readAsDataURL(file);
});
}
async function onSubmit(event) {
const form = event.currentTarget;
event.preventDefault();
const body = {};
const files = [];
for (const [key, value] of new FormData(form).entries()) {
if (value instanceof File) {
if (value.size) files.push([key, value]);
continue;
}
body[key] = String(value);
}
if (files.some((pair) => pair[1].size > FILE_MAX)) {
status.value = t.value.file_too_big;
return;
}
for (const [key, file] of files) {
body[key + "_filename"] = file.name;
body[key + "_data"] = await readFile(file);
}
const response = await fetch(ENDPOINT, {
method: "POST",
headers: { "Content-Type": "application/json", Accept: "application/json" },
body: JSON.stringify(body),
});
const result = await response.json();
status.value = result.success ? t.value.thanks : (result.message || "error");
}
</script>
<template>
<form @submit.prevent="onSubmit">
<h1>{{ t.title }}</h1>
<p>{{ t.lede }}</p>
<p v-if="t.disclaimer">{{ t.disclaimer }}</p>
<input type="hidden" name="access_key" :value="accessKey">
<div aria-hidden="true" style="position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden">
<input name="botcheck" tabindex="-1" autocomplete="off">
</div>
<section><h2>{{ t["section.patient"] }}</h2>
<label><span>{{ t["name"] }}</span><input name="name" type="text" required maxlength="80" autocomplete="name"></label>
<label><span>{{ t["birth_date"] }}</span><input name="birth_date" type="date" required></label>
<label><span>{{ t["phone"] }}</span><input name="phone" type="tel" required maxlength="40" autocomplete="tel"></label>
<label><span>{{ t["email"] }}</span><input name="email" type="email" maxlength="120" autocomplete="email"></label></section>
<section><h2>{{ t["section.visit"] }}</h2>
<label><span>{{ t["first_visit"] }}</span><select name="first_visit" required><option value="">—</option><option value="yes">{{ t["first_visit.yes"] }}</option><option value="no">{{ t["first_visit.no"] }}</option></select></label>
<label><span>{{ t["reason"] }}</span><textarea name="reason" required maxlength="500"></textarea></label>
<label><span>{{ t["medications"] }}</span><select name="medications" required v-model="values.medications"><option value="">—</option><option value="yes">{{ t["medications.yes"] }}</option><option value="no">{{ t["medications.no"] }}</option></select></label>
<template v-if="values["medications"] === 'yes'"><label><span>{{ t["medication_note"] }}</span><textarea name="medication_note" maxlength="500"></textarea></label></template></section>
<section><h2>{{ t["section.emergency"] }}</h2>
<label><span>{{ t["emergency_name"] }}</span><input name="emergency_name" type="text" maxlength="80" autocomplete="name"></label>
<label><span>{{ t["emergency_phone"] }}</span><input name="emergency_phone" type="tel" maxlength="40" autocomplete="tel"></label></section>
<section><h2>{{ t["section.consent"] }}</h2>
<label class="check"><input name="consent_contact" type="checkbox" value="yes" required><span>{{ t["consent_contact"] }}</span></label>
<label class="check"><input name="consent_privacy" type="checkbox" value="yes" required><span>{{ t["consent_privacy"] }}</span></label></section>
<!-- Turnstile hook: enable Turnstile on this form in Formgong, add the api.js script, and a div.cf-turnstile with data-sitekey="YOUR_TURNSTILE_SITE_KEY". -->
<button type="submit">{{ t.submit }}</button>
<p>{{ status }}</p>
</form>
</template>
<!-- Generated from src/content/industries.ts — npm run templates:write -->
<script>
let { lang = "en", accessKey = "fk_your_access_key" } = $props();
const ENDPOINT = "https://formgong.com/submit";
const FILE_MAX = 24576;
const LABELS = {
"uk": {
"title": "Форма первинного прийому пацієнта",
"lede": "Дані для першого візиту. Не додавайте те, без чого прийом можна провести.",
"submit": "Надіслати",
"thanks": "Надіслано. Дякуємо.",
"file_too_big": "Файл більший за 24 КБ. Додайте посилання.",
"disclaimer": "Ця форма не є медичним записом. Не надсилайте діагнози, результати аналізів чи інші дані про здоров'я, без яких заявку не обробити. Дані про здоров'я — особлива категорія за GDPR.",
"section.patient": "Пацієнт",
"name": "Ім'я",
"birth_date": "Дата народження",
"phone": "Телефон",
"email": "Електронна пошта",
"section.visit": "Цей візит",
"first_visit": "Це ваш перший візит сюди?",
"first_visit.yes": "Так",
"first_visit.no": "Ні",
"reason": "Чому ви приходите?",
"medications": "Чи є регулярні ліки, про які клініці варто знати?",
"medications.yes": "Так",
"medications.no": "Ні",
"medication_note": "Які ліки? Залиште порожнім, якщо для візиту список не потрібен.",
"section.emergency": "Екстрений контакт",
"emergency_name": "Ім'я",
"emergency_phone": "Телефон",
"section.consent": "Згода",
"consent_contact": "Погоджуюсь, щоб зі мною зв'язалися щодо цієї заявки.",
"consent_privacy": "Погоджуюсь, що ці відповіді зберігаються, щоб заявку можна було обробити."
},
"en": {
"title": "Patient intake form",
"lede": "First-visit details for a clinic. Leave out anything the visit does not need.",
"submit": "Send",
"thanks": "Sent. Thank you.",
"file_too_big": "That file is over 24 KB. Paste a link instead.",
"disclaimer": "This form is not a medical record. Do not send diagnoses, test results, or other health details you do not need for the request. Health data is a special category under the GDPR.",
"section.patient": "Patient",
"name": "Name",
"birth_date": "Date of birth",
"phone": "Phone",
"email": "Email",
"section.visit": "This visit",
"first_visit": "Is this your first visit here?",
"first_visit.yes": "Yes",
"first_visit.no": "No",
"reason": "Why are you coming in?",
"medications": "Do you take regular medication the clinic should know about?",
"medications.yes": "Yes",
"medications.no": "No",
"medication_note": "Which medicines? Leave blank if the visit does not need the list.",
"section.emergency": "Emergency contact",
"emergency_name": "Name",
"emergency_phone": "Phone",
"section.consent": "Consent",
"consent_contact": "I agree to be contacted about this request.",
"consent_privacy": "I agree that these answers are stored so the request can be handled."
},
"pl": {
"title": "Formularz wywiadu pacjenta",
"lede": "Dane na pierwszą wizytę. Pomiń to, bez czego wizyta może się odbyć.",
"submit": "Wyślij",
"thanks": "Wysłano. Dziękujemy.",
"file_too_big": "Plik ma ponad 24 KB. Wklej link.",
"disclaimer": "Ten formularz nie jest dokumentacją medyczną. Nie wysyłaj rozpoznań, wyników badań ani innych danych o zdrowiu, które nie są potrzebne do obsługi zgłoszenia. Dane o zdrowiu to szczególna kategoria w RODO.",
"section.patient": "Pacjent",
"name": "Imię",
"birth_date": "Data urodzenia",
"phone": "Telefon",
"email": "E-mail",
"section.visit": "Ta wizyta",
"first_visit": "Czy to pierwsza wizyta tutaj?",
"first_visit.yes": "Tak",
"first_visit.no": "Nie",
"reason": "Po co przychodzisz?",
"medications": "Czy przyjmujesz leki, o których przychodnia powinna wiedzieć?",
"medications.yes": "Tak",
"medications.no": "Nie",
"medication_note": "Jakie leki? Zostaw puste, jeśli wizyta nie wymaga listy.",
"section.emergency": "Kontakt alarmowy",
"emergency_name": "Imię",
"emergency_phone": "Telefon",
"section.consent": "Zgoda",
"consent_contact": "Zgadzam się na kontakt w sprawie tego zgłoszenia.",
"consent_privacy": "Zgadzam się, aby te odpowiedzi zostały zapisane w celu obsługi zgłoszenia."
},
"tr": {
"title": "Hasta kabul formu",
"lede": "İlk ziyaret için bilgiler. Ziyaret onsuz yapılabiliyorsa eklemeyin.",
"submit": "Gönder",
"thanks": "Gönderildi. Teşekkürler.",
"file_too_big": "Dosya 24 KB'den büyük. Bağlantı ekleyin.",
"disclaimer": "Bu form bir tıbbi kayıt değildir. Tanı, tahlil sonucu veya talep için gerekmeyen başka sağlık verisi göndermeyin. Sağlık verisi GDPR'de özel nitelikli veridir.",
"section.patient": "Hasta",
"name": "Ad",
"birth_date": "Doğum tarihi",
"phone": "Telefon",
"email": "E-posta",
"section.visit": "Bu ziyaret",
"first_visit": "Buraya ilk gelişiniz mi?",
"first_visit.yes": "Evet",
"first_visit.no": "Hayır",
"reason": "Neden geliyorsunuz?",
"medications": "Kliniğin bilmesi gereken düzenli bir ilaç var mı?",
"medications.yes": "Evet",
"medications.no": "Hayır",
"medication_note": "Hangi ilaçlar? Ziyaret için liste gerekmiyorsa boş bırakın.",
"section.emergency": "Acil durumda",
"emergency_name": "Ad",
"emergency_phone": "Telefon",
"section.consent": "Onay",
"consent_contact": "Bu talep hakkında benimle iletişime geçilmesini kabul ediyorum.",
"consent_privacy": "Bu yanıtların talebin işlenmesi için saklanmasını kabul ediyorum."
}
};
let status = $state("");
let values = $state({ medications: "" });
const t = $derived(LABELS[lang] || LABELS.en);
function readFile(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
const raw = String(reader.result || "");
const comma = raw.indexOf(",");
resolve(comma === -1 ? raw : raw.slice(comma + 1));
};
reader.onerror = () => reject(reader.error);
reader.readAsDataURL(file);
});
}
async function onSubmit(event) {
const form = event.currentTarget;
event.preventDefault();
const body = {};
const files = [];
for (const [key, value] of new FormData(form).entries()) {
if (value instanceof File) {
if (value.size) files.push([key, value]);
continue;
}
body[key] = String(value);
}
if (files.some((pair) => pair[1].size > FILE_MAX)) {
status = t.file_too_big;
return;
}
for (const [key, file] of files) {
body[key + "_filename"] = file.name;
body[key + "_data"] = await readFile(file);
}
const response = await fetch(ENDPOINT, {
method: "POST",
headers: { "Content-Type": "application/json", Accept: "application/json" },
body: JSON.stringify(body),
});
const result = await response.json();
status = result.success ? t.thanks : (result.message || "error");
}
</script>
<form onsubmit={onSubmit}>
<h1>{t.title}</h1>
<p>{t.lede}</p>
{#if t.disclaimer}<p>{t.disclaimer}</p>{/if}
<input type="hidden" name="access_key" value={accessKey}>
<div aria-hidden="true" style="position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden">
<input name="botcheck" tabindex="-1" autocomplete="off">
</div>
<section><h2>{t["section.patient"]}</h2>
<label><span>{t["name"]}</span><input name="name" type="text" required maxlength="80"></label>
<label><span>{t["birth_date"]}</span><input name="birth_date" type="date" required></label>
<label><span>{t["phone"]}</span><input name="phone" type="tel" required maxlength="40"></label>
<label><span>{t["email"]}</span><input name="email" type="email" maxlength="120"></label></section>
<section><h2>{t["section.visit"]}</h2>
<label><span>{t["first_visit"]}</span><select name="first_visit" required><option value="">—</option><option value="yes">{t["first_visit.yes"]}</option><option value="no">{t["first_visit.no"]}</option></select></label>
<label><span>{t["reason"]}</span><textarea name="reason" required maxlength="500"></textarea></label>
<label><span>{t["medications"]}</span><select name="medications" required bind:value={values.medications}><option value="">—</option><option value="yes">{t["medications.yes"]}</option><option value="no">{t["medications.no"]}</option></select></label>
{#if values.medications === "yes"}<label><span>{t["medication_note"]}</span><textarea name="medication_note" maxlength="500"></textarea></label>{/if}</section>
<section><h2>{t["section.emergency"]}</h2>
<label><span>{t["emergency_name"]}</span><input name="emergency_name" type="text" maxlength="80"></label>
<label><span>{t["emergency_phone"]}</span><input name="emergency_phone" type="tel" maxlength="40"></label></section>
<section><h2>{t["section.consent"]}</h2>
<label class="check"><input name="consent_contact" type="checkbox" value="yes" required><span>{t["consent_contact"]}</span></label>
<label class="check"><input name="consent_privacy" type="checkbox" value="yes" required><span>{t["consent_privacy"]}</span></label></section>
<!-- Turnstile hook: enable Turnstile on this form in Formgong, add the api.js script, and a div.cf-turnstile with data-sitekey="YOUR_TURNSTILE_SITE_KEY". -->
<button type="submit">{t.submit}</button>
<p>{status}</p>
</form>