Files
Glenn GoossensandClaude Opus 5 b831ab9f1f select-search: recent-blok voor elke dropdown, bipp-budgetcode levert het niet meer zelf
Elke grote dropdown houdt nu zijn eigen vijf laatst gekozen waarden bij,
bovenaan de lijst onder de kopregel recent. Alles zit onder een
localStorage-sleutel, per veld, met een sleutel die uit name of id volgt
zodat rij 3 en rij 4 van hetzelfde veld één lijst delen. Delete haalt een
regel uit recent, en data-ss-recent="manual" plus window.selectSearch.remember()
is er voor wie pas mag onthouden nadat de server bevestigd heeft.

bipp-budgetcode gebruikt die weg en bouwt zijn eigen recent-optgroup dus
niet langer zelf.

Een optie zonder leesbare tekst telt voortaan als "niets gekozen", ook als
ze een waarde draagt, zoals de <option value="0">&nbsp;</option> van een
OAF-scherm. Zo'n regel stond eerst gewoon in de lijst; wie ze koos kreeg
haar daarna permanent als lege blauwe balk onder recent te zien.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 16:59:22 +02:00

163 lines
6.4 KiB
HTML

<!doctype html>
<html lang="nl">
<head>
<meta charset="utf-8">
<title>select-search fixture</title>
<style>
body{font:13px/1.5 system-ui,-apple-system,"Segoe UI",sans-serif;margin:24px;color:#111}
table{border-spacing:0 6px}
td:first-child{padding-right:24px}
select{width:400px}
#uit{margin-top:20px;padding:8px;background:#f2f5fb;border:1px solid #cbd8ee;white-space:pre-wrap}
.bar{background:#eaf1fb;padding:8px;margin:-24px -24px 20px}
</style>
</head>
<body>
<div class="bar">Testpagina, bootst de werk-app na</div>
<form id="f">
<label><input type="checkbox" id="incl"> Inclusief niet-raamcontractartikelen</label>
<table>
<tr><td><label for="lev">Leverancier</label></td>
<td><select id="lev" name="leverancier"></select></td></tr>
<tr><td><label for="fab">Fabricaat</label></td>
<td><select id="fab" name="fabricaat" data-placeholder="fabricaat"></select></td></tr>
<tr><td><label for="groep">Met groepen</label></td>
<td><select id="groep" name="groep"></select></td></tr>
<tr><td><label for="ctl00_body_resultTable_ctl03_interfaceAccountList">Grootboek rij 3</label></td>
<td><select id="ctl00_body_resultTable_ctl03_interfaceAccountList"
name="ctl00$body$resultTable$ctl03$interfaceAccountList"></select></td></tr>
<tr><td><label for="ctl00_body_resultTable_ctl04_interfaceAccountList">Grootboek rij 4</label></td>
<td><select id="ctl00_body_resultTable_ctl04_interfaceAccountList"
name="ctl00$body$resultTable$ctl04$interfaceAccountList"></select></td></tr>
<tr><td><label for="oaf">OAF-stijl</label></td>
<td><select id="oaf" name="oaf"></select></td></tr>
<tr><td><label for="klein">Klein menu</label></td>
<td><select id="klein" name="klein">
<option value="">--</option><option>Ja</option><option>Nee</option>
</select></td></tr>
</table>
<button type="submit">Verzenden</button>
</form>
<div id="uit">nog niets verzonden</div>
<script>
var VOOR = ['Restaurant','Bakkerij','Groothandel','Technische Dienst','Installatiebedrijf',
'Drukkerij','Transport','Bouwbedrijf','Schoonmaak','Catering','Labo','Apotheek',
'Garage','Kwekerij','Slagerij','Boekhandel','Meubelmakerij','Elektro'];
var NAAM = ['Poule & Poulette','Van den Berghe','De Smet','Janssens','Peeters','Maertens',
'Vermeulen','Claeys','De Vos','Willems','Lemmens','Coppens','Declercq','Genée',
'Vanhoutte','Segers','Wouters','Dhondt','Vandenbroucke','Storms'];
var VORM = ['B.V.','N.V.','BVBA','VZW','Comm.V.','& Zonen'];
function maak(n, offset){
var out = [];
for (var i = 0; i < n; i++) {
var v = VOOR[(i + offset) % VOOR.length];
var m = NAAM[(i * 7 + offset) % NAAM.length];
var s = VORM[(i * 3 + offset) % VORM.length];
out.push({v: 'ID' + (1000 + i + offset), t: v + ' ' + m + ' ' + s + ' (' + (1000 + i + offset) + ')'});
}
return out;
}
function vul(sel, n, offset){
var huidig = sel.value;
sel.innerHTML = '';
var leeg = document.createElement('option');
leeg.value = ''; leeg.textContent = '';
sel.appendChild(leeg);
maak(n, offset).forEach(function(o){
var e = document.createElement('option');
e.value = o.v; e.textContent = o.t;
sel.appendChild(e);
});
sel.value = huidig;
}
// Select met optgroups: recent bovenaan, daarna de rest, plus een optie zonder groep die
// bovenaan los blijft staan. Labels lang genoeg om af te kappen.
function vulGroepen(sel){
sel.innerHTML = '';
var leeg = document.createElement('option');
leeg.value = ''; leeg.textContent = 'leverancier';
sel.appendChild(leeg);
var blokken = [
['favorieten', maak(3, 300)],
['alle leveranciers', maak(60, 700)]
];
blokken.forEach(function(blok){
var g = document.createElement('optgroup');
g.label = blok[0];
// Alleen favorieten mag met Delete uitgedund worden. Zo is de vlag hier ook echt getest.
if (blok[0] === 'favorieten') g.dataset.removable = '1';
blok[1].forEach(function(o){
var e = document.createElement('option');
e.value = o.v; e.textContent = o.t;
g.appendChild(e);
});
sel.appendChild(g);
});
}
vulGroepen(document.getElementById('groep'));
// OAF schrijft zijn "niets gekozen" niet met een lege waarde maar met een spatie-optie die wel
// een waarde draagt. Die regel hoort niet in de lijst te staan (je kunt ze niet lezen en dus ook
// niet herkennen) en al helemaal niet in recent, maar het kruisje mag er wel op mikken.
function vulOaf(sel){
sel.innerHTML = '';
var leeg = document.createElement('option');
leeg.value = '0'; leeg.innerHTML = '&nbsp;';
sel.appendChild(leeg);
maak(40, 500).forEach(function(o){
var e = document.createElement('option');
e.value = o.v; e.textContent = o.t;
sel.appendChild(e);
});
}
vulOaf(document.getElementById('oaf'));
// De host beslist wat verwijderen betekent voor zijn eigen regels. Hier: de optie gaat uit
// favorieten en verhuist naar de tweede groep. Het recent-blok erboven beheert select-search
// zelf; Delete daarop komt hier dus niet langs.
document.getElementById('groep').addEventListener('select-search:remove', function(e){
var sel = e.currentTarget;
var weg = sel.options[e.detail.index];
if (!weg) return;
var doel = sel.querySelectorAll('optgroup')[1];
var gekozen = sel.value;
doel.insertBefore(weg, doel.firstChild);
sel.value = gekozen;
});
var rij3 = document.getElementById('ctl00_body_resultTable_ctl03_interfaceAccountList');
var rij4 = document.getElementById('ctl00_body_resultTable_ctl04_interfaceAccountList');
vul(rij3, 40, 200);
vul(rij4, 40, 200);
var lev = document.getElementById('lev'), fab = document.getElementById('fab');
function herlaad(){
var inclusief = document.getElementById('incl').checked;
vul(lev, inclusief ? 850 : 120, 0);
vul(fab, inclusief ? 400 : 60, 500);
}
document.getElementById('incl').addEventListener('change', herlaad);
herlaad();
lev.addEventListener('change', function(){
console.log('[fixture] change op leverancier:', lev.value, '/', lev.options[lev.selectedIndex].textContent);
});
document.getElementById('f').addEventListener('submit', function(e){
e.preventDefault();
var d = new FormData(e.target);
document.getElementById('uit').textContent =
'verzonden:\n leverancier = ' + d.get('leverancier') +
'\n fabricaat = ' + d.get('fabricaat') +
'\n groep = ' + d.get('groep') +
'\n klein = ' + d.get('klein') +
'\n (label leverancier: ' + (lev.options[lev.selectedIndex] || {textContent:''}).textContent + ')';
});
</script>
</body>
</html>