From b69aa3152d8f2492f1fd01741b0d0477d02ec635 Mon Sep 17 00:00:00 2001 From: Glenn Goossens <48956933+glgoose@users.noreply.github.com> Date: Tue, 6 Oct 2026 10:33:12 +0200 Subject: [PATCH] bipp-raamcontract: vink "Inclusief niet-raamcontractartikelen" automatisch aan op de BIPP-zoekpagina Co-Authored-By: Claude Sonnet 5.5 --- README.md | 13 ++-- scripts/bipp-raamcontract/README.md | 23 +++++++ .../bipp-raamcontract.user.js | 65 +++++++++++++++++++ 3 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 scripts/bipp-raamcontract/README.md create mode 100644 scripts/bipp-raamcontract/bipp-raamcontract.user.js diff --git a/README.md b/README.md index 6175085..a999f89 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ # ua-userscripts -| toepassing | wat het doet | | -| -------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | -| **BIPP** | budgetcode kiezen en zien in het winkelmandje | [installeren](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/bipp-budgetcode/bipp-budgetcode.user.js) | -| **BIPP** | zoekveld in dropdowns met veel opties | [installeren](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/select-search/select-search.user.js) | -| **iExpense** | alle onkostenrapporten in één doorzoekbare tabel | [installeren](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/iexpense-search/iexpense-search.user.js) | -| **PeopleSoft** | werkende knop "Downloaden naar Excel" | [installeren](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/peoplesoft-excel-download/peoplesoft-excel-download.user.js) | +| toepassing | wat het doet | | +| -------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| **BIPP** | zoekveld in dropdowns met veel opties | [installeren](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/select-search/select-search.user.js) | +| **BIPP** | budgetcode kiezen en zien in het winkelmandje | [installeren](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/bipp-budgetcode/bipp-budgetcode.user.js) | +| **BIPP** | "Inclusief niet-raamcontractartikelen" standaard aan | [installeren](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/bipp-raamcontract/bipp-raamcontract.user.js) | +| **iExpense** | alle onkostenrapporten in één doorzoekbare tabel | [installeren](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/iexpense-search/iexpense-search.user.js) | +| **PeopleSoft** | werkende knop "Downloaden naar Excel" | [installeren](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/peoplesoft-excel-download/peoplesoft-excel-download.user.js) | ## Installatie-instructies diff --git a/scripts/bipp-raamcontract/README.md b/scripts/bipp-raamcontract/README.md new file mode 100644 index 0000000..f6b8edd --- /dev/null +++ b/scripts/bipp-raamcontract/README.md @@ -0,0 +1,23 @@ +# bipp-raamcontract + +Zet het vinkje *Inclusief niet-raamcontractartikelen* op de zoekpagina van BIPP standaard aan. + +[**Installeren**](https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/bipp-raamcontract/bipp-raamcontract.user.js) +· gebeurt er niets, zie de [installatie-uitleg](../../README.md). + +## Hoe het werkt + +- Het script zoekt het selectievakje via de tekst van zijn label en klikt erop als het uit staat. + Een echte klik (geen `checked = true`) laat de handlers van de app draaien, dus de + optielijsten van Leverancier en Fabricaat worden meteen opnieuw opgebouwd. +- Bouwt de pagina het formulier later op, dan wacht het script daar maximaal 15 seconden op. +- Een vinkje dat je zelf uitzet blijft uit tot de pagina opnieuw laadt. + +## Beperkingen + +- Laadt de app de pagina opnieuw na de klik en staat het vinkje daarna uit, dan klikt het script + niet nogmaals binnen 5 seconden, om een herlaadlus te vermijden. + +## Licentie + +[GPL-3.0-or-later](../../LICENSE). diff --git a/scripts/bipp-raamcontract/bipp-raamcontract.user.js b/scripts/bipp-raamcontract/bipp-raamcontract.user.js new file mode 100644 index 0000000..8589d6a --- /dev/null +++ b/scripts/bipp-raamcontract/bipp-raamcontract.user.js @@ -0,0 +1,65 @@ +// ==UserScript== +// @name BIPP: "Inclusief niet-raamcontractartikelen" standaard aan +// @namespace https://github.com/glgoose/ua-userscripts +// @version 1.0.0 +// @description Vinkt "Inclusief niet-raamcontractartikelen" aan zodra de zoekpagina laadt. +// @author glgoose +// @license GPL-3.0-or-later +// @homepageURL https://github.com/glgoose/ua-userscripts/tree/main/scripts/bipp-raamcontract +// @supportURL https://github.com/glgoose/ua-userscripts/issues +// @downloadURL https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/bipp-raamcontract/bipp-raamcontract.user.js +// @updateURL https://raw.githubusercontent.com/glgoose/ua-userscripts/main/scripts/bipp-raamcontract/bipp-raamcontract.user.js +// @match https://bipp.biotechpartner.be/web/* +// @run-at document-idle +// @grant none +// ==/UserScript== +(function () { + 'use strict'; + + var LABEL = 'inclusief niet-raamcontractartikelen'; + var GUARD_KEY = 'bippRaamcontractLast'; + var GUARD_MS = 5000; + var MAX_WAIT_MS = 15000; + + function norm(s) { return (s || '').replace(/\s+/g, ' ').trim().toLowerCase(); } + + function findBox() { + var boxes = document.querySelectorAll('input[type="checkbox"]'); + for (var i = 0; i < boxes.length; i++) { + var box = boxes[i]; + var label = box.labels && box.labels[0]; + var t = norm(label ? label.textContent : box.parentNode && box.parentNode.textContent); + if (t === LABEL) return box; + } + return null; + } + + // Een klik die een postback met paginaherlaad uitlost, start dit script opnieuw. + // Staat het vinkje daarna weer uit, dan zou dat eindeloos doorgaan. + function recentlyClicked() { + try { return Date.now() - Number(sessionStorage.getItem(GUARD_KEY) || 0) < GUARD_MS; } + catch (e) { return false; } + } + function markClicked() { + try { sessionStorage.setItem(GUARD_KEY, String(Date.now())); } catch (e) { /* geen opslag */ } + } + + var obs; + function stop() { if (obs) obs.disconnect(); } + + function check() { + var box = findBox(); + if (!box) return false; + if (!box.checked && !recentlyClicked()) { + markClicked(); + box.click(); // click, geen .checked = true, zodat de handlers van de app draaien + } + return true; + } + + if (check()) return; + // De pagina bouwt het formulier soms pas later op. + obs = new MutationObserver(function () { if (check()) stop(); }); + obs.observe(document.body, { childList: true, subtree: true }); + setTimeout(stop, MAX_WAIT_MS); +})();