2022-11-29 21:21:26 +01:00
/ *
* This file is part of Part - DB ( https : //github.com/Part-DB/Part-DB-symfony).
*
* Copyright ( C ) 2019 - 2022 Jan Böhmer ( https : //github.com/jbtronics)
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < https : //www.gnu.org/licenses/>.
* /
2022-03-05 23:28:29 +01:00
'use strict' ;
2023-02-01 23:33:46 +01:00
import { Dropdown } from "bootstrap" ;
2022-07-29 22:52:58 +02:00
class RegisterEventHelper {
2022-03-05 23:28:29 +01:00
constructor ( ) {
2022-03-06 14:45:01 +01:00
this . registerTooltips ( ) ;
2023-02-01 23:33:46 +01:00
this . configureDropdowns ( ) ;
2022-03-06 14:45:01 +01:00
this . registerSpecialCharInput ( ) ;
2023-01-07 20:58:13 +01:00
2023-02-01 23:33:46 +01:00
this . registerModalDropRemovalOnFormSubmit ( ) ;
2023-01-07 20:58:13 +01:00
}
registerModalDropRemovalOnFormSubmit ( ) {
//Remove all modal backdrops, before rendering the new page.
document . addEventListener ( 'turbo:before-render' , event => {
2023-02-12 17:56:59 +01:00
const back _drop = document . querySelector ( '.modal-backdrop' ) ;
if ( back _drop ) {
back _drop . remove ( ) ;
}
2023-01-07 20:58:13 +01:00
} ) ;
2022-03-05 23:28:29 +01:00
}
registerLoadHandler ( fn ) {
2022-07-31 21:47:31 +02:00
document . addEventListener ( 'turbo:render' , fn ) ;
2022-03-05 23:28:29 +01:00
document . addEventListener ( 'turbo:load' , fn ) ;
}
2023-02-01 23:33:46 +01:00
configureDropdowns ( ) {
this . registerLoadHandler ( ( ) => {
//Set the dropdown strategy to fixed, so that the dropdowns are not cut off by the overflow: hidden of the body.
//Solution from: https://github.com/twbs/bootstrap/issues/36560
const dropdowns = document . querySelectorAll ( '[data-bs-toggle="dropdown"]' ) ;
const dropdown = [ ... dropdowns ] . map ( ( dropdownToggleEl ) => new Dropdown ( dropdownToggleEl , {
popperConfig ( defaultBsPopperConfig ) {
return { ... defaultBsPopperConfig , strategy : 'fixed' } ;
}
} ) ) ;
} ) ;
}
2022-03-06 14:45:01 +01:00
registerTooltips ( ) {
2023-07-08 19:08:00 +02:00
const handler = ( ) => {
2022-03-06 14:45:01 +01:00
$ ( ".tooltip" ) . remove ( ) ;
2022-07-24 20:23:12 +02:00
//Exclude dropdown buttons from tooltips, otherwise we run into endless errors from bootstrap (bootstrap.esm.js:614 Bootstrap doesn't allow more than one instance per element. Bound instance: bs.dropdown.)
2023-07-08 19:08:00 +02:00
$ ( 'a[title], label[title], button[title]:not([data-bs-toggle="dropdown"]), p[title], span[title], h6[title], h3[title], i[title]' )
2022-03-06 14:45:01 +01:00
//@ts-ignore
. tooltip ( "hide" ) . tooltip ( { container : "body" , placement : "auto" , boundary : 'window' } ) ;
2023-07-08 19:08:00 +02:00
} ;
this . registerLoadHandler ( handler ) ;
document . addEventListener ( 'dt:loaded' , handler ) ;
2022-03-06 14:45:01 +01:00
}
registerSpecialCharInput ( ) {
this . registerLoadHandler ( ( ) => {
//@ts-ignore
2022-07-31 21:47:31 +02:00
$ ( "input[type=text], input[type=search]" ) . unbind ( "keydown" ) . keydown ( function ( event ) {
2023-04-23 23:21:38 +02:00
let use _special _char = event . altKey ;
2022-03-06 14:45:01 +01:00
let greek _char = "" ;
2023-04-23 23:21:38 +02:00
if ( use _special _char ) {
//Use the key property to determine the greek letter (as it is independent of the keyboard layout)
2022-03-06 14:45:01 +01:00
switch ( event . key ) {
2023-04-23 23:21:38 +02:00
//Greek letters
case "a" : //Alpha (lowercase)
2022-03-06 14:45:01 +01:00
greek _char = "\u03B1" ;
break ;
2023-04-23 23:21:38 +02:00
case "A" : //Alpha (uppercase)
greek _char = "\u0391" ;
break ;
case "b" : //Beta (lowercase)
2022-03-06 14:45:01 +01:00
greek _char = "\u03B2" ;
break ;
2023-04-23 23:21:38 +02:00
case "B" : //Beta (uppercase)
greek _char = "\u0392" ;
break ;
case "g" : //Gamma (lowercase)
2022-03-06 14:45:01 +01:00
greek _char = "\u03B3" ;
break ;
2023-04-23 23:21:38 +02:00
case "G" : //Gamma (uppercase)
greek _char = "\u0393" ;
break ;
case "d" : //Delta (lowercase)
2022-03-06 14:45:01 +01:00
greek _char = "\u03B4" ;
break ;
2023-04-23 23:21:38 +02:00
case "D" : //Delta (uppercase)
greek _char = "\u0394" ;
break ;
case "e" : //Epsilon (lowercase)
greek _char = "\u03B5" ;
break ;
case "E" : //Epsilon (uppercase)
greek _char = "\u0395" ;
break ;
case "z" : //Zeta (lowercase)
greek _char = "\u03B6" ;
break ;
case "Z" : //Zeta (uppercase)
greek _char = "\u0396" ;
break ;
case "h" : //Eta (lowercase)
greek _char = "\u03B7" ;
break ;
case "H" : //Eta (uppercase)
greek _char = "\u0397" ;
break ;
case "q" : //Theta (lowercase)
greek _char = "\u03B8" ;
break ;
case "Q" : //Theta (uppercase)
greek _char = "\u0398" ;
break ;
case "i" : //Iota (lowercase)
greek _char = "\u03B9" ;
break ;
case "I" : //Iota (uppercase)
greek _char = "\u0399" ;
break ;
case "k" : //Kappa (lowercase)
greek _char = "\u03BA" ;
break ;
case "K" : //Kappa (uppercase)
greek _char = "\u039A" ;
break ;
case "l" : //Lambda (lowercase)
greek _char = "\u03BB" ;
break ;
case "L" : //Lambda (uppercase)
greek _char = "\u039B" ;
break ;
case "m" : //Mu (lowercase)
greek _char = "\u03BC" ;
break ;
case "M" : //Mu (uppercase)
greek _char = "\u039C" ;
break ;
case "n" : //Nu (lowercase)
greek _char = "\u03BD" ;
break ;
case "N" : //Nu (uppercase)
greek _char = "\u039D" ;
break ;
case "x" : //Xi (lowercase)
greek _char = "\u03BE" ;
break ;
case "X" : //Xi (uppercase)
greek _char = "\u039E" ;
break ;
case "o" : //Omicron (lowercase)
greek _char = "\u03BF" ;
break ;
case "O" : //Omicron (uppercase)
greek _char = "\u039F" ;
break ;
case "p" : //Pi (lowercase)
greek _char = "\u03C0" ;
2022-03-06 14:45:01 +01:00
break ;
2023-04-23 23:21:38 +02:00
case "P" : //Pi (uppercase)
greek _char = "\u03A0" ;
2022-03-06 14:45:01 +01:00
break ;
2023-04-23 23:21:38 +02:00
case "r" : //Rho (lowercase)
greek _char = "\u03C1" ;
2022-03-06 14:45:01 +01:00
break ;
2023-04-23 23:21:38 +02:00
case "R" : //Rho (uppercase)
greek _char = "\u03A1" ;
2022-03-06 14:45:01 +01:00
break ;
2023-04-23 23:21:38 +02:00
case "s" : //Sigma (lowercase)
greek _char = "\u03C3" ;
2022-03-06 14:45:01 +01:00
break ;
2023-04-23 23:21:38 +02:00
case "S" : //Sigma (uppercase)
greek _char = "\u03A3" ;
2022-03-06 14:45:01 +01:00
break ;
2023-04-23 23:21:38 +02:00
case "t" : //Tau (lowercase)
greek _char = "\u03C4" ;
2022-03-06 14:45:01 +01:00
break ;
2023-04-23 23:21:38 +02:00
case "T" : //Tau (uppercase)
greek _char = "\u03A4" ;
2022-03-06 14:45:01 +01:00
break ;
2023-04-23 23:21:38 +02:00
case "u" : //Upsilon (lowercase)
greek _char = "\u03C5" ;
2022-03-06 14:45:01 +01:00
break ;
2023-04-23 23:21:38 +02:00
case "U" : //Upsilon (uppercase)
greek _char = "\u03A5" ;
2022-03-06 14:45:01 +01:00
break ;
2023-04-23 23:21:38 +02:00
case "f" : //Phi (lowercase)
greek _char = "\u03C6" ;
break ;
case "F" : //Phi (uppercase)
greek _char = "\u03A6" ;
break ;
case "c" : //Chi (lowercase)
greek _char = "\u03C7" ;
break ;
case "C" : //Chi (uppercase)
greek _char = "\u03A7" ;
break ;
case "y" : //Psi (lowercase)
greek _char = "\u03C8" ;
break ;
case "Y" : //Psi (uppercase)
greek _char = "\u03A8" ;
break ;
case "w" : //Omega (lowercase)
greek _char = "\u03C9" ;
break ;
case "W" : //Omega (uppercase)
greek _char = "\u03A9" ;
break ;
}
//Use keycodes for special characters as the shift char on the number keys are layout dependent
switch ( event . keyCode ) {
case 49 : //1 key
//Product symbol on shift, sum on no shift
greek _char = event . shiftKey ? "\u220F" : "\u2211" ;
break ;
case 50 : //2 key
//Integral on no shift, partial derivative on shift
greek _char = event . shiftKey ? "\u2202" : "\u222B" ;
break ;
case 51 : //3 key
//Less than or equal on no shift, greater than or equal on shift
greek _char = event . shiftKey ? "\u2265" : "\u2264" ;
break ;
case 52 : //4 key
//Empty set on shift, infinity on no shift
greek _char = event . shiftKey ? "\u2205" : "\u221E" ;
break ;
case 53 : //5 key
//Not equal on shift, approx equal on no shift
greek _char = event . shiftKey ? "\u2260" : "\u2248" ;
break ;
case 54 : //6 key
//Element of on no shift, not element of on shift
greek _char = event . shiftKey ? "\u2209" : "\u2208" ;
break ;
case 55 : //7 key
//And on shift, or on no shift
greek _char = event . shiftKey ? "\u2227" : "\u2228" ;
break ;
case 56 : //8 key
//Proportional to on shift, angle on no shift
greek _char = event . shiftKey ? "\u221D" : "\u2220" ;
break ;
case 57 : //9 key
//Cube root on shift, square root on no shift
greek _char = event . shiftKey ? "\u221B" : "\u221A" ;
break ;
case 48 : //0 key
//Minus-Plus on shift, plus-minus on no shift
greek _char = event . shiftKey ? "\u2213" : "\u00B1" ;
break ;
//Special characters
case 219 : //hyphen (or ß on german layout)
//Copyright on no shift, TM on shift
greek _char = event . shiftKey ? "\u2122" : "\u00A9" ;
break ;
case 191 : //forward slash (or # on german layout)
//Generic currency on no shift, paragraph on shift
greek _char = event . shiftKey ? "\u00B6" : "\u00A4" ;
break ;
//Currency symbols
case 192 : //: or (ö on german layout)
//Euro on no shift, pound on shift
greek _char = event . shiftKey ? "\u00A3" : "\u20AC" ;
break ;
case 221 : //; or (ä on german layout)
//Yen on no shift, dollar on shift
greek _char = event . shiftKey ? "\u0024" : "\u00A5" ;
break ;
2022-03-06 14:45:01 +01:00
}
if ( greek _char == "" ) return ;
let $txt = $ ( this ) ;
//@ts-ignore
let caretPos = $txt [ 0 ] . selectionStart ;
let textAreaTxt = $txt . val ( ) . toString ( ) ;
$txt . val ( textAreaTxt . substring ( 0 , caretPos ) + greek _char + textAreaTxt . substring ( caretPos ) ) ;
}
} ) ;
//@ts-ignore
this . greek _once = true ;
} )
}
2022-03-05 23:28:29 +01:00
}
export default new RegisterEventHelper ( ) ;