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 ( ) {
this . registerLoadHandler ( ( ) => {
$ ( ".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-01-07 20:58:13 +01:00
$ ( 'a[title], button[title]:not([data-bs-toggle="dropdown"]), p[title], span[title], h6[title], h3[title], i.fas[title]' )
2022-03-06 14:45:01 +01:00
//@ts-ignore
. tooltip ( "hide" ) . tooltip ( { container : "body" , placement : "auto" , boundary : 'window' } ) ;
} ) ;
}
registerSpecialCharInput ( ) {
this . registerLoadHandler ( ( ) => {
//@ts-ignore
2022-07-31 21:47:31 +02:00
$ ( "input[type=text], input[type=search]" ) . unbind ( "keydown" ) . keydown ( function ( event ) {
2022-03-06 14:45:01 +01:00
let greek = event . altKey ;
let greek _char = "" ;
if ( greek ) {
switch ( event . key ) {
case "w" : //Omega
greek _char = '\u2126' ;
break ;
case "u" :
case "m" : //Micro
greek _char = "\u00B5" ;
break ;
case "p" : //Phi
greek _char = "\u03C6" ;
break ;
case "a" : //Alpha
greek _char = "\u03B1" ;
break ;
case "b" : //Beta
greek _char = "\u03B2" ;
break ;
case "c" : //Gamma
greek _char = "\u03B3" ;
break ;
case "d" : //Delta
greek _char = "\u03B4" ;
break ;
case "l" : //Pound
greek _char = "\u00A3" ;
break ;
case "y" : //Yen
greek _char = "\u00A5" ;
break ;
case "o" : //Yen
greek _char = "\u00A4" ;
break ;
case "1" : //Sum symbol
greek _char = "\u2211" ;
break ;
case "2" : //Integral
greek _char = "\u222B" ;
break ;
case "3" : //Less-than or equal
greek _char = "\u2264" ;
break ;
case "4" : //Greater than or equal
greek _char = "\u2265" ;
break ;
case "5" : //PI
greek _char = "\u03c0" ;
break ;
case "q" : //Copyright
greek _char = "\u00A9" ;
break ;
case "e" : //Euro
greek _char = "\u20AC" ;
break ;
}
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 ( ) ;