De knop "Downloaden naar Excel" in de PeopleSoft-grids levert een bestand op dat Excel
niet of niet goed leest. Dit script vangt de klik op en schrijft zelf een xlsx uit wat er
in de tabel staat, dus zonder de server.
De klik wordt in de capture-fase op document opgevangen, want PeopleSoft hertekent de
pagina constant met AJAX en een handler op de knop zelf overleeft dat niet. De knop-id
verraadt bij welke grid hij hoort. Een flex-grid staat soms in twee tabellen, een
vastgezet en een scrollend deel met dezelfde rijen, en die kolommen worden per rij-index
weer aan elkaar geplakt.
Getallen komen als getal binnen volgens de nl-BE-notatie, met haakjes en een min achteraan
als negatief. Schrijven gebeurt met SheetJS via @require; is die niet geladen, dan valt
het terug op een CSV met puntkomma's en een BOM, wat Excel hier zonder importwizard opent.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
De twee BIPP-scripts staan onder elkaar, zodat wie het mandje gebruikt beide rijen in
één oogopslag ziet.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
BIPP zet de analytische velden op een aparte pagina, dus je moest het mandje verlaten om
een budgetcode te kiezen en je zag achteraf niet welke er stond. Dit script zet de code
als dropdown onder de grootboekrekening in de rij zelf, slaat op via een
achtergrond-postback en vult de code aan in Interne commentaar.
De 5553 codes staan onder "alle budgetcodes", met bovenaan een groep "recent" met de
laatste 8 keuzes uit localStorage. Die groep is data-removable, dus een code die je één
keer per ongeluk koos haal je er met Delete weer uit; select-search stuurt het event, dit
script wist de code uit de MRU en bouwt de groepen opnieuw op.
Status staat als icoontje van 12px in een vak dat er altijd is, op de regel van de link
Bekijk, zodat er nooit iets verschuift. Zandloper met grijze tekst zolang de keten loopt,
en daarna gewoon weer zwart: geen vinkje, want de zwarte tekst is de bevestiging al. Bij
een fout een rood uitroepteken met rode rand en de waarde teruggedraaid, zodat de
oorspronkelijke pagina bereikbaar blijft.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
De blauwe balk werd alleen door de pijltjes verzet: er was een li.active-stijl maar
geen enkele hover- of mousemove-handler, dus wie met de muis over de lijst ging stond
nergens op. Nu verzet mousemove dezelfde active-regel als het toetsenbord. Bewust geen
mouseover, want een stilliggende muis boven de lijst zou dan de pijltjes blijven
tegenwerken.
Daarbovenop een generiek haakje om suggesties op te ruimen, zoals de adresbalk van een
browser dat doet. Een optie of optgroup met data-removable is met Delete te wissen: het
script haalt zelf niets weg maar stuurt een select-search:remove-event met value, label
en index, en wie de lijst bezit past de opties aan. Geen kruisje per regel: dat neemt
plek in en wie met de muis op een regel staat wil die kiezen, niet weggooien.
Delete vuurt alleen zolang er niets getypt is, anders blijft het een gewone teksttoets.
Die vraag werd eerst met input.value beantwoord, en dat is niet de zoekterm: bij een
open lijst zonder typwerk staat daar het gekozen label in, geselecteerd en klaar om over
te typen. Delete deed dus niets in precies de gewone situatie. De zoekterm zit nu in een
eigen variabele, en die lost hetzelfde stille probleem op in resync, die de open lijst
zou dichtfilteren op een label dat de gebruiker nooit intypte.
Na een herbouw van de opties blijft de balk staan waar hij stond, geklemd op de laatste
regel, zodat je meerdere regels achter elkaar kan wissen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Kolomvolgorde, toepassing vooraan, installeren-link, aantal stappen,
uitzonderingen, broncodelinks en meerdere-toestellen-uitleg in de
tabel op elkaar afgestemd.
Een aangepaste versie die iemand verspreidt moet voortaan zijn broncode meegeven.
Bij client-side JavaScript telt het uitserveren naar een browser als verspreiden,
dus dit dekt ook het geval dat iemand de code in zijn eigen webapp bouwt.
Beide scripts krijgen een hogere @version, anders komt de nieuwe licentieregel
nooit bij wie het al geinstalleerd heeft. Wat al onder MIT gepubliceerd is blijft
onder MIT beschikbaar; dit geldt vanaf deze versies.
Verhuist uit ~/dotfiles/userscripts/, zodat er maar één bron is. Het metadatablok
krijgt de velden die het nodig heeft om zichzelf bij te werken: namespace, licentie,
homepage, support en de twee URLs naar het raw-bestand.
De build schreef naar dist/. In deze repo is het installeerbare bestand altijd
scripts/<naam>/<naam>.user.js, zodat elke installatielink af te leiden valt zonder
in de repo te kijken. @version naar 1.1.0 zodat bestaande installaties die via de
doorverwijzing in de oude repo binnenkomen, hierna nog een stap omhoog doen.
De installatie-uitleg staat voortaan een niveau hoger in de hoofd-README.
Instructions were prose; now steps and tables. Firefox was missing and
needs no "Allow user scripts" toggle, so that step is split out as
Chromium-only. Bookmarklet moved to its own section at the end.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Both browsers follow the same flow, so a single numbered list is clearer
than a Chrome section plus an Edge exception. Adds the Edge Add-ons link
and the one-time "Allow user scripts" toggle, without which no userscript
runs at all.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Makes any <select> with many options searchable, for web apps whose
dropdowns have no search. The original <select> stays in the DOM and
remains the source of truth: choosing an option sets selectedIndex and
fires native input/change events, so the host application and its form
submission are unaffected.
Handles option lists that the app repopulates at runtime via a per-select
MutationObserver, and new selects appearing after AJAX via a document-level
one. Filtering is substring-based, accent-insensitive and multi-token.
Built into both a Tampermonkey userscript and a bookmarklet from one source.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>