diff --git a/scripts/bipp-sneltoetsen/README.md b/scripts/bipp-sneltoetsen/README.md index c7273ef..121d69e 100644 --- a/scripts/bipp-sneltoetsen/README.md +++ b/scripts/bipp-sneltoetsen/README.md @@ -1,28 +1,32 @@ # bipp-sneltoetsen -Ctrl+letter drukt in BIPP op een knop. De letter is onderstreept, de tooltip toont de sneltoets, en zolang je Ctrl ingedrukt houdt verschijnt de sneltoets onder elke knop die er een heeft. +Sneltoetsen in BIPP, per rol van de knop. Ze werken in de Nederlandse en de Engelse interface, want de toets hangt aan de rol en niet aan een letter uit het label. De tooltip toont de sneltoets, en zolang je Ctrl, Cmd of Alt ingedrukt houdt verschijnt de sneltoets onder elke knop die er een heeft. -| toets | knop | waar | -| ------ | ---------- | ------------------------------------------------- | -| Ctrl+B | Bevestigen | Aanvraag evalueren, bestelbon detail | -| Ctrl+Z | Zoeken | Artikelen, Favorietenlijsten, Aanvragen, Bestelbonnen, Ontvangstregistratie | -| Ctrl+R | Reset | idem | -| Ctrl+N | Nieuw | Artikelen, Favorietenlijsten | -| Ctrl+S | Opslaan | Winkelmandje, bestelbon detail | -| Ctrl+I | Indienen | Winkelmandje | -| Ctrl+T | Terug | detailpagina's | +| toets | rol | NL | EN | +| ------------------------------ | ---------- | --------------------------- | ---------------------- | +| Ctrl+Enter (Mac ook Cmd+Enter) | hoofdactie | Bevestigen, anders Indienen | Authorization, anders Submit | +| Ctrl+S | opslaan | Opslaan | Save | +| Ctrl+[ | terug | Terug | Back | +| Alt+S | zoeken | Zoeken | Search | +| Alt+R | reset | Reset | Reset | +| Alt+N | nieuw | Nieuw | New | +| Alt+C | annuleren | Annuleren | Cancel | +| Alt+H | wachtstand | In wachtstand | On hold | -Verwijderen, Annuleren en In wachtstand krijgen bewust geen sneltoets: die zijn niet terug te draaien of komen zelden voor. +Ctrl voor de standaardtoetsen, Alt voor de zijacties. Op een Mac is Alt de Option-toets. [**Installeren**](https://gitea.flw.uantwerpen.be/glenn/ua-userscripts/raw/branch/main/scripts/bipp-sneltoetsen/bipp-sneltoetsen.user.js) · gebeurt er niets, zie de [installatie-uitleg](../../README.md). ## Hoe het werkt -- Het script zoekt op elke pagina onder `/web/` per sneltoets de eerste zichtbare, actieve knop met dat label. Is er geen, dan doet de toets niets en gaat hij gewoon door naar de browser. -- Op macOS gebruikt Chrome Cmd voor zijn eigen sneltoetsen, dus Ctrl+letter is vrij. In tekstvelden zijn sommige Ctrl-letters Emacs-bindings (Ctrl+B één teken terug, Ctrl+N volgende regel, Ctrl+T letters wisselen): die heb je in BIPP niet meer. +- Het script zoekt op elke pagina onder `/web/` per sneltoets de eerste zichtbare, actieve knop met een van de labels van die rol. Is er geen, dan doet de toets niets en gaat hij gewoon naar de browser. +- Staan Bevestigen en Indienen allebei op de pagina, dan krijgt alleen Bevestigen Ctrl+Enter. +- Ctrl+S overschrijft de opslaantoets van de browser, maar alleen op pagina's met een Opslaan-knop. Cmd (macOS) blijft bij de browser, behalve voor Enter. +- De zijacties staan op Alt: Chrome geeft Ctrl+N (nieuw venster) niet aan een pagina, Ctrl+F en Ctrl+R zijn zoeken en herladen, en Ctrl+Alt is AltGr op Windows. Op een Mac typt Option+letter normaal een teken, dat het script onderdrukt op pagina's met zo'n knop. +- De hints onder de knoppen staan op één regel. Raken ze elkaar, dan schuift de volgende hint naar rechts. +- Annuleren en In wachtstand klikken de knop zoals een muisklik, dus een bevestigingsdialoog van BIPP verschijnt gewoon. - Zet BIPP zelf al een tooltip op de knop (Bevestigen, Indienen), dan komt de sneltoets op een eigen regel eronder. -- De onderstreping en de hints verschuiven niets: ze staan `position:absolute` buiten de flow. Bij een `` kan de letter niet onderstreept worden met HTML, dus komt er een lijntje onder, berekend uit de lettermaat. - Pagina's die hun knoppen later opbouwen krijgen tot 15 seconden de tijd. ## Licentie diff --git a/scripts/bipp-sneltoetsen/bipp-sneltoetsen.user.js b/scripts/bipp-sneltoetsen/bipp-sneltoetsen.user.js index 5216827..e9bfa6d 100644 --- a/scripts/bipp-sneltoetsen/bipp-sneltoetsen.user.js +++ b/scripts/bipp-sneltoetsen/bipp-sneltoetsen.user.js @@ -1,8 +1,8 @@ // ==UserScript== // @name BIPP: sneltoetsen voor knoppen // @namespace https://github.com/glgoose/ua-userscripts -// @version 1.1.2 -// @description Ctrl+letter drukt op Bevestigen (B), Zoeken (Z), Reset (R), Nieuw (N), Opslaan (S), Indienen (I) en Terug (T). De letter is onderstreept en bij ingedrukte Ctrl verschijnt de sneltoets onder de knop. +// @version 1.2.0 +// @description Sneltoetsen per rol van de knop, in het Nederlands en het Engels: Ctrl+Enter (Bevestigen/Authorization, anders Indienen/Submit), Ctrl+S (Opslaan/Save), Ctrl+[ (Terug/Back), Alt+S (Zoeken/Search), Alt+R (Reset), Alt+N (Nieuw/New), Alt+C (Annuleren/Cancel), Alt+H (In wachtstand/On hold). Bij ingedrukte Ctrl, Cmd of Alt verschijnt de sneltoets onder de knop. // @author glgoose // @license GPL-3.0-or-later // @homepageURL https://gitea.flw.uantwerpen.be/glenn/ua-userscripts/src/branch/main/scripts/bipp-sneltoetsen @@ -16,76 +16,55 @@ (function () { 'use strict'; - // Knoplabel (kleine letters), de letter die onderstreept wordt, en de toets. + // Een sneltoets hangt aan de rol van de knop, niet aan een letter uit het label, dus NL en EN delen dezelfde toets. + // labels: kleine letters, in volgorde van voorrang (de eerste die op de pagina staat wint). + // match: welke toetscombinatie het is. hint: wat de tooltip en de hint onder de knop tonen. var KEYS = [ - { label: 'bevestigen', letter: 'b', code: 'KeyB' }, - { label: 'zoeken', letter: 'z', code: 'KeyZ' }, - { label: 'reset', letter: 'r', code: 'KeyR' }, - { label: 'nieuw', letter: 'n', code: 'KeyN' }, - { label: 'opslaan', letter: 's', code: 'KeyS' }, - { label: 'indienen', letter: 'i', code: 'KeyI' }, - { label: 'terug', letter: 't', code: 'KeyT' } + { labels: ['bevestigen', 'authorization', 'confirm', 'indienen', 'submit'], + // Op een Mac werkt Cmd+Enter ook, maar de hint blijft overal Ctrl+Enter. + hint: 'Ctrl+Enter', + match: function (e) { return (e.code === 'Enter' || e.code === 'NumpadEnter') && (e.ctrlKey || e.metaKey) && !(e.ctrlKey && e.metaKey) && !e.altKey && !e.shiftKey; } }, + { labels: ['zoeken', 'search'], hint: 'Alt+S', match: alt('KeyS') }, + { labels: ['opslaan', 'save'], hint: 'Ctrl+S', match: ctrl('KeyS') }, + { labels: ['terug', 'back'], hint: 'Ctrl+[', match: ctrl('BracketLeft') }, + { labels: ['reset'], hint: 'Alt+R', match: alt('KeyR') }, + { labels: ['nieuw', 'new'], hint: 'Alt+N', match: alt('KeyN') }, + { labels: ['annuleren', 'cancel'], hint: 'Alt+C', match: alt('KeyC') }, + { labels: ['in wachtstand', 'on hold'], hint: 'Alt+H', match: alt('KeyH') } ]; var MARK = 'data-bipp-sneltoets'; - function hint(k) { return 'Ctrl+' + k.letter.toUpperCase(); } + // Alt voor de zijacties: Ctrl+N, Ctrl+F en Ctrl+R zijn browsertoetsen, en Ctrl+Alt is AltGr op Windows. + function alt(code) { + return function (e) { return e.code === code && e.altKey && !e.ctrlKey && !e.metaKey && !e.shiftKey; }; + } + + // Alleen Ctrl: Cmd blijft bij de browser (Cmd+F, Cmd+S, Cmd+R zijn zoeken, opslaan en herladen). + function ctrl(code) { + return function (e) { return e.code === code && e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey; }; + } function norm(s) { return (s || '').replace(/\s+/g, ' ').trim().toLowerCase(); } function visible(el) { return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length); } - // Eerste zichtbare, actieve knop met dit label. Een postback-pagina kan er verborgen kopieën van hebben. + // Per label (op volgorde van voorrang) de eerste zichtbare, actieve knop. Een postback-pagina kan er verborgen kopieën van hebben. function findButton(k) { var btns = document.querySelectorAll('input[type="submit"], input[type="button"], button'); - for (var i = 0; i < btns.length; i++) { - var b = btns[i]; - if (norm(b.value || b.textContent) === k.label && !b.disabled && visible(b)) return b; + for (var l = 0; l < k.labels.length; l++) { + for (var i = 0; i < btns.length; i++) { + var b = btns[i]; + if (norm(b.value || b.textContent) === k.labels[l] && !b.disabled && visible(b)) return b; + } } return null; } - //