Kavel bij lead/klant en relatie: kavelgegevens (m², bestemming, plannen, achtererf, natura, cultuur, monument, bouwjaar) in CRM-stijl boven de kaart; de kaart zelf alleen met de knoppen (kaart-app &weergave=kaart, gegevens via postMessage), geen scroll meer in het blok

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Machiel
2026-10-16 19:52:12 +02:00
co-authored by Claude Opus 5.5
parent b66d6a6fe6
commit 805448d515
4 changed files with 84 additions and 15 deletions
+7 -1
View File
@@ -248,8 +248,14 @@ dl.props dd { margin: 0; overflow-wrap: anywhere; white-space: pre-line; }
.file .muted { padding: 0 0.5rem 0.35rem; font-size: 0.8rem; } .file .muted { padding: 0 0.5rem 0.35rem; font-size: 0.8rem; }
.viewer-frame { aspect-ratio: 16 / 10; min-height: 320px; border: 1px solid var(--line); border-radius: var(--radius-md); overflow: hidden; background: var(--blue); } .viewer-frame { aspect-ratio: 16 / 10; min-height: 320px; border: 1px solid var(--line); border-radius: var(--radius-md); overflow: hidden; background: var(--blue); }
.viewer-frame iframe { display: block; width: 100%; height: 100%; border: 0; } .viewer-frame iframe { display: block; width: 100%; height: 100%; border: 0; }
.kaart-frame { height: 640px; max-height: 80vh; border: 1px solid var(--line); border-radius: var(--radius-md); overflow: hidden; background: var(--blue); } .kaart-frame { height: 520px; max-height: 75vh; border: 1px solid var(--line); border-radius: var(--radius-md); overflow: hidden; background: var(--blue); }
.kaart-frame iframe { display: block; width: 100%; height: 100%; border: 0; } .kaart-frame iframe { display: block; width: 100%; height: 100%; border: 0; }
.kavel .kavel-adres { margin: 0 0 0.75rem; }
.kavel .kavel-kpi { padding: 0.75rem 1rem; }
.kavel .kavel-kpi .value { font-size: clamp(1.1rem, 2.4vw, 1.5rem); margin: 0.2rem 0 0; }
.kavel .kavel-kpi.vrij { background: var(--orange-tint-soft); border-color: var(--orange-line); }
.kavel .kavel-kpi.vrij .value { color: var(--orange); }
.kavel dl.props dt[hidden], .kavel dl.props dd[hidden] { display: none; }
/* documenten met versies (contact, relatie, portaal) */ /* documenten met versies (contact, relatie, portaal) */
.docs { margin-bottom: 1rem; } .docs { margin-bottom: 1rem; }
.doc { border-top: 1px solid var(--line); } .doc { border-top: 1px solid var(--line); }
+73
View File
@@ -0,0 +1,73 @@
{# Kavel bij een contact of relatie: de kavelgegevens in CRM-stijl, daaronder alleen de kaart (kaart-app,
&weergave=kaart). De kaart stuurt de gegevens met postMessage ({type: 'kaveltoets', resultaat | fout}). #}
{% macro kaart_block(kaart) %}
<div class="card kavel"><div class="card-body">
<div class="card-top"><h2>Kavel</h2>
<div class="actions"><a class="btn btn-outline-primary btn-sm" href="{{ kaart }}" target="_blank" data-kavel-open>Volledig openen</a></div></div>
<p class="muted kavel-status" data-kavel-status style="margin:0 0 1rem">Kavel wordt opgezocht…</p>
<div data-kavel-gegevens hidden>
<p class="kavel-adres"><strong data-k="adres"></strong> <span class="muted" data-k="perceel"></span></p>
<div class="row g-2 mb-3">
<div class="col-4"><div class="kpi kavel-kpi"><div class="muted">Kavel</div><div class="value" data-k="kavel_m2"></div></div></div>
<div class="col-4"><div class="kpi kavel-kpi"><div class="muted">Bebouwd</div><div class="value" data-k="bebouwd_m2"></div></div></div>
<div class="col-4"><div class="kpi kavel-kpi vrij"><div class="muted">Vrije meters</div><div class="value" data-k="vrije_m2"></div></div></div>
</div>
<dl class="props mb-3">
<dt>Bestemming</dt><dd data-k="bestemming"></dd>
<dt data-rij="plannen">Geldend plan</dt><dd data-rij="plannen" data-k="plannen"></dd>
<dt data-rij="paraplu">Parapluplannen</dt><dd data-rij="paraplu" data-k="paraplu"></dd>
<dt>Achtererfgebied</dt><dd data-k="achtererf"></dd>
<dt>Natura 2000</dt><dd data-k="natura2000"></dd>
<dt>Cultuurgebied</dt><dd data-k="cultuurgebied"></dd>
<dt>Rijksmonument</dt><dd data-k="rijksmonument"></dd>
<dt>Bouwjaar</dt><dd data-k="bouwjaar"></dd>
</dl>
<p class="muted" style="font-size:.85rem" data-k="multi" hidden></p>
<p style="font-size:.9rem"><a data-k="loket" href="#" target="_blank" rel="noopener noreferrer">Regels in het Omgevingsloket</a> <span class="muted">· indicatieve waarden</span></p>
</div>
<div class="kaart-frame"><iframe src="{{ kaart }}&amp;weergave=kaart" title="Kaart van de kavel" loading="lazy" data-kavel-frame></iframe></div>
</div></div>
<script>
(() => {
const card = document.currentScript.previousElementSibling;
const frame = card.querySelector('[data-kavel-frame]'), box = card.querySelector('[data-kavel-gegevens]');
const status = card.querySelector('[data-kavel-status]'), open = card.querySelector('[data-kavel-open]');
const k = (n) => card.querySelector(`[data-k="${n}"]`);
const m2 = (n) => n == null ? '—' : `${Number(n).toLocaleString('nl-NL')} m²`;
const janee = (v, ja) => v == null ? 'onbekend' : v ? ja : 'nee';
const links = (el, lijst) => {
el.replaceChildren(...lijst.flatMap((p, i) => {
const a = document.createElement('a');
a.href = p.url; a.target = '_blank'; a.rel = 'noopener noreferrer';
a.textContent = p.naam + (p.datum ? ` (${p.datum.slice(0, 4)})` : '');
return i ? [document.createElement('br'), a] : [a];
}));
card.querySelectorAll(`[data-rij="${el.dataset.k}"]`).forEach(r => { r.hidden = !lijst.length; });
};
addEventListener('message', (e) => {
if (e.origin !== location.origin || e.source !== frame.contentWindow || !e.data || e.data.type !== 'kaveltoets') return;
if (e.data.fout) { status.textContent = e.data.fout; status.hidden = false; box.hidden = true; return; }
const r = e.data.resultaat;
status.hidden = true; box.hidden = false;
k('adres').textContent = r.adres;
k('perceel').textContent = [r.kavelnummer && `perceel ${r.kavelnummer}`].filter(Boolean).join(' · ');
k('kavel_m2').textContent = m2(r.kavel_m2);
k('bebouwd_m2').textContent = m2(r.bebouwd_m2);
k('vrije_m2').textContent = m2(r.vrije_m2);
k('bestemming').textContent = r.bestemming || '—';
links(k('plannen'), r.plannen || []);
links(k('paraplu'), r.paraplu || []);
k('achtererf').textContent = r.achtererf || '—';
k('natura2000').textContent = janee(r.natura2000, 'ja, raakt de kavel');
k('cultuurgebied').textContent = janee(r.cultuurgebied, 'ja, ligt erin');
k('rijksmonument').textContent = janee(r.rijksmonument, 'ja, op de kavel');
k('bouwjaar').textContent = r.bouwjaar || '—';
const multi = k('multi');
multi.hidden = !(r.adressen_op_kavel > 1);
multi.textContent = multi.hidden ? '' : `Let op: op ${r.aantal_percelen > 1 ? 'deze percelen' : 'dit perceel'} liggen ${r.adressen_op_kavel} adressen; kavel en bebouwd gelden voor het hele perceel.`;
k('loket').href = r.loket;
if (r.link) open.href = r.link;
});
})();
</script>
{% endmacro %}
+2 -7
View File
@@ -1,6 +1,7 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% from '_compose.html' import compose %} {% from '_compose.html' import compose %}
{% from '_documents.html' import documents_list with context %} {% from '_documents.html' import documents_list with context %}
{% from '_kaart.html' import kaart_block %}
{% block title %}{{ c.name }}{% endblock %} {% block title %}{{ c.name }}{% endblock %}
{% block content %} {% block content %}
<div class="head"> <div class="head">
@@ -96,13 +97,7 @@
</div></div> </div></div>
{% endif %} {% endif %}
{% if kaart %} {% if kaart %}{{ kaart_block(kaart) }}{% endif %}
<div class="card"><div class="card-body">
<div class="card-top"><h2>Kavel</h2>
<div class="actions"><a class="btn btn-outline-primary btn-sm" href="{{ kaart }}" target="_blank">Openen</a></div></div>
<div class="kaart-frame"><iframe src="{{ kaart }}" title="Kaart van de kavel" loading="lazy"></iframe></div>
</div></div>
{% endif %}
<div class="card o-2"><div class="card-body"> <div class="card o-2"><div class="card-body">
<h2>Taken</h2> <h2>Taken</h2>
+2 -7
View File
@@ -1,5 +1,6 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% from '_documents.html' import documents_list with context %} {% from '_documents.html' import documents_list with context %}
{% from '_kaart.html' import kaart_block %}
{% block title %}{{ r.name }}{% endblock %} {% block title %}{{ r.name }}{% endblock %}
{% block content %} {% block content %}
<div class="head"> <div class="head">
@@ -78,13 +79,7 @@
</div></div> </div></div>
{% endif %} {% endif %}
{% if kaart %} {% if kaart %}{{ kaart_block(kaart) }}{% endif %}
<div class="card"><div class="card-body">
<div class="card-top"><h2>Kavel</h2>
<div class="actions"><a class="btn btn-outline-primary btn-sm" href="{{ kaart }}" target="_blank">Openen</a></div></div>
<div class="kaart-frame"><iframe src="{{ kaart }}" title="Kaart van de kavel" loading="lazy"></iframe></div>
</div></div>
{% endif %}
{% if r.kind == 'partner' %} {% if r.kind == 'partner' %}
<div class="card"><div class="card-body"> <div class="card"><div class="card-body">