├── backend ├── .htaccess ├── config │ ├── dbConfig.php │ ├── Controller.php │ ├── Core.php │ └── DB.php ├── controllers │ └── Pages.php ├── view │ └── index.php ├── bootstrap.php └── models │ ├── RDVModel.php │ └── UserModel.php ├── front ├── .browserslistrc ├── public │ ├── favicon.ico │ └── index.html ├── src │ ├── assets │ │ └── logo.png │ ├── views │ │ ├── About.vue │ │ ├── Login.vue │ │ └── Register.vue │ ├── main.js │ ├── components │ │ ├── Tasks.vue │ │ ├── Footer.vue │ │ ├── ButtonVue.vue │ │ ├── Header.vue │ │ ├── HelloWorld.vue │ │ ├── LoginForm.vue │ │ └── AddTask.vue │ ├── router │ │ └── index.js │ └── App.vue ├── babel.config.js ├── vue.config.js ├── .gitignore ├── README.md ├── package.json └── db.json ├── .gitattributes ├── composer.json ├── vendor ├── fpdf │ ├── tutorial │ │ ├── logo.png │ │ ├── 20k_c1.txt │ │ ├── calligra.ttf │ │ ├── calligra.z │ │ ├── makefont.php │ │ ├── tuto1.php │ │ ├── tuto7.php │ │ ├── countries.txt │ │ ├── index.htm │ │ ├── tuto2.php │ │ ├── tuto3.php │ │ ├── tuto4.php │ │ ├── tuto5.php │ │ └── tuto6.php │ ├── license.txt │ ├── font │ │ ├── courier.php │ │ ├── courierb.php │ │ ├── courieri.php │ │ └── courierbi.php │ ├── doc │ │ ├── pageno.htm │ │ ├── getpageheight.htm │ │ ├── getpagewidth.htm │ │ ├── getx.htm │ │ ├── gety.htm │ │ ├── setfontsize.htm │ │ ├── getstringwidth.htm │ │ ├── close.htm │ │ ├── ln.htm │ │ ├── setx.htm │ │ ├── error.htm │ │ ├── settopmargin.htm │ │ ├── setrightmargin.htm │ │ ├── addlink.htm │ │ ├── setxy.htm │ │ ├── setlinewidth.htm │ │ ├── setleftmargin.htm │ │ ├── line.htm │ │ ├── sety.htm │ │ ├── setcompression.htm │ │ ├── settitle.htm │ │ ├── setsubject.htm │ │ ├── setauthor.htm │ │ ├── setlink.htm │ │ ├── setkeywords.htm │ │ ├── setmargins.htm │ │ ├── setcreator.htm │ │ ├── setautopagebreak.htm │ │ ├── footer.htm │ │ ├── header.htm │ │ ├── text.htm │ │ ├── aliasnbpages.htm │ │ ├── settextcolor.htm │ │ ├── link.htm │ │ ├── setfillcolor.htm │ │ ├── rect.htm │ │ ├── setdrawcolor.htm │ │ ├── write.htm │ │ ├── setdisplaymode.htm │ │ ├── output.htm │ │ ├── acceptpagebreak.htm │ │ ├── addfont.htm │ │ ├── __construct.htm │ │ ├── addpage.htm │ │ └── multicell.htm │ ├── install.txt │ └── fpdf.css ├── firebase │ └── php-jwt │ │ ├── src │ │ ├── ExpiredException.php │ │ ├── BeforeValidException.php │ │ └── SignatureInvalidException.php │ │ ├── composer.json │ │ └── LICENSE ├── autoload.php └── composer │ ├── autoload_namespaces.php │ ├── autoload_psr4.php │ ├── autoload_classmap.php │ ├── installed.php │ ├── platform_check.php │ ├── LICENSE │ ├── autoload_static.php │ ├── autoload_real.php │ └── installed.json ├── frontend ├── assets │ └── bootstrqp │ │ ├── img │ │ └── mdb-favicon.ico │ │ └── src │ │ └── js │ │ ├── mdb │ │ ├── perfect-scrollbar │ │ │ ├── lib │ │ │ │ ├── css.js │ │ │ │ ├── dom.js │ │ │ │ ├── class-names.js │ │ │ │ ├── util.js │ │ │ │ └── event-manager.js │ │ │ ├── handlers │ │ │ │ ├── click-rail.js │ │ │ │ └── drag-thumb.js │ │ │ └── process-scroll-diff.js │ │ ├── util │ │ │ ├── touch │ │ │ │ ├── touchUtil.js │ │ │ │ ├── index.js │ │ │ │ └── swipe.js │ │ │ ├── keycodes.js │ │ │ ├── focusTrap.js │ │ │ └── stack.js │ │ └── dom │ │ │ ├── data.js │ │ │ ├── selector-engine.js │ │ │ └── manipulator.js │ │ ├── mdb.free.js │ │ ├── bootstrap │ │ ├── src │ │ │ ├── base-component.js │ │ │ ├── dom │ │ │ │ ├── data.js │ │ │ │ ├── selector-engine.js │ │ │ │ └── manipulator.js │ │ │ ├── util │ │ │ │ └── scrollbar.js │ │ │ └── button.js │ │ ├── mdb-prefix │ │ │ ├── base-component.js │ │ │ ├── dom │ │ │ │ ├── data.js │ │ │ │ ├── selector-engine.js │ │ │ │ └── manipulator.js │ │ │ ├── util │ │ │ │ └── scrollbar.js │ │ │ └── button.js │ │ └── dist │ │ │ ├── base-component.js.map │ │ │ ├── base-component.js │ │ │ └── dom │ │ │ ├── data.js │ │ │ ├── selector-engine.js │ │ │ ├── data.js.map │ │ │ └── manipulator.js │ │ └── free │ │ ├── alert.js │ │ ├── scrollspy.js │ │ └── carousel.js └── js │ ├── admin.js │ ├── auth.js │ ├── download.js │ ├── customers.js │ └── index.js ├── .htaccess ├── public ├── .htaccess └── index.php └── composer.lock /backend/.htaccess: -------------------------------------------------------------------------------- 1 | Options -Indexes 2 | -------------------------------------------------------------------------------- /front/.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not dead 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require": { 3 | "firebase/php-jwt": "^5.2" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /front/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WalidMoultamiss/RD_vy/HEAD/front/public/favicon.ico -------------------------------------------------------------------------------- /front/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WalidMoultamiss/RD_vy/HEAD/front/src/assets/logo.png -------------------------------------------------------------------------------- /front/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /vendor/fpdf/tutorial/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WalidMoultamiss/RD_vy/HEAD/vendor/fpdf/tutorial/logo.png -------------------------------------------------------------------------------- /vendor/fpdf/tutorial/20k_c1.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WalidMoultamiss/RD_vy/HEAD/vendor/fpdf/tutorial/20k_c1.txt -------------------------------------------------------------------------------- /vendor/fpdf/tutorial/calligra.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WalidMoultamiss/RD_vy/HEAD/vendor/fpdf/tutorial/calligra.ttf -------------------------------------------------------------------------------- /vendor/fpdf/tutorial/calligra.z: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WalidMoultamiss/RD_vy/HEAD/vendor/fpdf/tutorial/calligra.z -------------------------------------------------------------------------------- /front/src/views/About.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/img/mdb-favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WalidMoultamiss/RD_vy/HEAD/frontend/assets/bootstrqp/img/mdb-favicon.ico -------------------------------------------------------------------------------- /.htaccess: -------------------------------------------------------------------------------- 1 | 2 | RewriteEngine on 3 | RewriteRule ^$ public/ [L] 4 | RewriteRule (.*) public/$1 [L] 5 | 6 | 7 | -------------------------------------------------------------------------------- /frontend/js/admin.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | authUser.isAdmin() 4 | if (authUser.role != "Admin") { 5 | window.location.replace('http://localhost:3000') 6 | } 7 | 8 | 9 | -------------------------------------------------------------------------------- /vendor/firebase/php-jwt/src/ExpiredException.php: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /backend/config/dbConfig.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vendor/autoload.php: -------------------------------------------------------------------------------- 1 | AddPage(); 6 | $pdf->SetFont('Arial','B',16); 7 | $pdf->Cell(40,10,'Hello World!'); 8 | $pdf->Output(); 9 | ?> 10 | -------------------------------------------------------------------------------- /vendor/composer/autoload_namespaces.php: -------------------------------------------------------------------------------- 1 | view('index'); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | Options -Multiviews 3 | RewriteEngine On 4 | RewriteBase /RD_vy/public 5 | RewriteCond %{REQUEST_FILENAME} !-d 6 | RewriteCond %{REQUEST_FILENAME} !-f 7 | RewriteRule ^(.+)$ index.php?url=$1 [QSA,L] 8 | 9 | 10 | -------------------------------------------------------------------------------- /vendor/composer/autoload_psr4.php: -------------------------------------------------------------------------------- 1 | array($vendorDir . '/firebase/php-jwt/src'), 10 | ); 11 | -------------------------------------------------------------------------------- /vendor/composer/autoload_classmap.php: -------------------------------------------------------------------------------- 1 | $vendorDir . '/composer/InstalledVersions.php', 10 | ); 11 | -------------------------------------------------------------------------------- /vendor/fpdf/tutorial/tuto7.php: -------------------------------------------------------------------------------- 1 | AddFont('Calligrapher','','calligra.php'); 7 | $pdf->AddPage(); 8 | $pdf->SetFont('Calligrapher','',35); 9 | $pdf->Cell(0,10,'Enjoy new fonts with FPDF!'); 10 | $pdf->Output(); 11 | ?> 12 | -------------------------------------------------------------------------------- /front/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports={ 2 | devServer: { 3 | proxy:{ 4 | '^/api': { 5 | target: 'http://localhost:5000', 6 | changeOrigin: true, 7 | logLevel: 'debug', 8 | pathRewrite: {'^/api': '/'} 9 | }, 10 | }, 11 | }, 12 | } -------------------------------------------------------------------------------- /front/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /vendor/fpdf/license.txt: -------------------------------------------------------------------------------- 1 | Permission is hereby granted, free of charge, to any person obtaining a copy 2 | of this software to use, copy, modify, distribute, sublicense, and/or sell 3 | copies of the software, and to permit persons to whom the software is furnished 4 | to do so. 5 | 6 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. -------------------------------------------------------------------------------- /front/README.md: -------------------------------------------------------------------------------- 1 | # app 2 | 3 | ## Project setup 4 | ``` 5 | npm install 6 | ``` 7 | 8 | ### Compiles and hot-reloads for development 9 | ``` 10 | npm run serve 11 | ``` 12 | 13 | ### Compiles and minifies for production 14 | ``` 15 | npm run build 16 | ``` 17 | 18 | ### Customize configuration 19 | See [Configuration Reference](https://cli.vuejs.org/config/). 20 | -------------------------------------------------------------------------------- /backend/view/index.php: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | Flights 14 | 15 | 16 |

Backend

17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /frontend/js/auth.js: -------------------------------------------------------------------------------- 1 | let authUser = new User() 2 | setTimeout(() => { 3 | authUser.checkAuth().then(result => { 4 | if (result.error) { 5 | console.log(result.error); 6 | localStorage.getItem('Token') ? localStorage.removeItem('Token') : null 7 | window.location.replace('http://localhost:3000/assets/pages/login.html') 8 | } 9 | }) 10 | }, 500); 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/perfect-scrollbar/lib/css.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | export function get(element) { 4 | return getComputedStyle(element); 5 | } 6 | 7 | export function set(element, obj) { 8 | for (const key in obj) { 9 | let val = obj[key]; 10 | if (typeof val === 'number') { 11 | val = `${val}px`; 12 | } 13 | element.style[key] = val; 14 | } 15 | return element; 16 | } 17 | -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); 10 | ?> 11 | -------------------------------------------------------------------------------- /vendor/fpdf/font/courierb.php: -------------------------------------------------------------------------------- 1 | array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); 10 | ?> 11 | -------------------------------------------------------------------------------- /vendor/fpdf/font/courieri.php: -------------------------------------------------------------------------------- 1 | array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); 10 | ?> 11 | -------------------------------------------------------------------------------- /vendor/fpdf/font/courierbi.php: -------------------------------------------------------------------------------- 1 | array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); 10 | ?> 11 | -------------------------------------------------------------------------------- /vendor/fpdf/tutorial/countries.txt: -------------------------------------------------------------------------------- 1 | Austria;Vienna;83859;8075 2 | Belgium;Brussels;30518;10192 3 | Denmark;Copenhagen;43094;5295 4 | Finland;Helsinki;304529;5147 5 | France;Paris;543965;58728 6 | Germany;Berlin;357022;82057 7 | Greece;Athens;131625;10511 8 | Ireland;Dublin;70723;3694 9 | Italy;Roma;301316;57563 10 | Luxembourg;Luxembourg;2586;424 11 | Netherlands;Amsterdam;41526;15654 12 | Portugal;Lisbon;91906;9957 13 | Spain;Madrid;504790;39348 14 | Sweden;Stockholm;410934;8839 15 | United Kingdom;London;243820;58862 16 | -------------------------------------------------------------------------------- /front/src/components/Tasks.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 28 | -------------------------------------------------------------------------------- /front/src/components/Footer.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/pageno.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PageNo 6 | 7 | 8 | 9 |

PageNo

10 | int PageNo() 11 |

Description

12 | Returns the current page number. 13 |

See also

14 | AliasNbPages 15 |
16 |
Index
17 | 18 | 19 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/util/touch/touchUtil.js: -------------------------------------------------------------------------------- 1 | class TouchUtil { 2 | _getCoordinates(e) { 3 | const [touch] = e.touches; 4 | return { 5 | x: touch.clientX, 6 | y: touch.clientY, 7 | }; 8 | } 9 | 10 | _getDirection(displacement) { 11 | return { 12 | x: { 13 | direction: displacement.x < 0 ? 'left' : 'right', 14 | value: Math.abs(displacement.x), 15 | }, 16 | y: { 17 | direction: displacement.y < 0 ? 'up' : 'down', 18 | value: Math.abs(displacement.y), 19 | }, 20 | }; 21 | } 22 | } 23 | 24 | export default TouchUtil; 25 | -------------------------------------------------------------------------------- /vendor/fpdf/install.txt: -------------------------------------------------------------------------------- 1 | The FPDF library is made up of the following elements: 2 | 3 | - the main file, fpdf.php, which contains the class 4 | - the font definition files located in the font directory 5 | 6 | The font definition files are necessary as soon as you want to output some text in a document. 7 | If they are not accessible, the SetFont() method will produce the following error: 8 | 9 | FPDF error: Could not include font definition file 10 | 11 | 12 | Remarks: 13 | 14 | - Only the files corresponding to the fonts actually used are necessary 15 | - The tutorials provided in this package are ready to be executed 16 | -------------------------------------------------------------------------------- /front/src/components/ButtonVue.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 24 | 27 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/getpageheight.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | GetPageHeight 6 | 7 | 8 | 9 |

GetPageHeight

10 | float GetPageHeight() 11 |

Description

12 | Returns the current page height. 13 |

See also

14 | GetPageWidth 15 |
16 |
Index
17 | 18 | 19 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/getpagewidth.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | GetPageWidth 6 | 7 | 8 | 9 |

GetPageWidth

10 | float GetPageWidth() 11 |

Description

12 | Returns the current page width. 13 |

See also

14 | GetPageHeight 15 |
16 |
Index
17 | 18 | 19 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/getx.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | GetX 6 | 7 | 8 | 9 |

GetX

10 | float GetX() 11 |

Description

12 | Returns the abscissa of the current position. 13 |

See also

14 | SetX, 15 | GetY, 16 | SetY 17 |
18 |
Index
19 | 20 | 21 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/gety.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | GetY 6 | 7 | 8 | 9 |

GetY

10 | float GetY() 11 |

Description

12 | Returns the ordinate of the current position. 13 |

See also

14 | SetY, 15 | GetX, 16 | SetX 17 |
18 |
Index
19 | 20 | 21 | -------------------------------------------------------------------------------- /front/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "backend": "json-server --watch db.json --port 5000" 9 | }, 10 | "dependencies": { 11 | "core-js": "^3.6.5", 12 | "json-server": "^0.16.3", 13 | "vue": "^3.0.0", 14 | "vue-router": "^4.0.8" 15 | }, 16 | "devDependencies": { 17 | "@vue/cli-plugin-babel": "~4.5.0", 18 | "@vue/cli-service": "~4.5.0", 19 | "@vue/compiler-sfc": "^3.0.0", 20 | "sass": "^1.26.5", 21 | "sass-loader": "^8.0.2", 22 | "vue-cli-plugin-vuetify": "~2.4.1" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /frontend/js/download.js: -------------------------------------------------------------------------------- 1 | let id = location.search 2 | params = new URLSearchParams(id) 3 | 4 | setTimeout(() => { 5 | let ticket = document.querySelector("#tm") 6 | let a = ReserverUser.all.filter((elm) => { 7 | if (+elm.id === +params.get("id")) { 8 | return elm 9 | } 10 | }) 11 | console.log(a); 12 | Passengers.getPassengersByRes(params.get("id")).then((result) => { 13 | console.log(result); 14 | 15 | }) 16 | html2pdf().set({ 17 | pagebreak: { mode: 'avoid-all', before: '#breakPage' } 18 | }); 19 | 20 | html2pdf().from(ticket).save() 21 | setTimeout(() => { 22 | window.close() 23 | }, 1000); 24 | 25 | }, 100); 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | // -------------------------------------------------------------------------------- /vendor/fpdf/doc/setfontsize.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetFontSize 6 | 7 | 8 | 9 |

SetFontSize

10 | SetFontSize(float size) 11 |

Description

12 | Defines the size of the current font. 13 |

Parameters

14 |
15 |
size
16 |
17 | The size (in points). 18 |
19 |
20 |

See also

21 | SetFont 22 |
23 |
Index
24 | 25 | 26 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/getstringwidth.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | GetStringWidth 6 | 7 | 8 | 9 |

GetStringWidth

10 | float GetStringWidth(string s) 11 |

Description

12 | Returns the length of a string in user unit. A font must be selected. 13 |

Parameters

14 |
15 |
s
16 |
17 | The string whose length is to be computed. 18 |
19 |
20 |
21 |
Index
22 | 23 | 24 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/close.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Close 6 | 7 | 8 | 9 |

Close

10 | Close() 11 |

Description

12 | Terminates the PDF document. It is not necessary to call this method explicitly because Output() 13 | does it automatically. 14 |
15 | If the document contains no page, AddPage() is called to prevent from getting an invalid document. 16 |

See also

17 | Output 18 |
19 |
Index
20 | 21 | 22 | -------------------------------------------------------------------------------- /front/src/router/index.js: -------------------------------------------------------------------------------- 1 | import {createRouter, createWebHistory} from 'vue-router'; 2 | import Home from '../views/Home.vue' 3 | import About from '../views/About.vue' 4 | import Login from '../views/Login.vue' 5 | import Register from '../views/Register.vue' 6 | const routes = [ 7 | { 8 | path: '/', 9 | name: 'Home', 10 | component: Home, 11 | }, 12 | { 13 | path: '/register', 14 | name: 'Register', 15 | component: Register, 16 | }, 17 | { 18 | path: '/login', 19 | name: 'Login', 20 | component: Login, 21 | }, 22 | { 23 | path: '/about', 24 | name: 'About', 25 | component: About, 26 | } 27 | ] 28 | 29 | const router = createRouter({ 30 | history: createWebHistory(process.env.BASE_URL), 31 | routes 32 | }) 33 | 34 | export default router -------------------------------------------------------------------------------- /vendor/composer/installed.php: -------------------------------------------------------------------------------- 1 | 3 | array ( 4 | 'pretty_version' => 'dev-master', 5 | 'version' => 'dev-master', 6 | 'aliases' => 7 | array ( 8 | ), 9 | 'reference' => '22a333eeb1e8c2356fe4eb1119685b37b11097d9', 10 | 'name' => '__root__', 11 | ), 12 | 'versions' => 13 | array ( 14 | '__root__' => 15 | array ( 16 | 'pretty_version' => 'dev-master', 17 | 'version' => 'dev-master', 18 | 'aliases' => 19 | array ( 20 | ), 21 | 'reference' => '22a333eeb1e8c2356fe4eb1119685b37b11097d9', 22 | ), 23 | 'firebase/php-jwt' => 24 | array ( 25 | 'pretty_version' => 'v5.2.1', 26 | 'version' => '5.2.1.0', 27 | 'aliases' => 28 | array ( 29 | ), 30 | 'reference' => 'f42c9110abe98dd6cfe9053c49bc86acc70b2d23', 31 | ), 32 | ), 33 | ); 34 | -------------------------------------------------------------------------------- /front/db.json: -------------------------------------------------------------------------------- 1 | { 2 | "tasks": [ 3 | { 4 | "id": 1, 5 | "text": "Atlastrip Appointment", 6 | "day": "March 3rd at 2:30pm", 7 | "reminder": true, 8 | "status": "viewed" 9 | }, 10 | { 11 | "id": 79264, 12 | "text": "task default54", 13 | "day": "dsgdfgdfgds", 14 | "reminder": true, 15 | "status": "viewed" 16 | }, 17 | { 18 | "id": 71674, 19 | "text": "dfgsdg", 20 | "day": "dsfgdfgsdfg", 21 | "reminder": false, 22 | "status": "viewed" 23 | }, 24 | { 25 | "id": 3284, 26 | "text": "dfgdfgd", 27 | "day": "fgggfffggfffgfgfgdqszses", 28 | "reminder": false, 29 | "status": "viewed" 30 | }, 31 | { 32 | "id": 33222, 33 | "text": "task default9", 34 | "day": "qsdqsdqsd", 35 | "reminder": false, 36 | "status": "viewed" 37 | } 38 | ] 39 | } -------------------------------------------------------------------------------- /vendor/fpdf/doc/ln.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Ln 6 | 7 | 8 | 9 |

Ln

10 | Ln([float h]) 11 |

Description

12 | Performs a line break. The current abscissa goes back to the left margin and the ordinate 13 | increases by the amount passed in parameter. 14 |

Parameters

15 |
16 |
h
17 |
18 | The height of the break. 19 |
20 | By default, the value equals the height of the last printed cell. 21 |
22 |
23 |

See also

24 | Cell 25 |
26 |
Index
27 | 28 | 29 | -------------------------------------------------------------------------------- /vendor/fpdf/tutorial/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Tutorials 6 | 7 | 8 | 9 |

Tutorials

10 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setx.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetX 6 | 7 | 8 | 9 |

SetX

10 | SetX(float x) 11 |

Description

12 | Defines the abscissa of the current position. If the passed value is negative, it is relative 13 | to the right of the page. 14 |

Parameters

15 |
16 |
x
17 |
18 | The value of the abscissa. 19 |
20 |
21 |

See also

22 | GetX, 23 | GetY, 24 | SetY, 25 | SetXY 26 |
27 |
Index
28 | 29 | 30 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/error.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Error 6 | 7 | 8 | 9 |

Error

10 | Error(string msg) 11 |

Description

12 | This method is automatically called in case of a fatal error; it simply throws an exception 13 | with the provided message.
14 | An inherited class may override it to customize the error handling but the method should 15 | never return, otherwise the resulting document would probably be invalid. 16 |

Parameters

17 |
18 |
msg
19 |
20 | The error message. 21 |
22 |
23 |
24 |
Index
25 | 26 | 27 | -------------------------------------------------------------------------------- /vendor/fpdf/tutorial/tuto2.php: -------------------------------------------------------------------------------- 1 | Image('logo.png',10,6,30); 11 | // Arial bold 15 12 | $this->SetFont('Arial','B',15); 13 | // Move to the right 14 | $this->Cell(80); 15 | // Title 16 | $this->Cell(30,10,'Title',1,0,'C'); 17 | // Line break 18 | $this->Ln(20); 19 | } 20 | 21 | // Page footer 22 | function Footer() 23 | { 24 | // Position at 1.5 cm from bottom 25 | $this->SetY(-15); 26 | // Arial italic 8 27 | $this->SetFont('Arial','I',8); 28 | // Page number 29 | $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C'); 30 | } 31 | } 32 | 33 | // Instanciation of inherited class 34 | $pdf = new PDF(); 35 | $pdf->AliasNbPages(); 36 | $pdf->AddPage(); 37 | $pdf->SetFont('Times','',12); 38 | for($i=1;$i<=40;$i++) 39 | $pdf->Cell(0,10,'Printing line number '.$i,0,1); 40 | $pdf->Output(); 41 | ?> 42 | -------------------------------------------------------------------------------- /vendor/firebase/php-jwt/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "firebase/php-jwt", 3 | "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", 4 | "homepage": "https://github.com/firebase/php-jwt", 5 | "keywords": [ 6 | "php", 7 | "jwt" 8 | ], 9 | "authors": [ 10 | { 11 | "name": "Neuman Vong", 12 | "email": "neuman+pear@twilio.com", 13 | "role": "Developer" 14 | }, 15 | { 16 | "name": "Anant Narayanan", 17 | "email": "anant@php.net", 18 | "role": "Developer" 19 | } 20 | ], 21 | "license": "BSD-3-Clause", 22 | "require": { 23 | "php": ">=5.3.0" 24 | }, 25 | "autoload": { 26 | "psr-4": { 27 | "Firebase\\JWT\\": "src" 28 | } 29 | }, 30 | "require-dev": { 31 | "phpunit/phpunit": ">=4.8 <=9" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/settopmargin.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetTopMargin 6 | 7 | 8 | 9 |

SetTopMargin

10 | SetTopMargin(float margin) 11 |

Description

12 | Defines the top margin. The method can be called before creating the first page. 13 |

Parameters

14 |
15 |
margin
16 |
17 | The margin. 18 |
19 |
20 |

See also

21 | SetLeftMargin, 22 | SetRightMargin, 23 | SetAutoPageBreak, 24 | SetMargins 25 |
26 |
Index
27 | 28 | 29 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setrightmargin.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetRightMargin 6 | 7 | 8 | 9 |

SetRightMargin

10 | SetRightMargin(float margin) 11 |

Description

12 | Defines the right margin. The method can be called before creating the first page. 13 |

Parameters

14 |
15 |
margin
16 |
17 | The margin. 18 |
19 |
20 |

See also

21 | SetLeftMargin, 22 | SetTopMargin, 23 | SetAutoPageBreak, 24 | SetMargins 25 |
26 |
Index
27 | 28 | 29 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb.free.js: -------------------------------------------------------------------------------- 1 | // BOOTSTRAP CORE COMPONENTS 2 | import Button from './free/button'; 3 | import Collapse from './bootstrap/mdb-prefix/collapse'; 4 | import Offcanvas from './bootstrap/mdb-prefix/offcanvas'; 5 | import Alert from './free/alert'; 6 | import Carousel from './free/carousel'; 7 | import Modal from './free/modal'; 8 | import Popover from './free/popover'; 9 | import ScrollSpy from './free/scrollspy'; 10 | import Tab from './free/tab'; 11 | import Tooltip from './free/tooltip'; 12 | import Toast from './free/toast'; 13 | 14 | // MDB FREE COMPONENTS 15 | import Input from './free/input'; 16 | import Dropdown from './free/dropdown'; 17 | import Ripple from './free/ripple'; 18 | import Range from './free/range'; 19 | 20 | export { 21 | Alert, 22 | Button, 23 | Carousel, 24 | Collapse, 25 | Offcanvas, 26 | Dropdown, 27 | Input, 28 | Modal, 29 | Popover, 30 | Ripple, 31 | ScrollSpy, 32 | Tab, 33 | Toast, 34 | Tooltip, 35 | Range, 36 | }; 37 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/addlink.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AddLink 6 | 7 | 8 | 9 |

AddLink

10 | int AddLink() 11 |

Description

12 | Creates a new internal link and returns its identifier. An internal link is a clickable area 13 | which directs to another place within the document. 14 |
15 | The identifier can then be passed to Cell(), Write(), Image() or Link(). The destination is 16 | defined with SetLink(). 17 |

See also

18 | Cell, 19 | Write, 20 | Image, 21 | Link, 22 | SetLink 23 |
24 |
Index
25 | 26 | 27 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setxy.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetXY 6 | 7 | 8 | 9 |

SetXY

10 | SetXY(float x, float y) 11 |

Description

12 | Defines the abscissa and ordinate of the current position. If the passed values are negative, 13 | they are relative respectively to the right and bottom of the page. 14 |

Parameters

15 |
16 |
x
17 |
18 | The value of the abscissa. 19 |
20 |
y
21 |
22 | The value of the ordinate. 23 |
24 |
25 |

See also

26 | SetX, 27 | SetY 28 |
29 |
Index
30 | 31 | 32 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setlinewidth.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetLineWidth 6 | 7 | 8 | 9 |

SetLineWidth

10 | SetLineWidth(float width) 11 |

Description

12 | Defines the line width. By default, the value equals 0.2 mm. The method can be called before 13 | the first page is created and the value is retained from page to page. 14 |

Parameters

15 |
16 |
width
17 |
18 | The width. 19 |
20 |
21 |

See also

22 | Line, 23 | Rect, 24 | Cell, 25 | MultiCell 26 |
27 |
Index
28 | 29 | 30 | -------------------------------------------------------------------------------- /front/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | <%= htmlWebpackPlugin.options.title %> 12 | 13 | 14 | 17 |
18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /vendor/composer/platform_check.php: -------------------------------------------------------------------------------- 1 | = 50300)) { 8 | $issues[] = 'Your Composer dependencies require a PHP version ">= 5.3.0". You are running ' . PHP_VERSION . '.'; 9 | } 10 | 11 | if ($issues) { 12 | if (!headers_sent()) { 13 | header('HTTP/1.1 500 Internal Server Error'); 14 | } 15 | if (!ini_get('display_errors')) { 16 | if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { 17 | fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); 18 | } elseif (!headers_sent()) { 19 | echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; 20 | } 21 | } 22 | trigger_error( 23 | 'Composer detected issues in your platform: ' . implode(' ', $issues), 24 | E_USER_ERROR 25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /frontend/js/customers.js: -------------------------------------------------------------------------------- 1 | authUser.all().then(({users}) => { 2 | const dashUsers = document.querySelector('#Users') 3 | console.log(users); 4 | users.map((user) => { 5 | let tr = document.createElement('tr') 6 | console.log(user); 7 | /*html*/ 8 | tr.innerHTML = ` 9 | ${user.cin} 10 | ${user.first_name} 11 | ${user.last_name} 12 | ${user.phone} 13 | ${user.email} 14 | ${user.address} 15 | ${user.birth_date} 16 | ${user.num_passport} 17 | ${user.role} 18 | 19 | ` 20 | dashUsers.appendChild(tr) 21 | }) 22 | }).catch((err) => { 23 | 24 | }); 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setleftmargin.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetLeftMargin 6 | 7 | 8 | 9 |

SetLeftMargin

10 | SetLeftMargin(float margin) 11 |

Description

12 | Defines the left margin. The method can be called before creating the first page. 13 |
14 | If the current abscissa gets out of page, it is brought back to the margin. 15 |

Parameters

16 |
17 |
margin
18 |
19 | The margin. 20 |
21 |
22 |

See also

23 | SetTopMargin, 24 | SetRightMargin, 25 | SetAutoPageBreak, 26 | SetMargins 27 |
28 |
Index
29 | 30 | 31 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/perfect-scrollbar/lib/dom.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | export function div(className) { 4 | const div = document.createElement('div'); 5 | div.className = className; 6 | return div; 7 | } 8 | 9 | const elMatches = 10 | typeof Element !== 'undefined' && 11 | (Element.prototype.matches || 12 | Element.prototype.webkitMatchesSelector || 13 | Element.prototype.mozMatchesSelector || 14 | Element.prototype.msMatchesSelector); 15 | 16 | export function matches(element, query) { 17 | if (!elMatches) { 18 | throw new Error('No element matching method supported'); 19 | } 20 | 21 | return elMatches.call(element, query); 22 | } 23 | 24 | export function remove(element) { 25 | if (element.remove) { 26 | element.remove(); 27 | } else { 28 | if (element.parentNode) { 29 | element.parentNode.removeChild(element); 30 | } 31 | } 32 | } 33 | 34 | export function queryChildren(element, selector) { 35 | return Array.prototype.filter.call(element.children, (child) => matches(child, selector)); 36 | } 37 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/line.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Line 6 | 7 | 8 | 9 |

Line

10 | Line(float x1, float y1, float x2, float y2) 11 |

Description

12 | Draws a line between two points. 13 |

Parameters

14 |
15 |
x1
16 |
17 | Abscissa of first point. 18 |
19 |
y1
20 |
21 | Ordinate of first point. 22 |
23 |
x2
24 |
25 | Abscissa of second point. 26 |
27 |
y2
28 |
29 | Ordinate of second point. 30 |
31 |
32 |

See also

33 | SetLineWidth, 34 | SetDrawColor 35 |
36 |
Index
37 | 38 | 39 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/sety.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetY 6 | 7 | 8 | 9 |

SetY

10 | SetY(float y [, boolean resetX]) 11 |

Description

12 | Sets the ordinate and optionally moves the current abscissa back to the left margin. If the value 13 | is negative, it is relative to the bottom of the page. 14 |

Parameters

15 |
16 |
y
17 |
18 | The value of the ordinate. 19 |
20 |
resetX
21 |
22 | Whether to reset the abscissa. Default value: true. 23 |
24 |
25 |

See also

26 | GetX, 27 | GetY, 28 | SetX, 29 | SetXY 30 |
31 |
Index
32 | 33 | 34 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setcompression.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetCompression 6 | 7 | 8 | 9 |

SetCompression

10 | SetCompression(boolean compress) 11 |

Description

12 | Activates or deactivates page compression. When activated, the internal representation of 13 | each page is compressed, which leads to a compression ratio of about 2 for the resulting 14 | document. 15 |
16 | Compression is on by default. 17 |
18 |
19 | Note: the Zlib extension is required for this feature. If not present, compression 20 | will be turned off. 21 |

Parameters

22 |
23 |
compress
24 |
25 | Boolean indicating if compression must be enabled. 26 |
27 |
28 |
29 |
Index
30 | 31 | 32 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/settitle.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetTitle 6 | 7 | 8 | 9 |

SetTitle

10 | SetTitle(string title [, boolean isUTF8]) 11 |

Description

12 | Defines the title of the document. 13 |

Parameters

14 |
15 |
title
16 |
17 | The title. 18 |
19 |
isUTF8
20 |
21 | Indicates if the string is encoded in ISO-8859-1 (false) or UTF-8 (true).
22 | Default value: false. 23 |
24 |
25 |

See also

26 | SetAuthor, 27 | SetCreator, 28 | SetKeywords, 29 | SetSubject 30 |
31 |
Index
32 | 33 | 34 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setsubject.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetSubject 6 | 7 | 8 | 9 |

SetSubject

10 | SetSubject(string subject [, boolean isUTF8]) 11 |

Description

12 | Defines the subject of the document. 13 |

Parameters

14 |
15 |
subject
16 |
17 | The subject. 18 |
19 |
isUTF8
20 |
21 | Indicates if the string is encoded in ISO-8859-1 (false) or UTF-8 (true).
22 | Default value: false. 23 |
24 |
25 |

See also

26 | SetAuthor, 27 | SetCreator, 28 | SetKeywords, 29 | SetTitle 30 |
31 |
Index
32 | 33 | 34 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setauthor.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetAuthor 6 | 7 | 8 | 9 |

SetAuthor

10 | SetAuthor(string author [, boolean isUTF8]) 11 |

Description

12 | Defines the author of the document. 13 |

Parameters

14 |
15 |
author
16 |
17 | The name of the author. 18 |
19 |
isUTF8
20 |
21 | Indicates if the string is encoded in ISO-8859-1 (false) or UTF-8 (true).
22 | Default value: false. 23 |
24 |
25 |

See also

26 | SetCreator, 27 | SetKeywords, 28 | SetSubject, 29 | SetTitle 30 |
31 |
Index
32 | 33 | 34 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/util/keycodes.js: -------------------------------------------------------------------------------- 1 | export const LEFT_ARROW = 37; 2 | export const UP_ARROW = 38; 3 | export const RIGHT_ARROW = 39; 4 | export const DOWN_ARROW = 40; 5 | export const HOME = 36; 6 | export const END = 35; 7 | export const PAGE_UP = 33; 8 | export const PAGE_DOWN = 34; 9 | export const ENTER = 13; 10 | export const SPACE = 32; 11 | export const ESCAPE = 27; 12 | export const TAB = 9; 13 | export const BACKSPACE = 8; 14 | export const DELETE = 46; 15 | export const A = 65; 16 | export const B = 66; 17 | export const C = 67; 18 | export const D = 68; 19 | export const E = 69; 20 | export const F = 70; 21 | export const G = 71; 22 | export const H = 72; 23 | export const I = 73; 24 | export const J = 74; 25 | export const K = 75; 26 | export const L = 76; 27 | export const M = 77; 28 | export const N = 78; 29 | export const O = 79; 30 | export const P = 80; 31 | export const Q = 81; 32 | export const R = 82; 33 | export const S = 83; 34 | export const T = 84; 35 | export const U = 85; 36 | export const V = 86; 37 | export const W = 87; 38 | export const X = 88; 39 | export const Y = 89; 40 | export const Z = 90; 41 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/perfect-scrollbar/handlers/click-rail.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | import updateGeometry from '../update-geometry'; 4 | 5 | export default function (i) { 6 | // const element = i.element; 7 | 8 | i.event.bind(i.scrollbarY, 'mousedown', (e) => e.stopPropagation()); 9 | i.event.bind(i.scrollbarYRail, 'mousedown', (e) => { 10 | const positionTop = e.pageY - window.pageYOffset - i.scrollbarYRail.getBoundingClientRect().top; 11 | const direction = positionTop > i.scrollbarYTop ? 1 : -1; 12 | 13 | i.element.scrollTop += direction * i.containerHeight; 14 | updateGeometry(i); 15 | 16 | e.stopPropagation(); 17 | }); 18 | 19 | i.event.bind(i.scrollbarX, 'mousedown', (e) => e.stopPropagation()); 20 | i.event.bind(i.scrollbarXRail, 'mousedown', (e) => { 21 | const positionLeft = 22 | e.pageX - window.pageXOffset - i.scrollbarXRail.getBoundingClientRect().left; 23 | const direction = positionLeft > i.scrollbarXLeft ? 1 : -1; 24 | 25 | i.element.scrollLeft += direction * i.containerWidth; 26 | updateGeometry(i); 27 | 28 | e.stopPropagation(); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /front/src/components/Header.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 31 | 32 | 33 | 42 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setlink.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetLink 6 | 7 | 8 | 9 |

SetLink

10 | SetLink(int link [, float y [, int page]]) 11 |

Description

12 | Defines the page and position a link points to. 13 |

Parameters

14 |
15 |
link
16 |
17 | The link identifier returned by AddLink(). 18 |
19 |
y
20 |
21 | Ordinate of target position; -1 indicates the current position. 22 | The default value is 0 (top of page). 23 |
24 |
page
25 |
26 | Number of target page; -1 indicates the current page. This is the default value. 27 |
28 |
29 |

See also

30 | AddLink 31 |
32 |
Index
33 | 34 | 35 | -------------------------------------------------------------------------------- /vendor/composer/LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Copyright (c) Nils Adermann, Jordi Boggiano 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is furnished 9 | to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | THE SOFTWARE. 21 | 22 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setkeywords.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetKeywords 6 | 7 | 8 | 9 |

SetKeywords

10 | SetKeywords(string keywords [, boolean isUTF8]) 11 |

Description

12 | Associates keywords with the document, generally in the form 'keyword1 keyword2 ...'. 13 |

Parameters

14 |
15 |
keywords
16 |
17 | The list of keywords. 18 |
19 |
isUTF8
20 |
21 | Indicates if the string is encoded in ISO-8859-1 (false) or UTF-8 (true).
22 | Default value: false. 23 |
24 |
25 |

See also

26 | SetAuthor, 27 | SetCreator, 28 | SetSubject, 29 | SetTitle 30 |
31 |
Index
32 | 33 | 34 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setmargins.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetMargins 6 | 7 | 8 | 9 |

SetMargins

10 | SetMargins(float left, float top [, float right]) 11 |

Description

12 | Defines the left, top and right margins. By default, they equal 1 cm. Call this method to change 13 | them. 14 |

Parameters

15 |
16 |
left
17 |
18 | Left margin. 19 |
20 |
top
21 |
22 | Top margin. 23 |
24 |
right
25 |
26 | Right margin. Default value is the left one. 27 |
28 |
29 |

See also

30 | SetLeftMargin, 31 | SetTopMargin, 32 | SetRightMargin, 33 | SetAutoPageBreak 34 |
35 |
Index
36 | 37 | 38 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setcreator.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetCreator 6 | 7 | 8 | 9 |

SetCreator

10 | SetCreator(string creator [, boolean isUTF8]) 11 |

Description

12 | Defines the creator of the document. This is typically the name of the application that 13 | generates the PDF. 14 |

Parameters

15 |
16 |
creator
17 |
18 | The name of the creator. 19 |
20 |
isUTF8
21 |
22 | Indicates if the string is encoded in ISO-8859-1 (false) or UTF-8 (true).
23 | Default value: false. 24 |
25 |
26 |

See also

27 | SetAuthor, 28 | SetKeywords, 29 | SetSubject, 30 | SetTitle 31 |
32 |
Index
33 | 34 | 35 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setautopagebreak.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetAutoPageBreak 6 | 7 | 8 | 9 |

SetAutoPageBreak

10 | SetAutoPageBreak(boolean auto [, float margin]) 11 |

Description

12 | Enables or disables the automatic page breaking mode. When enabling, the second parameter is 13 | the distance from the bottom of the page that defines the triggering limit. By default, the 14 | mode is on and the margin is 2 cm. 15 |

Parameters

16 |
17 |
auto
18 |
19 | Boolean indicating if mode should be on or off. 20 |
21 |
margin
22 |
23 | Distance from the bottom of the page. 24 |
25 |
26 |

See also

27 | Cell, 28 | MultiCell, 29 | AcceptPageBreak 30 |
31 |
Index
32 | 33 | 34 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/footer.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Footer 6 | 7 | 8 | 9 |

Footer

10 | Footer() 11 |

Description

12 | This method is used to render the page footer. It is automatically called by AddPage() and 13 | Close() and should not be called directly by the application. The implementation in FPDF is 14 | empty, so you have to subclass it and override the method if you want a specific processing. 15 |

Example

16 |
17 |
class PDF extends FPDF
18 | {
19 | function Footer()
20 | {
21 |     // Go to 1.5 cm from bottom
22 |     $this->SetY(-15);
23 |     // Select Arial italic 8
24 |     $this->SetFont('Arial','I',8);
25 |     // Print centered page number
26 |     $this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
27 | }
28 | }
29 |
30 |

See also

31 | Header 32 |
33 |
Index
34 | 35 | 36 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/header.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Header 6 | 7 | 8 | 9 |

Header

10 | Header() 11 |

Description

12 | This method is used to render the page header. It is automatically called by AddPage() and 13 | should not be called directly by the application. The implementation in FPDF is empty, so 14 | you have to subclass it and override the method if you want a specific processing. 15 |

Example

16 |
17 |
class PDF extends FPDF
18 | {
19 | function Header()
20 | {
21 |     // Select Arial bold 15
22 |     $this->SetFont('Arial','B',15);
23 |     // Move to the right
24 |     $this->Cell(80);
25 |     // Framed title
26 |     $this->Cell(30,10,'Title',1,0,'C');
27 |     // Line break
28 |     $this->Ln(20);
29 | }
30 | }
31 |
32 |

See also

33 | Footer 34 |
35 |
Index
36 | 37 | 38 | -------------------------------------------------------------------------------- /vendor/composer/autoload_static.php: -------------------------------------------------------------------------------- 1 | 11 | array ( 12 | 'Firebase\\JWT\\' => 13, 13 | ), 14 | ); 15 | 16 | public static $prefixDirsPsr4 = array ( 17 | 'Firebase\\JWT\\' => 18 | array ( 19 | 0 => __DIR__ . '/..' . '/firebase/php-jwt/src', 20 | ), 21 | ); 22 | 23 | public static $classMap = array ( 24 | 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 25 | ); 26 | 27 | public static function getInitializer(ClassLoader $loader) 28 | { 29 | return \Closure::bind(function () use ($loader) { 30 | $loader->prefixLengthsPsr4 = ComposerStaticInit1c3260cfa4cff3800f50c4f7595d8739::$prefixLengthsPsr4; 31 | $loader->prefixDirsPsr4 = ComposerStaticInit1c3260cfa4cff3800f50c4f7595d8739::$prefixDirsPsr4; 32 | $loader->classMap = ComposerStaticInit1c3260cfa4cff3800f50c4f7595d8739::$classMap; 33 | 34 | }, null, ClassLoader::class); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/perfect-scrollbar/lib/class-names.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | const cls = { 4 | main: 'ps', 5 | rtl: 'ps__rtl', 6 | element: { 7 | thumb: (x) => `ps__thumb-${x}`, 8 | rail: (x) => `ps__rail-${x}`, 9 | consuming: 'ps__child--consume', 10 | }, 11 | state: { 12 | focus: 'ps--focus', 13 | clicking: 'ps--clicking', 14 | active: (x) => `ps--active-${x}`, 15 | scrolling: (x) => `ps--scrolling-${x}`, 16 | }, 17 | }; 18 | 19 | export default cls; 20 | 21 | /* 22 | * Helper methods 23 | */ 24 | const scrollingClassTimeout = { x: null, y: null }; 25 | 26 | export function addScrollingClass(i, x) { 27 | const classList = i.element.classList; 28 | const className = cls.state.scrolling(x); 29 | 30 | if (classList.contains(className)) { 31 | clearTimeout(scrollingClassTimeout[x]); 32 | } else { 33 | classList.add(className); 34 | } 35 | } 36 | 37 | export function removeScrollingClass(i, x) { 38 | scrollingClassTimeout[x] = setTimeout( 39 | () => i.isAlive && i.element.classList.remove(cls.state.scrolling(x)), 40 | i.settings.scrollingThreshold 41 | ); 42 | } 43 | 44 | export function setScrollingClassInstantly(i, x) { 45 | addScrollingClass(i, x); 46 | removeScrollingClass(i, x); 47 | } 48 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/text.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Text 6 | 7 | 8 | 9 |

Text

10 | Text(float x, float y, string txt) 11 |

Description

12 | Prints a character string. The origin is on the left of the first character, on the baseline. 13 | This method allows to place a string precisely on the page, but it is usually easier to use 14 | Cell(), MultiCell() or Write() which are the standard methods to print text. 15 |

Parameters

16 |
17 |
x
18 |
19 | Abscissa of the origin. 20 |
21 |
y
22 |
23 | Ordinate of the origin. 24 |
25 |
txt
26 |
27 | String to print. 28 |
29 |
30 |

See also

31 | SetFont, 32 | SetTextColor, 33 | Cell, 34 | MultiCell, 35 | Write 36 |
37 |
Index
38 | 39 | 40 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/src/base-component.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v5.0.0-beta3): base-component.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | import Data from './dom/data'; 9 | 10 | /** 11 | * ------------------------------------------------------------------------ 12 | * Constants 13 | * ------------------------------------------------------------------------ 14 | */ 15 | 16 | const VERSION = '5.0.0-beta3'; 17 | 18 | class BaseComponent { 19 | constructor(element) { 20 | element = typeof element === 'string' ? document.querySelector(element) : element; 21 | 22 | if (!element) { 23 | return; 24 | } 25 | 26 | this._element = element; 27 | Data.set(this._element, this.constructor.DATA_KEY, this); 28 | } 29 | 30 | dispose() { 31 | Data.remove(this._element, this.constructor.DATA_KEY); 32 | this._element = null; 33 | } 34 | 35 | /** Static */ 36 | 37 | static getInstance(element) { 38 | return Data.get(element, this.DATA_KEY); 39 | } 40 | 41 | static get VERSION() { 42 | return VERSION; 43 | } 44 | } 45 | 46 | export default BaseComponent; 47 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/mdb-prefix/base-component.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v5.0.0-beta3): base-component.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | import Data from './dom/data'; 9 | 10 | /** 11 | * ------------------------------------------------------------------------ 12 | * Constants 13 | * ------------------------------------------------------------------------ 14 | */ 15 | 16 | const VERSION = '5.0.0-beta3'; 17 | 18 | class BaseComponent { 19 | constructor(element) { 20 | element = typeof element === 'string' ? document.querySelector(element) : element; 21 | 22 | if (!element) { 23 | return; 24 | } 25 | 26 | this._element = element; 27 | Data.set(this._element, this.constructor.DATA_KEY, this); 28 | } 29 | 30 | dispose() { 31 | Data.remove(this._element, this.constructor.DATA_KEY); 32 | this._element = null; 33 | } 34 | 35 | /** Static */ 36 | 37 | static getInstance(element) { 38 | return Data.get(element, this.DATA_KEY); 39 | } 40 | 41 | static get VERSION() { 42 | return VERSION; 43 | } 44 | } 45 | 46 | export default BaseComponent; 47 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/aliasnbpages.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AliasNbPages 6 | 7 | 8 | 9 |

AliasNbPages

10 | AliasNbPages([string alias]) 11 |

Description

12 | Defines an alias for the total number of pages. It will be substituted as the document is 13 | closed. 14 |

Parameters

15 |
16 |
alias
17 |
18 | The alias. Default value: {nb}. 19 |
20 |
21 |

Example

22 |
23 |
class PDF extends FPDF
24 | {
25 | function Footer()
26 | {
27 |     // Go to 1.5 cm from bottom
28 |     $this->SetY(-15);
29 |     // Select Arial italic 8
30 |     $this->SetFont('Arial','I',8);
31 |     // Print current and total page numbers
32 |     $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
33 | }
34 | }
35 | 
36 | $pdf = new PDF();
37 | $pdf->AliasNbPages();
38 |
39 |

See also

40 | PageNo, 41 | Footer 42 |
43 |
Index
44 | 45 | 46 | -------------------------------------------------------------------------------- /vendor/fpdf/fpdf.css: -------------------------------------------------------------------------------- 1 | body {font-family:"Times New Roman",serif} 2 | h1 {font:bold 135% Arial,sans-serif; color:#4000A0; margin-bottom:0.9em} 3 | h2 {font:bold 95% Arial,sans-serif; color:#900000; margin-top:1.5em; margin-bottom:1em} 4 | dl.param dt {text-decoration:underline} 5 | dl.param dd {margin-top:1em; margin-bottom:1em} 6 | dl.param ul {margin-top:1em; margin-bottom:1em} 7 | tt, code, kbd {font-family:"Courier New",Courier,monospace; font-size:82%} 8 | div.source {margin-top:1.4em; margin-bottom:1.3em} 9 | div.source pre {display:table; border:1px solid #24246A; width:100%; margin:0em; font-family:inherit; font-size:100%} 10 | div.source code {display:block; border:1px solid #C5C5EC; background-color:#F0F5FF; padding:6px; color:#000000} 11 | div.doc-source {margin-top:1.4em; margin-bottom:1.3em} 12 | div.doc-source pre {display:table; width:100%; margin:0em; font-family:inherit; font-size:100%} 13 | div.doc-source code {display:block; background-color:#E0E0E0; padding:4px} 14 | .kw {color:#000080; font-weight:bold} 15 | .str {color:#CC0000} 16 | .cmt {color:#008000} 17 | p.demo {text-align:center; margin-top:-0.9em} 18 | a.demo {text-decoration:none; font-weight:bold; color:#0000CC} 19 | a.demo:link {text-decoration:none; font-weight:bold; color:#0000CC} 20 | a.demo:hover {text-decoration:none; font-weight:bold; color:#0000FF} 21 | a.demo:active {text-decoration:none; font-weight:bold; color:#0000FF} 22 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/settextcolor.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetTextColor 6 | 7 | 8 | 9 |

SetTextColor

10 | SetTextColor(int r [, int g, int b]) 11 |

Description

12 | Defines the color used for text. It can be expressed in RGB components or gray scale. The 13 | method can be called before the first page is created and the value is retained from page to 14 | page. 15 |

Parameters

16 |
17 |
r
18 |
19 | If g et b are given, red component; if not, indicates the gray level. 20 | Value between 0 and 255. 21 |
22 |
g
23 |
24 | Green component (between 0 and 255). 25 |
26 |
b
27 |
28 | Blue component (between 0 and 255). 29 |
30 |
31 |

See also

32 | SetDrawColor, 33 | SetFillColor, 34 | Text, 35 | Cell, 36 | MultiCell 37 |
38 |
Index
39 | 40 | 41 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/perfect-scrollbar/lib/util.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | import * as CSS from './css'; 4 | import * as DOM from './dom'; 5 | 6 | export function toInt(x) { 7 | return parseInt(x, 10) || 0; 8 | } 9 | 10 | export function isEditable(el) { 11 | return ( 12 | DOM.matches(el, 'input,[contenteditable]') || 13 | DOM.matches(el, 'select,[contenteditable]') || 14 | DOM.matches(el, 'textarea,[contenteditable]') || 15 | DOM.matches(el, 'button,[contenteditable]') 16 | ); 17 | } 18 | 19 | export function outerWidth(element) { 20 | const styles = CSS.get(element); 21 | return ( 22 | toInt(styles.width) + 23 | toInt(styles.paddingLeft) + 24 | toInt(styles.paddingRight) + 25 | toInt(styles.borderLeftWidth) + 26 | toInt(styles.borderRightWidth) 27 | ); 28 | } 29 | 30 | export const env = { 31 | isWebKit: typeof document !== 'undefined' && 'WebkitAppearance' in document.documentElement.style, 32 | supportsTouch: 33 | typeof window !== 'undefined' && 34 | ('ontouchstart' in window || 35 | ('maxTouchPoints' in window.navigator && window.navigator.maxTouchPoints > 0) || 36 | (window.DocumentTouch && document instanceof window.DocumentTouch)), 37 | supportsIePointer: typeof navigator !== 'undefined' && navigator.msMaxTouchPoints, 38 | isChrome: typeof navigator !== 'undefined' && /Chrome/i.test(navigator && navigator.userAgent), 39 | }; 40 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/link.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Link 6 | 7 | 8 | 9 |

Link

10 | Link(float x, float y, float w, float h, mixed link) 11 |

Description

12 | Puts a link on a rectangular area of the page. Text or image links are generally put via Cell(), 13 | Write() or Image(), but this method can be useful for instance to define a clickable area inside 14 | an image. 15 |

Parameters

16 |
17 |
x
18 |
19 | Abscissa of the upper-left corner of the rectangle. 20 |
21 |
y
22 |
23 | Ordinate of the upper-left corner of the rectangle. 24 |
25 |
w
26 |
27 | Width of the rectangle. 28 |
29 |
h
30 |
31 | Height of the rectangle. 32 |
33 |
link
34 |
35 | URL or identifier returned by AddLink(). 36 |
37 |
38 |

See also

39 | AddLink, 40 | Cell, 41 | Write, 42 | Image 43 |
44 |
Index
45 | 46 | 47 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setfillcolor.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetFillColor 6 | 7 | 8 | 9 |

SetFillColor

10 | SetFillColor(int r [, int g, int b]) 11 |

Description

12 | Defines the color used for all filling operations (filled rectangles and cell backgrounds). 13 | It can be expressed in RGB components or gray scale. The method can be called before the first 14 | page is created and the value is retained from page to page. 15 |

Parameters

16 |
17 |
r
18 |
19 | If g and b are given, red component; if not, indicates the gray level. 20 | Value between 0 and 255. 21 |
22 |
g
23 |
24 | Green component (between 0 and 255). 25 |
26 |
b
27 |
28 | Blue component (between 0 and 255). 29 |
30 |
31 |

See also

32 | SetDrawColor, 33 | SetTextColor, 34 | Rect, 35 | Cell, 36 | MultiCell 37 |
38 |
Index
39 | 40 | 41 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/rect.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Rect 6 | 7 | 8 | 9 |

Rect

10 | Rect(float x, float y, float w, float h [, string style]) 11 |

Description

12 | Outputs a rectangle. It can be drawn (border only), filled (with no border) or both. 13 |

Parameters

14 |
15 |
x
16 |
17 | Abscissa of upper-left corner. 18 |
19 |
y
20 |
21 | Ordinate of upper-left corner. 22 |
23 |
w
24 |
25 | Width. 26 |
27 |
h
28 |
29 | Height. 30 |
31 |
style
32 |
33 | Style of rendering. Possible values are: 34 | 39 |
40 |
41 |

See also

42 | SetLineWidth, 43 | SetDrawColor, 44 | SetFillColor 45 |
46 |
Index
47 | 48 | 49 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/util/touch/index.js: -------------------------------------------------------------------------------- 1 | import Swipe from './swipe'; 2 | 3 | class Touch { 4 | constructor(element, event = 'swipe', options = {}) { 5 | this._element = element; 6 | this._event = event; 7 | 8 | // events 9 | 10 | this.swipe = new Swipe(element, options); 11 | 12 | // handlers 13 | 14 | this._touchStartHandler = this._handleTouchStart.bind(this); 15 | this._touchMoveHandler = this._handleTouchMove.bind(this); 16 | this._touchEndHandler = this._handleTouchEnd.bind(this); 17 | } 18 | 19 | dispose() { 20 | this._element.removeEventListener('touchstart', this._touchStartHandler); 21 | this._element.removeEventListener('touchmove', this._touchMoveHandler); 22 | window.removeEventListener('touchend', this._touchEndHandler); 23 | } 24 | 25 | init() { 26 | // istanbul ignore next 27 | this._element.addEventListener('touchstart', (e) => this._handleTouchStart(e)); 28 | // istanbul ignore next 29 | this._element.addEventListener('touchmove', (e) => this._handleTouchMove(e)); 30 | // istanbul ignore next 31 | window.addEventListener('touchend', (e) => this._handleTouchEnd(e)); 32 | } 33 | 34 | _handleTouchStart(e) { 35 | this[this._event].handleTouchStart(e); 36 | } 37 | 38 | _handleTouchMove(e) { 39 | this[this._event].handleTouchMove(e); 40 | } 41 | 42 | _handleTouchEnd(e) { 43 | this[this._event].handleTouchEnd(e); 44 | } 45 | } 46 | 47 | export default Touch; 48 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setdrawcolor.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetDrawColor 6 | 7 | 8 | 9 |

SetDrawColor

10 | SetDrawColor(int r [, int g, int b]) 11 |

Description

12 | Defines the color used for all drawing operations (lines, rectangles and cell borders). It 13 | can be expressed in RGB components or gray scale. The method can be called before the first 14 | page is created and the value is retained from page to page. 15 |

Parameters

16 |
17 |
r
18 |
19 | If g et b are given, red component; if not, indicates the gray level. 20 | Value between 0 and 255. 21 |
22 |
g
23 |
24 | Green component (between 0 and 255). 25 |
26 |
b
27 |
28 | Blue component (between 0 and 255). 29 |
30 |
31 |

See also

32 | SetFillColor, 33 | SetTextColor, 34 | Line, 35 | Rect, 36 | Cell, 37 | MultiCell 38 |
39 |
Index
40 | 41 | 42 | -------------------------------------------------------------------------------- /backend/config/Controller.php: -------------------------------------------------------------------------------- 1 | "localhost", 37 | "aud" => "localhost", 38 | "iat" => $iat, 39 | 'exp' => $exp, 40 | 'reference' => $reference, 41 | 'role' => $role, 42 | 'hash' => $hash, 43 | ); 44 | 45 | $jwt = JWT::encode($payload, $this->key, 'HS512'); 46 | 47 | return $jwt; 48 | } 49 | public function verifyAuth($token){ 50 | $decoded = JWT::decode($token, $this->key, array('HS512')); 51 | return $decoded; 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /vendor/firebase/php-jwt/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011, Neuman Vong 2 | 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | * Redistributions of source code must retain the above copyright 9 | notice, this list of conditions and the following disclaimer. 10 | 11 | * Redistributions in binary form must reproduce the above 12 | copyright notice, this list of conditions and the following 13 | disclaimer in the documentation and/or other materials provided 14 | with the distribution. 15 | 16 | * Neither the name of Neuman Vong nor the names of other 17 | contributors may be used to endorse or promote products derived 18 | from this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 | -------------------------------------------------------------------------------- /backend/config/Core.php: -------------------------------------------------------------------------------- 1 | getUrl(); //get the url 17 | if ($url?file_exists('../backend/controllers/' . ucwords($url[0]) . '.php'):null) { 18 | $this->Controller = ucwords($url[0]); 19 | unset($url[0]); 20 | } 21 | 22 | require_once '../backend/controllers/' . $this->Controller . '.php'; 23 | $this->Controller = new $this->Controller; 24 | 25 | if (isset($url[1])) { 26 | if (method_exists($this->Controller, $url[1])) { 27 | $this->Method = $url[1]; 28 | unset($url[1]); 29 | } 30 | } 31 | 32 | $this->Controller->data = file_get_contents("php://input") ? json_decode(file_get_contents("php://input")) : []; 33 | $this->params = $url ? array_values($url) : []; 34 | 35 | call_user_func_array([$this->Controller, $this->Method], $this->params); 36 | 37 | } 38 | 39 | public function getUrl() 40 | { 41 | if (isset($_GET['url'])) { 42 | $url = rtrim($_GET['url'], '/'); 43 | $url = filter_var($url, FILTER_SANITIZE_URL); 44 | $url = explode('/', $url); 45 | return $url; 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/write.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Write 6 | 7 | 8 | 9 |

Write

10 | Write(float h, string txt [, mixed link]) 11 |

Description

12 | This method prints text from the current position. When the right margin is reached (or the \n 13 | character is met) a line break occurs and text continues from the left margin. Upon method exit, 14 | the current position is left just at the end of the text. 15 |
16 | It is possible to put a link on the text. 17 |

Parameters

18 |
19 |
h
20 |
21 | Line height. 22 |
23 |
txt
24 |
25 | String to print. 26 |
27 |
link
28 |
29 | URL or identifier returned by AddLink(). 30 |
31 |
32 |

Example

33 |
34 |
// Begin with regular font
35 | $pdf->SetFont('Arial','',14);
36 | $pdf->Write(5,'Visit ');
37 | // Then put a blue underlined link
38 | $pdf->SetTextColor(0,0,255);
39 | $pdf->SetFont('','U');
40 | $pdf->Write(5,'www.fpdf.org','http://www.fpdf.org');
41 |
42 |

See also

43 | SetFont, 44 | SetTextColor, 45 | AddLink, 46 | MultiCell, 47 | SetAutoPageBreak 48 |
49 |
Index
50 | 51 | 52 | -------------------------------------------------------------------------------- /front/src/App.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 12 | 13 | 46 | 47 | 82 | -------------------------------------------------------------------------------- /frontend/js/index.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | let newUser = new User() 5 | 6 | const loginEmail = document.querySelector('#loginEmail') 7 | const loginPassword = document.querySelector('#loginPassword') 8 | const formLogin = document.querySelector('#auth-login'); 9 | const formRegister = document.querySelector('#auth-register'); 10 | 11 | 12 | formLogin?formLogin.addEventListener('submit', (e) => { 13 | e.preventDefault() 14 | login() 15 | }):null 16 | formRegister?formRegister.addEventListener('submit', (e) => { 17 | e.preventDefault() 18 | register() 19 | }):null 20 | 21 | function login() { 22 | newUser.login(loginEmail.value, loginPassword.value) 23 | setTimeout(() => { 24 | console.log(newUser.currentUser) 25 | }, 300); 26 | 27 | } 28 | 29 | function register() { 30 | const email = document.querySelector('#registerEmail').value 31 | const cin = document.querySelector('#registerCin').value 32 | const first_name = document.querySelector('#registerfirst_name').value 33 | const last_name = document.querySelector('#registerlast_name').value 34 | const address = document.querySelector('#registerAddress').value 35 | const num_passport = document.querySelector('#registerPassport').value 36 | const birth_date = document.querySelector('#registerBirthday').value 37 | const phone = document.querySelector('#registerPhone').value 38 | const password = document.querySelector('#registerPassword').value 39 | const password_repeat = document.querySelector('#registerRepeatPassword').value 40 | 41 | let data = { 42 | email, 43 | cin, 44 | first_name, 45 | last_name, 46 | address, 47 | num_passport, 48 | birth_date, 49 | password, 50 | phone, 51 | password_repeat, 52 | role:"Admin" 53 | } 54 | 55 | newUser.register(data) 56 | } 57 | 58 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/dom/data.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v5.0.0-beta2): dom/data.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | /** 9 | * ------------------------------------------------------------------------ 10 | * Constants 11 | * ------------------------------------------------------------------------ 12 | */ 13 | 14 | const mapData = (() => { 15 | const storeData = {}; 16 | let id = 1; 17 | return { 18 | set(element, key, data) { 19 | if (typeof element[key] === 'undefined') { 20 | element[key] = { 21 | key, 22 | id, 23 | }; 24 | id++; 25 | } 26 | 27 | storeData[element[key].id] = data; 28 | }, 29 | get(element, key) { 30 | if (!element || typeof element[key] === 'undefined') { 31 | return null; 32 | } 33 | 34 | const keyProperties = element[key]; 35 | if (keyProperties.key === key) { 36 | return storeData[keyProperties.id]; 37 | } 38 | 39 | return null; 40 | }, 41 | delete(element, key) { 42 | if (typeof element[key] === 'undefined') { 43 | return; 44 | } 45 | 46 | const keyProperties = element[key]; 47 | if (keyProperties.key === key) { 48 | delete storeData[keyProperties.id]; 49 | delete element[key]; 50 | } 51 | }, 52 | }; 53 | })(); 54 | 55 | const Data = { 56 | setData(instance, key, data) { 57 | mapData.set(instance, key, data); 58 | }, 59 | getData(instance, key) { 60 | return mapData.get(instance, key); 61 | }, 62 | removeData(instance, key) { 63 | mapData.delete(instance, key); 64 | }, 65 | }; 66 | 67 | export default Data; 68 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/src/dom/data.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v5.0.0-beta3): dom/data.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | /** 9 | * ------------------------------------------------------------------------ 10 | * Constants 11 | * ------------------------------------------------------------------------ 12 | */ 13 | 14 | const elementMap = new Map(); 15 | 16 | export default { 17 | set(element, key, instance) { 18 | if (!elementMap.has(element)) { 19 | elementMap.set(element, new Map()); 20 | } 21 | 22 | const instanceMap = elementMap.get(element); 23 | 24 | // make it clear we only want one instance per element 25 | // can be removed later when multiple key/instances are fine to be used 26 | if (!instanceMap.has(key) && instanceMap.size !== 0) { 27 | // eslint-disable-next-line no-console 28 | console.error( 29 | `Bootstrap doesn't allow more than one instance per element. Bound instance: ${ 30 | Array.from(instanceMap.keys())[0] 31 | }.` 32 | ); 33 | return; 34 | } 35 | 36 | instanceMap.set(key, instance); 37 | }, 38 | 39 | get(element, key) { 40 | if (elementMap.has(element)) { 41 | return elementMap.get(element).get(key) || null; 42 | } 43 | 44 | return null; 45 | }, 46 | 47 | remove(element, key) { 48 | if (!elementMap.has(element)) { 49 | return; 50 | } 51 | 52 | const instanceMap = elementMap.get(element); 53 | 54 | instanceMap.delete(key); 55 | 56 | // free up element references if there are no instances left for an element 57 | if (instanceMap.size === 0) { 58 | elementMap.delete(element); 59 | } 60 | }, 61 | }; 62 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/util/touch/swipe.js: -------------------------------------------------------------------------------- 1 | import TouchUtil from './touchUtil'; 2 | import EventHandler from '../../dom/event-handler'; 3 | 4 | const DEFAULT_OPTIONS = { 5 | threshold: 10, 6 | direction: 'all', 7 | }; 8 | 9 | class Swipe extends TouchUtil { 10 | constructor(element, options) { 11 | super(); 12 | this._element = element; 13 | this._startPosition = null; 14 | this._options = { 15 | ...DEFAULT_OPTIONS, 16 | ...options, 17 | }; 18 | } 19 | 20 | handleTouchStart(e) { 21 | this._startPosition = this._getCoordinates(e); 22 | } 23 | 24 | handleTouchMove(e) { 25 | if (!this._startPosition) return; 26 | 27 | const position = this._getCoordinates(e); 28 | const displacement = { 29 | x: position.x - this._startPosition.x, 30 | y: position.y - this._startPosition.y, 31 | }; 32 | 33 | const swipe = this._getDirection(displacement); 34 | 35 | if (this._options.direction === 'all') { 36 | if (swipe.y.value < this._options.threshold && swipe.x.value < this._options.threshold) { 37 | return; 38 | } 39 | const direction = swipe.y.value > swipe.x.value ? swipe.y.direction : swipe.x.direction; 40 | EventHandler.trigger(this._element, `swipe${direction}`); 41 | EventHandler.trigger(this._element, 'swipe', { direction }); 42 | this._startPosition = null; 43 | return; 44 | } 45 | 46 | const axis = this._options.direction === 'left' || this._options === 'right' ? 'x' : 'y'; 47 | 48 | if ( 49 | swipe[axis].direction === this._options.direction && 50 | swipe[axis].value > this._options.threshold 51 | ) { 52 | EventHandler.trigger(this._element, `swipe${swipe[axis].direction}`); 53 | this._startPosition = null; 54 | } 55 | } 56 | 57 | handleTouchEnd() { 58 | this._startPosition = null; 59 | } 60 | } 61 | 62 | export default Swipe; 63 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/setdisplaymode.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SetDisplayMode 6 | 7 | 8 | 9 |

SetDisplayMode

10 | SetDisplayMode(mixed zoom [, string layout]) 11 |

Description

12 | Defines the way the document is to be displayed by the viewer. The zoom level can be set: pages can be 13 | displayed entirely on screen, occupy the full width of the window, use real size, be scaled by a 14 | specific zooming factor or use viewer default (configured in the Preferences menu of Adobe Reader). 15 | The page layout can be specified too: single at once, continuous display, two columns or viewer 16 | default. 17 |

Parameters

18 |
19 |
zoom
20 |
21 | The zoom to use. It can be one of the following string values: 22 | 28 | or a number indicating the zooming factor to use. 29 |
30 |
layout
31 |
32 | The page layout. Possible values are: 33 | 39 | Default value is default. 40 |
41 |
42 |
43 |
Index
44 | 45 | 46 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/mdb-prefix/dom/data.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v5.0.0-beta3): dom/data.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | /** 9 | * ------------------------------------------------------------------------ 10 | * Constants 11 | * ------------------------------------------------------------------------ 12 | */ 13 | 14 | const elementMap = new Map(); 15 | 16 | export default { 17 | set(element, key, instance) { 18 | if (!elementMap.has(element)) { 19 | elementMap.set(element, new Map()); 20 | } 21 | 22 | const instanceMap = elementMap.get(element); 23 | 24 | // make it clear we only want one instance per element 25 | // can be removed later when multiple key/instances are fine to be used 26 | if (!instanceMap.has(key) && instanceMap.size !== 0) { 27 | // eslint-disable-next-line no-console 28 | console.error( 29 | `Bootstrap doesn't allow more than one instance per element. Bound instance: ${ 30 | Array.from(instanceMap.keys())[0] 31 | }.` 32 | ); 33 | return; 34 | } 35 | 36 | instanceMap.set(key, instance); 37 | }, 38 | 39 | get(element, key) { 40 | if (elementMap.has(element)) { 41 | return elementMap.get(element).get(key) || null; 42 | } 43 | 44 | return null; 45 | }, 46 | 47 | remove(element, key) { 48 | if (!elementMap.has(element)) { 49 | return; 50 | } 51 | 52 | const instanceMap = elementMap.get(element); 53 | 54 | instanceMap.delete(key); 55 | 56 | // free up element references if there are no instances left for an element 57 | if (instanceMap.size === 0) { 58 | elementMap.delete(element); 59 | } 60 | }, 61 | }; 62 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/output.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Output 6 | 7 | 8 | 9 |

Output

10 | string Output([string dest [, string name [, boolean isUTF8]]]) 11 |

Description

12 | Send the document to a given destination: browser, file or string. In the case of a browser, the 13 | PDF viewer may be used or a download may be forced. 14 |
15 | The method first calls Close() if necessary to terminate the document. 16 |

Parameters

17 |
18 |
dest
19 |
20 | Destination where to send the document. It can be one of the following: 21 | 27 | The default value is I. 28 |
29 |
name
30 |
31 | The name of the file. It is ignored in case of destination S.
32 | The default value is doc.pdf. 33 |
34 |
isUTF8
35 |
36 | Indicates if name is encoded in ISO-8859-1 (false) or UTF-8 (true). 37 | Only used for destinations I and D.
38 | The default value is false. 39 |
40 |
41 |

See also

42 | Close 43 |
44 |
Index
45 | 46 | 47 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/acceptpagebreak.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AcceptPageBreak 6 | 7 | 8 | 9 |

AcceptPageBreak

10 | boolean AcceptPageBreak() 11 |

Description

12 | Whenever a page break condition is met, the method is called, and the break is issued or not 13 | depending on the returned value. The default implementation returns a value according to the 14 | mode selected by SetAutoPageBreak(). 15 |
16 | This method is called automatically and should not be called directly by the application. 17 |

Example

18 | The method is overriden in an inherited class in order to obtain a 3 column layout: 19 |
20 |
class PDF extends FPDF
21 | {
22 | var $col = 0;
23 | 
24 | function SetCol($col)
25 | {
26 |     // Move position to a column
27 |     $this->col = $col;
28 |     $x = 10+$col*65;
29 |     $this->SetLeftMargin($x);
30 |     $this->SetX($x);
31 | }
32 | 
33 | function AcceptPageBreak()
34 | {
35 |     if($this->col<2)
36 |     {
37 |         // Go to next column
38 |         $this->SetCol($this->col+1);
39 |         $this->SetY(10);
40 |         return false;
41 |     }
42 |     else
43 |     {
44 |         // Go back to first column and issue page break
45 |         $this->SetCol(0);
46 |         return true;
47 |     }
48 | }
49 | }
50 | 
51 | $pdf = new PDF();
52 | $pdf->AddPage();
53 | $pdf->SetFont('Arial','',12);
54 | for($i=1;$i<=300;$i++)
55 |     $pdf->Cell(0,5,"Line $i",0,1);
56 | $pdf->Output();
57 |
58 |

See also

59 | SetAutoPageBreak 60 |
61 |
Index
62 | 63 | 64 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/addfont.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AddFont 6 | 7 | 8 | 9 |

AddFont

10 | AddFont(string family [, string style [, string file]]) 11 |

Description

12 | Imports a TrueType, OpenType or Type1 font and makes it available. It is necessary to generate a font 13 | definition file first with the MakeFont utility. 14 |
15 | The definition file (and the font file itself when embedding) must be present in the font directory. 16 | If it is not found, the error "Could not include font definition file" is raised. 17 |

Parameters

18 |
19 |
family
20 |
21 | Font family. The name can be chosen arbitrarily. If it is a standard family name, it will 22 | override the corresponding font. 23 |
24 |
style
25 |
26 | Font style. Possible values are (case insensitive): 27 | 33 | The default value is regular. 34 |
35 |
file
36 |
37 | The font definition file. 38 |
39 | By default, the name is built from the family and style, in lower case with no space. 40 |
41 |
42 |

Example

43 |
44 |
$pdf->AddFont('Comic','I');
45 |
46 | is equivalent to: 47 |
48 |
$pdf->AddFont('Comic','I','comici.php');
49 |
50 |

See also

51 | SetFont 52 |
53 |
Index
54 | 55 | 56 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/perfect-scrollbar/process-scroll-diff.js: -------------------------------------------------------------------------------- 1 | import { setScrollingClassInstantly } from './lib/class-names'; 2 | 3 | function createEvent(name) { 4 | if (typeof window.CustomEvent === 'function') { 5 | return new CustomEvent(name); 6 | } 7 | 8 | const evt = document.createEvent('CustomEvent'); 9 | evt.initCustomEvent(name, false, false, undefined); 10 | return evt; 11 | } 12 | 13 | export default function (i, axis, diff, useScrollingClass = true, forceFireReachEvent = false) { 14 | let fields; 15 | if (axis === 'top') { 16 | fields = ['contentHeight', 'containerHeight', 'scrollTop', 'y', 'up', 'down']; 17 | } else if (axis === 'left') { 18 | fields = ['contentWidth', 'containerWidth', 'scrollLeft', 'x', 'left', 'right']; 19 | } else { 20 | throw new Error('A proper axis should be provided'); 21 | } 22 | 23 | processScrollDiff(i, diff, fields, useScrollingClass, forceFireReachEvent); 24 | } 25 | 26 | function processScrollDiff( 27 | i, 28 | diff, 29 | [contentHeight, containerHeight, scrollTop, y, up, down], 30 | useScrollingClass = true, 31 | forceFireReachEvent = false 32 | ) { 33 | const element = i.element; 34 | 35 | // reset reach 36 | i.reach[y] = null; 37 | 38 | // 1 for subpixel rounding 39 | if (element[scrollTop] < 1) { 40 | i.reach[y] = 'start'; 41 | } 42 | 43 | // 1 for subpixel rounding 44 | if (element[scrollTop] > i[contentHeight] - i[containerHeight] - 1) { 45 | i.reach[y] = 'end'; 46 | } 47 | 48 | if (diff) { 49 | element.dispatchEvent(createEvent(`ps-scroll-${y}`)); 50 | 51 | if (diff < 0) { 52 | element.dispatchEvent(createEvent(`ps-scroll-${up}`)); 53 | } else if (diff > 0) { 54 | element.dispatchEvent(createEvent(`ps-scroll-${down}`)); 55 | } 56 | 57 | if (useScrollingClass) { 58 | setScrollingClassInstantly(i, y); 59 | } 60 | } 61 | 62 | if (i.reach[y] && (diff || forceFireReachEvent)) { 63 | element.dispatchEvent(createEvent(`ps-${y}-reach-${i.reach[y]}`)); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /backend/models/RDVModel.php: -------------------------------------------------------------------------------- 1 | db = new DB(); 9 | } 10 | 11 | public function getRDVs($date) 12 | { 13 | $this->db->query("SELECT * FROM slots where date = :date ORDER BY slot ASC "); 14 | $this->db->bind(':date', $date); 15 | return $this->db->all(); 16 | } 17 | 18 | public function RDVInfo($id) 19 | { 20 | $this->db->query("SELECT * FROM slots WHERE id = :id"); 21 | $this->db->bind(':id', $id); 22 | return $this->db->single(); 23 | } 24 | 25 | public function RDVInfoByRef($rdv) 26 | { 27 | $this->db->query("SELECT * FROM slots WHERE refenrence_id = :rdv"); 28 | $this->db->bind(':rdv', $rdv); 29 | return $this->db->single(); 30 | } 31 | 32 | 33 | 34 | public function getRDVsByDate($date) 35 | { 36 | $this->db->query("SELECT * FROM slots WHERE date = :date"); 37 | $this->db->bind(':date', $date); 38 | return $this->db->single(); 39 | } 40 | 41 | 42 | public function add($data, $reference) 43 | { 44 | try { 45 | $this->db->query("INSERT INTO 46 | slots 47 | SET 48 | date = :date, 49 | slot = :slot, 50 | refenrence_id = :reference 51 | "); 52 | 53 | $this->db->bind(':date', $data->date); 54 | $this->db->bind(':slot', $data->slot); 55 | $this->db->bind(':reference', $data->reference); 56 | $this->db->single(); 57 | } catch (\PDOExeption $err) { 58 | return $err->getMessage(); 59 | die(); 60 | } 61 | return true; 62 | } 63 | 64 | public function delete($data) 65 | { 66 | $this->db->query('DELETE FROM slots WHERE id=:id'); 67 | $this->db->bind(':id', $data->id); 68 | $this->db->execute(); 69 | } 70 | 71 | 72 | 73 | 74 | } 75 | -------------------------------------------------------------------------------- /vendor/fpdf/tutorial/tuto3.php: -------------------------------------------------------------------------------- 1 | SetFont('Arial','B',15); 12 | // Calculate width of title and position 13 | $w = $this->GetStringWidth($title)+6; 14 | $this->SetX((210-$w)/2); 15 | // Colors of frame, background and text 16 | $this->SetDrawColor(0,80,180); 17 | $this->SetFillColor(230,230,0); 18 | $this->SetTextColor(220,50,50); 19 | // Thickness of frame (1 mm) 20 | $this->SetLineWidth(1); 21 | // Title 22 | $this->Cell($w,9,$title,1,1,'C',true); 23 | // Line break 24 | $this->Ln(10); 25 | } 26 | 27 | function Footer() 28 | { 29 | // Position at 1.5 cm from bottom 30 | $this->SetY(-15); 31 | // Arial italic 8 32 | $this->SetFont('Arial','I',8); 33 | // Text color in gray 34 | $this->SetTextColor(128); 35 | // Page number 36 | $this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C'); 37 | } 38 | 39 | function ChapterTitle($num, $label) 40 | { 41 | // Arial 12 42 | $this->SetFont('Arial','',12); 43 | // Background color 44 | $this->SetFillColor(200,220,255); 45 | // Title 46 | $this->Cell(0,6,"Chapter $num : $label",0,1,'L',true); 47 | // Line break 48 | $this->Ln(4); 49 | } 50 | 51 | function ChapterBody($file) 52 | { 53 | // Read text file 54 | $txt = file_get_contents($file); 55 | // Times 12 56 | $this->SetFont('Times','',12); 57 | // Output justified text 58 | $this->MultiCell(0,5,$txt); 59 | // Line break 60 | $this->Ln(); 61 | // Mention in italics 62 | $this->SetFont('','I'); 63 | $this->Cell(0,5,'(end of excerpt)'); 64 | } 65 | 66 | function PrintChapter($num, $title, $file) 67 | { 68 | $this->AddPage(); 69 | $this->ChapterTitle($num,$title); 70 | $this->ChapterBody($file); 71 | } 72 | } 73 | 74 | $pdf = new PDF(); 75 | $title = '20000 Leagues Under the Seas'; 76 | $pdf->SetTitle($title); 77 | $pdf->SetAuthor('Jules Verne'); 78 | $pdf->PrintChapter(1,'A RUNAWAY REEF','20k_c1.txt'); 79 | $pdf->PrintChapter(2,'THE PROS AND CONS','20k_c2.txt'); 80 | $pdf->Output(); 81 | ?> 82 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/dist/base-component.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"base-component.js","sources":["../src/base-component.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta3): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst VERSION = '5.0.0-beta3'\n\nclass BaseComponent {\n constructor(element) {\n element = typeof element === 'string' ? document.querySelector(element) : element\n\n if (!element) {\n return\n }\n\n this._element = element\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n this._element = null\n }\n\n /** Static */\n\n static getInstance(element) {\n return Data.get(element, this.DATA_KEY)\n }\n\n static get VERSION() {\n return VERSION\n }\n}\n\nexport default BaseComponent\n"],"names":["VERSION","BaseComponent","constructor","element","document","querySelector","_element","Data","set","DATA_KEY","dispose","remove","getInstance","get"],"mappings":";;;;;;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;EAIA;EACA;EACA;EACA;EACA;;EAEA,MAAMA,OAAO,GAAG,aAAhB;;EAEA,MAAMC,aAAN,CAAoB;EAClBC,EAAAA,WAAW,CAACC,OAAD,EAAU;EACnBA,IAAAA,OAAO,GAAG,OAAOA,OAAP,KAAmB,QAAnB,GAA8BC,QAAQ,CAACC,aAAT,CAAuBF,OAAvB,CAA9B,GAAgEA,OAA1E;;EAEA,QAAI,CAACA,OAAL,EAAc;EACZ;EACD;;EAED,SAAKG,QAAL,GAAgBH,OAAhB;EACAI,IAAAA,wBAAI,CAACC,GAAL,CAAS,KAAKF,QAAd,EAAwB,KAAKJ,WAAL,CAAiBO,QAAzC,EAAmD,IAAnD;EACD;;EAEDC,EAAAA,OAAO,GAAG;EACRH,IAAAA,wBAAI,CAACI,MAAL,CAAY,KAAKL,QAAjB,EAA2B,KAAKJ,WAAL,CAAiBO,QAA5C;EACA,SAAKH,QAAL,GAAgB,IAAhB;EACD;EAED;;;EAEkB,SAAXM,WAAW,CAACT,OAAD,EAAU;EAC1B,WAAOI,wBAAI,CAACM,GAAL,CAASV,OAAT,EAAkB,KAAKM,QAAvB,CAAP;EACD;;EAEiB,aAAPT,OAAO,GAAG;EACnB,WAAOA,OAAP;EACD;;EAzBiB;;;;;;;;"} -------------------------------------------------------------------------------- /vendor/composer/autoload_real.php: -------------------------------------------------------------------------------- 1 | = 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); 32 | if ($useStaticLoader) { 33 | require __DIR__ . '/autoload_static.php'; 34 | 35 | call_user_func(\Composer\Autoload\ComposerStaticInit1c3260cfa4cff3800f50c4f7595d8739::getInitializer($loader)); 36 | } else { 37 | $map = require __DIR__ . '/autoload_namespaces.php'; 38 | foreach ($map as $namespace => $path) { 39 | $loader->set($namespace, $path); 40 | } 41 | 42 | $map = require __DIR__ . '/autoload_psr4.php'; 43 | foreach ($map as $namespace => $path) { 44 | $loader->setPsr4($namespace, $path); 45 | } 46 | 47 | $classMap = require __DIR__ . '/autoload_classmap.php'; 48 | if ($classMap) { 49 | $loader->addClassMap($classMap); 50 | } 51 | } 52 | 53 | $loader->register(true); 54 | 55 | return $loader; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /front/src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 40 | 41 | 42 | 59 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/src/dom/selector-engine.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v5.0.0-beta3): dom/selector-engine.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | /** 9 | * ------------------------------------------------------------------------ 10 | * Constants 11 | * ------------------------------------------------------------------------ 12 | */ 13 | 14 | const NODE_TEXT = 3; 15 | 16 | const SelectorEngine = { 17 | find(selector, element = document.documentElement) { 18 | return [].concat(...Element.prototype.querySelectorAll.call(element, selector)); 19 | }, 20 | 21 | findOne(selector, element = document.documentElement) { 22 | return Element.prototype.querySelector.call(element, selector); 23 | }, 24 | 25 | children(element, selector) { 26 | return [].concat(...element.children).filter((child) => child.matches(selector)); 27 | }, 28 | 29 | parents(element, selector) { 30 | const parents = []; 31 | 32 | let ancestor = element.parentNode; 33 | 34 | while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) { 35 | if (ancestor.matches(selector)) { 36 | parents.push(ancestor); 37 | } 38 | 39 | ancestor = ancestor.parentNode; 40 | } 41 | 42 | return parents; 43 | }, 44 | 45 | prev(element, selector) { 46 | let previous = element.previousElementSibling; 47 | 48 | while (previous) { 49 | if (previous.matches(selector)) { 50 | return [previous]; 51 | } 52 | 53 | previous = previous.previousElementSibling; 54 | } 55 | 56 | return []; 57 | }, 58 | 59 | next(element, selector) { 60 | let next = element.nextElementSibling; 61 | 62 | while (next) { 63 | if (next.matches(selector)) { 64 | return [next]; 65 | } 66 | 67 | next = next.nextElementSibling; 68 | } 69 | 70 | return []; 71 | }, 72 | }; 73 | 74 | export default SelectorEngine; 75 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/mdb-prefix/dom/selector-engine.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v5.0.0-beta3): dom/selector-engine.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | /** 9 | * ------------------------------------------------------------------------ 10 | * Constants 11 | * ------------------------------------------------------------------------ 12 | */ 13 | 14 | const NODE_TEXT = 3; 15 | 16 | const SelectorEngine = { 17 | find(selector, element = document.documentElement) { 18 | return [].concat(...Element.prototype.querySelectorAll.call(element, selector)); 19 | }, 20 | 21 | findOne(selector, element = document.documentElement) { 22 | return Element.prototype.querySelector.call(element, selector); 23 | }, 24 | 25 | children(element, selector) { 26 | return [].concat(...element.children).filter((child) => child.matches(selector)); 27 | }, 28 | 29 | parents(element, selector) { 30 | const parents = []; 31 | 32 | let ancestor = element.parentNode; 33 | 34 | while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) { 35 | if (ancestor.matches(selector)) { 36 | parents.push(ancestor); 37 | } 38 | 39 | ancestor = ancestor.parentNode; 40 | } 41 | 42 | return parents; 43 | }, 44 | 45 | prev(element, selector) { 46 | let previous = element.previousElementSibling; 47 | 48 | while (previous) { 49 | if (previous.matches(selector)) { 50 | return [previous]; 51 | } 52 | 53 | previous = previous.previousElementSibling; 54 | } 55 | 56 | return []; 57 | }, 58 | 59 | next(element, selector) { 60 | let next = element.nextElementSibling; 61 | 62 | while (next) { 63 | if (next.matches(selector)) { 64 | return [next]; 65 | } 66 | 67 | next = next.nextElementSibling; 68 | } 69 | 70 | return []; 71 | }, 72 | }; 73 | 74 | export default SelectorEngine; 75 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/src/dom/manipulator.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v5.0.0-beta3): dom/manipulator.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | function normalizeData(val) { 9 | if (val === 'true') { 10 | return true; 11 | } 12 | 13 | if (val === 'false') { 14 | return false; 15 | } 16 | 17 | if (val === Number(val).toString()) { 18 | return Number(val); 19 | } 20 | 21 | if (val === '' || val === 'null') { 22 | return null; 23 | } 24 | 25 | return val; 26 | } 27 | 28 | function normalizeDataKey(key) { 29 | return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`); 30 | } 31 | 32 | const Manipulator = { 33 | setDataAttribute(element, key, value) { 34 | element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value); 35 | }, 36 | 37 | removeDataAttribute(element, key) { 38 | element.removeAttribute(`data-bs-${normalizeDataKey(key)}`); 39 | }, 40 | 41 | getDataAttributes(element) { 42 | if (!element) { 43 | return {}; 44 | } 45 | 46 | const attributes = {}; 47 | 48 | Object.keys(element.dataset) 49 | .filter((key) => key.startsWith('bs')) 50 | .forEach((key) => { 51 | let pureKey = key.replace(/^bs/, ''); 52 | pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); 53 | attributes[pureKey] = normalizeData(element.dataset[key]); 54 | }); 55 | 56 | return attributes; 57 | }, 58 | 59 | getDataAttribute(element, key) { 60 | return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`)); 61 | }, 62 | 63 | offset(element) { 64 | const rect = element.getBoundingClientRect(); 65 | 66 | return { 67 | top: rect.top + document.body.scrollTop, 68 | left: rect.left + document.body.scrollLeft, 69 | }; 70 | }, 71 | 72 | position(element) { 73 | return { 74 | top: element.offsetTop, 75 | left: element.offsetLeft, 76 | }; 77 | }, 78 | }; 79 | 80 | export default Manipulator; 81 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/perfect-scrollbar/lib/event-manager.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | class EventElement { 3 | constructor(element) { 4 | this.element = element; 5 | this.handlers = {}; 6 | } 7 | 8 | bind(eventName, handler) { 9 | if (typeof this.handlers[eventName] === 'undefined') { 10 | this.handlers[eventName] = []; 11 | } 12 | this.handlers[eventName].push(handler); 13 | this.element.addEventListener(eventName, handler, false); 14 | } 15 | 16 | unbind(eventName, target) { 17 | this.handlers[eventName] = this.handlers[eventName].filter((handler) => { 18 | if (target && handler !== target) { 19 | return true; 20 | } 21 | this.element.removeEventListener(eventName, handler, false); 22 | return false; 23 | }); 24 | } 25 | 26 | unbindAll() { 27 | for (const name in this.handlers) { 28 | this.unbind(name); 29 | } 30 | } 31 | 32 | get isEmpty() { 33 | return Object.keys(this.handlers).every((key) => this.handlers[key].length === 0); 34 | } 35 | } 36 | 37 | export default class EventManager { 38 | constructor() { 39 | this.eventElements = []; 40 | } 41 | 42 | eventElement(element) { 43 | let ee = this.eventElements.filter((ee) => ee.element === element)[0]; 44 | if (!ee) { 45 | ee = new EventElement(element); 46 | this.eventElements.push(ee); 47 | } 48 | return ee; 49 | } 50 | 51 | bind(element, eventName, handler) { 52 | this.eventElement(element).bind(eventName, handler); 53 | } 54 | 55 | unbind(element, eventName, handler) { 56 | const ee = this.eventElement(element); 57 | ee.unbind(eventName, handler); 58 | 59 | if (ee.isEmpty) { 60 | // remove 61 | this.eventElements.splice(this.eventElements.indexOf(ee), 1); 62 | } 63 | } 64 | 65 | unbindAll() { 66 | this.eventElements.forEach((e) => e.unbindAll()); 67 | this.eventElements = []; 68 | } 69 | 70 | once(element, eventName, handler) { 71 | const ee = this.eventElement(element); 72 | const onceHandler = (evt) => { 73 | ee.unbind(eventName, onceHandler); 74 | handler(evt); 75 | }; 76 | ee.bind(eventName, onceHandler); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/mdb-prefix/dom/manipulator.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v5.0.0-beta3): dom/manipulator.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | function normalizeData(val) { 9 | if (val === 'true') { 10 | return true; 11 | } 12 | 13 | if (val === 'false') { 14 | return false; 15 | } 16 | 17 | if (val === Number(val).toString()) { 18 | return Number(val); 19 | } 20 | 21 | if (val === '' || val === 'null') { 22 | return null; 23 | } 24 | 25 | return val; 26 | } 27 | 28 | function normalizeDataKey(key) { 29 | return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`); 30 | } 31 | 32 | const Manipulator = { 33 | setDataAttribute(element, key, value) { 34 | element.setAttribute(`data-mdb-${normalizeDataKey(key)}`, value); 35 | }, 36 | 37 | removeDataAttribute(element, key) { 38 | element.removeAttribute(`data-mdb-${normalizeDataKey(key)}`); 39 | }, 40 | 41 | getDataAttributes(element) { 42 | if (!element) { 43 | return {}; 44 | } 45 | 46 | const attributes = {}; 47 | 48 | Object.keys(element.dataset) 49 | .filter((key) => key.startsWith('mdb')) 50 | .forEach((key) => { 51 | let pureKey = key.replace(/^mdb/, ''); 52 | pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); 53 | attributes[pureKey] = normalizeData(element.dataset[key]); 54 | }); 55 | 56 | return attributes; 57 | }, 58 | 59 | getDataAttribute(element, key) { 60 | return normalizeData(element.getAttribute(`data-mdb-${normalizeDataKey(key)}`)); 61 | }, 62 | 63 | offset(element) { 64 | const rect = element.getBoundingClientRect(); 65 | 66 | return { 67 | top: rect.top + document.body.scrollTop, 68 | left: rect.left + document.body.scrollLeft, 69 | }; 70 | }, 71 | 72 | position(element) { 73 | return { 74 | top: element.offsetTop, 75 | left: element.offsetLeft, 76 | }; 77 | }, 78 | }; 79 | 80 | export default Manipulator; 81 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/__construct.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | __construct 6 | 7 | 8 | 9 |

__construct

10 | __construct([string orientation [, string unit [, mixed size]]]) 11 |

Description

12 | This is the class constructor. It allows to set up the page size, the orientation and the 13 | unit of measure used in all methods (except for font sizes). 14 |

Parameters

15 |
16 |
orientation
17 |
18 | Default page orientation. Possible values are (case insensitive): 19 | 23 | Default value is P. 24 |
25 |
unit
26 |
27 | User unit. Possible values are: 28 | 34 | A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). This 35 | is a very common unit in typography; font sizes are expressed in that unit. 36 |
37 |
38 | Default value is mm. 39 |
40 |
size
41 |
42 | The size used for pages. It can be either one of the following values (case insensitive): 43 | 50 | or an array containing the width and the height (expressed in the unit given by unit).
51 |
52 | Default value is A4. 53 |
54 |
55 |

Example

56 | Example with a custom 100x150 mm page size: 57 |
58 |
$pdf = new FPDF('P','mm',array(100,150));
59 |
60 |
61 |
Index
62 | 63 | 64 | -------------------------------------------------------------------------------- /backend/config/DB.php: -------------------------------------------------------------------------------- 1 | host . ';dbname=' . $this->dbname; 18 | $optins = array( 19 | PDO::ATTR_PERSISTENT => true, 20 | PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 21 | ); 22 | 23 | try { 24 | $this->conn = new PDO($connection, $this->user, $this->pass, $optins); 25 | } catch (PDOExeption $err) { 26 | $this->error = $err->getMessage(); 27 | echo $this->error; 28 | } 29 | 30 | } 31 | 32 | public function query($sql) 33 | { 34 | $this->stmt = $this->conn->prepare($sql); 35 | } 36 | 37 | public function bind($param, $value, $type = null) 38 | { 39 | if (is_null($type)) { 40 | switch (true) { 41 | case is_int($value): 42 | $type = PDO::PARAM_INT; 43 | break; 44 | case is_bool($value): 45 | $type = PDO::PARAM_BOOL; 46 | break; 47 | case is_null($value): 48 | $type = PDO::PARAM_NULL; 49 | break; 50 | default: 51 | $type = PDO::PARAM_STR; 52 | } 53 | } 54 | $this->stmt->bindValue($param, $value, $type); 55 | } 56 | 57 | 58 | public function execute() 59 | { 60 | return $this->stmt->execute(); 61 | } 62 | 63 | 64 | public function all() 65 | { 66 | $this->execute(); 67 | return $this->stmt->fetchAll(PDO::FETCH_OBJ); 68 | } 69 | 70 | public function single() 71 | { 72 | $this->execute(); 73 | return $this->stmt->fetch(PDO::FETCH_OBJ); 74 | } 75 | 76 | public function rowCount() 77 | { 78 | return $this->stmt->rowCount(); 79 | } 80 | 81 | public function lastInsertId() 82 | { 83 | return $this->dbh->lastInsertId(); 84 | } 85 | 86 | } 87 | -------------------------------------------------------------------------------- /front/src/components/LoginForm.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 63 | 64 | 88 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/dom/selector-engine.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v5.0.0-beta2): dom/selector-engine.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | /** 9 | * ------------------------------------------------------------------------ 10 | * Constants 11 | * ------------------------------------------------------------------------ 12 | */ 13 | 14 | const NODE_TEXT = 3; 15 | 16 | const SelectorEngine = { 17 | closest(element, selector) { 18 | return element.closest(selector); 19 | }, 20 | 21 | matches(element, selector) { 22 | return element.matches(selector); 23 | }, 24 | 25 | find(selector, element = document.documentElement) { 26 | return [].concat(...Element.prototype.querySelectorAll.call(element, selector)); 27 | }, 28 | 29 | findOne(selector, element = document.documentElement) { 30 | return Element.prototype.querySelector.call(element, selector); 31 | }, 32 | 33 | children(element, selector) { 34 | const children = [].concat(...element.children); 35 | 36 | return children.filter((child) => child.matches(selector)); 37 | }, 38 | 39 | parents(element, selector) { 40 | const parents = []; 41 | 42 | let ancestor = element.parentNode; 43 | 44 | while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) { 45 | if (this.matches(ancestor, selector)) { 46 | parents.push(ancestor); 47 | } 48 | 49 | ancestor = ancestor.parentNode; 50 | } 51 | 52 | return parents; 53 | }, 54 | 55 | prev(element, selector) { 56 | let previous = element.previousElementSibling; 57 | 58 | while (previous) { 59 | if (previous.matches(selector)) { 60 | return [previous]; 61 | } 62 | 63 | previous = previous.previousElementSibling; 64 | } 65 | 66 | return []; 67 | }, 68 | 69 | next(element, selector) { 70 | let next = element.nextElementSibling; 71 | 72 | while (next) { 73 | if (this.matches(next, selector)) { 74 | return [next]; 75 | } 76 | 77 | next = next.nextElementSibling; 78 | } 79 | 80 | return []; 81 | }, 82 | }; 83 | 84 | export default SelectorEngine; 85 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/dist/base-component.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap base-component.js v5.0.0-beta3 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | */ 6 | (function (global, factory) { 7 | typeof exports === 'object' && typeof module !== 'undefined' 8 | ? (module.exports = factory(require('./dom/data.js'))) 9 | : typeof define === 'function' && define.amd 10 | ? define(['./dom/data'], factory) 11 | : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), 12 | (global.Base = factory(global.Data))); 13 | })(this, function (Data) { 14 | 'use strict'; 15 | 16 | function _interopDefaultLegacy(e) { 17 | return e && typeof e === 'object' && 'default' in e ? e : { default: e }; 18 | } 19 | 20 | var Data__default = /*#__PURE__*/ _interopDefaultLegacy(Data); 21 | 22 | /** 23 | * -------------------------------------------------------------------------- 24 | * Bootstrap (v5.0.0-beta3): base-component.js 25 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 26 | * -------------------------------------------------------------------------- 27 | */ 28 | /** 29 | * ------------------------------------------------------------------------ 30 | * Constants 31 | * ------------------------------------------------------------------------ 32 | */ 33 | 34 | const VERSION = '5.0.0-beta3'; 35 | 36 | class BaseComponent { 37 | constructor(element) { 38 | element = typeof element === 'string' ? document.querySelector(element) : element; 39 | 40 | if (!element) { 41 | return; 42 | } 43 | 44 | this._element = element; 45 | Data__default['default'].set(this._element, this.constructor.DATA_KEY, this); 46 | } 47 | 48 | dispose() { 49 | Data__default['default'].remove(this._element, this.constructor.DATA_KEY); 50 | this._element = null; 51 | } 52 | /** Static */ 53 | 54 | static getInstance(element) { 55 | return Data__default['default'].get(element, this.DATA_KEY); 56 | } 57 | 58 | static get VERSION() { 59 | return VERSION; 60 | } 61 | } 62 | 63 | return BaseComponent; 64 | }); 65 | //# sourceMappingURL=base-component.js.map 66 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/addpage.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AddPage 6 | 7 | 8 | 9 |

AddPage

10 | AddPage([string orientation [, mixed size [, int rotation]]]) 11 |

Description

12 | Adds a new page to the document. If a page is already present, the Footer() method is called 13 | first to output the footer. Then the page is added, the current position set to the top-left 14 | corner according to the left and top margins, and Header() is called to display the header. 15 |
16 | The font which was set before calling is automatically restored. There is no need to call 17 | SetFont() again if you want to continue with the same font. The same is true for colors and 18 | line width. 19 |
20 | The origin of the coordinate system is at the top-left corner and increasing ordinates go 21 | downwards. 22 |

Parameters

23 |
24 |
orientation
25 |
26 | Page orientation. Possible values are (case insensitive): 27 | 31 | The default value is the one passed to the constructor. 32 |
33 |
size
34 |
35 | Page size. It can be either one of the following values (case insensitive): 36 | 43 | or an array containing the width and the height (expressed in user unit).
44 |
45 | The default value is the one passed to the constructor. 46 |
47 |
rotation
48 |
49 | Angle by which to rotate the page. It must be a multiple of 90; positive values 50 | mean clockwise rotation. The default value is 0. 51 |
52 |
53 |

See also

54 | __construct, 55 | Header, 56 | Footer, 57 | SetMargins 58 |
59 |
Index
60 | 61 | 62 | -------------------------------------------------------------------------------- /front/src/components/AddTask.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 65 | 66 | 90 | -------------------------------------------------------------------------------- /vendor/composer/installed.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": [ 3 | { 4 | "name": "firebase/php-jwt", 5 | "version": "v5.2.1", 6 | "version_normalized": "5.2.1.0", 7 | "source": { 8 | "type": "git", 9 | "url": "https://github.com/firebase/php-jwt.git", 10 | "reference": "f42c9110abe98dd6cfe9053c49bc86acc70b2d23" 11 | }, 12 | "dist": { 13 | "type": "zip", 14 | "url": "https://api.github.com/repos/firebase/php-jwt/zipball/f42c9110abe98dd6cfe9053c49bc86acc70b2d23", 15 | "reference": "f42c9110abe98dd6cfe9053c49bc86acc70b2d23", 16 | "shasum": "" 17 | }, 18 | "require": { 19 | "php": ">=5.3.0" 20 | }, 21 | "require-dev": { 22 | "phpunit/phpunit": ">=4.8 <=9" 23 | }, 24 | "time": "2021-02-12T00:02:00+00:00", 25 | "type": "library", 26 | "installation-source": "dist", 27 | "autoload": { 28 | "psr-4": { 29 | "Firebase\\JWT\\": "src" 30 | } 31 | }, 32 | "notification-url": "https://packagist.org/downloads/", 33 | "license": [ 34 | "BSD-3-Clause" 35 | ], 36 | "authors": [ 37 | { 38 | "name": "Neuman Vong", 39 | "email": "neuman+pear@twilio.com", 40 | "role": "Developer" 41 | }, 42 | { 43 | "name": "Anant Narayanan", 44 | "email": "anant@php.net", 45 | "role": "Developer" 46 | } 47 | ], 48 | "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", 49 | "homepage": "https://github.com/firebase/php-jwt", 50 | "keywords": [ 51 | "jwt", 52 | "php" 53 | ], 54 | "support": { 55 | "issues": "https://github.com/firebase/php-jwt/issues", 56 | "source": "https://github.com/firebase/php-jwt/tree/v5.2.1" 57 | }, 58 | "install-path": "../firebase/php-jwt" 59 | } 60 | ], 61 | "dev": true, 62 | "dev-package-names": [] 63 | } 64 | -------------------------------------------------------------------------------- /front/src/views/Login.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 | 67 | -------------------------------------------------------------------------------- /front/src/views/Register.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 20 | 63 | 64 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/dist/dom/data.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap data.js v5.0.0-beta3 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | */ 6 | (function (global, factory) { 7 | typeof exports === 'object' && typeof module !== 'undefined' 8 | ? (module.exports = factory()) 9 | : typeof define === 'function' && define.amd 10 | ? define(factory) 11 | : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), 12 | (global.Data = factory())); 13 | })(this, function () { 14 | 'use strict'; 15 | 16 | /** 17 | * -------------------------------------------------------------------------- 18 | * Bootstrap (v5.0.0-beta3): dom/data.js 19 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 20 | * -------------------------------------------------------------------------- 21 | */ 22 | 23 | /** 24 | * ------------------------------------------------------------------------ 25 | * Constants 26 | * ------------------------------------------------------------------------ 27 | */ 28 | const elementMap = new Map(); 29 | var data = { 30 | set(element, key, instance) { 31 | if (!elementMap.has(element)) { 32 | elementMap.set(element, new Map()); 33 | } 34 | 35 | const instanceMap = elementMap.get(element); // make it clear we only want one instance per element 36 | // can be removed later when multiple key/instances are fine to be used 37 | 38 | if (!instanceMap.has(key) && instanceMap.size !== 0) { 39 | // eslint-disable-next-line no-console 40 | console.error( 41 | `Bootstrap doesn't allow more than one instance per element. Bound instance: ${ 42 | Array.from(instanceMap.keys())[0] 43 | }.` 44 | ); 45 | return; 46 | } 47 | 48 | instanceMap.set(key, instance); 49 | }, 50 | 51 | get(element, key) { 52 | if (elementMap.has(element)) { 53 | return elementMap.get(element).get(key) || null; 54 | } 55 | 56 | return null; 57 | }, 58 | 59 | remove(element, key) { 60 | if (!elementMap.has(element)) { 61 | return; 62 | } 63 | 64 | const instanceMap = elementMap.get(element); 65 | instanceMap.delete(key); // free up element references if there are no instances left for an element 66 | 67 | if (instanceMap.size === 0) { 68 | elementMap.delete(element); 69 | } 70 | }, 71 | }; 72 | 73 | return data; 74 | }); 75 | //# sourceMappingURL=data.js.map 76 | -------------------------------------------------------------------------------- /backend/models/UserModel.php: -------------------------------------------------------------------------------- 1 | db = new DB(); 10 | } 11 | 12 | public function getUsers() 13 | { 14 | $this->db->query("SELECT * FROM user"); 15 | return $this->db->all(); 16 | } 17 | 18 | public function getUserByRef($reference) 19 | { 20 | $this->db->query("SELECT * FROM user WHERE reference = :reference"); 21 | $this->db->bind(':reference', $reference); 22 | return $this->db->single(); 23 | } 24 | 25 | public function getUserByEmail($email) 26 | { 27 | $this->db->query("SELECT * FROM user WHERE email = :email"); 28 | $this->db->bind(':email', $email); 29 | return $this->db->single(); 30 | } 31 | 32 | public function getUserByRole($role) 33 | { 34 | echo $role; 35 | $this->db->query("SELECT * FROM user WHERE role = :role"); 36 | $this->db->bind(':role', $role); 37 | return $this->db->all(); 38 | } 39 | 40 | 41 | public function uniqidReal($lenght = 8) { 42 | if (function_exists("random_bytes")) { 43 | $bytes = random_bytes(ceil($lenght / 2)); 44 | } elseif (function_exists("openssl_random_pseudo_bytes")) { 45 | $bytes = openssl_random_pseudo_bytes(ceil($lenght / 2)); 46 | } else { 47 | throw new Exception("no cryptographically secure random function available"); 48 | } 49 | return substr(bin2hex($bytes), 0, $lenght); 50 | } 51 | 52 | public function register($data) 53 | { 54 | $uniqueRef=strtoupper($this->uniqidReal()); 55 | 56 | try { 57 | $this->db->query("INSERT INTO 58 | user 59 | SET 60 | email = :email, 61 | first_name = :first_name, 62 | last_name = :last_name, 63 | -- phone = :phone, 64 | password = :password, 65 | reference = :reference 66 | 67 | "); 68 | 69 | $this->db->bind(':email', $data->email); 70 | $this->db->bind(':first_name', $data->first_name); 71 | $this->db->bind(':last_name', $data->last_name); 72 | // $this->db->bind(':phone', $data->phone); 73 | $this->db->bind(':password', $data->password); 74 | $this->db->bind(':reference', $uniqueRef); 75 | $this->db->single(); 76 | } catch (\PDOExeption $err) { 77 | return $err->getMessage(); 78 | die(); 79 | } 80 | return $this->getUserByRef($uniqueRef); 81 | } 82 | 83 | 84 | 85 | 86 | } 87 | -------------------------------------------------------------------------------- /vendor/fpdf/doc/multicell.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MultiCell 6 | 7 | 8 | 9 |

MultiCell

10 | MultiCell(float w, float h, string txt [, mixed border [, string align [, boolean fill]]]) 11 |

Description

12 | This method allows printing text with line breaks. They can be automatic (as soon as the 13 | text reaches the right border of the cell) or explicit (via the \n character). As many cells 14 | as necessary are output, one below the other. 15 |
16 | Text can be aligned, centered or justified. The cell block can be framed and the background 17 | painted. 18 |

Parameters

19 |
20 |
w
21 |
22 | Width of cells. If 0, they extend up to the right margin of the page. 23 |
24 |
h
25 |
26 | Height of cells. 27 |
28 |
txt
29 |
30 | String to print. 31 |
32 |
border
33 |
34 | Indicates if borders must be drawn around the cell block. The value can be either a number: 35 | 39 | or a string containing some or all of the following characters (in any order): 40 | 46 | Default value: 0. 47 |
48 |
align
49 |
50 | Sets the text alignment. Possible values are: 51 | 57 |
58 |
fill
59 |
60 | Indicates if the cell background must be painted (true) or transparent (false). 61 | Default value: false. 62 |
63 |
64 |

See also

65 | SetFont, 66 | SetDrawColor, 67 | SetFillColor, 68 | SetTextColor, 69 | SetLineWidth, 70 | Cell, 71 | Write, 72 | SetAutoPageBreak 73 |
74 |
Index
75 | 76 | 77 | -------------------------------------------------------------------------------- /vendor/fpdf/tutorial/tuto4.php: -------------------------------------------------------------------------------- 1 | SetFont('Arial','B',15); 15 | $w = $this->GetStringWidth($title)+6; 16 | $this->SetX((210-$w)/2); 17 | $this->SetDrawColor(0,80,180); 18 | $this->SetFillColor(230,230,0); 19 | $this->SetTextColor(220,50,50); 20 | $this->SetLineWidth(1); 21 | $this->Cell($w,9,$title,1,1,'C',true); 22 | $this->Ln(10); 23 | // Save ordinate 24 | $this->y0 = $this->GetY(); 25 | } 26 | 27 | function Footer() 28 | { 29 | // Page footer 30 | $this->SetY(-15); 31 | $this->SetFont('Arial','I',8); 32 | $this->SetTextColor(128); 33 | $this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C'); 34 | } 35 | 36 | function SetCol($col) 37 | { 38 | // Set position at a given column 39 | $this->col = $col; 40 | $x = 10+$col*65; 41 | $this->SetLeftMargin($x); 42 | $this->SetX($x); 43 | } 44 | 45 | function AcceptPageBreak() 46 | { 47 | // Method accepting or not automatic page break 48 | if($this->col<2) 49 | { 50 | // Go to next column 51 | $this->SetCol($this->col+1); 52 | // Set ordinate to top 53 | $this->SetY($this->y0); 54 | // Keep on page 55 | return false; 56 | } 57 | else 58 | { 59 | // Go back to first column 60 | $this->SetCol(0); 61 | // Page break 62 | return true; 63 | } 64 | } 65 | 66 | function ChapterTitle($num, $label) 67 | { 68 | // Title 69 | $this->SetFont('Arial','',12); 70 | $this->SetFillColor(200,220,255); 71 | $this->Cell(0,6,"Chapter $num : $label",0,1,'L',true); 72 | $this->Ln(4); 73 | // Save ordinate 74 | $this->y0 = $this->GetY(); 75 | } 76 | 77 | function ChapterBody($file) 78 | { 79 | // Read text file 80 | $txt = file_get_contents($file); 81 | // Font 82 | $this->SetFont('Times','',12); 83 | // Output text in a 6 cm width column 84 | $this->MultiCell(60,5,$txt); 85 | $this->Ln(); 86 | // Mention 87 | $this->SetFont('','I'); 88 | $this->Cell(0,5,'(end of excerpt)'); 89 | // Go back to first column 90 | $this->SetCol(0); 91 | } 92 | 93 | function PrintChapter($num, $title, $file) 94 | { 95 | // Add chapter 96 | $this->AddPage(); 97 | $this->ChapterTitle($num,$title); 98 | $this->ChapterBody($file); 99 | } 100 | } 101 | 102 | $pdf = new PDF(); 103 | $title = '20000 Leagues Under the Seas'; 104 | $pdf->SetTitle($title); 105 | $pdf->SetAuthor('Jules Verne'); 106 | $pdf->PrintChapter(1,'A RUNAWAY REEF','20k_c1.txt'); 107 | $pdf->PrintChapter(2,'THE PROS AND CONS','20k_c2.txt'); 108 | $pdf->Output(); 109 | ?> 110 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/free/alert.js: -------------------------------------------------------------------------------- 1 | import { getjQuery, onDOMContentLoaded } from '../mdb/util/index'; 2 | import EventHandler from '../mdb/dom/event-handler'; 3 | import SelectorEngine from '../mdb/dom/selector-engine'; 4 | import BSAlert from '../bootstrap/mdb-prefix/alert'; 5 | 6 | /** 7 | * ------------------------------------------------------------------------ 8 | * Constants 9 | * ------------------------------------------------------------------------ 10 | */ 11 | 12 | const NAME = 'alert'; 13 | const DATA_KEY = `mdb.${NAME}`; 14 | const EVENT_KEY = `.${DATA_KEY}`; 15 | 16 | const EVENT_CLOSE_BS = 'close.bs.alert'; 17 | const EVENT_CLOSED_BS = 'closed.bs.alert'; 18 | 19 | const EVENT_CLOSE = `close${EVENT_KEY}`; 20 | const EVENT_CLOSED = `closed${EVENT_KEY}`; 21 | 22 | const SELECTOR_ALERT = '.alert'; 23 | 24 | class Alert extends BSAlert { 25 | constructor(element, data = {}) { 26 | super(element, data); 27 | 28 | this._init(); 29 | } 30 | 31 | dispose() { 32 | EventHandler.off(this._element, EVENT_CLOSE_BS); 33 | EventHandler.off(this._element, EVENT_CLOSED_BS); 34 | 35 | super.dispose(); 36 | } 37 | 38 | // Getters 39 | static get NAME() { 40 | return NAME; 41 | } 42 | 43 | // Private 44 | _init() { 45 | this._bindCloseEvent(); 46 | this._bindClosedEvent(); 47 | } 48 | 49 | _bindCloseEvent() { 50 | EventHandler.on(this._element, EVENT_CLOSE_BS, () => { 51 | EventHandler.trigger(this._element, EVENT_CLOSE); 52 | }); 53 | } 54 | 55 | _bindClosedEvent() { 56 | EventHandler.on(this._element, EVENT_CLOSED_BS, () => { 57 | EventHandler.trigger(this._element, EVENT_CLOSED); 58 | }); 59 | } 60 | } 61 | 62 | /** 63 | * ------------------------------------------------------------------------ 64 | * Data Api implementation - auto initialization 65 | * ------------------------------------------------------------------------ 66 | */ 67 | 68 | SelectorEngine.find(SELECTOR_ALERT).forEach((el) => { 69 | let instance = Alert.getInstance(el); 70 | if (!instance) { 71 | instance = new Alert(el); 72 | } 73 | }); 74 | 75 | /** 76 | * ------------------------------------------------------------------------ 77 | * jQuery 78 | * ------------------------------------------------------------------------ 79 | * add .rating to jQuery only if jQuery is present 80 | */ 81 | onDOMContentLoaded(() => { 82 | const $ = getjQuery(); 83 | 84 | if ($) { 85 | const JQUERY_NO_CONFLICT = $.fn[NAME]; 86 | $.fn[NAME] = Alert.jQueryInterface; 87 | $.fn[NAME].Constructor = Alert; 88 | $.fn[NAME].noConflict = () => { 89 | $.fn[NAME] = JQUERY_NO_CONFLICT; 90 | return Alert.jQueryInterface; 91 | }; 92 | } 93 | }); 94 | 95 | export default Alert; 96 | -------------------------------------------------------------------------------- /vendor/fpdf/tutorial/tuto5.php: -------------------------------------------------------------------------------- 1 | Cell(40,7,$col,1); 23 | $this->Ln(); 24 | // Data 25 | foreach($data as $row) 26 | { 27 | foreach($row as $col) 28 | $this->Cell(40,6,$col,1); 29 | $this->Ln(); 30 | } 31 | } 32 | 33 | // Better table 34 | function ImprovedTable($header, $data) 35 | { 36 | // Column widths 37 | $w = array(40, 35, 40, 45); 38 | // Header 39 | for($i=0;$iCell($w[$i],7,$header[$i],1,0,'C'); 41 | $this->Ln(); 42 | // Data 43 | foreach($data as $row) 44 | { 45 | $this->Cell($w[0],6,$row[0],'LR'); 46 | $this->Cell($w[1],6,$row[1],'LR'); 47 | $this->Cell($w[2],6,number_format($row[2]),'LR',0,'R'); 48 | $this->Cell($w[3],6,number_format($row[3]),'LR',0,'R'); 49 | $this->Ln(); 50 | } 51 | // Closing line 52 | $this->Cell(array_sum($w),0,'','T'); 53 | } 54 | 55 | // Colored table 56 | function FancyTable($header, $data) 57 | { 58 | // Colors, line width and bold font 59 | $this->SetFillColor(255,0,0); 60 | $this->SetTextColor(255); 61 | $this->SetDrawColor(128,0,0); 62 | $this->SetLineWidth(.3); 63 | $this->SetFont('','B'); 64 | // Header 65 | $w = array(40, 35, 40, 45); 66 | for($i=0;$iCell($w[$i],7,$header[$i],1,0,'C',true); 68 | $this->Ln(); 69 | // Color and font restoration 70 | $this->SetFillColor(224,235,255); 71 | $this->SetTextColor(0); 72 | $this->SetFont(''); 73 | // Data 74 | $fill = false; 75 | foreach($data as $row) 76 | { 77 | $this->Cell($w[0],6,$row[0],'LR',0,'L',$fill); 78 | $this->Cell($w[1],6,$row[1],'LR',0,'L',$fill); 79 | $this->Cell($w[2],6,number_format($row[2]),'LR',0,'R',$fill); 80 | $this->Cell($w[3],6,number_format($row[3]),'LR',0,'R',$fill); 81 | $this->Ln(); 82 | $fill = !$fill; 83 | } 84 | // Closing line 85 | $this->Cell(array_sum($w),0,'','T'); 86 | } 87 | } 88 | 89 | $pdf = new PDF(); 90 | // Column headings 91 | $header = array('Country', 'Capital', 'Area (sq km)', 'Pop. (thousands)'); 92 | // Data loading 93 | $data = $pdf->LoadData('countries.txt'); 94 | $pdf->SetFont('Arial','',14); 95 | $pdf->AddPage(); 96 | $pdf->BasicTable($header,$data); 97 | $pdf->AddPage(); 98 | $pdf->ImprovedTable($header,$data); 99 | $pdf->AddPage(); 100 | $pdf->FancyTable($header,$data); 101 | $pdf->Output(); 102 | ?> 103 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/perfect-scrollbar/handlers/drag-thumb.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | import * as CSS from '../lib/css'; 4 | import * as DOM from '../lib/dom'; 5 | import cls, { addScrollingClass, removeScrollingClass } from '../lib/class-names'; 6 | import updateGeometry from '../update-geometry'; 7 | import { toInt } from '../lib/util'; 8 | 9 | export default function (i) { 10 | bindMouseScrollHandler(i, [ 11 | 'containerWidth', 12 | 'contentWidth', 13 | 'pageX', 14 | 'railXWidth', 15 | 'scrollbarX', 16 | 'scrollbarXWidth', 17 | 'scrollLeft', 18 | 'x', 19 | 'scrollbarXRail', 20 | ]); 21 | bindMouseScrollHandler(i, [ 22 | 'containerHeight', 23 | 'contentHeight', 24 | 'pageY', 25 | 'railYHeight', 26 | 'scrollbarY', 27 | 'scrollbarYHeight', 28 | 'scrollTop', 29 | 'y', 30 | 'scrollbarYRail', 31 | ]); 32 | } 33 | 34 | function bindMouseScrollHandler( 35 | i, 36 | [ 37 | containerHeight, 38 | contentHeight, 39 | pageY, 40 | railYHeight, 41 | scrollbarY, 42 | scrollbarYHeight, 43 | scrollTop, 44 | y, 45 | scrollbarYRail, 46 | ] 47 | ) { 48 | const element = i.element; 49 | 50 | let startingScrollTop = null; 51 | let startingMousePageY = null; 52 | let scrollBy = null; 53 | 54 | function mouseMoveHandler(e) { 55 | if (e.touches && e.touches[0]) { 56 | e[pageY] = e.touches[0].pageY; 57 | } 58 | element[scrollTop] = startingScrollTop + scrollBy * (e[pageY] - startingMousePageY); 59 | addScrollingClass(i, y); 60 | updateGeometry(i); 61 | 62 | e.stopPropagation(); 63 | e.preventDefault(); 64 | } 65 | 66 | function mouseUpHandler() { 67 | removeScrollingClass(i, y); 68 | i[scrollbarYRail].classList.remove(cls.state.clicking); 69 | i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler); 70 | } 71 | 72 | function bindMoves(e, touchMode) { 73 | startingScrollTop = element[scrollTop]; 74 | if (touchMode && e.touches) { 75 | e[pageY] = e.touches[0].pageY; 76 | } 77 | startingMousePageY = e[pageY]; 78 | scrollBy = (i[contentHeight] - i[containerHeight]) / (i[railYHeight] - i[scrollbarYHeight]); 79 | if (!touchMode) { 80 | i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler); 81 | i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler); 82 | e.preventDefault(); 83 | } else { 84 | i.event.bind(i.ownerDocument, 'touchmove', mouseMoveHandler); 85 | } 86 | 87 | i[scrollbarYRail].classList.add(cls.state.clicking); 88 | 89 | e.stopPropagation(); 90 | } 91 | 92 | i.event.bind(i[scrollbarY], 'mousedown', (e) => { 93 | bindMoves(e); 94 | }); 95 | i.event.bind(i[scrollbarY], 'touchstart', (e) => { 96 | bindMoves(e, true); 97 | }); 98 | } 99 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "2e81f436193da5b40f951c6849eda663", 8 | "packages": [ 9 | { 10 | "name": "firebase/php-jwt", 11 | "version": "v5.2.1", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/firebase/php-jwt.git", 15 | "reference": "f42c9110abe98dd6cfe9053c49bc86acc70b2d23" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/firebase/php-jwt/zipball/f42c9110abe98dd6cfe9053c49bc86acc70b2d23", 20 | "reference": "f42c9110abe98dd6cfe9053c49bc86acc70b2d23", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=5.3.0" 25 | }, 26 | "require-dev": { 27 | "phpunit/phpunit": ">=4.8 <=9" 28 | }, 29 | "type": "library", 30 | "autoload": { 31 | "psr-4": { 32 | "Firebase\\JWT\\": "src" 33 | } 34 | }, 35 | "notification-url": "https://packagist.org/downloads/", 36 | "license": [ 37 | "BSD-3-Clause" 38 | ], 39 | "authors": [ 40 | { 41 | "name": "Neuman Vong", 42 | "email": "neuman+pear@twilio.com", 43 | "role": "Developer" 44 | }, 45 | { 46 | "name": "Anant Narayanan", 47 | "email": "anant@php.net", 48 | "role": "Developer" 49 | } 50 | ], 51 | "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", 52 | "homepage": "https://github.com/firebase/php-jwt", 53 | "keywords": [ 54 | "jwt", 55 | "php" 56 | ], 57 | "support": { 58 | "issues": "https://github.com/firebase/php-jwt/issues", 59 | "source": "https://github.com/firebase/php-jwt/tree/v5.2.1" 60 | }, 61 | "time": "2021-02-12T00:02:00+00:00" 62 | } 63 | ], 64 | "packages-dev": [], 65 | "aliases": [], 66 | "minimum-stability": "stable", 67 | "stability-flags": [], 68 | "prefer-stable": false, 69 | "prefer-lowest": false, 70 | "platform": [], 71 | "platform-dev": [], 72 | "plugin-api-version": "2.0.0" 73 | } 74 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/src/util/scrollbar.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v5.0.0-beta3): util/scrollBar.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | import SelectorEngine from '../dom/selector-engine'; 9 | import Manipulator from '../dom/manipulator'; 10 | 11 | const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed'; 12 | const SELECTOR_STICKY_CONTENT = '.sticky-top'; 13 | 14 | const getWidth = () => { 15 | // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes 16 | const documentWidth = document.documentElement.clientWidth; 17 | return Math.abs(window.innerWidth - documentWidth); 18 | }; 19 | 20 | const hide = (width = getWidth()) => { 21 | document.body.style.overflow = 'hidden'; 22 | _setElementAttributes( 23 | SELECTOR_FIXED_CONTENT, 24 | 'paddingRight', 25 | (calculatedValue) => calculatedValue + width 26 | ); 27 | _setElementAttributes( 28 | SELECTOR_STICKY_CONTENT, 29 | 'marginRight', 30 | (calculatedValue) => calculatedValue - width 31 | ); 32 | _setElementAttributes('body', 'paddingRight', (calculatedValue) => calculatedValue + width); 33 | }; 34 | 35 | const _setElementAttributes = (selector, styleProp, callback) => { 36 | const scrollbarWidth = getWidth(); 37 | SelectorEngine.find(selector).forEach((element) => { 38 | if (element !== document.body && window.innerWidth > element.clientWidth + scrollbarWidth) { 39 | return; 40 | } 41 | 42 | const actualValue = element.style[styleProp]; 43 | const calculatedValue = window.getComputedStyle(element)[styleProp]; 44 | Manipulator.setDataAttribute(element, styleProp, actualValue); 45 | element.style[styleProp] = callback(Number.parseFloat(calculatedValue)) + 'px'; 46 | }); 47 | }; 48 | 49 | const reset = () => { 50 | document.body.style.overflow = 'auto'; 51 | _resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight'); 52 | _resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight'); 53 | _resetElementAttributes('body', 'paddingRight'); 54 | }; 55 | 56 | const _resetElementAttributes = (selector, styleProp) => { 57 | SelectorEngine.find(selector).forEach((element) => { 58 | const value = Manipulator.getDataAttribute(element, styleProp); 59 | if (typeof value === 'undefined' && element === document.body) { 60 | element.style.removeProperty(styleProp); 61 | } else { 62 | Manipulator.removeDataAttribute(element, styleProp); 63 | element.style[styleProp] = value; 64 | } 65 | }); 66 | }; 67 | 68 | const isBodyOverflowing = () => { 69 | return getWidth() > 0; 70 | }; 71 | 72 | export { getWidth, hide, isBodyOverflowing, reset }; 73 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/mdb-prefix/util/scrollbar.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v5.0.0-beta3): util/scrollBar.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | import SelectorEngine from '../dom/selector-engine'; 9 | import Manipulator from '../dom/manipulator'; 10 | 11 | const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed'; 12 | const SELECTOR_STICKY_CONTENT = '.sticky-top'; 13 | 14 | const getWidth = () => { 15 | // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes 16 | const documentWidth = document.documentElement.clientWidth; 17 | return Math.abs(window.innerWidth - documentWidth); 18 | }; 19 | 20 | const hide = (width = getWidth()) => { 21 | document.body.style.overflow = 'hidden'; 22 | _setElementAttributes( 23 | SELECTOR_FIXED_CONTENT, 24 | 'paddingRight', 25 | (calculatedValue) => calculatedValue + width 26 | ); 27 | _setElementAttributes( 28 | SELECTOR_STICKY_CONTENT, 29 | 'marginRight', 30 | (calculatedValue) => calculatedValue - width 31 | ); 32 | _setElementAttributes('body', 'paddingRight', (calculatedValue) => calculatedValue + width); 33 | }; 34 | 35 | const _setElementAttributes = (selector, styleProp, callback) => { 36 | const scrollbarWidth = getWidth(); 37 | SelectorEngine.find(selector).forEach((element) => { 38 | if (element !== document.body && window.innerWidth > element.clientWidth + scrollbarWidth) { 39 | return; 40 | } 41 | 42 | const actualValue = element.style[styleProp]; 43 | const calculatedValue = window.getComputedStyle(element)[styleProp]; 44 | Manipulator.setDataAttribute(element, styleProp, actualValue); 45 | element.style[styleProp] = callback(Number.parseFloat(calculatedValue)) + 'px'; 46 | }); 47 | }; 48 | 49 | const reset = () => { 50 | document.body.style.overflow = 'auto'; 51 | _resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight'); 52 | _resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight'); 53 | _resetElementAttributes('body', 'paddingRight'); 54 | }; 55 | 56 | const _resetElementAttributes = (selector, styleProp) => { 57 | SelectorEngine.find(selector).forEach((element) => { 58 | const value = Manipulator.getDataAttribute(element, styleProp); 59 | if (typeof value === 'undefined' && element === document.body) { 60 | element.style.removeProperty(styleProp); 61 | } else { 62 | Manipulator.removeDataAttribute(element, styleProp); 63 | element.style[styleProp] = value; 64 | } 65 | }); 66 | }; 67 | 68 | const isBodyOverflowing = () => { 69 | return getWidth() > 0; 70 | }; 71 | 72 | export { getWidth, hide, isBodyOverflowing, reset }; 73 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/src/button.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v5.0.0-beta3): button.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | import { defineJQueryPlugin } from './util/index'; 9 | import Data from './dom/data'; 10 | import EventHandler from './dom/event-handler'; 11 | import BaseComponent from './base-component'; 12 | 13 | /** 14 | * ------------------------------------------------------------------------ 15 | * Constants 16 | * ------------------------------------------------------------------------ 17 | */ 18 | 19 | const NAME = 'button'; 20 | const DATA_KEY = 'bs.button'; 21 | const EVENT_KEY = `.${DATA_KEY}`; 22 | const DATA_API_KEY = '.data-api'; 23 | 24 | const CLASS_NAME_ACTIVE = 'active'; 25 | 26 | const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="button"]'; 27 | 28 | const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`; 29 | 30 | /** 31 | * ------------------------------------------------------------------------ 32 | * Class Definition 33 | * ------------------------------------------------------------------------ 34 | */ 35 | 36 | class Button extends BaseComponent { 37 | // Getters 38 | 39 | static get DATA_KEY() { 40 | return DATA_KEY; 41 | } 42 | 43 | // Public 44 | 45 | toggle() { 46 | // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method 47 | this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE)); 48 | } 49 | 50 | // Static 51 | 52 | static jQueryInterface(config) { 53 | return this.each(function () { 54 | let data = Data.get(this, DATA_KEY); 55 | 56 | if (!data) { 57 | data = new Button(this); 58 | } 59 | 60 | if (config === 'toggle') { 61 | data[config](); 62 | } 63 | }); 64 | } 65 | } 66 | 67 | /** 68 | * ------------------------------------------------------------------------ 69 | * Data Api implementation 70 | * ------------------------------------------------------------------------ 71 | */ 72 | 73 | EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, (event) => { 74 | event.preventDefault(); 75 | 76 | const button = event.target.closest(SELECTOR_DATA_TOGGLE); 77 | 78 | let data = Data.get(button, DATA_KEY); 79 | if (!data) { 80 | data = new Button(button); 81 | } 82 | 83 | data.toggle(); 84 | }); 85 | 86 | /** 87 | * ------------------------------------------------------------------------ 88 | * jQuery 89 | * ------------------------------------------------------------------------ 90 | * add .Button to jQuery only if jQuery is present 91 | */ 92 | 93 | defineJQueryPlugin(NAME, Button); 94 | 95 | export default Button; 96 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/mdb-prefix/button.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v5.0.0-beta3): button.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | import { defineJQueryPlugin } from './util/index'; 9 | import Data from './dom/data'; 10 | import EventHandler from './dom/event-handler'; 11 | import BaseComponent from './base-component'; 12 | 13 | /** 14 | * ------------------------------------------------------------------------ 15 | * Constants 16 | * ------------------------------------------------------------------------ 17 | */ 18 | 19 | const NAME = 'button'; 20 | const DATA_KEY = 'bs.button'; 21 | const EVENT_KEY = `.${DATA_KEY}`; 22 | const DATA_API_KEY = '.data-api'; 23 | 24 | const CLASS_NAME_ACTIVE = 'active'; 25 | 26 | const SELECTOR_DATA_TOGGLE = '[data-mdb-toggle="button"]'; 27 | 28 | const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`; 29 | 30 | /** 31 | * ------------------------------------------------------------------------ 32 | * Class Definition 33 | * ------------------------------------------------------------------------ 34 | */ 35 | 36 | class Button extends BaseComponent { 37 | // Getters 38 | 39 | static get DATA_KEY() { 40 | return DATA_KEY; 41 | } 42 | 43 | // Public 44 | 45 | toggle() { 46 | // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method 47 | this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE)); 48 | } 49 | 50 | // Static 51 | 52 | static jQueryInterface(config) { 53 | return this.each(function () { 54 | let data = Data.get(this, DATA_KEY); 55 | 56 | if (!data) { 57 | data = new Button(this); 58 | } 59 | 60 | if (config === 'toggle') { 61 | data[config](); 62 | } 63 | }); 64 | } 65 | } 66 | 67 | /** 68 | * ------------------------------------------------------------------------ 69 | * Data Api implementation 70 | * ------------------------------------------------------------------------ 71 | */ 72 | 73 | EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, (event) => { 74 | event.preventDefault(); 75 | 76 | const button = event.target.closest(SELECTOR_DATA_TOGGLE); 77 | 78 | let data = Data.get(button, DATA_KEY); 79 | if (!data) { 80 | data = new Button(button); 81 | } 82 | 83 | data.toggle(); 84 | }); 85 | 86 | /** 87 | * ------------------------------------------------------------------------ 88 | * jQuery 89 | * ------------------------------------------------------------------------ 90 | * add .Button to jQuery only if jQuery is present 91 | */ 92 | 93 | defineJQueryPlugin(NAME, Button); 94 | 95 | export default Button; 96 | -------------------------------------------------------------------------------- /vendor/fpdf/tutorial/tuto6.php: -------------------------------------------------------------------------------- 1 | /U',$html,-1,PREG_SPLIT_DELIM_CAPTURE); 16 | foreach($a as $i=>$e) 17 | { 18 | if($i%2==0) 19 | { 20 | // Text 21 | if($this->HREF) 22 | $this->PutLink($this->HREF,$e); 23 | else 24 | $this->Write(5,$e); 25 | } 26 | else 27 | { 28 | // Tag 29 | if($e[0]=='/') 30 | $this->CloseTag(strtoupper(substr($e,1))); 31 | else 32 | { 33 | // Extract attributes 34 | $a2 = explode(' ',$e); 35 | $tag = strtoupper(array_shift($a2)); 36 | $attr = array(); 37 | foreach($a2 as $v) 38 | { 39 | if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3)) 40 | $attr[strtoupper($a3[1])] = $a3[2]; 41 | } 42 | $this->OpenTag($tag,$attr); 43 | } 44 | } 45 | } 46 | } 47 | 48 | function OpenTag($tag, $attr) 49 | { 50 | // Opening tag 51 | if($tag=='B' || $tag=='I' || $tag=='U') 52 | $this->SetStyle($tag,true); 53 | if($tag=='A') 54 | $this->HREF = $attr['HREF']; 55 | if($tag=='BR') 56 | $this->Ln(5); 57 | } 58 | 59 | function CloseTag($tag) 60 | { 61 | // Closing tag 62 | if($tag=='B' || $tag=='I' || $tag=='U') 63 | $this->SetStyle($tag,false); 64 | if($tag=='A') 65 | $this->HREF = ''; 66 | } 67 | 68 | function SetStyle($tag, $enable) 69 | { 70 | // Modify style and select corresponding font 71 | $this->$tag += ($enable ? 1 : -1); 72 | $style = ''; 73 | foreach(array('B', 'I', 'U') as $s) 74 | { 75 | if($this->$s>0) 76 | $style .= $s; 77 | } 78 | $this->SetFont('',$style); 79 | } 80 | 81 | function PutLink($URL, $txt) 82 | { 83 | // Put a hyperlink 84 | $this->SetTextColor(0,0,255); 85 | $this->SetStyle('U',true); 86 | $this->Write(5,$txt,$URL); 87 | $this->SetStyle('U',false); 88 | $this->SetTextColor(0); 89 | } 90 | } 91 | 92 | $html = 'You can now easily print text mixing different styles: bold, italic, 93 | underlined, or all at once!

You can also insert links on 94 | text, such as www.fpdf.org, or on an image: click on the logo.'; 95 | 96 | $pdf = new PDF(); 97 | // First page 98 | $pdf->AddPage(); 99 | $pdf->SetFont('Arial','',20); 100 | $pdf->Write(5,"To find out what's new in this tutorial, click "); 101 | $pdf->SetFont('','U'); 102 | $link = $pdf->AddLink(); 103 | $pdf->Write(5,'here',$link); 104 | $pdf->SetFont(''); 105 | // Second page 106 | $pdf->AddPage(); 107 | $pdf->SetLink($link); 108 | $pdf->Image('logo.png',10,12,30,0,'','http://www.fpdf.org'); 109 | $pdf->SetLeftMargin(45); 110 | $pdf->SetFontSize(14); 111 | $pdf->WriteHTML($html); 112 | $pdf->Output(); 113 | ?> 114 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/free/scrollspy.js: -------------------------------------------------------------------------------- 1 | import { getjQuery, onDOMContentLoaded } from '../mdb/util/index'; 2 | import EventHandler from '../mdb/dom/event-handler'; 3 | import SelectorEngine from '../mdb/dom/selector-engine'; 4 | import Manipulator from '../mdb/dom/manipulator'; 5 | import BSScrollSpy from '../bootstrap/mdb-prefix/scrollspy'; 6 | 7 | /** 8 | * ------------------------------------------------------------------------ 9 | * Constants 10 | * ------------------------------------------------------------------------ 11 | */ 12 | 13 | const NAME = 'scrollspy'; 14 | const DATA_KEY = `mdb.${NAME}`; 15 | const EVENT_KEY = `.${DATA_KEY}`; 16 | const DATA_API_KEY = '.data-api'; 17 | 18 | const EVENT_ACTIVATE_BS = 'activate.bs.scrollspy'; 19 | 20 | const EVENT_ACTIVATE = `activate${EVENT_KEY}`; 21 | 22 | const SELECTOR_DATA_SPY = '[data-mdb-spy="scroll"]'; 23 | const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`; 24 | 25 | class ScrollSpy extends BSScrollSpy { 26 | constructor(element, data) { 27 | super(element, data); 28 | 29 | this._scrollElement = element.tagName === 'BODY' ? window : element; 30 | 31 | this._init(); 32 | } 33 | 34 | dispose() { 35 | EventHandler.off(this._scrollElement, EVENT_ACTIVATE_BS); 36 | this._scrollElement = null; 37 | 38 | super.dispose(); 39 | } 40 | 41 | // Getters 42 | static get NAME() { 43 | return NAME; 44 | } 45 | 46 | // Private 47 | _init() { 48 | this._bindActivateEvent(); 49 | } 50 | 51 | _bindActivateEvent() { 52 | EventHandler.on(this._scrollElement, EVENT_ACTIVATE_BS, (e) => { 53 | EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, { 54 | relatedTarget: e.relatedTarget, 55 | }); 56 | }); 57 | } 58 | } 59 | 60 | /** 61 | * ------------------------------------------------------------------------ 62 | * Data Api implementation - auto initialization 63 | * ------------------------------------------------------------------------ 64 | */ 65 | 66 | EventHandler.on(window, EVENT_LOAD_DATA_API, () => { 67 | SelectorEngine.find(SELECTOR_DATA_SPY).forEach((el) => { 68 | let instance = ScrollSpy.getInstance(el); 69 | if (!instance) { 70 | instance = new ScrollSpy(el, Manipulator.getDataAttributes(el)); 71 | } 72 | }); 73 | }); 74 | 75 | /** 76 | * ------------------------------------------------------------------------ 77 | * jQuery 78 | * ------------------------------------------------------------------------ 79 | * add .rating to jQuery only if jQuery is present 80 | */ 81 | 82 | onDOMContentLoaded(() => { 83 | const $ = getjQuery(); 84 | 85 | if ($) { 86 | const JQUERY_NO_CONFLICT = $.fn[NAME]; 87 | $.fn[NAME] = ScrollSpy.jQueryInterface; 88 | $.fn[NAME].Constructor = ScrollSpy; 89 | $.fn[NAME].noConflict = () => { 90 | $.fn[NAME] = JQUERY_NO_CONFLICT; 91 | return ScrollSpy.jQueryInterface; 92 | }; 93 | } 94 | }); 95 | 96 | export default ScrollSpy; 97 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/util/focusTrap.js: -------------------------------------------------------------------------------- 1 | import SelectorEngine from '../dom/selector-engine'; 2 | import { isVisible } from './index'; 3 | 4 | class FocusTrap { 5 | constructor(element, options = {}, toggler) { 6 | this._element = element; 7 | this._toggler = toggler; 8 | this._event = options.event || 'blur'; 9 | this._condition = options.condition || (() => true); 10 | this._selector = 11 | options.selector || 'button, a, input, select, textarea, [tabindex]:not([tabindex="-1"])'; 12 | this._onlyVisible = options.onlyVisible || false; 13 | this._focusableElements = []; 14 | this._firstElement = null; 15 | this._lastElement = null; 16 | 17 | this.handler = (e) => { 18 | if (this._condition(e) && e.target === this._lastElement) { 19 | e.preventDefault(); 20 | this._firstElement.focus(); 21 | } 22 | }; 23 | } 24 | 25 | trap() { 26 | this._setElements(); 27 | this._init(); 28 | this._setFocusTrap(); 29 | } 30 | 31 | disable() { 32 | this._focusableElements.forEach((element) => { 33 | element.removeEventListener(this._event, this.handler); 34 | }); 35 | 36 | if (this._toggler) { 37 | this._toggler.focus(); 38 | } 39 | } 40 | 41 | update() { 42 | this._setElements(); 43 | this._setFocusTrap(); 44 | } 45 | 46 | _init() { 47 | const handler = (e) => { 48 | if (!this._firstElement || e.key !== 'Tab' || this._focusableElements.includes(e.target)) { 49 | return; 50 | } 51 | 52 | e.preventDefault(); 53 | this._firstElement.focus(); 54 | 55 | window.removeEventListener('keydown', handler); 56 | }; 57 | 58 | window.addEventListener('keydown', handler); 59 | } 60 | 61 | _filterVisible(elements) { 62 | return elements.filter((el) => { 63 | if (!isVisible(el)) return false; 64 | 65 | const ancestors = SelectorEngine.parents(el, '*'); 66 | 67 | for (let i = 0; i < ancestors.length; i++) { 68 | const style = window.getComputedStyle(ancestors[i]); 69 | if (style && (style.display === 'none' || style.visibility === 'hidden')) return false; 70 | } 71 | return true; 72 | }); 73 | } 74 | 75 | _setElements() { 76 | this._focusableElements = SelectorEngine.find(this._selector, this._element); 77 | 78 | if (this._onlyVisible) { 79 | this._focusableElements = this._filterVisible(this._focusableElements); 80 | } 81 | 82 | this._firstElement = this._focusableElements[0]; 83 | this._lastElement = this._focusableElements[this._focusableElements.length - 1]; 84 | } 85 | 86 | _setFocusTrap() { 87 | this._focusableElements.forEach((element, i) => { 88 | if (i === this._focusableElements.length - 1) { 89 | element.addEventListener(this._event, this.handler); 90 | } else { 91 | element.removeEventListener(this._event, this.handler); 92 | } 93 | }); 94 | } 95 | } 96 | 97 | export default FocusTrap; 98 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/dist/dom/selector-engine.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap selector-engine.js v5.0.0-beta3 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | */ 6 | (function (global, factory) { 7 | typeof exports === 'object' && typeof module !== 'undefined' 8 | ? (module.exports = factory()) 9 | : typeof define === 'function' && define.amd 10 | ? define(factory) 11 | : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), 12 | (global.SelectorEngine = factory())); 13 | })(this, function () { 14 | 'use strict'; 15 | 16 | /** 17 | * -------------------------------------------------------------------------- 18 | * Bootstrap (v5.0.0-beta3): dom/selector-engine.js 19 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 20 | * -------------------------------------------------------------------------- 21 | */ 22 | 23 | /** 24 | * ------------------------------------------------------------------------ 25 | * Constants 26 | * ------------------------------------------------------------------------ 27 | */ 28 | const NODE_TEXT = 3; 29 | const SelectorEngine = { 30 | find(selector, element = document.documentElement) { 31 | return [].concat(...Element.prototype.querySelectorAll.call(element, selector)); 32 | }, 33 | 34 | findOne(selector, element = document.documentElement) { 35 | return Element.prototype.querySelector.call(element, selector); 36 | }, 37 | 38 | children(element, selector) { 39 | return [].concat(...element.children).filter((child) => child.matches(selector)); 40 | }, 41 | 42 | parents(element, selector) { 43 | const parents = []; 44 | let ancestor = element.parentNode; 45 | 46 | while ( 47 | ancestor && 48 | ancestor.nodeType === Node.ELEMENT_NODE && 49 | ancestor.nodeType !== NODE_TEXT 50 | ) { 51 | if (ancestor.matches(selector)) { 52 | parents.push(ancestor); 53 | } 54 | 55 | ancestor = ancestor.parentNode; 56 | } 57 | 58 | return parents; 59 | }, 60 | 61 | prev(element, selector) { 62 | let previous = element.previousElementSibling; 63 | 64 | while (previous) { 65 | if (previous.matches(selector)) { 66 | return [previous]; 67 | } 68 | 69 | previous = previous.previousElementSibling; 70 | } 71 | 72 | return []; 73 | }, 74 | 75 | next(element, selector) { 76 | let next = element.nextElementSibling; 77 | 78 | while (next) { 79 | if (next.matches(selector)) { 80 | return [next]; 81 | } 82 | 83 | next = next.nextElementSibling; 84 | } 85 | 86 | return []; 87 | }, 88 | }; 89 | 90 | return SelectorEngine; 91 | }); 92 | //# sourceMappingURL=selector-engine.js.map 93 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/dist/dom/data.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"data.js","sources":["../../src/dom/data.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta3): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n"],"names":["elementMap","Map","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EAEA,MAAMA,UAAU,GAAG,IAAIC,GAAJ,EAAnB;AAEA,aAAe;EACbC,EAAAA,GAAG,CAACC,OAAD,EAAUC,GAAV,EAAeC,QAAf,EAAyB;EAC1B,QAAI,CAACL,UAAU,CAACM,GAAX,CAAeH,OAAf,CAAL,EAA8B;EAC5BH,MAAAA,UAAU,CAACE,GAAX,CAAeC,OAAf,EAAwB,IAAIF,GAAJ,EAAxB;EACD;;EAED,UAAMM,WAAW,GAAGP,UAAU,CAACQ,GAAX,CAAeL,OAAf,CAApB,CAL0B;EAQ1B;;EACA,QAAI,CAACI,WAAW,CAACD,GAAZ,CAAgBF,GAAhB,CAAD,IAAyBG,WAAW,CAACE,IAAZ,KAAqB,CAAlD,EAAqD;EACnD;EACAC,MAAAA,OAAO,CAACC,KAAR,CAAe,+EAA8EC,KAAK,CAACC,IAAN,CAAWN,WAAW,CAACO,IAAZ,EAAX,EAA+B,CAA/B,CAAkC,GAA/H;EACA;EACD;;EAEDP,IAAAA,WAAW,CAACL,GAAZ,CAAgBE,GAAhB,EAAqBC,QAArB;EACD,GAjBY;;EAmBbG,EAAAA,GAAG,CAACL,OAAD,EAAUC,GAAV,EAAe;EAChB,QAAIJ,UAAU,CAACM,GAAX,CAAeH,OAAf,CAAJ,EAA6B;EAC3B,aAAOH,UAAU,CAACQ,GAAX,CAAeL,OAAf,EAAwBK,GAAxB,CAA4BJ,GAA5B,KAAoC,IAA3C;EACD;;EAED,WAAO,IAAP;EACD,GAzBY;;EA2BbW,EAAAA,MAAM,CAACZ,OAAD,EAAUC,GAAV,EAAe;EACnB,QAAI,CAACJ,UAAU,CAACM,GAAX,CAAeH,OAAf,CAAL,EAA8B;EAC5B;EACD;;EAED,UAAMI,WAAW,GAAGP,UAAU,CAACQ,GAAX,CAAeL,OAAf,CAApB;EAEAI,IAAAA,WAAW,CAACS,MAAZ,CAAmBZ,GAAnB,EAPmB;;EAUnB,QAAIG,WAAW,CAACE,IAAZ,KAAqB,CAAzB,EAA4B;EAC1BT,MAAAA,UAAU,CAACgB,MAAX,CAAkBb,OAAlB;EACD;EACF;;EAxCY,CAAf;;;;;;;;"} -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/bootstrap/dist/dom/manipulator.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap manipulator.js v5.0.0-beta3 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | */ 6 | (function (global, factory) { 7 | typeof exports === 'object' && typeof module !== 'undefined' 8 | ? (module.exports = factory()) 9 | : typeof define === 'function' && define.amd 10 | ? define(factory) 11 | : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), 12 | (global.Manipulator = factory())); 13 | })(this, function () { 14 | 'use strict'; 15 | 16 | /** 17 | * -------------------------------------------------------------------------- 18 | * Bootstrap (v5.0.0-beta3): dom/manipulator.js 19 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 20 | * -------------------------------------------------------------------------- 21 | */ 22 | function normalizeData(val) { 23 | if (val === 'true') { 24 | return true; 25 | } 26 | 27 | if (val === 'false') { 28 | return false; 29 | } 30 | 31 | if (val === Number(val).toString()) { 32 | return Number(val); 33 | } 34 | 35 | if (val === '' || val === 'null') { 36 | return null; 37 | } 38 | 39 | return val; 40 | } 41 | 42 | function normalizeDataKey(key) { 43 | return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`); 44 | } 45 | 46 | const Manipulator = { 47 | setDataAttribute(element, key, value) { 48 | element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value); 49 | }, 50 | 51 | removeDataAttribute(element, key) { 52 | element.removeAttribute(`data-bs-${normalizeDataKey(key)}`); 53 | }, 54 | 55 | getDataAttributes(element) { 56 | if (!element) { 57 | return {}; 58 | } 59 | 60 | const attributes = {}; 61 | Object.keys(element.dataset) 62 | .filter((key) => key.startsWith('bs')) 63 | .forEach((key) => { 64 | let pureKey = key.replace(/^bs/, ''); 65 | pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); 66 | attributes[pureKey] = normalizeData(element.dataset[key]); 67 | }); 68 | return attributes; 69 | }, 70 | 71 | getDataAttribute(element, key) { 72 | return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`)); 73 | }, 74 | 75 | offset(element) { 76 | const rect = element.getBoundingClientRect(); 77 | return { 78 | top: rect.top + document.body.scrollTop, 79 | left: rect.left + document.body.scrollLeft, 80 | }; 81 | }, 82 | 83 | position(element) { 84 | return { 85 | top: element.offsetTop, 86 | left: element.offsetLeft, 87 | }; 88 | }, 89 | }; 90 | 91 | return Manipulator; 92 | }); 93 | //# sourceMappingURL=manipulator.js.map 94 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/util/stack.js: -------------------------------------------------------------------------------- 1 | import SelectorEngine from '../dom/selector-engine'; 2 | import { isVisible, typeCheckConfig } from './index'; 3 | 4 | const NAME = 'Stack'; 5 | 6 | const DEFAULT_OPTIONS = { 7 | position: 'top', 8 | container: null, 9 | refresh: 1000, 10 | filter: (el) => { 11 | return el; 12 | }, 13 | }; 14 | 15 | const TYPE_OPTIONS = { 16 | position: 'string', 17 | container: '(undefined|null|string)', 18 | refresh: 'number', 19 | filter: 'function', 20 | }; 21 | 22 | class Stack { 23 | constructor(element, selector, options) { 24 | this._element = element; 25 | this._selector = selector; 26 | this._options = this._getConfig(options); 27 | 28 | this._offset = null; 29 | 30 | if (this._options.container) { 31 | this._parent = SelectorEngine.findOne(this._options.container); 32 | } 33 | } 34 | 35 | get stackableElements() { 36 | return SelectorEngine.find(this._selector) 37 | .filter((el, i) => this._options.filter(el, i)) 38 | .map((el) => ({ el, rect: el.getBoundingClientRect() })) 39 | .filter(({ el, rect }) => { 40 | const basicCondition = el !== this._element && isVisible(el); 41 | if (this._offset === null) { 42 | return basicCondition; 43 | } 44 | 45 | return basicCondition && this._getBoundryOffset(rect) < this._offset; 46 | }) 47 | .sort((a, b) => { 48 | return this._getBoundryOffset(b.rect) - this._getBoundryOffset(a.rect); 49 | }); 50 | } 51 | 52 | get nextElements() { 53 | return SelectorEngine.find(this._selector) 54 | .filter((el) => el !== this._element) 55 | .filter((el, i) => this._options.filter(el, i)) 56 | .filter((el) => { 57 | return this._getBoundryOffset(el.getBoundingClientRect()) > this._offset; 58 | }); 59 | } 60 | 61 | _getConfig(options) { 62 | const config = { 63 | ...DEFAULT_OPTIONS, 64 | ...options, 65 | }; 66 | 67 | typeCheckConfig(NAME, config, TYPE_OPTIONS); 68 | 69 | return config; 70 | } 71 | 72 | _getBoundryOffset(rect) { 73 | const { position } = this._options; 74 | 75 | let parentTopOffset = 0; 76 | let parentBottomBoundry = window.innerHeight; 77 | 78 | if (this._parent) { 79 | const parentRect = this._parent.getBoundingClientRect(); 80 | 81 | parentTopOffset = parentRect.top; 82 | parentBottomBoundry = parentRect.bottom; 83 | } 84 | 85 | if (position === 'top') { 86 | return rect.top - parentTopOffset; 87 | } 88 | return parentBottomBoundry - rect.bottom; 89 | } 90 | 91 | calculateOffset() { 92 | const [previousElement] = this.stackableElements; 93 | 94 | if (!previousElement) { 95 | this._offset = 0; 96 | } else { 97 | this._offset = this._getBoundryOffset(previousElement.rect) + previousElement.rect.height; 98 | } 99 | 100 | return this._offset; 101 | } 102 | } 103 | 104 | export default Stack; 105 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/free/carousel.js: -------------------------------------------------------------------------------- 1 | import { getjQuery, onDOMContentLoaded } from '../mdb/util/index'; 2 | import EventHandler from '../mdb/dom/event-handler'; 3 | import SelectorEngine from '../mdb/dom/selector-engine'; 4 | import BSCarousel from '../bootstrap/mdb-prefix/carousel'; 5 | 6 | /** 7 | * ------------------------------------------------------------------------ 8 | * Constants 9 | * ------------------------------------------------------------------------ 10 | */ 11 | 12 | const NAME = 'carousel'; 13 | const DATA_KEY = `mdb.${NAME}`; 14 | const EVENT_KEY = `.${DATA_KEY}`; 15 | 16 | const EVENT_SLIDE_BS = 'slide.bs.carousel'; 17 | const EVENT_SLID_BS = 'slid.bs.carousel'; 18 | 19 | const EVENT_SLIDE = `slide${EVENT_KEY}`; 20 | const EVENT_SLID = `slid${EVENT_KEY}`; 21 | 22 | const SELECTOR_DATA_RIDE = '[data-mdb-ride="carousel"]'; 23 | 24 | class Carousel extends BSCarousel { 25 | constructor(element, data) { 26 | super(element, data); 27 | 28 | this._init(); 29 | } 30 | 31 | dispose() { 32 | EventHandler.off(this._element, EVENT_SLIDE_BS); 33 | EventHandler.off(this._element, EVENT_SLID_BS); 34 | 35 | super.dispose(); 36 | } 37 | 38 | // Getters 39 | static get NAME() { 40 | return NAME; 41 | } 42 | 43 | // Private 44 | _init() { 45 | this._bindSlideEvent(); 46 | this._bindSlidEvent(); 47 | } 48 | 49 | _bindSlideEvent() { 50 | EventHandler.on(this._element, EVENT_SLIDE_BS, (e) => { 51 | EventHandler.trigger(this._element, EVENT_SLIDE, { 52 | relatedTarget: e.relatedTarget, 53 | direction: e.direction, 54 | from: e.from, 55 | to: e.to, 56 | }); 57 | }); 58 | } 59 | 60 | _bindSlidEvent() { 61 | EventHandler.on(this._element, EVENT_SLID_BS, (e) => { 62 | EventHandler.trigger(this._element, EVENT_SLID, { 63 | relatedTarget: e.relatedTarget, 64 | direction: e.direction, 65 | from: e.from, 66 | to: e.to, 67 | }); 68 | }); 69 | } 70 | } 71 | 72 | /** 73 | * ------------------------------------------------------------------------ 74 | * Data Api implementation - auto initialization 75 | * ------------------------------------------------------------------------ 76 | */ 77 | 78 | SelectorEngine.find(SELECTOR_DATA_RIDE).forEach((el) => { 79 | let instance = Carousel.getInstance(el); 80 | if (!instance) { 81 | instance = new Carousel(el); 82 | } 83 | }); 84 | 85 | /** 86 | * ------------------------------------------------------------------------ 87 | * jQuery 88 | * ------------------------------------------------------------------------ 89 | * add .rating to jQuery only if jQuery is present 90 | */ 91 | 92 | onDOMContentLoaded(() => { 93 | const $ = getjQuery(); 94 | 95 | if ($) { 96 | const JQUERY_NO_CONFLICT = $.fn[NAME]; 97 | $.fn[NAME] = Carousel.jQueryInterface; 98 | $.fn[NAME].Constructor = Carousel; 99 | $.fn[NAME].noConflict = () => { 100 | $.fn[NAME] = JQUERY_NO_CONFLICT; 101 | return Carousel.jQueryInterface; 102 | }; 103 | } 104 | }); 105 | 106 | export default Carousel; 107 | -------------------------------------------------------------------------------- /frontend/assets/bootstrqp/src/js/mdb/dom/manipulator.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v5.0.0-beta2): dom/manipulator.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | function normalizeData(val) { 9 | if (val === 'true') { 10 | return true; 11 | } 12 | 13 | if (val === 'false') { 14 | return false; 15 | } 16 | 17 | if (val === Number(val).toString()) { 18 | return Number(val); 19 | } 20 | 21 | if (val === '' || val === 'null') { 22 | return null; 23 | } 24 | 25 | return val; 26 | } 27 | 28 | function normalizeDataKey(key) { 29 | return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`); 30 | } 31 | 32 | const Manipulator = { 33 | setDataAttribute(element, key, value) { 34 | element.setAttribute(`data-mdb-${normalizeDataKey(key)}`, value); 35 | }, 36 | 37 | removeDataAttribute(element, key) { 38 | element.removeAttribute(`data-mdb-${normalizeDataKey(key)}`); 39 | }, 40 | 41 | getDataAttributes(element) { 42 | if (!element) { 43 | return {}; 44 | } 45 | 46 | const attributes = { 47 | ...element.dataset, 48 | }; 49 | 50 | Object.keys(attributes) 51 | .filter((key) => key.startsWith('mdb')) 52 | .forEach((key) => { 53 | let pureKey = key.replace(/^mdb/, ''); 54 | pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); 55 | attributes[pureKey] = normalizeData(attributes[key]); 56 | }); 57 | 58 | return attributes; 59 | }, 60 | 61 | getDataAttribute(element, key) { 62 | return normalizeData(element.getAttribute(`data-mdb-${normalizeDataKey(key)}`)); 63 | }, 64 | 65 | offset(element) { 66 | const rect = element.getBoundingClientRect(); 67 | 68 | return { 69 | top: rect.top + document.body.scrollTop, 70 | left: rect.left + document.body.scrollLeft, 71 | }; 72 | }, 73 | 74 | position(element) { 75 | return { 76 | top: element.offsetTop, 77 | left: element.offsetLeft, 78 | }; 79 | }, 80 | 81 | style(element, style) { 82 | Object.assign(element.style, style); 83 | }, 84 | 85 | toggleClass(element, className) { 86 | if (!element) { 87 | return; 88 | } 89 | 90 | if (element.classList.contains(className)) { 91 | element.classList.remove(className); 92 | } else { 93 | element.classList.add(className); 94 | } 95 | }, 96 | 97 | addClass(element, className) { 98 | if (element.classList.contains(className)) return; 99 | element.classList.add(className); 100 | }, 101 | 102 | addStyle(element, style) { 103 | Object.keys(style).forEach((property) => { 104 | element.style[property] = style[property]; 105 | }); 106 | }, 107 | 108 | removeClass(element, className) { 109 | if (!element.classList.contains(className)) return; 110 | element.classList.remove(className); 111 | }, 112 | 113 | hasClass(element, className) { 114 | return element.classList.contains(className); 115 | }, 116 | }; 117 | 118 | export default Manipulator; 119 | --------------------------------------------------------------------------------